IMD 1.17: 5/01/2010 22:00:07 cp/m 3 distribution diskette master II morrow designs micro-decision double sided (md11) 128k cp/m vers 3.0 rev 1.8 1984 >2!9^#V!1 Not a SYSTEM Diskette. (0>2!9^#V!1 Not a SYSTEM Diskette. GENCOM COMt BNKBIOS3MAC BNKBIOS3MACN !"#$%&'HD19DEF MAC()*+,-./DEFAULT KEY0CCP COM12ED COMI34567SUXIMS COM8HIST UTL 9HELP HLP:;<=>?@ABCDEFGHIHELP HLPhJKLMNOPQRSTUVWXCPMLDR RELYZDIRLBL RSX[TRACE UTL \CPM3 LIB ]^MODEBAUDLIB_Z80 LIB/`abSCB ASMcdCALLVERSASMeDUMP ASM fgECHOVERSASMhRANDOM ASMVijklmnEQUATES MACoDRIVES MAC(pqrLDRBIOS3MAC8stuvGENCPM COM(wxyz{|}~GENCPM DATINIT PILBOOT SUBBIOS SUBHDIXIY MACBKFIELD PILPBOOT3 MACGO PILMICRO PILQUEST PILTUTORIALPILLDEFINE MACINITDIR COMzMDINST PILUInvalid FCB.Media change occurred.Disk I/O error.Invalid drive error.Invalid SCB offsetMissing right parenthesis.Missing SCB value.Missing left parenthesis.Unrecognized option.No modifier for this option.OPTION: This file was not used.GENCOM completed.Requires CP/M 3 or higher.1n$1n$" %* %|<Ó* %}0HÓ::$]Ç:$jZÇ:$wÇ:$҄ZÇer ͺv!n$q*n$& ͤ!p$p+q*o$~*o$Nͤ*o$#"o$  ͤ ͤ!r$p+q*q$DMͺ !t$p+q*s$!v$p+q*u$!x$p+q*w$!}$p+q*|$"y$*y$}2$|2{$!~$q*~$&,2$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$p+q*$!$q*$&-!;6:$!; *;&') N#F:2$!;4%:2$%ͻ2$!;6>!;S*;&/% 6!;48!/%6 !;6#6:; *;&*(~ HҞ*;&*(*;&/% w!;4#4`*;&/% 6.!;6 :; *;&*(~ H!;4#N*( *;&/% w!;4î!;p+q3r*;D+ͱ :;" rͺ :;2 !%6? :;? !%6:$H :$Q :$ˆ :;} rͺ;+ͱ È aͧ !%6:$‘ :$š :$£ *$#";*;Ny 2$ *$DM*;i *:&: w*$##"$ *$;i *:&: w*;"$!:4*$Ny 2$\Q *$#"$*$Ny 2$:$1*$#"$*$Ny 2$!L:$IY!M:$YwQ *$#"$*$Ny 2$!N*$#"$9*$0͸ *$#";*;Ny 2$!L:$£!M:$°6*$0͸ F*;0͸ *$DM*;i *:&v: w*$##"$2*$;i *:&v: w*;#"$Q !;p+q*;DM*O>0*;"( !;p+q*;DM:O>R*;"( !;p+q*;DMJ2$>!$y*;"( *( >Š*(DMͻO>ҟ*("(!;p+q*$"%*;"%*$"'%̀"$$#*'"( !;q!;6>!;*;&)))=% *;& *;& w!;4!;6 >!;F:;2;*;&; 6*;& 6!;4!;6> !;ڍ:;2;*;&% *;&; w*;&*(*;& w!;4K;ͫ2$>!$ҥ*'"(!;p+q!;6 >!!;*;&*;6!;4±!6?)@w){#{s333333.;;33,;;#wD{_#6 sO O ڹ.:;=,/[]<>a{Ҷ_#  ý Copyright (c) 1982, Digital Research 11/02/82 @ @NULL0LOADER0SCB []=, :;<>%\|"()/#!@&+-*? COMHEXRSX1###~ERROR: FILE: File not found.No directory space.Invalid file name.First submitted file must be a COM file.Duplicate input RSX...Duplicate RSX in header. Replacing old by new.Invalid RSX type.No more RSX files to be used.Error on copy.There are not enough available RSX slots.Disk read.Disk write.Total file size exceeds 64K.COM file found and NULL option.No header or RSXs to strip.Mͺz/%ͺ!;p+q*;DM *y$}2;|2;:; F  :; T   :;x :;j $ :;x 4 !;q!;6*;&1 :/• >*;&1 :;© :;!;4 !;r+s+p+q+p+q !;6. *;~ *;~2;*;My 2$!;6:$ L :;  *;My 2$ ! . :;2$͌ :;2$2;*;~2;!;6*;~2;. *;~L ç *;N! *;*; =2;!;› !;6!;6:;!;ژ L :;ڑ 6 !;4z Þ 6 *;6͌ *;:;w:$$͂#+s#r :$ *$#"$ :L2$:;2;O*; ~2;*;&*;:/( !;4*;:;w*;&*;:; *;&*;~2; *;6*$~2; :;2;!;6*$#~2;!;4N*; :0f !;6| *;&*;:;| !;6!;4N*$ ~2;*;&*$~2;*;My 2$:$:$H:$H:$H !;4N*$ ~2;*;My 2$ä :;2$$͂##+s#r*$Ny 2$!L *$#"$ :$$#+";!;6:$!;P *;Nͤ*;#";!;41 !;p+qr*;DMͺ!;r+s+p+q*;DM͗ *;DM͗ *;~w*;*;~!;p+q*;>9Ұ *;~7w÷ *;~0w!;r+s+q+q*;:;~!;H IQ !;60!$6!;6*$#"$;- :Q2<:{$*{$Mx:{$2<%͛2$:<B*<>̓#+s#r!<5&*<$T :{$]*(DMZ!#:Q! <#:Q2<* !<ړ*<&* (6!<4w* (" (!<6*<&') ^#V"(x*(DM͋2$!)"<*<*<&$) N#Fq#px*(DM͋2$:)!)6*<&9 :)w!)6!)6!)6%͛2$!"$$*$*$"$!<4:$GT*<$#ã!!<ڸ*<&: 6!<4!\"<$w#s#r!n"<$w#s#r.:[ -!<6>!:H!<6::=!!(<ڋ*&<&)))9 *(<& *'<&)))9 *(<& w:(<<2(!(!%< *%<& * (*$<&)))9 *%<& w:%<<2%<!)" (!$6!,<6:$!,<*,<&$ 6!-<6:$!-<ں*-<&') ^#V"(!.<6>!.<ڑ*.<& * (*.<& *(ʇð:.<<2.!$:$_!)" (!,<6:$!,<r:,<<2,<* (#^#V"0<:$5~ *( 6x*(DM͋2$!0<#"$%͛2$*$DMi*0<"$/>>!)" (* ( ~2$ʃ҃* ( :$* ( w*("(* ( >Ҭf %͛2$:$~!"$$!"$$#*$"$*(DM1͞%U̓!)"Ÿ :3<<23<0 !$:$ !9!3<6!$:3<҄!*3<&$ ~24<:$=2$:4<26<:$!6!$ҹ! !O:) ":$!!$6!:%!%!!$6!!$6:)"!$6.;) -!2":$"!$62":%!%,"!$62" :"!$6:$/^"%ͦ%ͻ2$*(~2%%S!*3<&ͮ#% "(*3<&') q#p!4<6> !4<ڱ"!*3<&ͮ#% *4<& 6:4<<24<…" *$&$ :3 !6<#*5<&*7<*6<&*( w:5<<25<:6<<26<"!: !6:5<<25<:6<<26<:#>i`N#Fog_ogDM!>))덑o|gҨ# =–#DM!>))ҽ# =µ#^#V) #^#V|g}o #O{ozgi`N#Fogo&og_{_z#W ( w*<&') ^#V"(!<6>!!%(z:$/H!"$$#͞%U!$6̓!"<6:"<#ڀ*"<&( 6:"<<2"<_!"<6:$!"<ک*"<&$) >w#6:"<<2"<…!(" (* (:Ow:%/* ( :Ow* ( 6* ( :$w!"$:%:O2)x* (DM%͛2$>!$!%"( ):%/i:$R%͛2$*("(!"$$fx%͛2$!"$o!"$*$*$"$/!##"$*$DM*#w#6!)" (%͛2$* (##"*<**$#_"*(DM͠*$~[h*( ~25<>!5<!6<6!4<6:5<=!4<*6<&*(*3<&)))=% *4<& w:6<<26<:4<<24<†*3<&% :5!%**(DM*O>S:%/P o:%o*( >o :% :$<2$23<!*3<&ͮ#% *3<&') q#p!4<6:$=!4< !5<6> !5<:3<=o&!ͮ#% *5<& !*3<&ͮ#% *5<& w:5<<25<³:3<=23<:4<<24<£R"*'"(X">!$҉!!$6!3<6:$!3< !*3<&') ^#V"(X#/b 'Ͳ"!*3<&% >x *3!$Ҙ Ͳ"!:3<<24<:$!4<!*4<&') ^#V"'!6<6>!6< *6<&*(*6<&*' :6<<26<¿ Ͳ":4<<24<TEMP $$$ TITLE MD-11 BIOS, Copyright (c) 1984, Morrow Designs, Inc. 23_Feb_84 SUBTTL CP/M Plus BIOS -- Table of Contents ; MD-11 BIOS for CP/M Plus V3.0, Copyright (c), 1983, 1984, ; Morrow Designs, Inc. ; 600 McCormick ; San Leandro, ; California 94577 ; Bill Smith ; 1.) CP/M Plus BIOS -- Table of Contents ; 2.) Global Equates, ROM / RAM shared data areas -- RAMDATY ; 3.) Local Equates, ROM Entry Points ; 4.) Banked BIOS -- Character Tables ; 5.) Banked BIOS -- Block I/O ; 6.) Banked BIOS -- CCP Loader ; 7.) Banked BIOS -- Extended BIOS Functions ; 8.) Banked BIOS -- Data Structures, DPH ; 9.) Banked BIOS -- Data Structures, DPB ; 10.) Banked BIOS -- Data Structures, RAMDATY ; 11.) Banked BIOS -- Data Structures, MTABs ; 12.) Banked BIOS -- Data Structures, Free Space Pool ; 13.) Banked BIOS -- Character I/O, Initialization ; 14.) Banked BIOS -- Character I/O, Translation Level ; 15.) Banked BIOS -- Character I/O, Device Level ; 16.) Resident BIOS -- Jump Table ; 17.) Resident BIequ rom+6 ;rom home disk routine rdhsrm equ rom+9 ;rom read disk routine wrhsrm equ rom+0Ch ;rom write disk routine disrm equ rom+0Fh ;rom direct disk i/o routine bterm equ rom+18h ;rom print boot err routine APIFrm equ rom+1Bh ;rom default for application interface area rdlsec equ rom+20h ;rom read a logical sector wrlsec equ rom+23h ;Rom write a logical sector fmthst equ rom+26h ;rom format single track dpboff equ 12 ;offset from spt to dpb in dbh media_offset equ 11 ;offset into dph for media flag physoff equ 15 ;offset from spt to psh in dpb ;---------------------------------------------------------------------- ; external references ;---------------------------------------------------------------------- extrn @civec, @covec, @aivec, @aovec, @lovec, @bnkbf extrn @crdma, @crdsk, @vinfo, @resel, @fx, @usrcd, @mltio extrn @ermde, @erdsk, @media, @bflgs extrn @date, @hour, @min, @sec extrn ?erjmp, @mxtpa SUBTTL Banked BIOS -- Character Tables page ;---------------OS -- Bank Crossing Routines ; 18.) Resident BIOS -- Inter-Bank Moves, Banking Controls ; 19.) Resident BIOS -- Interrupt Handlers ; 20.) Resident BIOS -- Stacks and Interrupt Vectors ;credits ; The MD-11 Design Team included (alphabetically) ; David Block Len Edmondson Howard Fullmer ; Pearl Ledbetter George Morrow Bill Smith ; Mike Stolowitz Steve Tai John Zalabak .z80 true equ -1 false equ not true SUBTTL Global Equates, ROM / RAM shared data areas -- RAMDATY page include HD19DEF.MAC include DRIVES.MAC include DEFINE.MAC SUBTTL Local Equates, ROM Entry Points page BioRev equ 18h $txrdy equ 4 edv equ 40h ;bad drive from format entry primary equ 0 parity equ 7 getch equ 1 print equ 9 open equ 15 readseq equ 20 dma equ 26 parse equ 152 ;---------------------------------------------------------------------- tpa equ 100h dffcb equ 5ch stack80 equ 100h bootram equ 0 bdos equ 5 ccp equ tpa rom equ 0 msgrm equ rom+3 ;rom print signon message routine hmrm ------------------------------------------------------- dseg ;banked ;---------------------------------------------------------------------- ;cp/m plus disk functions ; these are presented here, before the jump table, in an effort ; to make their position in the system bank more obvious. ; Please read "banking considerations" following jump table ; ;---------------------------------------------------------------------- boot:: ;entry here placed at front of bnkbios as pointer ;to be used by external system programs to size system ;when examining cpm3.sys file jp boot2 ;jump to high common, end of code ;---------------------------------------------------------------------- char_tables:: ;these tables are provided for external programs which ;examine CPM3.SYS, must follow jump above ser1baud:: db dflt1 ser2baud: db dflt2 ser3baud: db dflt3 default_cflag: db 23h ;translations are on vnumb:: db drives ;number of physical drives tlev:: db 4 ;terminal level default is ------ vmsg:: db cr,lf,'Your floppy drive is being re-assigned as drive ' vdrv:: db 'a.',cr,lf,'Exchange diskettes and press [return]',0 ds 96-($-vmsg),0 vmsg_length equ $-vmsg ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Block I/O page boot2: ;enter here from loader, rom is on, system bank is on call bnk_initctc ;init bit rates ld hl,services ld (bios+1),hl ;point cold at services ld hl,dpb_buffer ;init dph.dpb -> dpb_buffer (gencpm needs 'em real) ld (dpbase+dpboff+dphlen*0),hl ld (dpbase+dpboff+dphlen*1),hl ld (dpbase+dpboff+dphlen*2),hl ld (dpbase+dpboff+dphlen*3),hl ld (dpbase+dpboff+dphlen*4),hl ld a,$cntrst ld (system_bank_bits),a out (bnkstb),a ;Turn on the rom and bank 0 ld iy,RamDatY ;IY:= Ram Data ld sp,System_Stack ;Stack:= Initialized ld de,Sign_On_Start call MsgRm ;Print the Sign On message ld a,$cntrst + 1 ld (system_bank_bits),a jp wboot ;read ccp and go ;------------------------------- sectrn:: ld l,c ;hl=bc ld h,b inc hl ;start sectors at 1 ld a,d ;see if xlat table or e ret z ;return if no xlat ex de,hl ;hl = table address add hl,bc ;add sector to table ld l,(hl) ;get xlated sector ld h,0 ret ;---------------------------------------------------------------------- seldsk:: ;enter with [c] = number of drive to select ;exit with [hl] -> dph, or [hl] = 0 if bad drive ld a,drives-1 ;check drive bound cp c jp c,bdrv ;jmp if bad ld a,c ;new drive ld (ramdaty+hstdsk),a ;set drive as current ld hl,ramdaty ;pointer to ramdaty push de ;save primary/secondsry select call gdsk1 ;get mtab pointer in [HL] pop de ;restore primary/secondary select bit primary,e jr nz,skpset ; if first time, bit @frgn,(hl) jr nz,skpset ; then if native morrow format, bit @hrddsk,(hl) jr nz,skpset ; then if floppy, (read disk id) ; Prepare to read ID info from media push hl ;save dskdef pointer calnot installed ds 3,0 ;reserved db BioRev ;BIOS Revision Number db clevel ;compatibility level dw APIF ;Pointer to Application Interface Area dw ramdaty ;Pointer to RamdatY dw ramdaty + MToff ;Pointer to the base of the first MTAB dw pool ;Pointer to free space etblptr:dw esctbl ctblptr:dw ctrltbl evctptr:dw escvect cvctptr:dw ctvect dw dcastrt dcastrt: db 1bh,3dh,0ffh ; dca prefix string ds 3,0ffh dcamid: ds 6,0ffh ; dca seperator dcaend: ds 6,0ffh ; dca terminator string esc_lvl: db 0 ;indicates esc sequence level offset1: db 0 ;first character offset offset2: db 0 ;second character offset order: db 0 ;bit 0 = 0 --> row, then column, ; = 1 --> column, then row ;bit 1 = 0 --> binary cursor adresses ; 1 --> ascii cursor addresses first: db 0 ; temporary storage of first second: db 0 ; temporary storage of second char_table_length equ $-char_tables ;-------------------------------------------------------------------------------------------------------------------- multio:: ;note multi-sector count ret ;not implemented ;---------------------------------------------------------------------- flush:: ;flush buffers xor a ;no error ret ;not needed ;---------------------------------------------------------------------- home:: ld bc,0 ;track 0 ; jp settrk ;---------------------------------------------------------------------- settrk:: ld (ramdaty+hsttrk),bc ;set track in ramdaty ret ;---------------------------------------------------------------------- setsec:: ld (ramdaty+hstsec),bc ;set sector in ramdaty ret sector_length: dw 0 ;init by seldsk ;---------------------------------------------------------------------- setbnk:: ;define dma bank ld (dmabnk),a ret dmabnk: ds 1,0 ;---------------------------------------------------------------------- setdma:: ld (ramdaty+dmaadr),bc ;set dma address in ramdaty ret ;---------------------------------------------------------l getab ;read config table from diskette or a ;see if error jp nz,ubdrv ;back to drive a: if error jr dskchk fmtlog: ;format enters here with disk info copied to buffer push hl ;format enters with system mtab dskchk: ; Check ID info for correctness (checksum) dsktln equ 25 dsktb equ dskbuf+80h+dsktln ;address of end of table+1 ld hl,dsktb ;pointer to end of table+1 ld b,dsktln ;count must be odd! for field of E5 xor a ;init check byte ld e,a ;init 0-check byte chklp: dec hl ;dec pointer xor (hl) ;x-or table value into parity check byte ld d,a ;save parity check byte or e ;or in 0-check byte ld e,a ;save 0-check byte ld a,d ;restore pariy check byte djnz chklp ;dec table length & loop til done ; inc hl ;hl=>dskdef1, access to sided-ness or a ;a=0 if table ok ld a,e ;a = 0-check byte jr nz,sside ;assume s.s. if invalid table or a ;check 0-check byte jr nz,dskdpb ;invalid table if zero sside: ld de,sdpb ;pointer ter pop bc ;dph address pop af ;restore boolean push bc ;dph address push de ;current dpb (common) jr nz,notab ;skip if no dpb update ld bc,15 ;length of dpb on drive media ldir ;update dpb notab: ; Figure the number of physical sectors per track = SPT / 2^secsiz ; Figure the transfer length for sector moves = 128 * secsiz ; Figure physical record shift mask (DPB.psm) = (2^secsiz)-1 ; Initialize physical record shift factor (DPB.psh) = secsiz pop de ;DPB in common pop hl ;current DPH ex (sp),hl ;restore current MTAB inc hl ;dskdef1, for sizmsk ld a,(hl) and $sizmsk ;get size push af ;save size ld b,a ;set as a count inc b ;count +1 for djnz bit @hasbad,(hl) ;set-up bad-map ld hl,ramdaty+dflag res @curbad,(hl) jr z,notab1 set @curbad,(hl) ;dflag @curbad reflects diskdef1 @hasbad notab1: ld c,70h ;for psm calculation ld a,(de) ;read records per track add a,a ;*2 ld hl,40h ;128/2 pspt: add hl,hl ector 1 ld hl,ramdaty+opflag res @inmap,(hl) res @bufok,(hl) jp read2 ;read without move ;---------------------------------------------------------------------- read:: ld hl,ramdaty+opflag res @inmap,(hl) ;don't pre-read bad map res @bufok,(hl) ;errors are not re-mapable call read2 push af call rwmove pop af ret read2: push ix ;save ix & iy push iy ld iy,ramdaty ;set-up iy -> ramdaty set @readop,(iy+dflag) ;indicate read call rom_on ;turn rom on call rdhsrm ;read from disk or a ;set flags for error push af ;save error call rom_off ;turn rom off pop af pop iy pop ix ld d,a ;[d]=physical error ret z ;if error, ld a,1 ; say so ret ;endif ;---------------------------------------------------------------------- write:: ld a,(read_after_write) ;check read before enabled ld hl,ramdaty+opflag res @inmap,(hl) ;do not pre-read bad map res @bufok,(hl) ;not mapable if no data pre-read bit 1,a jr z,write1 o s.s. dpb from ram pop hl ;restore ram mtab jr setsgl dskdpb: ;now we know that the media really is native morrow format dsktdb equ dskbuf+80h+9 ld de,dsktdb ;pointer to dpb in boot ;set ram MTAB according to disk MTAB bit @dblmed,(hl) ;check disk MTAB for d.s. media pop hl ;restore pointer to ram MTAB set @dblmed,(hl) ;presume double sided jr nz,dside ;but if single sided, setsgl: res @dblmed,(hl) ;set for s.s. media dside: xor a ;set z flag skpset: ;enter with z=1 if disk contains dpb to copy, pointed to by [DE] ;also, [HL] -> current MTAB push hl ;save current MTAB (in common) push af ;save z-boolean for ldir below push de ;save pointer to dpb from disk ld a,(ramdaty+hstdsk) ;get drive ld hl,drive_table call get_indexed ex (sp),hl ;put DPH on stack push hl ;under disk DPB address ld a,(ramdaty+hstdsk) ;get drive ld hl,dpb_table call get_indexed ex de,hl ;[de] -> dpb space in ram pop hl ;restore disk dpb point;transfer length * 2 rlc c ;shift mask * 2 circular srl a ;records per track / 2 djnz pspt ld (ramdaty+physpt),a ;set physical sectors per track ld (sector_length),hl ;set transfer length ld hl,physoff ;offset from SPT to PSH add hl,de ;[hl] -> DPB.psh pop af ;size ld (hl),a ;set DPB.psh inc hl ;[hl -> DPB.psm ld a,c and 7 ;delete remaining high order bits ld (hl),a ;set DPB.psm ex de,hl ;[hl] -> dpb ld de,dpb_buffer ;buffer in common ld bc,dpb_length ldir ;copy current dpb to common pop hl ;restore dph address ret ret ubdrv: pop hl ;drop bdrv: ld hl,0 ret get_indexed: add a,a ;*2 add a,l ld l,a jr nc,get_indexed2 inc h get_indexed2: ld a,(hl) ;dph lo inc hl ld h,(hl) ld l,a ;[hl] -> dph ret ;------------------------------------------------------------------ getab: ;read boot sector of currently selected disk ld hl,0 ld (ramdaty+hsttrk),hl ;set track 0 inc hl ld (ramdaty+hstsec),hl ;set s ;if pre-read enabled, ld a,(ramdaty+dflag) bit @curbad,a jr z,write1 ;if drive has bad map set @bufok,(hl) ;errors are re-mapable call read2 ;do pre-read, don't move data ret nz ;exit on non=remap error write1: call write2 jr z,r_a_w_check ;if error, ld d,a ;[d]=physical error cp ERwp ;is it write protected? ld a,2 ;write protect error jr z,write1a ;if write protected, say so ld a,1 ;error is permanent write1a: or a ;set flags = error ret r_a_w_check: ;no apparent error, ld a,(read_after_write) ;check user enabled read-after-write bit 0,a ld a,0 ;if not enabled, no error ret z ;if enabled, ld hl,ramdaty+opflag res @inmap,(hl) set @bufok,(hl) ;same as pre-read call read2 ;read the stuff, don't move data ret z ;exit if no error call write2 ;try writing again ld a,1 ;in case error, return permanent ret nz ;exit if error on second write jp read2 ;if written, check again, return read's error read_after_wage ;---------------------------------------------------------------------- rwmove:: ld hl,(ramdaty+dmaadr) ;destination address, (presuming read) ld de,dskbuf ;source address ld bc,0100h ;presume destination is tpa ld a,(ramdaty+dflag) bit @readop,a ;test for write jr nz,rwmov0 ;if write, ex de,hl ; reverse direction of transfer ld bc,0001h ; reverse banks too rwmov0: ld a,(bnkmsk) push af ld a,(dmabnk) ;see if dma to/from tpa bank (2) or a call nz,xmove ;set-up for inter-bank transfer ld bc,(sector_length) ;number of bytes to transfer call move ;make transfer pop af ld (bnkmsk),a ret ;---------------------------------------------------------------------- ;note: the rom is turned on by inter_bank to facilitate migration of code ; from here to rom. all usage of read, write, and format must pass ; through this code so we can perform interrupt management in later ; releases. IY -> Ramdaty rom_on: ;turn rom on set @romio,(iy+opflag) ;we are d a,(Tlev) ;If (the terminal level is non-zero) or a ; (set brightness to HIGH) jr z,BWSkp1 ld c,1Bh ; ConOut:= Escape call conout ld c,'(' ; ConOut:= Open Paren. call conout BWSkp1: ld hl,ramdaty+cflag set @imsact,(hl) ld a,(ramdaty+OpFlag) res @SerD,a ;Clear the Suppress Error Display flag res @SerUR,a ;Clear the Suppress Error Response flag ld (ramdaty+OpFlag),a ld a,10 ;retry count ld (ramdaty+retry),a ;set retry count ld c,0 ;drive a: call seldsk if floppy ld hl,1 ld (ramdaty+hsttrk),hl ;track 1 ld (ramdaty+hstsec),hl ;sector 1 else ld hl,6 ld (ramdaty+hstsec),hl ;sector 6 ld l,h ;[hl]=0 ld (ramdaty+hsttrk),hl ;track 0 endif ld a,1 ld (dmabnk),a ;moves to tpa bank ld hl,tpa ld (ramdaty+dmaadr),hl ;transfer to tpa ld b,4 ;4k to move ld iy,ramdaty bnk_wboot1: push bc ;save sector count call read ;read a sector to dma jr nz,bnk_wboot9 ;if no error, ld (ramdaty+dmaadr),hl ;dma ++ inc (iy+hstsrite: db 2 ;default = pre-reads on write2: push ix ;save ix & iy push iy ld iy,ramdaty ;set-up iy -> ramdaty res @readop,(iy+dflag) ;indicate write call rwmove ;make transfer call rom_on ;turn rom on call wrhsrm ;write to disk or a ;set flags for error push af ;save error call rom_off ;turn rom off pop af pop iy pop ix ret page ;---------------------------------------------------------------------- ; SETEM - Set the error mode (6_Feb_84) ;-------------------------------------- ; SetEM: res @SerD,(iy+OpFlag) ;Clear the Suppress Error Display flag res @SerUR,(iy+OpFlag) ;Clear the Suppress Error Response flag ld a,(@ermde) ;A:= Current system error mode cp 0FFh ;If (Error Mode eq Return) jr nz,SEMsk1 set @SerD,(iy+OpFlag) ; Set Suppress Display flag set @SerUR,(iy+OpFlag) ; Set Suppress Response flag ret SEMsk1: cp 0FEh ;If (Error Mode eq Return & Display) ret nz set @SerUR,(iy+OpFlag) ; Set Suppress Response flag ret pdoing rom block io di ld a,(system_bank_bits) and not $_RMENB ;rom on jr rom_common ;---------------------------------------------------------------------- rom_off: res @romio,(iy+opflag) ;done with rom block io di ld a,(system_bank_bits) or $_RMENB ;rom off rom_common: ld (system_bank_bits),a ;update out (bnkstb),a ei ret ;---------------------------------------------------------------------- xmove:: ;build memory mask modifying $xfer, $bank2, $_rmenb ;result is always non-zero ld a,c ;source bank cp b ;same as dest? ld b,$_RMENB ;presume no xfer, rom off jr z,xmove1 ld b,$XFER or $_RMENB ;set xfer, rom off xmove1: add a,a ;bank *2 for hardware or b ;add bits set above ld b,a ld a,(system_bank_bits) ;include centronics controls and not ($xfer + $bank2 + $_rmenb) or b ld (bnkmsk),a ;set for xmove ret ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- CCP Loader page bnk_wboot:: lec) ;sector ++, no track moves pop bc djnz bnk_wboot1 ld hl,(@mxtpa) ld (lo_mem_copy+6),hl ;set bdos address ld bc,100h ;destination tpa call xmove ld hl,0 ;destination lo-mem ld de,lo_mem_copy ld bc,lo_mem_length call move jp res_wboot ;transfer control thru common bnk_wboot9: ;error has ocurred call rom_on jp bterm ;exit to rom "press reset" lo_mem_copy: jp warmpt nop nop jp warmpt lo_mem_length equ $-lo_mem_copy ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Extended BIOS Functions page bnk_inter_bank: ;continuation of inter_bank ld (save_user_stack),sp ld sp,system_stack ld a,(system_bank_bits) push af ;save for restore and not ($bank2 + $_rmenb) ;indicate rom and sys are on ld (system_bank_bits),a ;now reflects system state ei push hl ld hl,bnk_return ;force return to here ex (sp),hl ;by placing on stack jp (hl) ;execute desired function bnk_return: ;prepare to tone func1: ;write to system memory ;[de] -> dest (sys) ;hl_entry -> source (tpa) ;bc_entry = length ld hl,(hl_entry) ld bc,(bc_entry) jr sys_move func2: ;read ramdaty and apif to [de] ld hl,ramdaty ld bc,mtoff jr tpa_move func3: ;read mtabs to [de] ld hl,ramdaty+mtoff ld bc,5*16 jr tpa_move func4: ;read drvtbl and all DPH to [de] ld hl,drive_table ld bc,32+drives*dphlen jr tpa_move func5: ;read dpb_table and all DPB to [de] ld hl,dpb_table ld bc,dpb_table_leng jr tpa_move func6: ;read character table to [de] ld hl,char_tables ld bc,char_table_length jr tpa_move func7: ;read virtual drive message to [de] ld hl,vmsg ld bc,vmsg_length jr tpa_move func8: ;read free space to [de] ld hl,pool ld bc,pool_length jr tpa_move sys_move: push bc ld bc,1 ;dest = system jr do_move tpa_move: push bc ld bc,100h ;dest = tpa do_move: call xmove ;interbank pop bc push bc push de push hl ex de,hl ;for move  ld iy,ramdaty set @bufok,(iy+opflag) jr f15a func16: ;verify track, non-destructive ld iy,ramdaty res @bufok,(iy+opflag) f15a: ;md11 hard disk sectors are formatted 1,8,6,4,2,9,7,5,3, physically ;interleave for verify makes sequence 1,6,2,7,3,8,4,9,5, every other one ;set b=sector_count, c=interleave_increment, d=sectors_track+1, e=remaps ld bc,0905h ;9 sectors interleaved ld de,0A00h ;10 is illegal sector bit @hrddsk,(iy+phydrv) jr nz,f15a1 ;if floppy ld bc,0501h ;5 sectors, sequentially f15a1: ld (iy+hstsec),1 ;begin at sector 1 f15: push de push bc res @inmap,(iy+opflag) ;reset @inmap call read2 pop bc pop de jr z,f15b0 ld d,a ;cast error code in d, remapped sectors in e ret ;user abort error f15b0: bit @inmap,(iy+opflag) jr z,f15b inc e ;remaps ++ f15b: ld a,(iy+hstsec) add a,c ;interleave cp d jr c,f15c dec d sub d ;- sectors per track inc d f15c: ld (iy+hstsec),a djnz f15 ;do number of sectors ld d,0 ;no errors reexit system bank ex (sp),hl ;get saved bank bits in [h] push af ;preserve returned value ld a,h di ;no interrupts while bits don't reflect system state ld (system_bank_bits),a jp res_bnk_return ;continue above bnk_services: ;extended bios functions ;entry parameters, bc = function number, 0 -> n (b=0) ; de,ix = parameters if needed ;hl_entry and bc_entry are also available ;exit parameters vary ld hl,-max_func add hl,bc jp c,wboot ;kill program if making illegal call ld hl,function_table add hl,bc add hl,bc ld a,(hl) inc hl ld h,(hl) ld l,a jp (hl) ;do function function_table: dw func0,func1,func2,func3,func4,func5,func6,func7 dw func8,bnk_format,bnk_initctc,bnk_inject_ims dw func12,func13,func14,func15,func16,func17 max_func equ ($-function_table)/2 func0: ;read from system memory ;[de] -> dest (tpa) ;hl_entry -> source (sys) ;bc_entry = length ld hl,(hl_entry) ld bc,(bc_entry) jr tpa_move ;tpa_move stepping-s call move pop hl pop de pop bc ret ;func9 equ bnk_format ;func10 equ bnk_initctc ;func11 equ bnk_inject_ims func12: ;enable/disable centronics interrupts [e]=0=disable ;stack currently contains (0)return to bnk_return, (+2)bank bits ;warning, this code is not intended to update centronics bits in iy.cpybnk ;this discipline will cause centronics interrupts to be disabled automatically ;during rom execution pop hl pop af ;get the bits ld d,a ;previous state res 7,a ;centronics interrupts off bit 0,e ;was this an enable? jr z,func12a set 7,a func12a: push af ;back on stack jp (hl) ;and exit func13: ;enable/disable disk read after write, [e]=0=disable, 1=enable ;enable/disable disk read before write, 2=enable ;[e] contains bit mask ld hl,read_after_write ld d,(hl) ;return what it was before ld (hl),e ret func14: ;execute in bank 1 (sys) at [hl] ld iy,ramdaty ld hl,(hl_entry) ld bc,(bc_entry) jp (hl) func15: ;verify track, destructive t ;normal exit func17: ;modify contents of cflag to contents of [e], return previous in [d] ld hl,ramdaty+cflag ld d,(hl) ld (hl),e ret ;---------------------------------------------------------------------- bnk_format:: ;enter with [de] -> old micro decision mtab/dpb pair, as on media ; [ix] -> user's APIF area ; apif.hstdsk = logical drive to format ; apif.hsttrk = track for format ; apif.hstsec -> sector table (in reverse order) push ix ;save for exit ld iy,ramdaty push de ;save mtab push ix pop hl ;source is user's apif ld de,apif ;dest is system apif ld bc,aileng ;count is length of apif call sys_move ;copy user's to system ld a,(iy+hstdsk) ;apif.drive from user call gdsk ;get its mtab bit @hrddsk,(hl) ;see if harddsk pop de ;restore user's mtab jr z,formf ;if hard disk ld e,1 ;secondary select ld c,(iy+hstdsk) call seldsk ;secondary select jr form8 formf: ;login floppy by writing format's copy o_on ;rom is on, but chario needs to know call fmthst ;format the track pop de ;destination is user's apif push af call rom_off ld hl,apif ld bc,aileng call tpa_move ;copy to user, return to caller pop af ;restore error ld d,a ;cast in [d] ret ;---------------------------------------------------------------------- gdsk: ;enter [a] = drive, [iy] or [hl] -> ramdaty ;return [hl] -> drive's MTAB push iy ;get iy into hl pop hl gdsk1: ld de,MToff ;calc. mtab pointer add hl,de rlca ;multiply drive by 16 rlca rlca rlca ld e,a ;add (16 * drive) to pointer add hl,de ret ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Data Structure, DPH page drvtbl:: ld hl,drive_table ret drive_table: table_gen dph ds (16-drives)*2,0 dpbase: struct_gen dph dphlen equ dphb-dpha dph_struct_len equ $-drive_table ;---------------------------------------------------------------------- SUBTTLlocated sector number ; db 0 ;(UNAMAX) Sectors per Unallocated block dw 0 ;(SECTRK) Logical Sectors per track ; db 0 ;(PHYSPT) Physical sectors per track db 0 ;(WRTYPE) Write type db 0 ;(CFLAG) Flag Byte (initialized from chr_tbl db 0 ;(DFLAG) Flag Byte db 0 ;(TRSEC) Offset to logical sector within physical sector dw vmsg ;(VMSGP) Pointer to virtual drive message ; dw vdrv ;(VDRVP) Pointer to virtual drive in message ; db 0FFh ;(CDSK) Current drive db cvdsk ;(VDSK) Current virtual drive dw 2800h ;(DMAADR) disk DMA address ; dw jcono ;(CONOUT) Pointer to Current console output routine ; dw jconi ;(CONIN) Pointer to Current console input routine ; dw jcons ;(CONSTS) Pointer to Current console status routine db $CNTRST ;(CPYBNK) Copy of bank strobe (printer restore = false) ;rom is on, bank 1 (system) is on, used only by rom, ;see system_bank_bits ;---------------------------------------------------------------------- ; Defauf disk info to diskbuf push de ;[de] -> new MTAB pointer (source) ex (sp),hl ;save system mtab ld de,dskbuf+80h ;ID area is destination ld bc,dsktln ;length call sys_move ;copy to system pop hl ;restore system mtab call fmtlog ;format logon for floppy form8: ld l,(iy+hstsec) ;get pointer to gap stuff ld h,(iy+hstsec+1) ld de,fmtbuf ;destination in system bank ld bc,3 ;3 bytes for gap table call sys_move ;move from tpa to sys add hl,bc ;update [hl] for sector table push hl ;save source for sector table ld a,(ramdaty+hstdsk) call gdsk ;get the mtab bit @hrddsk,(hl) ;test for hard disk ld hl,fmtbuf+3 ;table space for hard disk ld c,(iy+physpt) ;length is physical sectors per track ld b,0 ld de,0 ;zero additional offset for hard disk jp nz,formt1 ld de,12-3 ;additional offset for floppy formt1: add hl,de ex de,hl ;destination in [de] pop hl ;restore source pointer call sys_move ;move to system from tpa call rom Banked BIOS -- Data Structure, DPB page dpb_table: ;table defines logical to physical mapping of dpb's. ;structure is same as drive_table, all dph point at same dpb_buf ;in common. table_gen dpb dw 0 ;terminator struct_gen dpb dpb_length equ 17 dpb_table_leng equ $-dpb_table ;default single-sided disk dpb, not part of table sdpb:: dw 40 db 4 db 15 db 1 dw 94 dw 127 db 0c0h db 0 dw 32 dw 2 db 3,7 SUBTTL Banked BIOS -- Data Structure, RAMDATY, APIF page ;---------------------------------------------------------------------- ; General Disk Operations Data Area (1_Sept_83) ;---------------------------------------------- ; ramdatY:: db 0 ;(SEKDSK) BDOS disk number dw 0 ;(SEKTRK) BDOS track number ; dw 0 ;(SEKSEC) BDOS sector number ; dw 0 ;(SEKHST) Actual sector number on the disk ; db 0 ;(UNACNT) Unallocated record count db 0 ;(UNADSK) Unallocated disk number dw 0 ;(UNATRK) Unallocated track number ; dw 0 ;(UNASEC) Unallt Application Interface area (13_Oct_83) ;----------------------------------------------- ; APIF:: db 0 ;(HSTDRV) BDOS Drive Number (1st floppy) dw 0000 ;(HSTTRK) Desired Cylinder (lo) ; Desired Cylinder (hi) dw 1 ;(HSTSEC) Desired Sector (lo) ; Desired Sector (hi) db 1 ;(SECCNT) Number of sectors to transfer db 10 ;(RETRY) Retry Count dw dskbuf ;(HSTBUF) Buffer Address (lo) ; Buffer Address (hi) db 0 ;(ERFLAG) Error Code db 0 ;(OPFLAG) Options Flag dw 0 ;(PHYTRK) Physical track number (lo) ; Physical track number (hi) db 0 ;(PHYSEC) Physical sector number db 0 ;(PHYHD) Desired Head db 2 ;(PHYDRV) Physical Drive Number dw 0 ;(IOADD) Execution Address (lo) ; Execution Address (hi) SUBTTL Banked BIOS -- Data Structure, MTABs page mtab:: struct_gen mt SUBTTL Banked BIOS -- Free Space Pool page pool:: ;beginning of managed space xltab:: db 0 dw 5 xlt1k:: db 1,4,2,5,3 db 0feh ; console xl,'HELP',0dh db 6Fh,5,'HELP',0dh db 0Fh,5,'HELP',0dh ;Help Key db 4Eh,1,18h db 6Eh,1,18h db 0Eh,1,18h ;Home/Clear db 49h,1,18h db 69h,1,0bh db 09h,1,0bh ;Erase db 1ah,1,9h db 1bh,1,9h ;Tab function_table_length equ $-translation_table pool_length equ $-pool ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Chatacter I/O, Initialization page bnk_initctc: ;initialize serial list for hardware handshake if req'd ld a,(system_bank_bits) and not $cntrst ;restore centronics out (bnkstb),a ;exiting this bank lifts restore ;since not_restore is not saved, makes ;restore signal big & fat. ld a,(default_cflag) ;defaults from SETUP.COM ld (ramdaty+cflag),a ;cast to system ;Setup Handshaking for the list device ld a,0ffh ;XON flag ld (lstflg),a ;set flag ld a,3 out (s2stat),a ;select reg 3 ld a,(ramdaty+cflag) bit @hwsync,a ld a,11000001b ;8bits/char, rxon jr z,intct1 ld a,111000mer lo inc hl out (c),a ld a,(hl) ;timer hi out (c),a ret getval: ;index into baudtbl using [A], leaving [HL] on value ld hl,baudtbl ;base of bit rate values add a,a ;*2 ld c,a ld b,0 add hl,bc ret baudtbl: dflt1 equ 6 ;console 9600 baud dflt2 equ 3 ;list 1200 baud dflt3 equ 3 ;sio 1200 buad dw 1136 *2 ;110 dw 417 *2 ;300 dw 208 *2 ;600 dw 104 *2 ;1200 dw 52 *2 ;2400 dw 26 *2 ;4800 dw 13 *2 ;9600 dw 13 ;19,200 dw 1 ;reserved dw 1 ;reserved dw 1 ;reserved ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Character I/O, Translation Level page bnk_const: ld a,(ramdaty+cflag) ;get cflag bit @funact,a ;see if function key IMS is active ld a,0ffh ;set ready in case ret nz ;ret if function key call ims_chk ;see if IMS o.k. ld a,0 ;set not ready in case ret z ;ret not ready if IMS o.k. jp ser1_input_status leadin equ 1ch translate_input: calt table dw clen esctbl: db 0ffh ctrltbl:db 0ffh escvect:dw 0 ctvect: dw 0 ; translation strings for the terminal go here ;--------------------------------------------- ; clen equ $-esctbl db 0ffh ;End of Free Space Header dw 870 ;Initial Free Space Length ds 400,0 Sign_On_Start: db cr, lf, 'CP/M Plus -- Ver 3.0 Rev ' db ((BioRev and 0f0h) shr 4) + '0','.',(BioRev and 0Fh) + '0' db cr,lf,'Copyright 1982, 1983 Digital Research, Inc.' db cr,lf,'Copyright 1983, 1984 Morrow Designs, Inc.' db cr,lf,0 Sign_On_End: Sol equ Sign_On_End - Sign_On_Start ds (470 - Sol), 0 db 0fdh ;Ims Buffer Header dw 0 ;Ims Length db 0fch ;Function Table Header dw function_table_length ;Function Table Length translation_table: db 23 ;# entries db 4ah,1,2 db 6ah,1,17h db 0ah,1,17h ;up arrow db 4bh,0 db 6bh,0 db 0bh,0 ;down arrow db 4ch,1,8 db 6ch,1,1 db 0ch,1,8 ;left arrow db 4dh,1,20h db 6dh,1,6h db 0dh,1,7h ;right arrow db 4Fh,501b intct1: out (s2stat),a ;8bits/char, auto, rx on in a,(s2stat) ;Read status register once to clear it ;Setup Handshaking for the aux device ld a,3 out (s3stat),a ;select reg 3 ld a,(ramdaty+cflag) bit @siosyn,a ld a,11000001b ;8bits/char, rxon jr z,intct2 ld a,11100001b intct2: out (s3stat),a ;8bits/char, auto, rx on in a,(s3stat) ;Read status register once to clear it ;initialize all 3 bit rate generators ld a,(ser1baud) ;index for table call getval ld a,0beh ;mode word for channel 2, mode 3 ld c,baud0 ;set-up channel 2 for serial 1 CON: call setbaud ld a,(ser2baud) call getval ld a,07eh ;mode word for channel 1, mode 3 ld c,baud1 ;set-up channel 1 for serial 2 LST: call setbaud ld a,(ser3baud) call getval ld a,03eh ;mode word for channel 0, mode 3 ld c,baud2 ;set-up channel 0 for serial 3 SIO: ;do setbaud setbaud: ;set channel mode from [A], output 2 bytes from (hl) to (c) out (baudset),a ;set mode ld a,(hl) ;til getchr ;get a character from current source cp leadin ;check for function key lead-in ret nz ;back to cp/m if not ld hl,ramdaty+cflag bit @xl_in,(hl) ret z call getchr ;get function key identifier push af ;save char ld a,0fch ;function table call find inc hl pop af ;restore char call scan ;look for key jp nc,fcn2 ;if not found, set parity,a ;mark as function with parity bit=1 ret fcn2: ld a,(hl) ;check for string length = 0 or a ex de,hl ;[de]->string.length call nz,inject_ims ;inject string into ims jp translate_input ;get first character in sequence ;recurse if required ;---------------------------------------------------------------------- bnk_inject_ims: ;available to tpa programs ld a,1 ;external inject ld (ims_flag),a ;set flag ex de,hl ;source is [de] on entry ld bc,1 ;1 byte ld de,ims_length_byte ;destination call sys_move ;read length byte ex de,hl ;point at user's string ld bc,1 ;dest at IMS.head (=fd) inc hl ;[hl] -> ims.len(lo) ld e,(hl) ;read ims.len inc hl ld d,(hl) ex de,hl ;[hl]=ims.len, [de]->ims.len(hi) add hl,bc ;ims.len = ims.len + string.len ex de,hl ;[hl] -> ims.len(hi) sbc hl,bc ;ims.address = ims.address - string.len ld (hl),d ;write new ims header, ims.len(hi) dec hl ld (hl),e dec hl ld (hl),0fdh ;ims head complete inc hl inc hl inc hl ;[hl] -> destination, ims buffer pop de ;[de] -> source, text call move ;copy string, may be from tpa or sys ex de,hl ;[de] -> destination end, ims buffer ld hl,ramdaty+cflag ld a,(ims_flag) ;get IMS type flag or a jr z,fcn5 ;jmp if internal bit @imswet,(hl) jr z,fcn4 ;if ims already contains characters, bit @imsact,(hl) jr nz,fcn4 ;but is deactivated, dec de ; then point at last char, this string, ld a,(de) set parity,a ; and mark it to turn-off ims at end of this string ld (de),a fcn4: set @imswet,(hl) ;activate ims set ame as inc hl add hl,de ;next element scan1: djnz scan0 ;do until out of elements scf ;abnormal exit ret ;------------------------------------------------------------------- ;IMS_CHK - Check if IMS and/or ROM are active. ; ret: 0 if IMS active and ROM in-active ; 1 otherwise ;------------------------------------------------------------------- ; ims_chk: ld a,(ramdaty+cflag) ;get cflag and 0c0h ;mask out ims flags cp 0c0h ;check if ims active ret nz ;ret if not active ld a,(ramdaty+opflag) ;check input for rom error or vdisk bit @romio,a ;1=rom is getting characters ret ;ret: 0 if rom not processing ; 1 if rom processing ;---------------------------------------------------------------------- ; GETCHR - Input a Character from the Console or the Submit Buffer ;---------------------------------------------------------------- ; getchr: ld a,(ramdaty+cflag) ;get cflag bit @funact,a ;see if function key IMS is active jr nzination is sys for move below call xmove ld a,(hl) ;get length byte from ims_length_byte jr inject_ims2 ;[de] -> input string in tpa ims_length_byte: db 0 ;storage (dest for interbank move) inject_ims: ;enter with [DE] -> string with length byte first, ; exit with IMS active ld a,0 ;internal inject ld (ims_flag),a ;set flag ld a,(de) ;get length byte inject_ims2: ld c,a ;save ld b,0 inc de ;point at string text push de ;save string address ld a,0ffh ;free marker call find ;[de]=free length ;[hl]->free.leng(hi) push hl ;save free address ld h,d ld l,e ;[hl]=free length or a ;[cy]=0 sbc hl,bc ;free.len = free.len - string.len jr c,noims ;if not out of space, ex de,hl ;[de]=new free.len ex (sp),hl ;[hl]=free.address (save old length) ld (hl),d ;write new free.len(hi) dec hl ld (hl),e ;write new free.len(lo) inc hl inc hl ;[hl] -> free.data_area pop de ;[de] = old free.len add hl,de ;point@imsact,(hl) ret ;exit with carry = clear fcn5: dec de ;point at last char, this string, ld a,(de) set parity,a ;and mark it to turn-off ims at end of this string ld (de),a set @funact,(hl) ;set function key IMS active ret noims: ;enter here if no ims available pop de ;drop pop de ;drop ret ;exit with carry = set ims_flag: db 0 ;type of inject IMS ;0 = internal function key ;1 = external ;---------------------------------------------------------------------- ; SCAN - Search for key in table ;------------------------------- ; enter with [hl] -> table to be searched ; [a] = key to search for ; form of table is: ; element_count (byte) ; element_list (string) ; :: element = length (byte) ; string (text) scan: ld d,0 ld b,(hl) ;element count inc b inc hl ;point at key jr scan1 scan0: cp (hl) ;key we're looking for? inc hl ;point at string.length ret z ld e,(hl) ;not key, so get length inc e ;s,subgo ;get char. call ims_chk ;see if IMS o.k. jp nz,ser1_input ;jmp if no IMS submt: call ser1_input_status jr z,subgo ;then if input ready, call ser1_input ; get the character and 7fh cp 3 jr nz,subgo ;then if control-c drop_ims: ; empty the ims buffer ld a,0fdh ;ims call find ;get count push de ;save length ld a,0ffh ;free call find ex de,hl ;[hl]=free.len pop bc ;[bc]=ims.len add hl,bc ;[hl]=total space ex de,hl ;[hl]=free.len(hi) ld (hl),d dec hl ld (hl),e ;reset free length inc hl inc hl ;[hl] -> free.data space add hl,de ;[hl] -> end of free space ld (hl),0fdh ;ims header inc hl ld (hl),0 inc hl ld (hl),0 ;reset ims.len ld a,(ramdaty+cflag) ;de-activate ims res @imsact,a res @imswet,a ld (ramdaty+cflag),a ld a,18h ret ;endif subgo: ;else, else ld a,0ffh ;free space code call find ;find free space inc de ;update free space pointer ld (hl),d dec hl ld (hl),e add xt block add hl,de jr find0 ;keep looking ;---------------------------------------------------------------------- ; Console Output with escape sequence translation ;------------------------------------------------ ; ; on entry to xlate, register c contains the character to be output. ; a test is made to see if the system is in the process of outputing ; a multiple character escape sequence, or if the character is a ; morrow standars control code. if neither test is true, than the ; character is output. ; if the character is part of a multiple character escape sequence, ; then the character is passed to the escape routine. if the ; character is a mscc, then it is converted to the appropriate ; sequence, and output. ; esccod equ 1bh translate_output: ld a,(ramdaty+cflag) bit @xl_out,a jp z,ser1_output ;if translation is enabled, ld a,(esc_lvl) ; test escape flag or a ; check if flag is set jr nz,escape ; if escape sequence, jump ld a,1fh ; test if mscc cp c jpe of ffh is detected. ; outstr: add hl,bc ; add offset to base ld e,(hl) ; get location of string inc hl ld d,(hl) ex de,hl ; move address of string to hl loop: ld a,(hl) ; get a char cp 0ffh ; see if done ( ffh==>done) ret z ld c,a ; if not, get char call ser1_output ; xmit it inc hl jr loop ; until end of string page ;---------------------------------------------------------------------- ; ESCAPE - Cursor - Escape_Sequence Translation ;---------------------------------------------- ; ; this routine is used to create a string for direct ; cursor addressing, or to translate character codes. ; upon receipt of an escape code from ; a program, the esc_lvl is set to indicate an escape ; sequence is being output. when the next character is ; received, it is tested to see if it is an equals sign (=). ; if it is not, than an escape character is output, followed ; by the character received. if the character is the equal sign, ; then two more characters willhl,de ;set hl ==> ims buffer inc hl inc hl ld e,(hl) ;update ims buffer header ld (hl),0fdh inc hl ld d,(hl) dec de ld (hl),e inc hl ld a,e ;see if last char. or d ld a,(ramdaty+cflag) jr nz,skp1 ;jmp if not last char. res @imswet,a ;clear imsbuf flag skp1: bit parity,(hl) ;check parity bit of char. jr z,skp2 ;jmp if parity = 0 bit @funact,a ;see if function key IMS is active res @funact,a ;clear function key IMS jr nz,skp2 ;skip if function key was active res @imsact,a ;de-activate ims skp2: ld (ramdaty+cflag),a ;save cflag ld a,(hl) ;get char. ld (hl),d ;finish updating ims block header res parity,a ret ;---------------------------------------------------------------------- find: ;locate block in pool with id in [a] ld hl,pool find0: cp (hl) ;see if header code matches inc hl ;increment pointer ld e,(hl) ;get offset to next block inc hl ld d,(hl) ret z ;return if block found inc hl ;set pointer to ne c,ser1_output ; if not, then xmit it ld a,esccod ; check if esc char cp c jp nz,notesc ; if not, jump ld a,1 ; otherwise, set escape ld (esc_lvl),a ; level to 1st stage ret ; and return notesc: ld hl,(ctblptr) ; set to search control table call lookup ; and lookup character in table or a ; see if char found jp z,ser1_output ; if not, output char ld hl,(cvctptr) ; calculate string location ;---------------------------------------------------------------------- ; OUTSTR - Output a string of characters to the console ;------------------------------------------------------ ; ; this routine outputs a string of characters to the console. ; it is used by the translate program to output a terminal ; specific string in order to implement a control sequence. ; when entered, the hl register pair points to the base of ; the string table, and the bc register pair is the offset ; to the string. characters are output starting with the ; first character until a byte valu be accepted, after-which a string ; will be output for positioning the cursor. ; escape: ld a,(esc_lvl) ; get current escape level cp 1 ; level 1? jr z,seq1 ; then process 1st part cp 2 ; level 2? jr z,seq2 ; then process 2nd level jr seq3 ; it must be level 3 ; seq1: ld a,'=' ; equal sign? cp c ; if char is =, then dca started jr z,set ; else, could be character to xlate xor a ; clear escape level ld (esc_lvl),a ld hl,(etblptr) ; point to xlate table call lookup ; lookup character or a ; see if char found jr nz,down ; if found, jump to output push bc ld c,esccod ; else, send escape, then char call ser1_output ; send escape pop bc ; get original character jp ser1_output ; send it down: ld hl,(evctptr) ; calculate string location jr outstr ; output the string set: ld a,2 ; otherwise, set for level 2 ld (esc_lvl),a ; processing ret ; and return seq2: ld a,c ld (first),a ; this is the first char ld a,3 ; setget char to output ld c,a pop af call nz,ascout ; call ascii if flag set call ser1_output ; output char outend: ld hl,dcaend ; point to dca terminator jp loop page ;---------------------------------------------------------------------- ; LOOKUP - Lookup a table ;------------------------ ; ; this routine is entered with the hl register pair pointing to ; the base of a table to be searched. register c contains the ; character to search for. upon return, the accumulator will ; contain 0 if the character was not found, and ffh if it was found. ; if the character was found in the table, then bc will contain ; the offset into the table, multiplied by 2. i.e bc / 2 = location ; of character in table. the maximum number of values in the table is ; 20 h. ; lookup: ld b,0 ; init offset nmtch: ld a,(hl) ; get value from table cp 0ffh ; see if end of table jr z,nochar ; jmp if end cp c ; see if char matches jr z,mtch ; jmp if match inc hl ; inc table pointerevel page bnk_list: ld a,(ramdaty+cflag) bit @cenlst,a jr nz,centout lstdrv: call bnk_listst ;get serial handshake status jr z,lstdrv ;idle until ready jp ser2_output ;do output centout: call cent_status ;status jr z,centout ;wait for ready jp cent_output ;---------------------------------------------------------------------- bnk_listst: ld a,(ramdaty+cflag) bit @cenlst,a ;if centronics list jp nz,cent_status bit @hwsync,a ;check handshake mode jr nz,nolx ;jmp if not XON-XOFF call ser2_input_status call nz,ser2_input ; get a character or null cp 13h ; if xoff r'cvd... jr nz,nxtchk ; if not, check if xon ld a,0 ; set flag to not rdy ld (lstflg),a ret ; return not rdy nxtchk: cp 11h ; if xon, then it might be ready jr nz,chkflg ; else, state not changing ld a,0FFh ld (lstflg),a ; set flag to rdy chkflg: ld a,(lstflg) ; get status flag lstret: or a ; set flags ret z ; if zero, then xoff pending nolx: jp ser2_ for level 3 ld (esc_lvl),a ret seq3: ld a,(offset2) ; get offset for 2nd char add a,c ; add to 2nd char ld (second),a ; save 2nd char ld a,0 ld (esc_lvl),a ; clear escape sequence ld de,first ; pointer to 1st char ld a,(de) ; get 1st char ld c,a ; save in c ld a,(offset1) ; get offset for 1st char add a,c ; add to 1st char ld (de),a ; save 1st char ld a,(order) push af rra sbc a,a ; 0==>1-2 : ff==>2-1 ld b,a ; save order in b ld a,e ; use order to adjust de sub b ld e,a ; de points to 1st char to output ld hl,dcastrt ; pointer to dca prefix sting call loop ; output string ld a,(de) ; get 1st char to output ld c,a pop af bit 1,a ; see if ascii push af call nz,ascout ; call ascii if nz call ser1_output ; output char ld hl,dcamid ; pointer to seperator string call loop ; output string ld a,e ; use order to adjust de add a,b inc b add a,b ld e,a ; de points to 2nd char to output ld a,(de) ;  inc b ; inc offset inc b ; " " jr nmtch ; continue search mtch: ld c,b ; put offset in bc ld b,0 ld a,0ffh ; set a to success ret nochar: xor a ; set a to failure ret ;---------------------------------------------------------------------- ; ASCOUT - Output a byte in decimal ascii ;---------------------------------------- ; ; ascout takes a binary value in c and output its decimal ascii ; equivalent. ; ascout: push bc ld a,c ld c,'0' ;init to ascii 0 tens: sub 10 ;subtract 10 from value jr c,ones ;jmp if underflow inc c ;inc ascii tens value jr tens ;loop ones: ld b,a ;save intermediate value ld a,'0' ;a = ascii 0 cp c ;see if tens value is 0 call nz,ser1_output ;output tens value if not 0 ld a,3ah ;ascii 0 plus 10 add a,b ;add to produce ones value pop bc ld c,a ;get ready for output ret ;---------------------------------------------------------------------- SUBTTL Banked BIOS -- Character I/O, Device Loutput_status lstflg: db 0FFh ;X-on X-off (initial value = 0FF) page ;---------------------------------------------------------------------- ; Console Device Drivers ;----------------------- ; ser1_input_status: in a,(s1stat) and 1 ret z ld a,-1 ret ser1_input: call ser1_input_status jr z,ser1_input in a,(s1data) and 7fh ret ser1_output_status: in a,(s1stat) and $txrdy ret z ;exit if none ld a,-1 ret ser1_output: call ser1_output_status jr z,ser1_output ;wait for prev char ld a,c and 7fh out (s1data),a ret page ;---------------------------------------------------------------------- ; Serial List Device Drivers ;--------------------------- ; ser2_input_status: in a,(s2stat) and 1 ret z ld a,-1 ret ser2_input: call ser2_input_status jr z,ser2_input in a,(s2data) and 7fh ret ser2_output_status: in a,(s2stat) and $txrdy ret z ;exit if none ld a,-1 ret ser2_output: call ser2_output_status jr z, ld b,10 cntdly: djnz cntdly ;delay and not $CNTSTB out (bnkstb),a ;strobe off ei ret SUBTTL Resident BIOS -- Jump Table page ;---------------------------------------------------------------------- cseg ;resident ;---------------------------------------------------------------------- bios: jp boot ;arrive here from cold start load warmpt: jp wboot ;arrive here for warm start jcons: jp const ;return console input status jconi: jp conin ;read console character jcono: jp conout ;write conlole character jp list ;write list character jp auxout ;write aux character jp auxin ;read aux character jp home ;move to track zero on selected drive jp seldsk ;select disk drive jp settrk ;set track number jp setsec ;set sector number jp setdma ;set DMA address jp read ;read selected sector jp write ;write selected sector jp listst ;return list device status jp sectrn ;translate logical to physical sector number jp conost ;return console output status jp the system_stack save/restore routines shall reside in common. ; 5.) the call_bank/restore_bank routines shall reside in common. ; 6.) access to rom code shall never be made from common, only ; from the banked part of the bios (except for error exits) ; 7.) routines may be freely moved from the banked part to rom ; when doing so does not require co-binding of rom and bios. ; ; observing the above will make life more pleasant and will prevent ; brutalizations of our personal joules. ; ;---------------------------------------------------------------------- devtbl:: ld hl,0 ;no table time:: devini:: userf:: ld a,-1 ret ;---------------------------------------------------------------------- SUBTTL Resident BIOS -- Bank Crossing Routines page res_wboot: ld hl,(vnumb) ;get drive & terminal level ld a,1 ;tpa call selmem ;switch to tpa bank ld (8),hl ;save in page0 jp tpa services:: ;hook-up with bios extensions ld (hl_entry),hl ld (bc_entry),bc ld b,0 ld c,a ser2_output ;wait for prev char ld a,c and 7fh out (s2data),a ret ;---------------------------------------------------------------------- ; Auxilary List Device Drivers ;----------------------------- ; ser3_input_status: in a,(s3stat) and 1 ret z ld a,-1 ret ser3_input: call ser3_input_status jr z,ser3_input in a,(s3data) and 7fh ret ser3_output_status: in a,(s3stat) and $txrdy ret z ;exit if none ld a,-1 ret ser3_output: call ser3_output_status jr z,ser3_output ;wait for prev char ld a,c and 7fh out (s3data),a ret page ;---------------------------------------------------------------------- ; Centronics Parallel Device Driver ;---------------------------------- ; cent_status: in a,(cstat) and $CNTRDY ;test for busy = zero ret z ;exit false xor a dec a ;set true ret cent_output: ld a,c ;get char and 7fh out (cdata),a ;write data di ld a,(system_bank_bits) or $CNTSTB out (bnkstb),a ;strobe on  auxist ;return aux device input status jp auxost ;return aux device output status jp devtbl ;return address of character i/o table jp devini ;init character i/o devices jp drvtbl ;return address of disk drive table jp multio ;set number of consec. sec. to read/write jp flush ;flush user [de]blocking buffers jp move ;copy memory to memory jp time ;clock support jp selmem ;select memory bank jp setbnk ;set bank for next DMA jp xmove ;set banks for next move jp userf ;reserved for me. jp wboot ;reserved for DRI jp wboot ;reserved for DRI dpb_buffer: ds dpb_length,0 ;current dpb must be in common ;---------------------------------------------------------------------- ; BANKING CONSIDERATIONS ; we all live by rules, the following shall be observed: ; 1.) the routines SELMEM and MOVE shall always reside in common. ; 2.) interrupt entry points shall always reside in common. ; 3.) the interrupt save/restore routines, and the sytem stack ; shall always reside in common. ; 4.) ld hl,bnk_services jr inter_bank hl_entry: ds 2,0 bc_entry: ds 2,0 wboot:: ld hl,bnk_wboot jr inter_bank ;note, return_from_inter_bank not executed const:: ld hl,bnk_const jr inter_bank conin:: ld hl,translate_input jr inter_bank conost:: ld hl,ser1_output_status jr inter_bank auxin:: ld hl,ser3_input jr inter_bank auxist:: ld hl,ser3_input_status jr inter_bank auxost:: ld hl,ser3_output_status jr inter_bank auxout:: ld hl,ser3_output jr inter_bank listst:: ld hl,bnk_listst jr inter_bank list:: ld hl,bnk_list jr inter_bank conout:: ld hl,translate_output jr inter_bank ;---------------------------------------------------------------------- inter_bank: ;transfer control to bank 1 (sys), and force path back ; ;note: this code passes control to the system bank for all character io, ; and others which should be in common. to facilitate migration ; of code from system bank to rom, the rom is turned on here. ; note that res_d ;[hl]updated ;[bc]=0 ld a,(bnkmsk) ;see if xmove or a ;test jr z,move1 ;if xmove, di ;no interrupts during interbank xfer out (bnkstb),a ;select desired bank, rom off xor a ld (bnkmsk),a ;clear bank mask move1: ex de,hl ldir ;move ex de,hl ld a,(system_bank_bits) out (bnkstb),a ei ret bnkmsk: db 0 ;non-zero desired bank bits init in xmove ;---------------------------------------------------------------------- selmem:: ;select memory now, [a]=desired bank, 0 or 1 push hl ld hl,system_bank_bits di res 1,(hl) ;presume bank 0 add a,a ;*2 for bnkstb or (hl) ;switch to bank 1?? ld (hl),a ;update pop hl out (bnkstb),a ;set hardware ei ret ;note: the system_bank_bits are used by the bios to control bank switching ; and the centronics port. Ramdaty.CPYBNK is not used because it does ; not reside in common. This byte is initialized in boot2 ; system_bank_bits: db 0 ;Setup in Boot2 ($cntrst ! rom-off) ;---------se interrupt_stack equ 0ffc6h save_int_stack equ 0ffc6h ;note, the interrupt stack is overwritten by ;the system stack (which is small) during ;warm boot (which is the only time the rom uses ;the system stack, and runs it down to 0ffaah, ;but character interrupts are off by then.) system_stack equ 0ffd6h save_user_stack equ 0ffd6h ;reserved space, interupt vectors: ;ffd8-ffdf 4 vectors for sio/9 ;ffe0-ffef 8 vectors for dart ;fff0-fff9 5 vectors for disk system and centronics ;fffa-fffb redirection vector reserved for spool rsx ;fffc-fffd redirection vector available ;fffe-ffff redirection vector reserved for minimon break (rst 30h) end bdos can request the system bank, then pass control ; to bnk_bdos, and bnk_bdos can request character io while the system ; bank is already on, thus, the rom control bit is tested to prevent ; double execution. ld a,(system_bank_bits) ;get current bits bit 0,a ;see if rom already on jr nz,inter_bank2 ;if rom already on, jp (hl) ; don't do this twice, exit now. inter_bank2: ;rom is not on yet, and not ($bank2 + $_rmenb) ;select rom, bank1 di ;no interrupts while system_bank_bits don't reflect system out (bnkstb),a jp bnk_inter_bank ;do more below ;inter_bank continues in sys_bank, res_bnk_return begins in sys_bank res_bnk_return: ;return control to bank 2 (tpa) out (bnkstb),a ;restore bank 2 (tpa) ei pop af ;restore pop hl ld sp,(save_user_stack) ret ;---------------------------------------------------------------------- SUBTTL Resident BIOS -- Inter_bank Moves, Bank control page move:: ;[de]=source ;[hl]=dest ;[bc]=count ;[de]update------------------------------------------------------------- SUBTTL Resident BIOS -- Interrupt Handling Routines page interrupt_save: ;routine is called by interrupt entry ex (sp),hl ;save hl, get return ld (save_int_stack),sp ;save stack ld sp,interrupt_stack push af ;save [af] push hl ld hl,interrupt_exit ex (sp),hl ;save a return to exit jp (hl) ;ret ;interrupt service routines are responsible for saving [bc],[de] if used interrupt_exit: pop af ld sp,(save_int_stack) pop hl ei reti centronics_isr: call interrupt_save ld a,(system_bank_bits) push af ;save res 0,a ;rom off set 1,a ;bank 2 (tpa) on out (bnkstb),a ld hl,centronics_exit push hl ld hl,(0fffah) ;redirection vector jp (hl) centronics_exit: ;restore system pop af out (bnkstb),a ret ;---------------------------------------------------------------------- SUBTTL Resident BIOS -- Stacks and Interrupt Vectors page ;high ram definitions, not much space, be spar ;------------------------------------------------ ; ; Copyright 1983 ; Morrow Designs, Inc. ; San Leandro, Ca. ; John Zalabak ; ; ; This module is included in all of the MD11 source files. It ; contains all of the definitions which a) need to be globally accessed, ; (e.g. the ASCII character equates) and/or b) definitions which need to ; be globally managed (e.g. address definitions). ; Address definitions deserve further comment. ALL address usage ; is declared in this module. This is done to make memory management ; easier. It is NOT done to facilitate the sharing of data between ; modules. This practice should be avoided within this piece of software. ; Parameters are passed by using the General Operations Data ; Area. Provisions have been made in the cbios to overlay the user ; application interface portion of the general operations data area. ; ; Index of Definition Module ;--------------------------- ; ; Identification Information ; ASCII character equates ; ; Module Start ; Module Starting Addresses (28_Nov_83) ;-------------------------------------- ; o_main equ 0 ;Main line (hd*main.mac) o_io equ 220h ;Rom Level I/O (hd*io.mac) o_bios equ 380h ;Rom Level Bios Support (hd*bios.mac) o_dsk1 equ 600h ;Hi-Level Disk Drivers (hd*dsk1.mac) o_dsk2 equ 0F00h ;Lo-Level Disk Drivers (hl*dsk2.mac_) o_test equ 1900h ;Test and Diagnostics (hd*test.mac) o_hirm equ 1E00h ;Code for hard disk drivers (hd*hirm.mac) ; General Address Definitions (14_Nov_83) ;---------------------------------------- ; rom equ 0 ;Start of the ROM Memtop equ 0FFFFh ;Top Most Address of memory CSboot equ 0FE00h ;Cold Start Boot loader execution location combuf equ 0FE00h ;Start of the Common Buffer for disk operations ramdat equ 0FC00h ;Start of the default IX, IY and MTABs stack equ 0FC00h ;Stack dskbuf equ 2800h ;Start of the Disk Buffer prebuf equ dskbuf - 20h ;Main Entry Point to the read/write routines postbuf equ dskbuf + 400h ;End of the disk buffer genbuf equ u genbuf+7 ;Current Retry count blocks equ genbuf+8 ;Number 32 byte blocks for current sector size filchr equ genbuf+9 ;Fill byte (4E or FF) savpc equ genbuf+10 ;Save Location for the value of write pre-comp savlc equ genbuf+11 ;Save Location for the value of low current cyltbl equ genbuf+12 ;Table of drive's Current Cylinder positions badtrk equ genbuf+20 ;Bad Map Track Number (lo byte) ; " " " " (hi byte) badhd equ genbuf+22 ;Bad Map Head badsec equ genbuf+23 ;Bad Map Sector badoff equ genbuf+24 ;Offset to start of bad map (lo byte) ; " " " " " " (hi byte) badmap equ genbuf+26 ;Pointer to start of bad map buffer (lo byte) ; " " " " " " " (hi byte) piobuf equ genbuf+28 ;Swap buffer for phyical param. & I/O address ;Format Buffer Definitions (14_Nov_83) gaptbl equ fmtbuf ;Define the start of the format table gap1 equ fmtbuf ;Post index gap gap3 equ fmtbuf+1 ;Inter-Sector gap gap5 equ fmtbuf+2 ;Pre-ID-Index mark gap HDstbl equing Addresses ; General Address Definitions ; Disk Module Address Definitions ; ; I/O Registers - Serial Ports ; I/O Registers - Counter Timer Chip ; I/O Registers - Disk Read ; I/O Registers - Disk Write ; ; Lo-Level Disk Error Codes ; Bios Level Disk Error Codes ; ; General Operations Data Area Definitions ; offsets within the Applications Interface Area ; MTAB Table Format (there must be 1 MTAB for each logical drive) ; ; Identification Information (12_Dec_83) ;--------------------------------------- ; RomRev equ 14h ;Rom Revision Number Clevel equ 0 ;Compatibility Level BadID equ 4B6Fh ;Bad Map ID Word (in the boot sector) BadRev equ 10h ;Bad Map Revision Number (in the bad map header) ;---------------------------------------------------------------------- ; ASCII character equates ;------------------------ ; cr equ 0Dh ;carriage return lf equ 0Ah ;line feed bell equ 07h ;bell asc0 equ '0' ;ascii 0 asca equ 'A' ;ascii A asci equ 'I' ;ascii I ascr equ 'R' ;ascii Rdskbuf + 440h ;Start of the Scratch buffer fmtbuf equ dskbuf + 480h ;Start of the Format Buffer altbuf equ dskbuf + 500h ;Start of memory image of the bad map ; Disk Module Address Definitions ;-------------------------------- ; ;Pre-Buffer Definitions (14_Nov_83) hdID1 equ prebuf+2 ;Hard Disk ID 1 (Sector Header Sync and ID) hngloc equ prebuf+3 ;Location of the PCHL (hang location) header equ prebuf+4 ;Header Image address hdID2 equ prebuf+0Ch ;Hard Disk ID 2 (Data Header Sync and ID) hdID3 equ prebuf+1Eh ;Hard Disk ID 3 (Data Header Sync and ID) ;General Buffer Definitions (13_Dec_83) cpydrv equ genbuf ;Copy of Drive Strobe Register (drvstb) cpymod equ genbuf+1 ;Copy of Mode Register (mode) premsk equ genbuf+2 ;Save loc for write precompensation mask lcmsk equ genbuf+3 ;Save loc for low current mask revs equ genbuf+4 ;Number of revolutions before index error error equ genbuf+5 ;Temp Error register for floppy disk operations RomErr equ genbuf+6 ;Rom Level Error Code rtycnt eq  fmtbuf+3 ;Hard Disk Sector Skew Table FDstbl equ fmtbuf+12 ;Floppy Disk Sector Skew Table ;Disk Interrupt Vector Locations IRQbase equ memtop and 0FF00h ;Page address of interrupt vector table FDIvct equ IRQbase or 0F0h ;Floppy Disk Index Vector FDMvct equ IRQbase or 0F2h ;Floppy Disk Match Vector HDIvct equ IRQbase or 0F4h ;Hard Disk Index Vector HDMvct equ IRQbase or 0F6h ;Hard Disk Match Vector ; I/O Registers - Serial Ports ;----------------------------- ; s1data equ 60h ;serial port 1 data (dart1 = console port) s1stat equ 61h ;serial port 1 status s2data equ 62h ;serial port 2 data (dart2 = printer port) s2stat equ 63h ;serial port 2 status s3data equ 70h ;serial port 3 data (sio) s3stat equ 71h ;serial port 3 status (sio) ; I/O Registers - Counter Timer Chip ;----------------------------------- ; 1) The labels baud0, baud1 and baud2 correspond to the schematic labels ; for the signals carrying the baud rate clocks to the dart/sio. baud0 ; is u 040h ;Drive Strobe (local copy => cpydrv) $STEP equ 10000000b ; Step one track $DIR equ 01000000b ; Direction of step (0=out[home], 1=in) $LC equ 00100000b ; Low Current $HD2 equ 00010000b ; Head Select 2 $HD1 equ 00001000b ; Head Select 1 $HD0 equ 00000100b ; Head Select 0 $DS1 equ 00000010b ; Drive Select 1 $DS0 equ 00000001b ; Drive Select 0 bnkstb equ 41h ;Bank Strobe $CNTIRQ equ 10000000b ; Centronics interrupt enable $XFER equ 01000000b ; Inter-bank transfer (1=true) $MTRON equ 00100000b ; Motor On $AUTOE equ 00010000b ; Hard Disk Read/Write $CNTSTB equ 00001000b ; Printer Strobe $CNTRST equ 00000100b ; Printer Restore $BANK1 equ 00000000b ; Select Bank 1 (dummy def for coding clarity) $BANK2 equ 00000010b ; Select Bank 2 (1=true) $_RMENB equ 00000001b ; Enable Rom (0=true) cdata equ 42h ;Centronics data port wrtshf equ 047h ;Write shift register data mode equ 04Bh ;Write mode register (local copy => cpymod) $OP1 equ 10000000b ; Hard Disk Operation 1 $OP2 equ 010000e. The value placed in erflag and passed ; back up to the bios is remapped in ertran. ; 2) Notice that the two most signifigant bits are used to indicate ; errors that should NOT be retried and re:mappable errors. ; ;Special Error Flags $NOTRY equ 10000000b ;Do not attempt a retry of this operation $REMAP equ 01000000b ;Error can cause a re:mapping of current sector ;Rom Level Error Codes Eum equ 1 ;Unreadable Media Ehd equ 2 ;Header Error Eha equ 3 or $REMAP ;Mismatch: Header ID address mark Ehc equ 4 or $REMAP ;Mismatch: Header CRC Eda equ 5 or $REMAP ;Mismatch: Data address mark Edc equ 6 or $REMAP ;Mismatch: Data CRC Esk equ 7 ;Mismatch: Track Number (seek error) Ehn equ 8 or $NOTRY ;Mismatch: Head Number Esn equ 9 or $REMAP ;Mismatch: Sector Number Ess equ 10 or $NOTRY ;Mismatch: Sector Size Enh equ 11 ;Drive failed to find track 0 Emc equ 12 or $NOTRY ;Maximum Cylinder Number Exceeded Enr equ 13 ;Drive not ready Eto equ 14 or $NOTRY ;Motor Time-Out Failure the clock for serial port 1. ; baudset equ 53h ;ctc channel select/mode port baud0 equ 52h ;baud rate control for serial port 1 (consol) baud1 equ 51h ;baud rate control for serial port 2 baud2 equ 50h ;baud rate control for serial port 3 ; I/O Registers - Disk Read ;-------------------------- ; drvsts equ 0C0h ;Drive Status $INDEX equ 10000000b ; Index active $TRK0 equ 01000000b ; Track Zero active ; Spare $CRCSET equ 00010000b ; In Sync Flag (CRC set) $WPROT equ 00001000b ; Write Protect asserted $FAULT equ 00000100b ; Disk Fault $SEEKC equ 00000010b ; Seek Complete $READY equ 00000001b ; Drive Ready cstat equ 0C1h ;Centronics status port $DIAGM equ 00001000b ; Select diagnostics mode $CFAULT equ 00000100b ; Printer Fault $MTR equ 00000010b ; Motor on (drive active) $CNTRDY equ 00000001b ; Centronics Ready line clrint equ 0C2h ;Clear interrupts rdshfH equ 0C7h ;Read shift register data ; I/O Registers - Disk Write ;--------------------------- ; drvstb eq00b ; Hard Disk Operation 0 $N1 equ 00100000b ; Hard Disk Sector Size 1 $N0 equ 00010000b ; Hard Disk Sector Size0 1 $MFM equ 00001000b ; MFM/FM (Double/Single Density) $ALT equ 00000100b ; Alternate Mark Select for Compare $STD equ 00000010b ; Standard/Mini Floppy Select $PRECMP equ 00000001b ; Pre-compensation Assert ctlstb equ 04Fh ;Control Strobe $READ equ 10000000b ; Read Data $CMPR equ 01000000b ; Compare Data $WRITE equ 01000000b ; Write (synonym for Compare) $_CRC equ 00100000b ; Enable CRC Generation $MARK equ 00010000b ; Search For Mark Byte ; Spare $INTE equ 00000100b ; Enable Interrupts $SR equ 00000010b ; Source Shift Register $CRC equ 00000001b ; " CRC Generator $RAM equ 00000000b ; " RAM page ;---------------------------------------------------------------------- ; Lo_Level Disk Operation Error Codes (18_Dec_83) ;------------------------------------------------ ; 1) This is the table of the rom level error codes. These codes exist ; only in the disk modul  Ewp equ 15 or $NOTRY ;Write Protected Ewf equ 16 or $NOTRY ;Write Fault Ebf equ 17 or $NOTRY ;Bad Map is Full Ebi equ 18 or $NOTRY ;Bad Map ID does not match Ebr equ 19 or $NOTRY ;Bad Map Revision Number Doesn't Match Ebn equ 20 or $NOTRY ;Bad Map not opened Euk equ 21 or $NOTRY ;Unknown Error Code ; Bios Level Disk Operation Error Codes (18_Dec_83) ;-------------------------------------------------- ; 1) This is a table of the error codes that are passed to the bios. ; ; MD-11 MD-3 ERwp equ 1 ;Write Protected write protect 1 ERsk equ 2 ;Seek Error seek error 2 ERdac equ 3 ;Data Address CRC data crc 3 ERidc equ 4 ;ID Address CRC id crc 4 ERnf equ 5 ;Not Found not found 5 ERnr equ 6 ;Not Ready drive not ready 6 ERmf equ 7 ;Media Failure sync 7 ERef equ 8 ;Equipment Failure equipment check 8 ; invalid command 9 ERuk equ 10 ;Unknown Error Code unknown error 10 ERbm equ 11 ;Unable to ReMap ----- page ; Offsets within the General Operations Data Area device @imsact equ 6 ; 6 In memory submit flag (1=sub active) @imswet equ 7 ; 7 IMS buffer full (1=buffer has chars) DFlag equ 19 ;Dflag: Bit @hstact equ 0 ; 0 host active flag (1=sector in buffer) @hstwrt equ 1 ; 1 host written flag (1=buffer written) @rsflag equ 2 ; 2 read sector flag (1=need a read) @readop equ 3 ; 3 read operation flag (1=read 0=write) @fmoton equ 4 ; 4 floppy disk motor has been turned on (1=true) @curbad equ 5 ; 5 currently selected drive has bad map @maper equ 6 ; 6 Error can cause remapping of the sector @maprd equ 7 ; 7 Bad Map has been read trsec equ 20 ;offset to logical sector within physical sector vmsgp equ 21 ;pointer to virt drive mesg. ; vdrvp equ 23 ;pointer to virt drive in mesg. ; cdsk equ 25 ;current drive vdsk equ 26 ;current virtual drive dmaadr equ 27 ;BDOS dma address ; cnout equ 29 ;pointer to current console output routine ; cnin equ 31 ;pointer to current console input routine ; cnsts equ 33 ;Pointer to uffer data is Valid (1=true) @InMap equ 2 ; 2 Sector is in the bad map (1=true) @RomIO equ 1 ; 1 Bios has activated ROM for block device I/O ; 0 not used phytrk equ 11 + AIoff ;Physical Track ; phyhd equ 13 + AIoff ;Physical Head physec equ 14 + AIoff ;Physical Sector phydrv equ 15 + AIoff ;Physical Drive address ioadd equ 16 + AIoff ;execution address of disk i/o (rdio/wrio/fmtio) ;(high byte of execution address) AIleng equ 18 ;Define the length of the Application Interface page ; MTAB Table Format (there must be 1 MTAB for each logical drive) ;---------------------------------------------------------------- ; MToff equ 18 + AIoff ;Define offset from start of IY to start of MTAB dskdef0 equ 0 ;Flag Register (Active=True=Asserting=1) @VD equ 7 ; Virtual Drive (1) @FRGN equ 6 ; Foreign Drive (1) @SECZRO equ 5 ; Sector numbers start at zero (1) @DBLMED equ 2 ; Double(1)/Single Sided Media $HDMSK equ 00011100b ; Head Mask $PHYADR equ 00000011b ; Physical Dri (21_Dec_83) ;------------------------------------------------------------ ;bytes 0 thru 14 not used in cp/m3 bios sekdsk equ 0 ;BDOS disk number sektrk equ 1 ;BDOS track number ; seksec equ 3 ;BDOS sector number ; sekhst equ 5 ;Sector number on the disk ; unacnt equ 7 ;unallocated rec count unadsk equ 8 ;unallocated disk unatrk equ 9 ;unallocated track ; unasec equ 11 ;unallocated sector ; unamax equ 13 ;sectors per allocation block sectrk equ 14 ;Logical Sectors per track ; physpt equ 16 ;Physical Sectors per track wrtype equ 17 ;write type wrall equ 0 ; write allocatted wrdir equ 1 ; write directroy wrual equ 2 ; write unallocatted cflag equ 18 ;Cflag: Bit @xl_in equ 0 ; 0 Translate input function keys @xl_out equ 1 ; 1 Translate output controls and escapes @funact equ 2 ; 2 Function key IMS flag (1=active) @siosyn equ 3 ; 3 Hardware handshake for SIO @hwsync equ 4 ; 4 Hardware handshake for list device @cenlst equ 5 ; 5 Centronics is listthe current console input status routine ; cpybnk equ 35 ;Copy of the Current value of the bnkstb (port 41h) GOleng equ 36 ;Define the length of the general operations area ; Offsets within the Application Interface Area (21_Dec_83) ;---------------------------------------------------------- ; AIoff equ 36 ;Define offset from start of IY to start of AI hstdsk equ 0 + AIoff ;host disk (forms pointer to MTAB) hsttrk equ 1 + AIoff ;host track ; hstsec equ 3 + AIoff ;host sector (physical sector) ; seccnt equ 5 + AIoff ;sector count is number of sectors to transfer retry equ 6 + AIoff ;retry count = retries for read/write operations hstbuf equ 7 + AIoff ;pointer to disk data buffer ; erflag equ 9 + AIoff ;Error Flag opflag equ 10 + AIoff ;Options Flag: @serd equ 7 ; 7 Suppress Error Display @serur equ 6 ; 6 Suppress User response to errors @nover equ 5 ; 5 Supress Verification of track on seek @recal equ 4 ; 4 Recalibrate the drive @BufOK equ 3 ; 3 B ve Mask @HRDDSK equ 1 ; Hard Disk Flag dskdef1 equ 1 ;Flag Register (Active=True=Asserting=1) @DRVCAL equ 7 ; Drive Calibrated(1) @DRVRDY equ 6 ; Drive Has Ready Line(1) @DRVDEN equ 5 ; Double(1)/Single Density Media @DRVSIZ equ 4 ; Standard_8"(1)/Mini_5.25" Select @HASBAD equ 3 ; Drive Has a Bad Map @FSTSEK equ 2 ; Drive has Fast Seek capabilities $SIZMSK equ 00000011b ; Sector Mask ; 00 - 128 Bytes/sector ; 01 - 256 Bytes/sector ; 10 - 512 Bytes/sector ; 11 - 1024 Bytes/sector CRNCYL equ 2 ;Current Cylinder (lo) ; MAXCYL equ 4 ;Maximum Number of Cylinders (lo) ; STPRAT equ 6 ;Step Rate STPSET equ 7 ;Step Settling Time STPRCL equ 8 ;Recalibration Step Rate HLDDLY equ 9 ;Head Load delay time MOTDLY equ 10 ;Motor On delay time STRPRE equ 11 ;Starting Track of Write Pre-Compensation (lo) ; STRLOC equ 13 ;Starting Track of Lo-Current (lo) ; FMTTYP equ 15 ;Format Type ILE.S !+2 !  +~d {   O! w+w+: =w! 5 c ʋ  :p  m>> ͧ  N Ĩ –.~+w.~2  9 : ! ~##~ !7 : !Կ : x*l " !ZXچ! 6  zz: 6 : %2p  ͆ : =̀ 2r  DIR TYPE ERASE RENAME DIRSYS USER u"Q}:\=p:r Aæ R ÂN ͙ʸ} !M 545 x ]  ̵ 6 : oG! ~怹>2M  xf>:ͦ ͤ ͍ ͤ f ¹2 lf   ͫR  L͞L I *  *  A }_Yl !ͮ ͒6 \&đ %* "l ͍  ûȷ45: w ? A I N   SUBMIT COM ! ͮ ! 6 #"l  !cͿ  O!:r :ͦ ͍ !~B I !pͰ ^#VCOM SUB PRL y!cͰ  î !" * %.2P#ͮ !g 4*l +"l ͷ 2 "Qx2Sl "Tx2V!q ~ :p ͆ .ڶ2* og$2| .w#w#w#w;CP/M default function key definitions UP ^B ~UP ^W ^UP ^W DOWN ~DOWN ^DOWN LEFT ^H ~LEFT ^A ^LEFT ^H RIGHT \ ~RIGHT ^F ^RIGHT ^G HELP HELP_RTN ~HELP HELP_RTN ^HELP HELP_RTN ERASE ^X ~ERASE ^K ^ERASE ^K HOME ^X ~HOME ^X ^HOME ^X ~TAB _TAB ^TAB _TAB 'R@>ͥ'>2^:^og |t@!}*:^og))!\xm@Rm@!Z!}*:^og))>. '!^4@:^@*}^!]>S}2^:^¡@*}^!^> ͇@*}^:^og+MͨG!^> ͋*}^:^og#ͭ!^ > ʹ͋>2*ͮ"_!`d6*_#~A!`LOADER y; !91""|0!~ʞz=_: _* ""*og*%|}D S#N#F:ʒ#4ʝ^#V{‚:¿*.~w*DM!&_*.& >k s#rr+6.""1*D`.45. F.~. ^#Vx>`. s#rz 6#N#fi%$g1:=<@v_}v=p{_3;{<g"T=X3*j ~P#~R#~L{gbk#N#Fk$&Zcx {~#o}o1!;!"Ï:= w*wWx ~#&*.~s*"ѷ\ Cannot load Program 221282 COPYR '82 DRI <bHA$@DH   A@!" $$@X X X S 1-! j 1".~2.~2 :Xck*kͮ  b < .~=>$.w.6#w.6#w.61.~  .~~w@.p T~º>+~.~~! yͮ Ë.~~w2g !PROF .~ .w#w~?w; ; ! ~#49 w#~$ A  < > _I  ! 6 ! ~#Ͱ 6 m   _  ! 6=  { *.pѯ:r x , \<=!Ͱ =ɯ2 \s 2 ! D ;! : .44 #4"l ~[* 2 a7 {7 w!Y #! *l "l " ~ U #D ]T!̷ 6*%.w#w!} 6 r 6 #w.6#6 #t#6.wo*.s#r.rͧ ̧ m . ^#V45+ w#w.f.5\A "l " l |F# !( | !( : x. +"l ! ͮ   ͮ ~!G8 * ~;#1 կA *l ~:g #I ѯ*l  *l ~0څ :҅ q X x<Ü AX QX X ~@#~:k #^ *jT~# ® wy#ù ! 4 : !Ͱ ~@*h~ yw y/w*hw*h~I E> ͦ > æ % 0  < : ~ȹͦ #* A !g ~6*  * >? A *l " ~0: :: q "l x~0 xG#Gs : &͘ ͤ &ͦ %˜ >  Ʌo$>?· !  > # ͮ x> # ~ Enter User #:1I"CP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543218/82Invalid Filename$DIRECTORY FULL$DISK FULL$Creating Password$File not found$File not available$  ,.;=:<>_[]*? ERROR - $Password ? $Cannot Edit Wildcard Filename$Enter Output file: $FILE IS READ/ONLY$NEW FILE$-(Y/N)?$Insufficient memory$Enter Input file: $Output File Exists, Erase It$ BREAK "$" AT $END OF LINE$1I"1I"̈́""%*"%}0!#6%!"I" ͫ!+!#s͠!#s#r!I"!^ ͵ #I"!++s#r!#ͧ!+s#r!"#*#ͺ!"L#*I"% 6*I"+"K"ͫ!"M":] sr ͡ !#6\Mڀs:#Ҷ\S:h2y#!h6*"%|¶12!%¶!!%6!#6!+#:\:t#/H+#͍͋!%6 !"%*K""%!#6à1I"! %6#@1I"! %6?@1I"! %6>@1I"! %6F!"$%@! %6F!"$%1I"!w#6 * %M͟  :% :% H| Ã*%M͟ >$%!ʝ*$%DM !"$% 1I"!{#6! %6!z#6͂ ! %6E: $2%E͑  sð H͑  !s#6#~:+#2%:\2+#:%2\ ͎ð :%T ð :%U6 :%2}#ð :%V… f %%!DMt/͟ *K"DMt  :%2~#} !#6 !#6ð :% ± :%: %HҮ ͑ð :%Hҭ :%A !%6*%"%*K""%ͅ   !%6ͅê :%F M \ ê :%J¤ Mx: %2 %xҡ \: %=2%:%<2%! %f *%&$ ~2%-E *%"%* %M* %~ ! %: %%!"%!%6ͅ*%DM͘4 ê :%M: %H !%6>%! L:%<2%O!%$ Hqy :%2 %!%6*%#s#rê :%Nf Mc * %` ͭ/ @̀ !%6!"%͇ͅ!%6K"%!]   ê :%S¶ Mxҳ \: %2%%!DM͘! %:%Ұ *%&$ ~2%!%4-Ï t ê :%W ê :%Xu P"m2 %!#6 !u#6P"^:#  r `!u# ͓B !u#6 r"P"!"6#6!~"6!"6r":#B 5*%"%%%!o *%% N*%"%K >ê :%ZŸ ҏ ;  @Ҝ Ï ê :%ʪ ð ív!&%q:w# *&%&!'%q:'% !#4:'%   $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$: $$$ SUB#+#3\+#!t#6ð :%I`!#: $: %H2z#i!#6!"%}2%*%+% ~ fiW?:%<:%:%H:%H:%­ ͋:% :#!# :%^> :#2#O> w:#!#?!w#6!#6!w#6:#2#!#&:#2#:#2#:#!#< ,V*%+% ~ P !%6:%ƒ> *%% ~2%O͟ !%6:% *%+% ~ HҬ ͟ - *%Mo ^w:%@Ow:% :z#/H- : % :% !#4 :% :#O>!#w-:% :% /!%6  w4!%6!#6pi:%O- !#6:~#!z#] ð O͸ u\Kð :%RRP"m2 %Ғ!v#6:v#: %ڬ P"r"!\"6!p"6#6P"!v#6Y2%-!v#6P"Kð Q͸ +#ͺ:t#/!s# #+#3+#ͺsð :%-&͂ !%6:%#7ͻ͂ t!T!:%:Q!%6L=!t:%:t͂ !=!:%t*%#"%Ҁ!%6:%B¡!%>w!"%*K""%ͅð :%C²Ͳͅð :%DͲ͋ð :%K͋ð :%L͑ð :%P !%6w  !#6*'%M :#    !#55!(%q:(% :#O>H2)%yQ !(%6 !*%6:)%!*%n *(%M !*%4V !+%q:+% ~ >:+% :+% H:+% H!,%q*,%Mo ڻ ^+ :,%@2,%*,%M+  ͟  ͟ !.%p+q*-% !0%p+q */%DM !2%p+q *1%DM !4%p+q*3% !6%p+q*5%:! %6O!"$%@!8%p+q*7%!:%p+q*9%2#!<%p+q*;%2#!>%p+q*=%!@%p+q*?%!B%p+q*A%!#6# >>!D%p+q*C%!F%p+q*E%!K%r+s+p+q+q:G%=2G%+*H%*J% w*H%#"H%*J%#"J%!M%p+q###*L%gR !O%p+q*N%f!P%q*P%&-:u#Ҁ#^͵  !R%p+q*Q%DM s+#K͍:#ҹ#!T%p+qͬ*S%DM^!V%p+q*U%DMͺͬ*U%DM͑!X%p+q*W%DMͺͬ*W%2#!\%s+q+p+q:\%=2\%2*Y%:[%w*Y%#"Y%!`%r+s+p+q *]%*_%DM"͹!a%6:#!a%ڵ*N#*#DM\q2#ʤ>!#ґ͟*N#*#6:#2a%î*N#"N#!a%4`͹!"N#:s#>#N#!X*N#*#~2b%*N##"N#:b%:t#):s#z# ͟ *͟ *!$DM: %&*%& ~I:%<2%O! ~> >! %ҡͭ_! %:%ڍ>%!ʈ*%+"%>ͷ!ˆ!%6:%<2%=O!%$ NP:z#Ұ; OP:{#!{#6:#!~#K"%!*͟ ͡! $6 ͟ !#6!#: $2{#* $&# 6 : $<2 $=O!# NP:#B*Oͤ2%LLOͤ2%!{%p+q!~%6! %6!#6.:% ʏ:%ʏ *z%*z%#  :% ž.Ð͹y!|%6͹>!|%ҽÓ͡.ê:%::|%Ó*z%#~A<*z%wO>Ó*z%#6 .:%.)!|%6!#6.͹)> !|% Ó͡. :%;v*z% !|%6.͹d>!|%[Ó͡.H*z%DM#Þ>!}%҅Ó:~%ڏÓ:~% ! %6>:|%<2|%O*z% :%w!~%6!}%6>!}%*}%& :%> !}%  >!}%4¾>:#' ͡! $6!{#6 +#M9!t#6:,# 6,#]E+#\#4#:q"wRP"qr>!q"6:q"<2q"=O! NP!h6!j6!|6:#ҩcͬ\;"#:#c*#}|Hͽ ͬ\;"#*#}|Hͻ:s#)2%)*%M%%!=*%% :%w:% VL2%:% :z#/HH/Wҥ:% ”!%6 ͦ!%6 :%Ÿͦx* %&$ :%w: %<2 %d!%s+q*%"%!%6:%/%K"!H8*%#"%"%:%2%*%&$ *%% !%:%2%/H5!%4*%#"%:%I*%+"%ͅ:%! %6x: %2 %* %l!%p+q*%DMM2%: %ڍ! %6O@ *% ~ :#/Hҷ *%#*%#~ *%##:%*#$*!$DM!z#6:%!"#$*%"%*%"%*%+% ~2% %:#" ,*#$#"#$*%"%%%!v:% Z*#$#"#$ͭZ*%% ~2%O͟ *%"%2*!%&"%*%"%*%"%̀w͑:%2%!%6w:%2%K"%!>%!H͇!%6>!%ͭ@>!!%4!%6!"%ͻ, M"%!& )  !%6 -!%6 -:#>%!H] @!|#6*%M͌2%*%MP2%:%/!}#+w!|#6L2%^ !%q!%:%:#H: %H!%q*%M͑  *%M V ; Oͤ2% :%N à:%Y > >)!R#+##R#3R#ͺ:#)>>!P#ͧ!!d%s{@*P#!e%s!"P#!c%6:d%!c%*P#*L#DM+#́ʵ]>P#!ʦ*P#:e%ͷ!*P#*L#DM*L#*P#:e%ͷ!"P#$*P#"P#!c%4S!"P#!f%q#P#!,*P#*L#:f%w*P##"P#!g%q:#,Q:~"2":"2"r"́'$$!#6*#&" :g%w!#4:#2h%>!h%Y!h%4Dr"K!i%6 :i%=2i%ʐ*i%&r" *i%&P" ʍ>e>:"2~"r":"2"Qr"q:"2"!#6>!#*#&" ~!#4¾*P#},:s#\K+#K:#͟:x#+:5#25#ͬ+#:t#G\]#l3\+#]#;#3+#!k%p+q*j%*j%DM!l%q: %ʄ*l%M͟ !m%q:m%a/>z!m%/H!n%q*n%M͌ҹ:n%_:n%  # !o%6>!o%I Oͤ2p% *o%&# :p%w:p% I:p%:p%7:o%$:o%=2o%O!# 6 :p%Bs!o%4ͭ2p%!q%q:q%a!q%6:|#p*q%Mͤ:q%!s%p+q!'"v%!u%6>v%!*r%*v%~!{2t%*r%̀!"r%PY! ~!"v%:t%!u%!u%6:t%0O͟  ͟ Å!y%p+q:~#*x%DMt:͟  ͟ :͍*#}2#:t#C:e&;͍C:fC:d>!#6C!x#6:#f:t#X͍!s#6M #+#3!7#6+#:#…͟:y#ʞ:y#27#ͬ+#,!7#6!K#6*#"N#!"P#!"!$!"%>%!!"%*%+"%>>!"#$:%*%#"%*%"%!"%+"%$*%"%*K""%!"%!%6:%Ҭ%%!2%*%v!"%% ~ He*%"%0*%+"%>ͷ!2%:%ڕ!%6%%!+s#ré*#$+"#$:%ҩ*%"%):%*%"%*%+"%*%#"%*%#"%*!$#"!$*!$+"!$*%#"%*%#"%*%+"%% ~ *%+"%!%q:%Y%%!V:%S*%% ~2% E*%% :%wÄ%%!҄:%ҁ*%% *% wYͅ!%p+q%%!ʱÞ:%*%"%%%!!"%%%!"%*%"%%I"!%!*K""%*%*%"%%%! OQ2%3*%% :%w:% M!%q:}#d*%MP:%K"%!x*%% ~2%O:% –hͻ%K"!M"!ڼÿhÝ!%6!"%*%"%͚ͅh%%!!%6 :%02O"O> /!"%!))덑o|gҗ! =…!^#V) ¡!^#V|g}o «!_{ozgi`N#Fogo&og H !=! LIBX$$$$$$$LIBX$$$$$$$LIB$$$BAK p?  MD-11 Drive Shut Down Program 2.0 Copyright 1984 Morrow Designs Inc. $ You may now turn off the power to your system $ MD-11 Drive Shut Down Program 2.0 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU4!y~=W!x# ~#bxE {8~#o}oA'.`28!Ip+q*HT!J6J T ` T!p+q*T> >/Ҥ×!p+q*DM͛:̀ ̀:2:!!K:*&L Ǹ!4!K6 ͐uëYALPSID'TCELLOC$LAITINI!%cCOPYRIGHT (C) 1977 DIGITAL RESEARCH {{ { {zb{b{*9 {_zW}l&))o> \> \\ß*"!" ͟#͟Prںºx"x#"̀ں͇"1!6# y͟!h͟$h͟'h*̀`*̀`*1̀I ?! ^#Vr+sz`>>!@^#V#̀{ k͇#"/<͟h2**̀`i~#!~6͟*1Þ6͔h*1^#V#Þ͔{> \*/̀>*\ ERROR - FORM IS X,Y TYPE HISTOGRAM BOUNDS HISTOGRAM: ADDR RELATIVE FREQUENCY, LARGEST VALUE = .INITIAL = .COLLECT = .DISPLAY = .... !6 ` !6 ` !6 ` *&T` !6 ` !6 ` !60 ` *& T` !6* ` !6* ` !6* ` *& @AA I$DBD $I$BHA"DH!""@TIME-STAMPS ~OPTIONS -EXAMPLES ^DRIVES 4SETDEF MEXAMPLES mSHOW WEXAMPLES pSID COMMANDS bEXAMPLES eUTILITIES uSUBMIT 4SUBFILE EXECUTE  PROFILE.SUB  TYPE *EXAMPLES GUSER IEXAMPLES ZXREF $ $ )`$ j" ///1commands CP/M 3 Command Format: A>COMMAND {command tail} A CP/M 3 command line is composed of a command, an optional command tail, and a carriage return. The command is the name or filename of a program to be executed. The optional command tail can consist of a drive specification, one or more file specifications, and some options or parameters. ///2conventions COMMAND CONVENTIONS The following special symbols define command syntax. {} surrounds an optional item. | separates alternative items in a command line. indicates command. Banked system only. CTRL-C stops executing program when entered at the system prompt or after CTRL-S. CTRL-E forces a physical carriage return without sending command to CP/M 3. CTRL-F moves cursor one character to the right. Banked system only. CTRL-G deletes character at current cursor position if in the middle of a line. Banked system only. CTRL-I same as the TAB key. CTRL-H delete character to the left of cursor. CTRL-J moves cursor to the left of the command line and sends command to CP/M 3. Line feed, has same effect as carriage return. CTRL-K deletes character at cursor and all characters to the right. CTRL-M same as carriage return. CTRL-P echoes console output to the list device. CTRL-Q restarts screen scrolling after a CTRL-S. CTRL-R retypes the characters to the left of the cursor COMMANDS CONVENTIONS 3CNTRLCHARS COPYSYS $VDATE &dEXAMPLES (3DEVICE *:OPTIONS 0EXAMPLES 5 DIR ?TBUILT-IN BVEXAMPLES FWITHOPTIONS N)OPTIONS Q~EXAMPLES bjDUMP kED lKCOMMANDS n7EXAMPLES kERASE mOPTION pEXAMPLES lFILESPEC GENCOM eOPTIONS EXAMPLES |GET OPTIONS uEXAMPLES HELP jHEXCOM ZINITDIR LIB *OPTIONS GMODIFIERS *EXAMPLES 7LINK OPTIONS oEXAMPLES MAC EXAMPLES \OPTIONS $PATCH ]PIP (COPY) CEXAMPLES 6OPTIONS &)PUT /'OPTIONS 5MEXAMPLES >-RENAME D9EXAMPLES GRMAC NvOPTIONS PREXAMPLE T\SAVE VzEXAMPLE ZSET `LABEL c_EXAMPLES djPASSWORDS fbMODES i#ATTRIBUTES o&EXAMPLES wDEFAULT |Y a carriage return. ^ indicates the Control Key. n substitute a number for n. s substitute a string (group) of characters for s. o substitute an option or option list for o. [] type square brackets to enclose an option list. () type parens to enclose a range of options within an option list. RW Read-Write attribute - opposite of RO RO Read-Only attribute - opposite of RW SYS System attribute - opposite of DIR DIR Directory attribute - opposite of SYS ... preceding element can be repeated as many times as desired. * wildcard: replaces all or part of a filename and/or filetype. ? wildcard: replaces any single character in the same position of a filename and/or filetype. ///1cntrlchars Control Character Function CTRL-A moves cursor one character to the left. Banked system only. CTRL-B moves cursor from beginning to end of command line and back without affecting  on a new line; updates the command line buffer. CTRL-S stops screen scrolling. CTRL-U updates the command line buffer to contain the characters to the left of the cursor; deletes current line. CTRL-W recalls previous command line if current line is empty; otherwise moves cursor to end of line. CTRL-J,-M,-R,-U and RETURN update the command line buffer for recall with CTRL-W. Banked system only. CTRL-X deletes all characters to the left of the cursor. ///1COPYSYS Syntax: COPYSYS Explanation: COPYSYS copies the CP/M 3 system from a CP/M 3 system diskette to another diskette. The new diskette must have the same format as the original system diskette. Example: A>COPYSYS ///1DATE Syntax: DATE {CONTINUOUS} DATE {time-specification} DATE SET Explanation: The DATE command lets you display and seions [ XON | NOXON | baud-rate ] XON refers to the XON/XOFF communications protocol. NOXON indicates no protocol and the computer sends data to the device whether or not the device is ready to receive it. baud-rate is the speed of the device. The system accepts the following baud rates: 50 75 110 134 150 300 600 1200 1800 2400 3600 4800 7200 9600 19200 ///2Examples A>DEVICE Displays the physical devices and current assignments of the logical devices in the system. A>DEVICE NAMES Lists the physical devices with a summary of the device characteristics. A>DEVICE VALUES Displays the current logical device assignments. A>DEVICE CRT Displays the ates of files and the characteristics associated with the files. The DIR command has three distinct references: DIR DIRS DIR with Options DIR and DIRS are built-in utilities. DIR with Options is a transient utility and must be loaded into memory from the disk. ///2Built-in Syntax: DIR {d:} DIR {filespec} DIRS {d:} DIRS {filespec} Explanation: The DIR and DIRS Built-in commands display the names of files cataloged in the directory of an on-line disk. DIR lists the names of files in the current user number that have the Directory (DIR) attribute. DIR accepts the * and ? wildcards in the file specification. ///3Examples A>DIR Displays all files in user 0 on drive A that have the Directory attribute. A>DIR B: Displays all DIR files in user 0 on drive B. 2A>DIR C:ZIPPY.DAT Displays the name ZIt the date and time of day. ///2Examples A>DATE Displays the current date and time. A>DATE C Displays the date and time continuously. A>DATE 08/14/82 10:30:0 Sets the date and time. A>DATE SET Prompts for date and time entries. ///1DEVICE Syntax: DEVICE { NAMES | VALUES | physical-dev | logical-dev} DEVICE logical-dev=physical-dev {option} {,physical-dev {option},...} DEVICE logical-dev = NULL DEVICE physical-dev {option} DEVICE CONSOLE [ PAGE | COLUMNS = columns | LINES = lines] Explanation: DEVICE displays current logical device assignments and physical device names. DEVICE assigns logical devices to peripheral devices attached to the computer. DEVICE also sets the communications protocol and speed of a peripheral device, and displays or sets the current console screen size. ///2Opttributes of the physical device CRT. A>DEVICE CON Displays the assignment of the logical device CON: A>DEVICE CONOUT:=LPT,CRT Assigns the system console output (CONOUT:) to the printer (LPT) and the screen (CRT). A>DEVICE AUXIN:=CRT2 [XON,9600] Assigns the auxiliary logical input device (AUXIN:) to the physical device CRT using protocol XON/XOFF and sets the transmission rate for the device at 9600. A>DEVICE LST:=NULL Disconnects the list output logical device (LST:). A>DEVICE LPT [XON,9600] Sets the XON/XOFF protocol for the physical device LPT and sets the transmission speed at 9600. A>DEVICE CONSOLE [PAGE] Displays the current console page width in columns and length in lines. A>DEVICE CONSOLE [COLUMNS=40 LINES=16] Sets the screen size to 40 columns and 16 lines. ///1DIR The DIR command displays the nam PPY.DAT if the file is in user 2 on drive C. 4A>DIR *.BAS Displays all DIR files with filetype BAS in user 4 on drive A. B3>DIR X*.C?D Displays all DIR files in user 3 on drive B whose filename begins with the letter X, and whose three character filetype contains the first character C and last character D. A>DIRS Displays all files for user 0 on drive A that have the system (SYS) attribute. A>DIRS *.COM Displays all SYS files with filetype COM on drive A in user 0. A command (.COM) file in user 0 with the system attribute can be accessed from any user number on that drive, and from any drive in the search chain (see SETDEF). ///2withOptions Syntax: DIR {d:} [options] DIR {filespec} {filespec} ... [options] Explanation: The DIR command with options is an enhanced version of the DIR built-in command and diis a directory label on the drive, DIR shows the password protection mode and the time stamps. If there is no directory label, DIR displays two file entries on a line, omitting the password and time stamp columns. The display is alphabetically sorted. (See SET for a description of file attributes, directory labels, passwords and protection modes.) LENGTH=n displays n lines of printer output before inserting a table heading. n is a number between 5 and 65536. MESSAGE displays the names of drives and user numbers DIR is searching. NOSORT displays files in the order it finds them on the disk. RO displays only the files that have the Read-Only attribute. RW displays only the files that are set to Read-Write. SIZE displays the filename and size in kilobytes (1024 M in user 3 on drive B in size display format. A>DIR [drive=all user=all] TESTFILE.BOB DIR displays the filename TESTFILE.BOB if it is found on any drive in any user number. A>DIR [size,rw] D: DIR lists each Read-Write file that resides on Drive D, with its size in kilobytes. Note that D: is equivalent to D:*.*. ///1DUMP Syntax: DUMP filespec Explanation: DUMP displays the contents of a file in hexadecimal and ASCII format. Example: A>DUMP ABC.TEX ///1ed Format: ED input-filespec {d:|output-filespec} Explanation: Character file editor. To redirect or rename the new version of the file specify the destination drive or destination filespec. ///2commands ED Command Summary Command Action nA append n lines from original file to memory buffer 0A append file until buffer is one hsplays your files in a variety of ways. DIR can search for files on any or all drives, for any or all user numbers. One or two letters is sufficient to identify an option. You need not type the right hand square bracket. ///3Options Option Function ATT displays the file attributes. DATE displays date and time stamps of files. DIR displays only files that have the DIR attribute. DRIVE=ALL displays files on all on-line drives. DRIVE=(A,B,C,...,P) displays files on the drives specified. DRIVE=d displays files on the drive specified by d. EXCLUDE displays files that DO NOT MATCH the files specified in the command line. FF sends an initial form feed to the printer device if the printer has been activated by CTRL-P. FULL shows the name, size, number of 128-byte records, and attributes of the files. If there  bytes). SYS displays only the files that have the SYS attribute. USER=ALL displays all files in all user numbers for the default or specified drive. USER=n displays the files in the user number specified by n. USER=(0,1,...,15) displays files under the user numbers specified. ///3Examples A>DIR C: [FULL] Displays full set of characteristics for all files in user 0 on drive C. A>DIR C: [DATE] Lists the files on drive C and their dates. A>DIR D: [RW,SYS] Displays all files in user 0 on drive D with Read-Write and System attributes. 3A>DIR [USER=ALL, DRIVE=ALL] Displays all the files in all user numbers (0-15) in all on- line drives. B6>DIR [exclude] *.DAT Lists all the files on drive B in user 6 that do not have a filetype of .DAT. 3B>DIR [SIZE] *.PLI *.COM *.ASM Displays all the files of type PLI, COM, and ASalf full #A append file until buffer is full (or end of file) B, -B move CP to the beginning (B) or bottom (-B) of buffer nC, -nC move CP n characters forward (C) or back (-C) through buffer nD, -nD delete n characters before (-D) or from (D) the CP E save new file and return to CP/M-86 Fstring{^Z} find character string H save new file, reedit, use new file as original file I enter insert mode Istring{^Z} insert string at CP Jsearch_str^Zins_str^Zdel_to_str juxtapose strings nK, -nK delete (kill) n lines from the CP nL, -nL, 0L move CP n lines nMcommands execute commands n times n, -n move CP n lines and display that line n: move to line n :ncommand execute command through line n Nstring{^Z} extended find string O return to original file nP, -nP DAT A>ED TEST.DAT B: A>ED TEST.DAT TEST2.DAT A>ED TEST.DAT B:TEST2.DAT ///1erase Syntax: ERASE {filespec} {[CONFIRM]} Explanation: The ERASE command removes one or more files from the directory of a disk. Wildcard characters are accepted in the filespec. Directory and data space are automatically reclaimed for later use by another file. The ERASE command can be abbreviated to ERA. ///2Option [CONFIRM] option informs the system to prompt for verification before erasing each file that matches the filespec. CONFIRM can be abbreviated to C. ///2Examples A>ERASE X.PAS Removes the file X.PAS from the disk in drive A. A>ERA *.PRN Confirm (Y/N)?Y All files with the filetype PRN are removed from the disk in drive A. B>ERA A:MY*.* [CONFIRM] Each file on drive A with a fifiletype optional 0-3 letters and/or numbers password password optional 0-8 letters and/or numbers Valid combinations of the elements of a CP/M 3 file specification are: filename d:filename filename.typ d:filename.typ filename;password d:filename;password filename.typ;password d:filename.typ;password If you do not include a drive specifier, CP/M 3 automatically uses the default drive. Some CP/M 3 commands accept wildcard (* and ?) characters in the filename and/or filetype parts of the command tail. A wildcard in the command line can in one command reference many matching files on the default or specified user number and drive. (See Commands). ///1GENCOM Syntax: GENCOM {COM-filespec} {RSX-filespec} ... {[LOADER | NULL | SCB=(offset,value)]} Explanation: The move CP 23 lines forward and display 23 lines at console Q abandon new file, return to CP/M-86 R{^Z} read X$$$$$$$.LIB file into buffer Rfilespec{^Z} read filespec into buffer Sdelete string^Zinsert string substitute string nT, -nT, 0T type n lines U, -U upper-case translation V, -V line numbering on/off 0V display free buffer space nW write n lines to new file 0W write until buffer is half empty nX write or append n lines to X$$$$$$$.LIB nXfilespec{^Z} write n lines to filespec; append if previous xcommand applied to same file 0x{^Z} delete file X$$$$$$$.LIB 0xfilespec{^Z} delete filespec nZ wait n seconds Note: CP points to the current character being referenced in the edit buffer. Use {^Z} to separate multiple commands on the same line. ///2Examples A>ED TEST.lename that begins with MY is displayed with a question mark for confirmation. Type Y to erase the file displayed, N to keep the file. A>ERA B:*.* Confirm (Y/N)?Y All files on drive B are removed from the disk. ///1filespec FILESPEC FORMAT CP/M 3 identifies every file by its unique file specification, which can consist of four parts: the drive specification, the filename, the filetype and the password. The term "filespec" indicates any valid combination of the four parts of a file specification, all separated by their appropriate delimiters. A colon must follow a drive letter. A period must precede a filetype. A semicolon must precede a password. The symbols and rules for the parts of a file specification follow: d: drivespec optional single alpha character (A-P) filename filename 1-8 letters and/or numbers typ  GENCOM command creates a special COM file with attached RSX files. The GENCOM command can also restore a previously GENCOMed file to the original COM file without the header and RSX's. GENCOM can also attach header records to COM files. ///2Options LOADER sets a flag to keep the program loader active. NULL indicates that only RSX files are specified. GENCOM creates a dummy COM file for the RSX files. The output COM filename is taken from the filename of the first RSX-filespec. SCB=(offset,value) sets the System Control Block from the program by using the hex values specified by (offset,value). ///2Examples A>GENCOM MYPROG PROG1 PROG2 Generates a new COM file MYPROG.COM with attached RSX's PROG1 and PROG2. A>GENCOM PROG1 PROG2 [NULL] Creates a COM file PROG1.COM with RSX's PROG1 and PROG2. A>GENCOM MYPROG e. If the program terminates before exhausting all its input, the system reverts back to the console for console input. With the SYSTEM option, the system immediately goes to the specified file for console input. The system reverts to the console for input when it reaches the end of file. Re-direct the system to the console for console input with the GET CONSOLE INPUT FROM CONSOLE command as a command line in the input file. ///2Options ECHO specifies that input is echoed to the console. This is the default option. NO ECHO specifies that file input is not echoed to the console. The program output and the system prompts are not affected by this option and are still echoed to the console. SYSTEM specifies that all system input is immediately taken from the disk file specified in the command line. GET takes system and program ine system to get console input from the console. This command may be used in a file (previously specified in a GET FILE command), which is already being read by the system for console input. It is used to re-direct the console input back to the console before the end-of-file is reached. ///1HELP Syntax: HELP {topic} {subtopic1 ... subtopic8} {[NOPAGE|LIST]} Explanation: HELP displays a list of topics and provides summarized information for CP/M 3 commands. HELP topic displays information about that topic. HELP topic subtopic displays information about that subtopic. One or two letters is enough to identify the topics. After HELP displays information for your topic, it displays the special prompt HELP> on your screen, followed by a list of subtopics. - Enter ? to display list of main topics. - Enter a period and subtopic name to access subtopics. -  GENCOM takes MYPROG.COM, strips off the header and deletes all attached RSX's to restore it to its original COM format. A>GENCOM MYPROG PROG1 PROG2 GENCOM looks at the already-GENCOMed file MYPROG.COM to see if PROG1.RSX and PROG2.RSX are already attached RSX files in the module. If either one is already attached, GENCOM replaces it with the new RSX module. Otherwise, GENCOM appends the specified RSX files to the COM file. ///1GET Syntax: GET {CONSOLE INPUT FROM} FILE filespec{[{ECHO|NO ECHO} | SYSTEM]} GET {CONSOLE INPUT FROM} CONSOLE Explanation: GET directs the system to take console input from a file for the next system command or user program entered at the console. Console input is taken from a file until the program terminates. If the file is exhausted before program input is terminated, the program looks for subsequent input from the consolput from the file until the file is exhausted or until GET reads a GET console command from the file. ///2Examples A>GET FILE XINPUT A>MYPROG Tells the system to activate the GET utility. Since SYSTEM is not specified, the system reads the next input line from the console and executes MYPROG. If MYPROG program requires console input, it is taken from the file XINPUT. When MYPROG terminates, the system reverts back to the console for console input. A>GET FILE XIN2 [SYSTEM] Immediately directs the system to get subsequent console input from file XIN2 because it includes the SYSTEM option. The system reverts back to the console for console input when it reaches the end of file in XIN2. Or XIN2 may redirect the system back to the console if it contains a GET CONSOLE command. A>GET CONSOLE Tells thEnter a period to redisplay what you just read. - Press the RETURN key to return to the CP/M 3 system prompt. - [NOPAGE] option disables the 24 lines per page console display. - Press any key to exit a display and return to the HELP> prompt. Examples: A>HELP A>HELP DATE A>HELP DIR OPTIONS A>HELP>.OPTIONS HELP>SET HELP>SET PASSWORD HELP>.PASSWORD HELP>. HELP> ///1HEXCOM Syntax: HEXCOM filename Explanation: The HEXCOM Command generates a command file (filetype .COM) from a .HEX input file. It names the output file with the same filename as the input file but with filetype .COM. HEXCOM always looks for a file with filetype .HEX. Example: A>HEXCOM B:PROGRAM Generates a command file PROGRAM.COM from the input hex file PROGRAM.HEX. ///1INITDIR Syntax: INITDIR {d:} Explanation: The INITDIR Command initializes a diskin Microsoft REL file format. You can use LINK-80 to link the object modules contained in a library to other object files. LINK-80 automatically selects from the library only those modules needed by the program being linked, and then forms an executable file with a filetype of COM. ///2Options I The INDEX option creates an indexed library file of type .IRL. LINK-80 searches faster on indexed libraries than on non-indexed libraries. M The MODULE option displays module names. P The PUBLICS option displays module names and the public variables for the new library file. D The DUMP option displays the contents of object modules in ASCII form. ///2Modifiers Use modifiers in the command line to instruct LIB to delete, replace, or select modules in a library file. Angle brackets enclose the modules to be deleted or replaced. PE2.REL from FILE3.REL, omitting MODA which is a module in FILE3.REL. A>LIB FILE6=FILE5 Creates FILE6.REL from FILE5.REL, FILEB.REL replaces MODA. A>LIB FILE6=FILE5 Module THISNAME is in FILE5.REL. When LIB creates FILE6.REL from FILE5.REL the file THISNAME.REL replaces the similarly named module THISNAME. A>LIB FILE1[I]=B:FILE2(PLOTS,FIND,SEARCH-DISPLAY) Creates FILE1.IRL on drive A from the selected modules PLOTS, FIND, and modules SEARCH through the module DISPLAY, in FILE2.REL on drive B. ///1LINK Syntax: LINK d:{filespec,{[options]}=}filespec{[options]}{,...} Explanation: LINK combines relocatable object modules such as those produced by RMAC and PL/I-80 into a .COM file ready for execution. Relocatable files can contain external references and publics. Relocatable files can reference modules in directory to allow date and time stamping of files on that disk. INITDIR can also recover time/date directory space. Example: A>INITDIR C: INITDIR WILL ACTIVATE TIME-STAMPS FOR SPECIFIED DRIVE. Do you want to re-format the directory on C: (Y/N)?Y ///1LIB Syntax: LIB filespec{[I|M|P|D]} LIB filespec{[I|M|P]}=filespec{modifier} {,filespec{modifier} ... } Explanation: A library is a file that contains a collection of object modules. Use the LIB utility to create libraries, and to append, replace, select or delete modules from an existing library. Use LIB to obtain information about the contents of library files. LIB creates and maintains library files that contain object modules in Microsoft REL file format. These modules are produced by Digital Research's relocatable macro-assembler program, RMAC, or any other language translator that pruduces modules arentheses enclose the modules to be selected. LIB Modifiers Delete Replace If module name and filename are the same this shorthand can be used: Select (modFIRST-modLAST,mod1,mod2,...,modN) ///2Examples A>LIB TEST4[P] Displays all modules and publics in TEST4.REL. A>LIB TEST5[P]=FILE1,FILE2 Creates TEST5.REL from FILE1.REL and FILE2.REL and displays all modules and publics in TEST5.REL. A>LIB TEST=TEST1(MOD1,MOD4),TEST2(C1-C4,C6) Creates a library file TEST.REL from modules in two source files. TEST1.REL contributes MOD1 and MOD4. LIB extracts modules C1, C4, and all the modules located between them, as well as module C6 from TEST2.REL. A>LIB FILE2=FILE3 Creates FIL library files. LINK searches the library files and includes the referenced modules in the output file. See the CP/M 3 Programmer's Utilities Guide for a complete description of LINK- 80. ///2Options Use LINK option switches to control execution parameters. Link options follow the file specifications and are enclosed within square brackets. Multiple switches are separated by commas. LINK-80 Options A Additional memory; reduces buffer space and writes temporary data to disk B BIOS link in banked CP/M 3 system. 1. Aligns data segment on page boundary. 2. Puts length of code segment in header. 3. Defaults to .SPR filetype. Dhhhh Data origin; sets memory origin for common and data area Gn Go; set start address to lab file as a library $Cd Destination of console messages d can be X (console), Y (printer), or Z (zero output). Default is X. $Id Source of intermediate files; d is disk drive A-P. Default is current drive. $Ld Source of library files; d is disk drive A-P. Default is current drive. $Od Destination of of object file; d can be Z or disk drive A-P. Default is to same drive as first file in the LINK-80 command. $Sd Destination of symbol file; d can be Y or Z or disk drive A-P. Default is to same drive as first file in LINK-80 command. ///2Examples A>LINK b:MYFILE[NR] LINK-80 on drive A uses as input MYFILE.REL on drive B and pes with the input filename and filetypes of .HEX, .PRN, and .SYM. Filename.HEX contains INTEL hexadecimal format object code. Filename.PRN contains an annotated source listing that you can print or examine at the console. Filename.SYM contains a sorted list of symbols defined in the program. ///2Examples A>MAC SAMPLE A>MAC SAMPLE $PB AA HB SX ///2options Use options to direct the input and output of MAC. Use a letter with the option to indicate the source and destination drives, and console, printer, or zero output. Valid drive names are A thru O. X, P and Z specify console, printer, and zero output, respectively. Assembly Options That Direct Input/Output A source drive for .ASM file (A-O) H destination drive for .HEX file (A-O, Z) L source drive for macrolibrary .LIB files called by the MACLIB statement. P destination drive for .PRN file (A-O, X, P, Z) el n Lhhhh Load; change default load address of module to hhhh. Default 0100H Mhhhh Memory size; Define free memory requirements for MP/M modules. NL No listing of symbol table at console NR No symbol table file OC Output .COM command file. Default OP Output .PRL page relocatable file for execution under MP/M in relocatable segment OR Output .RSP resident system process file for execution under MP/M OS Output .SPR system page relocatable file for execution under MP/M Phhhh Program origin; changes default program origin address to hhhh. Default is 0100H. Q Lists symbols with leading question mark S Search precedingroduces the executable machine code file MYFILE.COM on drive B. The [NR] option specifies no symbol table file. A>LINK m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3, resolves their external references, and produces the executable machine code file m1.COM. A>LINK m=m1,m2,m3 LINK-80 combines the separately compiled files m1, m2, and m3 and produces the executable machine code file m.COM. A>LINK MYFILE,FILE5[s] The [s] option tells LINK-80 to search FILE5 as a library. LINK-80 combines MYFILE.REL with the referenced subroutines contained in FILE5.REL on the default drive A and produces MYFILE.COM on drive A. ///1mac Syntax: MAC filename {$options} Explanation: MAC, the CP/M 3 macro assembler, reads assembly language statements from a file of type .ASM, assembles the statements, and produces three output fil S destination drive for .SYM file Assembly Options That Modify Contents Of Output File +L lists input lines read from macrollibrary .LIB files -L suppresses listing (default) +M lists all macro lines as they are processed during assembly -M suppresses all macro lines as they are read during assembly *M lists only hex generated by macro expansions +Q lists all LOCAL symbols in the symbol list -Q suppresses all LOCAL symbols in the symbol list (default) +S appends symbol file to print file -S suppresses creation of symbol file +1 produces a pass 1 listing for macro debugging in .PRN file -1 suppress listing on pass 1 (default) ///1PATCH Syntax: PATCH filename{.typ} {n} Explanation: The PATCH command displays or installs patch number n to the CP/M 3 system or command files. The patch number n must be between 1 and 32 inclusive. Example: A>PATCH SHOW 2 Patches th A>PIP b:draft.txt = a: B3>PIP myfile.dat=A:[G9] A9>PIP B:[G3]=myfile.dat COPY A FILE AND RENAME IT A5>PIP newdraft.txt=oldraft.txt C8>PIP b:newdraft.txt=a:oldraft.txt COPY MULTIPLE FILES A>PIP b:=draft.* A>PIP b:=*.* B>PIP b:=c:.*.* C>PIP b:=*.txt[g5] C>PIP a:=*.com[wr] B>PIP a:[g3]=c:*.* COMBINE MULTIPLE FILES A>PIP b:new.dat=file1.dat,file2.dat COPY, RENAME AND PLACE IN USER 1 A>pip newdraft.txt[g1]=oldraft.txt COPY, RENAME AND GET FROM USER 1 A>PIP newdraft.txt=oldraft.txt[g1] COPY TO/FROM LOGICAL DEVICES A>PIP b:funfile.sue=con: A>PIP lst:=con: A>PIP lst:=b:draft.txt[t8] A>PIP prn:=b:draft.txt ///2options PIP OPTIONS A Archive. Copy only files that have been changed since the last copy. C Confirm. PIP prompts for confirmation before each file copy. Dn Delete any characters past coT PRINTER {OUTPUT TO} FILE filespec {option} | PRINTER PUT CONSOLE {OUTPUT TO} CONSOLE PUT PRINTER {OUTPUT TO} PRINTER Explanation: PUT puts console or printer output to a file for the next command entered at the console, until the program terminates. Then console output reverts to the console. Printer output is directed to a file until the program terminates. Then printer output is put back to the printer. PUT with the SYSTEM option directs all subsequent console/printer output to the specified file. This option terminates when you enter the PUT CONSOLE or PUT PRINTER command. ///2Options [ {ECHO | NO ECHO} {FILTER | NO FILTER} | {SYSTEM} ] ECHO specifies that output is echoed to the console. This is the default option when you direct console output to a file. NO ECHO specifies that file output is not echoed to the e SHOW.COM system file with patch number 2. ///1PIP (copy) Syntax: DESTINATION SOURCE PIP d:{Gn} | filespec{[Gn]} = filespec{[o]},... | d:{[o]} Explanation: The file copy program PIP copies files, combines files, and transfers files between disks, printers, consoles, or other devices attached to your computer. The first filespec is the destination. The second filespec is the source. Use two or more source filespecs separated by commas to combine two or more files into one file. [o] is any combination of the available options. The [Gn] option in the destination filespec tells PIP to copy your file to that user number. PIP with no command tail displays an * prompt and awaits your series of commands, entered and processed one line at a time. The source or destination can be any CP/M 3 logical device. ///2Examples COPY A FILE FROM ONE DISK TO ANOTHER A>PIP b:=a:draft.txt lumn n. E Echo transfer to console. F Filter form-feeds from source data. Gn Get from or go to user n. H Test for valid Hex format. I Ignore :00 Hex data records and test for valid Hex format. K Kill display of filespecs on console. L Translate upper case to lower case. N Number output lines O Object file transfer, ^Z ignored. Pn Set page length to n. (default n=60) Qs^Z Quit copying from source at string s. R Read files that have been set to SYStem. Ss^Z Start copying from the source at the string s. Tn Expand tabs to n spaces. U Translate lower case to upper case. V Verify that data has been written correctly. W Write over Read Only files without console query. Z Zero the parity bit. All options except C,G,K,O,R,V and W force an ASCII file transfer, character by character, terminated by a ^Z. ///1PUT Syntax: PUT CONSOLE {OUTPUT TO} FILE filespec {option} | CONSOLE PU console. NO ECHO is the default for the PUT PRINTER command. FILTER specifies filtering of control characters, which means that control characters are translated to printable characters. For example, an ESCape character is translated to ^[. NO FILTER means that PUT does not translate control characters. This is the default option. SYSTEM specifies that system output as well as program output is written to the file specified by filespec. Output is written to the file until a subsequent PUT CONSOLE command redirects console output back to the console. ///2Examples A>PUT CONSOLE OUTPUT TO FILE XOUT [ECHO] Directs console output to file XOUT with the output echoed to the console. A>PUT PRINTER OUTPUT TO FILE XOUT A>MYPROG Directs  A>RENAME The system prompts for the filespecs: Enter New Name:X.PRN Enter Old Name:Y.PRN Y .PRN=X .PRN A> File X.PRN is renamed to Y.PRN on drive A. B>REN A:PRINTS.NEW = PRINCE.NEW The file PRINCE.NEW on drive A changes to PRINTS.NEW on drive A. A>RENAME S*.TEX=A*.TEX The above command renames all the files matching A*.TEX to files with filenames S*.TEX. A>REN B:NEWLIST=B:OLDLIST The file OLDLIST changes to NEWLIST on drive B. Since the second drive specifier, B: is implied by the first one, it is unnecessary in this example. The command line above has the same effect as the following: A>REN B:NEWLIST=OLDLIST or A>REN NEWLIST=B:OLDLIST ///1RMAC Syntax: RMAC filespec {$Rd | $Sd | $Pd} Explanation: RMAC, a relocatable macro assembler, assembles .ASM filehe SAVE command, then run your program which reads a file into memory. Your program exits to the SAVE utility which prompts you for a filespec to which it copies the contents of memory, and the beginning and ending address of the memory to be SAVEd. ///2Example A>SAVE Activates the SAVE utility. Now enter the name of the program which loads a file into memory. A>SID dump.com Next, execute the program. #g0 When the program exits, SAVE intercepts the return to the system and prompts the user for the filespec and the bounds of memory to be SAVEd. SAVE Ver 3.0 Enter file (type RETURN to exit):dump2.com If file DUMP2.COM exists already, the system asks: Delete dump2.com? Y Then the system asks for the bounds of memory to be saved: Beginning hex address: 100 Ending hex address: 400 The contents of memory from 100H (Hexadecimal) to 400H is copied to file DUMP2.COM.  the printer output of program MYPROG to file XOUT. The output is not echoed to the printer. A>PUT PRINTER OUTPUT TO FILE XOUT2 [ECHO,SYSTEM] Directs all printer output to file XOUT2 as well as to the printer (with ECHO option), and the PUT is in effect until you enter a PUT PRINTER OUTPUT TO PRINTER command. A>PUT CONSOLE OUTPUT TO CONSOLE Directs console output back to the console. A>PUT PRINTER OUTPUT TO PRINTER Directs printer output back to the printer. ///1RENAME Syntax: RENAME {new-filespec=old-filespec} Explanation: RENAME lets you change the name of a file in the directory of a disk. To change several filenames in one command use the * or ? wildcards in the file specifications. The RENAME command can be abbreviated REN. REN prompts you for input. ///2Examples A>RENAME NEWFILE.BAS=OLDFILE.BAS The file OLDFILE.BAS changes to NEWFILE.BAS on drive A.s of into .REL files that you can link to create .COM files. ///2options RMAC options specify the destination of the output files. Replace d with the destination drive letter for the output files. Option d=output option R- drive for REL file (A-O, Z) S- drive for SYM file (A-O, X, P, Z) P- drive for PRN file (A-O, X, P, Z) A-O specifies drive A-O. X means output to the console. P means output to the printer. Z means zero output. ///2Example A>RMAC TEST $PX SB RB Assembles the file TEST.ASM from drive A, sends the listing file (TEST.PRN) to the console, puts the symbol file (TEST.SYM) on drive B and puts the relocatable object file (TEST.REL) on drive B. ///1SAVE Syntax: SAVE Explanation: SAVE copies the contents of memory to a file. To use SAVE, first issue t ///1SET Syntax: SET [options] SET d: [options] SET filespec [options] Explanation: SET initiates password protection and time stamping of files. It also sets the file and drive attributes Read-Write, Read-Only, DIR and SYS. It lets you label a disk and password protect the label. To enable time stamping of files, you must first run INITDIR to format the disk directory. ///2Label Syntax: SET {d:} [NAME=labelname.typ] SET [PASSWORD=password] SET [PASSWORD= ///3Examples A>SET [NAME=DISK100] Labels the disk on the default drive as DISK100. A>SET [PASSWORD=SECRET] Assigns SECRET to the disk label. A>SET [PASSWORD= Nullifies the existing password. ///2Passwords SET [PROTECT=ON] SET [PROTECT=OFF] SET filespec [PASSWORD=password] SET filespec [PROTECT=READ] SET le attribute to Read-Write. SYS sets the file attribute to SYS. DIR sets the file attribute to DIR. ARCHIVE=OFF means that the file has not been backed up (archived). ARCHIVE=ON means that the file has been backed up (archived). The Archive attribute can be turned on by SET or by PIP when copying a group of files with the PIP [A] option. SHOW and DIR display the Archive option. F1=ON|OFF turns on or off the user-definable file attribute F1. F2=ON|OFF turns on or off the user-definable file attribute F2. F3=ON|OFF turns on or off the user-definable file attribute F3. F4=ON|OFF turns on or off the user-definable file attribute F4. ///3Examples SET [PROTECT=ON] Turns on password protection for all the files on the disk. and update of your files. ///3Options [CREATE=ON] turns on CREATE time stamps on the disk in the default or specified drive. To record the creation time of a file, the CREATE option must be turned on before the file is created. [ACCESS=ON] turns on ACCESS time stamps on the disk in the default or specified drive. ACCESS and CREATE options are mutually exclusive; only one can be in effect at a time. If you turn on the ACCESS time stamp on a disk that previously had CREATE time stamp, the CREATE time stamp is automatically turned off. [UPDATE=ON] turns on UPDATE time stamps on the disk in the default or specified drive. UPDATE time stamps record the time the file was last modified. ///3Examples A>SET [ACCESS=ON] filespec [PROTECT=WRITE] SET filespec [PROTECT=DELETE] SET filespec [PROTECT=NONE] SET filespec [attribute-options] ///3Modes Password Protection Modes Mode Protection READ The password is required for reading, copying writing, deleting or renaming the file. WRITE The password is required for writing, deleting or renaming the file. You do not need a password to read the file. DELETE The password is only required for deleting or renaming the file. You do not need a password to read or modify the file. NONE No password exists for the file. If a password password exists, this modifier can be used to delete the password. ///2Attributes RO sets the file attribute to Read-Only. RW sets the fi You must turn on password protection before you can assign passwords to files. SET [PROTECT=OFF] Disables password protection for the files on your disk. A>SET MYFILE.TEX [PASSWORD=MYFIL] MYFIL is the password assigned to file MYFILE.TEX. B>SET *.TEX [PASSWORD=SECRET, PROTECT=WRITE] Assigns the password SECRET to all the TEX files on drive B. Each TEX file is given a WRITE protect mode to prevent unauthorized editing. A>SET MYFILE.TEX [RO SYS] Sets MYFILE.TEX to Read-Only and SYStem. ///2Default A>SET [DEFAULT=dd] Instructs the system to use dd as a password if you do not enter a password for a password-protected file. ///2Time-Stamps Syntax: SET [CREATE=ON] SET [ACCESS=ON] SET [UPDATE=ON] Explanation: The above SET commands allow you to keep a record of the time and date of file creation and update, or of the last access  A>SET [CREATE=ON,UPDATE=ON] ///2Drives Syntax: SET {d:} [RO] SET {d:} [RW] Example: A>SET B: [RO] Sets drive B to Read-Only. ///1SETDEF Syntax: SETDEF { d: {,d: {,d: {,d:}}}} {[ TEMPORARY = d: ] | [ ORDER = (typ {,typ}) ]} SETDEF [DISPLAY | NO DISPLAY] SETDEF [PAGE | NOPAGE] Explanation: SETDEF allows the user to display or define up to four drives for the program search order, the drive for temporary files, and the file type search order. The SETDEF definitions affect only the loading of programs and/or execution of SUBMIT (SUB) files. SETDEF turns on/off the system Display and Console Page modes. When on, the system displays the location and name of programs loaded or SUBmit files executed, and stops after displaying one full console screen of information. ///2Examples A>SETDEF er on the disk Number of free directory entries for the disk Drive characteristics ///2Examples A>SHOW A>SHOW [SPACE] Instructs the system to display access mode and amount of space left on logged-in drives. A>SHOW B: Show access mode for drive B and amount of space left on drive B. A>SHOW B:[LABEL] Displays label information for drive B. A>SHOW [USERS] Displays the current user number and all the users on drive A and the corresponding number of files assigned to them. A>SHOW C:[DIR] Displays the number of free directory entries on drive C. A>SHOW [DRIVE] Displays the drive characteristics of drive A. ///1SID Syntax: SID {pgm-filespec} {,sym-filespec} Explanation: The SID symbolic debugger allows you to monitor and test programs developed for the 8080 microprocessor. SID supports real-time breakpoints, fully mo (Load) Load program and symbol table {,sym-filespec} for execution E*sym-filespec (Load) Load a symbol table file Fs,f,d (Fill) Fill memory with constant value s is the start address f is the finish address d is an eight-bit data item G{p}{,a{,b}} (Go) Begin Execution p is a start address a is a temporary breakpoint H (Hex) Displays all symbols with addresses in Hex H.a Displays hex, decimal, and ASCII values of a where a is a symbolic expression Ha,b Computes hex sum and difference of a and b where  Displays current SETDEF parameters. A>SETDEF [TEMPORARY=C:] Sets disk drive C as the drive to be used for temporary files. A>SETDEF C:,* Tells the system to search for a program on drive C, then, if not found, search for it on the default drive. A>SETDEF [ORDER=(SUB,COM)] Instructs the system to search for a SUB file to execute. If no SUB file is found, search for a COM file. A>SETDEF [DISPLAY] Turns on the system display mode. Henceforth, the system displays the name and location of programs loaded or submit files executed. A>SETDEF [NO DISPLAY] Turns off the system Display mode. ///1SHOW Syntax: SHOW {d:}{[SPACE |LABEL |USERS |DIR |DRIVE]} Explanation: The SHOW command displays the following disk drive information: Access mode and the amount of free disk space Disk label Current user number and Number of files for each user numbnitored execution, symbolic disassembly, assembly, and memory display and fill functions. SID can dynamically load SID utility programs to provide traceback and histogram facilities. ///2Commands Command Meaning As (Assemble) Enter assembly language statements s is the start address Cs{b{,d}} (Call) Call to memory location from SID s is the called address b is the value of the BC register pair d is the value of the DE register pair D{W}{s}{,f} (Display) Display memory in hex and ASCII W is a 16-bit word format s is the start address f is the finish address Epgm-filespec a and b are symbolic expressions Icommand tail (Input) Input CCP command line L{s}{,f} (List) List 8080 mnemonic instructions s is the start address f is the finish address Ms,h,d (Move) Move Memory Block s is the start address h is the high address of the block d is the destination start address P{p{,c}} (Pass) Pass point set, reset, and display p is a permanent breakpoint address c is initial value of pass counter Rfilespec{,d} (Read) Read Code/Symbols d is an offset to each address S{W}s (Set) Set Memory Values s is address where value is (NEXT), the next location after the largest file read in (MSZE), the current value of the Program counter (PC), and the address of the end of available memory (END) Wfilespec,s,f (Write) Write the contents of a contiguous block of memory to filespec. f is finish address X{f}{r} (Examine) Examine/alter CPU state. f is flag bit C,Z,M,E or I. r is register A,B,D,H,S or P. ///2Examples A>SID CP/M 3 loads SID from drive A into memory. SID displays the # prompt when it is ready to accept commands. A>B:SID SAMPLE.HEX CP/M 3 loads SID and the program file SAMPLE.HEX into memory from drive B. ///2Utilities SID uetype of SUB). ///2Subfile The SUB file can contain the following types of lines: Any valid CP/M 3 command Any valid CP/M 3 command with SUBMIT parameters ($0-$9) Any data input line Any program input line with parameters ($0 to $9) The command line cannot exceed 135 characters. The following lines illustrate the variety of lines which may be entered in a SUB file: DIR DIR *.BAK MAC $1 $$$4 PIP LST:=$1.PRN[T$2 $3 $5] DIR *.ASM PIP SUBMIT A>SUBMIT SUBA A>SUBMIT AA ZZ SZ A>SUBMIT B:START DIR E: ///2PROFILE.SUB Everytime you power up or reset your computer, CP/M 3 looks for a special SUBmit file named PROFILE.SUB to ex sent W is 16 bit word T{n{,c}} (Trace) Trace Program Execution n is the number of program steps c is the utility entry address. T{W}{n{,c}} (Trace) Trace Without Call W instructs SID not to trace subroutines n is the number of program steps c is the utility entry address U{W}{n{,c}} (Untrace) Monitor Execution without Trace n is the number of program steps c is the utility entry address W instructs SID not to trace subroutines V (Value) Display the value of the next available location in memory tilities, HIST.UTL and TRACE.UTL are special programs that operate with SID to provide additional debugging facilities. The mechanisms for system initialization, data collection, and data display are described in the CP/M SID User's Guide. The HIST utility creates a histogram (bar graph) showing the relative frequency of execution of code within selected program segments of the test program. The HIST utility allows you to monitor those sections of code that execute most frequently. The TRACE utility obtains a backtrace of the instructions that led to a particular breakpoint address in a program under test. You can collect the addresses of up to 256 instructions between pass points in U or T modes. ///1SUBMIT Syntax: SUBMIT {filespec} {argument} ... {argument} Explanation: The SUBMIT command lets you execute a group (batch) of commands from a SUBmit file (a file with filecute. If it does not exist, CP/M 3 resumes normal operation. If the PROFILE.SUB file exists, the system executes the commands in the file. This file is convenient to use if you regularly execute a set of commands before you do your regular session on the computer. ///1TYPE Syntax: TYPE {filespec {[ PAGE | NOPAGE ]}} Explanation: The TYPE command displays the contents of an ASCII character file on your screen. [PAGE] Causes the console listing to be displayed in paged mode; i.e., stop automatically after listing n lines of text, where n normally defaults to 24 lines per page. [NOPAGE] Turns off Console Page Mode and continuously displays a typed file on the screen. ///2Examples A>TYPE MYPROG.PLI Displays the contents of the file MYPROG.PLI on your screen. A>TYPE B:THISFILE [PAGE] Displays the contents of the file THISFILE from d#b1En6`  fԐ1Uum(@8"ͩ bT|Ёnʲc`ݒͣJU;$wgvHea͵@lNd6Xt\ Ux&m&bsgHdf(eaUpW }IGÕAV!I@.1[|V!K'ԙ4yL6#Fr8#* Jj\U +ͣMU9Lg!yI ;6 pfiEt(Ub F$ [@{m8A8upBk g>:N ,:h : Rxf0V jo<- 'i0)d`@!M#%y`ݒ{JI;%%Ydn0ڄ-V<|fހfQfݠ6m]YmrXHk!W!*UC6(9``* º`+`1YbGV ^G< E`Y jV_0H05O#+v: s خSx:q$Of`R(Ԅ.- ͼ{>X0Y""f@VmjYVlUyBlڰ :0rP1nʲLJ5cAU %Ja`ͼ` `@k+T$ dp#t f`C՛V]b3jH6'p0!!*WH|#+x[݀:a v@rive B on your screen twenty four lines at a time. ///1USER Syntax: USER {number} Explanation: The USER command sets the current user number. The disk directory can be divided into distinct groups according to a "User Number." User numbers range from 0 through 15. ///2Examples A>USER Enter User#:5 5A> The current user number is now 5 on drive A. A>USER 3 3A> This command changes the current User Number to 3. ///1XREF Syntax: XREF {d:} filename {$P} Explanation: XREF provides a cross-reference summary of variable usage in a program. XREF requires the .PRN and .SYM files produced by MAC or RMAC for input to the program. The SYM and PRN files must have the same filename as the filename in the XREF command tail. XREF outputs a file of type .XRF. Examples: A>XREF b:MYPROG A>XREF b:MYPROG $P SPhhP8ͱ HFlh8` nx*l6ǀ3ll8 ~ `4fPp$#`?ٶ4u`Lͮ`eU8kFo&ePJܮwXڮVmfP DJ¯@ pic@Y FՀ3lh #~K6ƀHP&Y)AD24D) #: Id ynјY)AB@h(P&!r7Bi6L@r2L@3%0h(H @P( @P( @P( !Xf. rfi3A R G!`i3N`e9L'#  Cd l [ -"ڴ#+[p[@ ^Ȋ l9O/J7ps[F՛/xFV][^+vz@W ]+z@t"^+zEW Tz@W ^+z@W ^+z@W ^)jcv;cv;cv;cv;cv;cv;cv;cv;cv;cv8-Vx ͡LȆ?쁣@¶CVK'%dm]0p@" _2lR{6݁0Xw< M"0xʄGAD"!< "Ce6LgA!@r6а0 f a0 f f'/v{BH»@Y{La0`5;l:JfѰՐ^b1b+$?쁲[*@`^2K6meRq}Bwٴj^2! ;4f@RzKƬ;ͽ~ â:!~mU0wz@uB@+͵͸ja] mfݠ6ma`Q2XCp̃\Ub4f07 JYM"3i(2GV ew*a q='@DuO#?(W ;k+6 ~PV BP@2!~sǣ+t9erl[U;D +Wx z2AEwvlfuhٶI,V f`CMa 2YMWx!y@b+ó`@ @-U Uw[AF: c6B*OU > 0"[-Ke%ـlDp"[<-Ki%pm@D"[T-Kl%A@mD"[n-Kn%ЉmD"[-?帡`n@D$"[-Ks% {tX$@UaUzjH+{P@3k(3jK4K6`JYG&ml fհmIW, x@(dz¦.U _6J XKUw(A^Od`@F*K՛v#ץf@#sFI'U %Ja`ͼ` `@k+T$ dp#t f`C՛V]b3jH6'p0!!*WH|#+x[݀:a v@DIRLBL yd'* !9"1>"#2#:Og}**Ip2~w2i#1#":RͶ :O~!ʫ:<2Ž:"2"x2*# O:ļ:<:G>O*# :<t tIw!/>!/>!*6 #:_#:*Y" Y" Y" >*Y"#####Y"##Y"Y"Yz2*Kg"ɯ22!"*DM6:O* 2~ ~ †:<~:2>2:<** "_?:<2>!/:<}:2* ~b W6 y2> # vwm>2>!/ N *~O²+—">2>!/*:< "~G # p *~w#  :!y~=W!x# ~#bxE {8~#o}oA'.`28!Ip+q*HT!J6J T ` T!p+q*T> >/Ҥ×!p+q*DM͛:̀ ̀:2:!!K:*&L Ǹ!4!K6 ͐uÇYALPSID'TCELLOC$LAITINI!ÓCOPYRIGHT (C) 1977, DIGITAL RESEARCH g gzd{ *9 Wl> W> W*"!"^l!]kl$]xl']::>2l!6!"!~4*s,r,"!~Ol!F2y* "*xT-V-^yA!~4x]> WO" Q>2y*"  INITIAL = COLLECT = DISPLAY = "-A" IN EFFECT, ADDRESS BACKTRACE READY FOR SYMBOLIC BACKTRACE BACKTRACE:%B 2!4þ *%"%:/ ͩ!4¡ :$ !4!"%!q: O !{4>!O :!{O :2*'M!8 ^#V%!t ͫ *%B :w*%#"%` Ø Ø Ø Ø Ø ͩ` *M6` !6 ` !6 ` !6 ` *&T` !6 ` !6 ` !60 ` *& *8*:*8yO:O*}O= ~ w#P^#V#ɷ{ozg |g}oh:<͉̉O<OBKBK$'-*!*^#V"DD  $$HD@" @@ $B $$H$H$HH$$! HD$D$D@AD HD$!A"  @@ I$B$!!D!$"H@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z zcsv ; checksum vector else dw 0FFFEh ; checksum vector allocated by endif ; GENCPM if not nul ?asize dw ?alv ; allocation vector else dw 0FFFEh ; alloc vector allocated by GENCPM endif dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd ; by GENCPM db 0 ; hash bank if not nul ?csize ?csv ds ?csize ; checksum vector endif if not nul ?asize ?alv ds ?asize ; allocation vector endif endm dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm local ?n ;; physical sector mask and physical sector shift ?psh set 0 ?n set ?psize/128 ?psm set ?n-1 rept 8 ?n set ?n/2 if ?n = 0 exitm endif ?psh set ?psh + 1 endm ?spt set ?pspt*(?psize/128) ?bsh set 3 ?n set ?bls/1024 rept 8 ?n set ?n/2 if ?n = 0 exitm endif ?bsh set ?bsh + 1 endm ?blm set ?bls/128-1 ?size set (?trks-?of;variable for m ?gcdn set ?n ;;variable for n ?gcdr set 0 ;;variable for r rept 65535 ?gcdx set ?gcdm/?gcdn ?gcdr set ?gcdm - ?gcdx*?gcdn if ?gcdr = 0 exitm endif ?gcdm set ?gcdn ?gcdn set ?gcdr endm endm skew macro ?secs,?skf,?fsc ;; generate the translate table ?nxtsec set 0 ;;next sector to fill ?nxtbas set 0 ;;moves by one on overflow gcd %?secs,?skf ;; ?gcdn = gcd(?secs,skew) ?neltst set ?secs/?gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements ?nelts set ?neltst ;;counter rept ?secs ;;once for each sector db ?nxtsec+?fsc ?nxtsec set ?nxtsec+?skf if ?nxtsec >= ?secs ?nxtsec set ?nxtsec-?secs endif ?nelts set ?nelts-1 if ?nelts = 0 ?nxtbas set ?nxtbas+1 ?nxtsec set ?nxtbas ?nelts set ?neltst endif endm endm ; Macro Definitions for CP/M3 BIOS Data Structures. ; dtbl - drive table ; dph translate$table, - disk parameter header ; disk$parameter$block, ; checksum$size, (optional) ; alloc$size (optional) ; skew sectors, - skew table ; skew$factor, ; first$sector$number ; dpb physical$sector$size, - disk parameter block ; physical$sectors$per$track, ; number$tracks, ; block$size, ; number$dir$entries, ; track$offset, ; checksum$vec$size (optional) ; Drive Table. Contains 16 one word entries. dtbl macro ?list local ?n ?n set 0 irp ?drv, ?n set ?n+1 dw ?drv endm if ?n > 16 .' Too many drives. Max 16 allowed' exitm endif if ?n < 16 rept (16-?n) dw 0 endm endif endm dph macro ?trans,?dpb,?csize,?asize local ?csv,?alv dw ?trans ; translate table address db 0,0,0,0,0,0,0,0,0 ; BDOS Scratch area db 0 ; media flag dw ?dpb ; disk parameter block if not nul ?csize dw ?f)*?spt ?dsm set ?size/(?bls/128)-1 ?exm set ?bls/1024 if ?dsm > 255 if ?bls = 1024 .'Error, can''t have this size disk with 1k block size' exitm endif ?exm set ?exm/2 endif ?exm set ?exm-1 ?all set 0 ?n set (?ndirs*32+?bls-1)/?bls rept ?n ?all set (?all shr 1) or 8000h endm ?al0 set high ?all ?al1 set low ?all ?drm set ?ndirs-1 if not nul ?ncks ?cks set ?ncks else ?cks set ?ndirs/4 endif dw ?spt ; 128 byte records per track db ?bsh,?blm ; block shift and mask db ?exm ; extent mask dw ?dsm ; maximum block number dw ?drm ; maximum directory entry number db ?al0,?al1 ; alloc vector for directory dw ?cks ; checksum size dw ?off ; offset for system tracks db ?psh,?psm ; physical sector size shift ; and mask endm ; gcd macro ?m,?n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; (used in sector translate table generation) ?gcdm set ?m ; ; equates for mode byte bit fields mb$input equ 0000$0001b ; device may do input mb$output equ 0000$0010b ; device may do output mb$in$out equ mb$input+mb$output mb$soft$baud equ 0000$0100b ; software selectable ; baud rates mb$serial equ 0000$1000b ; device may use protocol mb$xon$xoff equ 0001$0000b ; XON/XOFF protocol ; enabled baud$none equ 0 ; no baud rate associated ; with this device baud$50 equ 1 ; 50 baud baud$75 equ 2 ; 75 baud baud$110 equ 3 ; 110 baud baud$134 equ 4 ; 134.5 baud baud$150 equ 5 ; 150 baud baud$300 equ 6 ; 300 baud baud$600 equ 7 ; 600 baud baud$1200 equ 8 ; 1200 baud baud$1800 equ 9 ; 1800 baud baud$2400 equ 10 ; 2400 baud baud$3600 equ 11 ; 3600 baud baud$4800 equ 12 ; 4800 baud baud$7200 equ 13 ; 7200 baud baud$9600 equ 14 ; 9600 baud baud$19200 equ 15 ; 19.2k baud ; @CHK MACRO USED FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ;; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?D,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM LDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDH,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH  ?D @CHK ?D DB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBCX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBCY MACRO ?D @CHK ?D DB 0FDH,9EH,?D ENDM ANDX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANDY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XORX MACRO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XORY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORX MACRO ?D @CHK ?D DB 0DDH,0B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ?D @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO DB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5DW ?NNNN ENDM SBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM SPIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DB 0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX MACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DB 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACROEH ENDM BC EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM INXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DB 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRO ?N DB 18H,?N-$-1 ENDM JRC MACRO ?N DB 38H,?N-$-1 ENDM JRNC MACRO ?N DB 30H,?N-$-1 ENDM JRZ MAC0CBH, ?D, 0EH ENDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?R ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM IOS (word, r/o) @CRDMA equ scb$base+3Ch ; Current DMA Address ; (word, r/o) @CRDSK equ scb$base+3Eh ; Current Disk (byte, r/o) @VINFO equ scb$base+3Fh ; BDOS Variable "INFO" ; (word, r/o) @RESEL equ scb$base+41h ; FCB Flag (byte, r/o) @FX equ scb$base+43h ; BDOS Function for Error ; Messages (byte, r/o) @USRCD equ scb$base+44h ; Current User Code (byte, r/o) @MLTIO equ scb$base+4Ah ; Current Multi-Sector Count ; (byte,r/w) @ERMDE equ scb$base+4Bh ; BDOS Error Mode (byte, r/o) @ERDSK equ scb$base+51h ; BDOS Error Disk (byte,r/o) @MEDIA equ scb$base+54h ; Set by BIOS to indicate ; open door (byte,r/w) @BFLGS equ scb$base+57h ; BDOS Message Size Flag (byte,r/o) @DATE equ scb$base+58h ; Date in Days Since 1 Jan 78 ; (word, r/w) @HOUR equ scb$base+5Ah ; Hour in BCD (byte, RO ?N DB 28H,?N-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PCIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 00H + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H ENDM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH,  title 'System Control Block Definition for CP/M3 BIOS' public @civec, @covec, @aivec, @aovec, @lovec, @bnkbf public @crdma, @crdsk, @vinfo, @resel, @fx, @usrcd public @mltio, @ermde, @erdsk, @media, @bflgs public @date, @hour, @min, @sec, ?erjmp, @mxtpa scb$base equ 0FE00H ; Base of the SCB @CIVEC equ scb$base+22h ; Console Input Redirection ; Vector (word, r/w) @COVEC equ scb$base+24h ; Console Output Redirection ; Vector (word, r/w) @AIVEC equ scb$base+26h ; Auxiliary Input Redirection ; Vector (word, r/w) @AOVEC equ scb$base+28h ; Auxiliary Output Redirection ; Vector (word, r/w) @LOVEC equ scb$base+2Ah ; List Output Redirection ; Vector (word, r/w) @BNKBF equ scb$base+35h ; Address of 128 Byte Buffer ; for Banked Br/w) @MIN equ scb$base+5Bh ; Minute in BCD (byte, r/w) @SEC equ scb$base+5Ch ; Second in BCD (byte, r/w) ?ERJMP equ scb$base+5Fh ; BDOS Error Message Jump ; (word, r/w) @MXTPA equ scb$base+62h ; Top of User TPA ; (address at 6,7)(word, r/o) end ion for Error ; Messages (byte, r/o) @USRCD equ scb$base+44h ; Current User Code (byte, r/o) @MLTIO equ scb$base+4Ah ; Current Multi-Sector Count ; (byte,r/w) @ERMDE equ scb$base+4Bh ; BDOS Error Mode (byte, r/o) @ERDSK equ scb$base+51h ; BDOS Error Disk (byte,r/o) @MEDIA equ scb$base+54h ; Set by BIOS to indicate ; open door (byte,r/w) @BFLGS equ scb$base+57h ; BDOS Message Size Flag (byte,r/o) @DATE equ scb$base+58h ; Date in Days Since 1 Jan 78 ; (word, r/w) @HOUR equ scb$base+5Ah ; Hour in BCD (byte,  ; CALLVERS program bdos equ 5 ; entry point for BDOS prtstr equ 9 ; print string function vers equ 12 ; get version function cr equ 0dh ; carriage return lf equ 0ah ; line feed org 100h mvi d,5 ; Perform 5 times loop: push d ; save counter mvi c,prtstr lxi d,call$msg ; print call message call bdos mvi c,vers call bdos ; try to get version # ; CALLVERS will intercept mov a,l sta curvers pop d dcr d ; decrement counter jnz loop mvi c,0 jmp bdos call$msg: db cr,lf,'**** CALLVERS **** $' curvers db 0 end  reserved for minimon break (rst 30h) end ^*^+"a*a*^ %Dͅ2 _*^#"^D!a4E!* " _* _*_: _og))))) ͝*n*#"n*:*D* _~*_*n*ͪw* _#*_*n*ͪ> G͋*n** _ s#r* _"w#w* _w#wbj* _s#rgo* _(s#r:*D*n*+"a!a7*^+*n* GE*; Dump program, reads input file and displays hex data ; org 100h bdos equ 0005h ;dos entry point cons equ 1 ;read console typef equ 2 ;type function printf equ 9 ;buffer print entry brkf equ 11 ;break key function (true if char ready) openf equ 15 ;file open readf equ 20 ;read function ; fcb equ 5ch ;file control block address buff equ 80h ;input disk buffer address ; ; non graphic characters cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ; file control block definitions fcbdn equ fcb+0 ;disk name fcbfn equ fcb+1 ;file name fcbft equ fcb+9 ;disk file type (3 characters) fcbrl equ fcb+12 ;file's current reel number fcbrc equ fcb+15 ;file's record count (0 to 128) fcbcr equ fcb+32 ;current (next) record number (0 to 127) fcbln equ fcb+33 ;fcb length ; ; set up stack lxi h,0 dad sp ; entry stack pointer in hl from the ccp shld oldsp ; set sp to local stack area (restored at finis) lxi sp,stktop ; read and print successive buffers call setup ;set up input file cpi 255 ;255 if file not present jnz openok ;skip if open is ok ; ; file not there, give error message and return lxi d,opnmsg call err jmp finis ;to return ; openok: ;open operation ok, set buffer index to end mvi a,80h sta ibp ;set buffer pointer to 80h ; hl contains next address to print lxi h,0 ;start with 0000 ; gloop: push h ;save line position call gnb pop h ;recall line position jc finis ;carry set by gnb if end file mov b,a ; print hex values ; check for line fold mov a,l ani 0fh ;check low 4 bits jnz nonum ; print line number call crlf ; ; check for break key call break ; accum lsb = 1 if character ready rrc ;into carry jc finis ;don't print any more ; mov a,h call phex mov a,l call phex nonum: inx h ;to next line number mvi a,' ' call pchar mov a,b call phex jmp gloop ; finis: ; end of dump call crlf lhld oldsp sphl ; stack pointer contains ccp's stack location ret ;to the ccp ; ; ; subroutines ; break: ;check bead the byte at buff+reg a mov e,a ;ls byte of buffer index mvi d,0 ;double precision index to de inr a ;index=index+1 sta ibp ;back to memory ; pointer is incremented ; save the current file address lxi h,buff dad d ; absolute character address is in hl mov a,m ; byte is in the accumulator ora a ;reset carry bit ret ; setup: ;set up file ; open the file for input xra a ;zero to accum sta fcbcr ;clear current record ; lxi d,fcb mvi c,openf call bdos ; 255 in accum if open error ret ; diskr: ;read disk file record push h! push d! push b lxi d,fcb mvi c,readf call bdos pop b! pop d! pop h ret ; ; fixed message area signon: db 'file dump version 2.0$' opnmsg: db cr,lf,'no input file present on disk$' ; variable area ibp: ds 2 ;input buffer pointer oldsp: ds 2 ;entry sp value from ccp ; ; stack area ds 64 ;reserve 32 level stack stktop: ; end reak key (actually any key will do) push h! push d! push b; environment saved mvi c,brkf call bdos pop b! pop d! pop h; environment restored ret ; pchar: ;print a character push h! push d! push b; saved mvi c,typef mov e,a call bdos pop b! pop d! pop h; restored ret ; crlf: mvi a,cr call pchar mvi a,lf call pchar ret ; ; pnib: ;print nibble in reg a ani 0fh ;low 4 bits cpi 10 jnc p10 ; less than or equal to 9 adi '0' jmp prn ; ; greater or equal to 10 p10: adi 'a' - 10 prn: call pchar ret ; phex: ;print hex char in reg a push psw rrc rrc rrc rrc call pnib ;print nibble pop psw call pnib ret ; err: ;print error message ; d,e addresses message ending with "$" mvi c,printf ;print buffer function call bdos ret ; ; gnb: ;get next byte lda ibp cpi 80h jnz g0 ; read another buffer ; ; call diskr ora a ;zero value if read ok jz g0 ;for another byte ; end of data, return with carry set for eof stc ret ; g0: ;r ; ECHOVERS RSX pstring equ 9 ; string print function cr equ 0dh lf equ 0ah ; ; RSX PREFIX STRUCTURE ; db 0,0,0,0,0,0 ; room for serial number jmp ftest ; begin of program next db 0c3H ; jump dw 0 ; next module in line prev: dw 0 ; previous module remov: db 0ffh ; remove flag set nonbnk: db 0 db 'ECHOVERS' space: ds 3 ftest: ; is this function 12? mov a,c cpi 12 jz begin ; yes - intercept jmp next ; some other function begin: lxi h,0 dad sp ;save stack shld ret$stack lxi sp,loc$stack mvi c,pstring lxi d,test$msg ; print message call next ; call BDOS lhld ret$stack ; restore user stack sphl lxi h,0031h ; return version number = 0031h ret test$msg: db cr,lf,'**** ECHOVERS **** $' ret$stack: dw 0 ds 32 ; 16 level stack loc$stack: end ]>S}2^:^¡@*}^!^> ͇@*}^:^og+MͨG!^> ͋*}^:^og#ͭ!^ > ʹ͋>2*ͮ"_!`d6*_#~A!`;*************************************************** ;* * ;* sample random access program for cp/m 3 * ;* * ;*************************************************** org 100h ;base of tpa ; reboot equ 0000h ;system reboot bdos equ 0005h ;bdos entry point ; coninp equ 1 ;console input function conout equ 2 ;console output function pstring equ 9 ;print string until '$' rstring equ 10 ;read console buffer version equ 12 ;return version number openf equ 15 ;file open function closef equ 16 ;close function makef equ 22 ;make file function readr equ 33 ;read random writer equ 34 ;write random wrtrzf equ 40 ;write random zero fill parsef equ 152 ;parse function ; fcb equ 005ch ;default file control block ranrec equ fcb+33 ;random record positi jnz ready ; ; cannot open file, so create it mvi c,makef lxi d,fcb call bdos inr a ;err 255 becomes zero jnz ready ; ; cannot create file, directory full lxi d,nospace call print jmp reboot ;back to ccp ; ;*************************************************** ;* * ;* loop back to "ready" after each command * ;* * ;*************************************************** ; ready: ; file is ready for processing ; call readcom ;read next command shld ranrec ;store input record# lxi h,ranovf mov m,c ;set ranrec high byte cpi 'Q' ;quit? jnz notq ; ; quit processing, close file mvi c,closef lxi d,fcb call bdos inr a ;err 255  mov m,a inx h ;next to fill dcr c ;counter goes down jnz rloop ;end of buffer? erloop: ; end of read loop, store 00 mvi m,0 ; ; write the record to selected record number mvi c,writer lxi d,fcb call bdos ora a ;error code zero? jnz error ;message if not jmp ready ;for another record ; ; ;******************************************************** ;* * ;* end of write command, process write random zero fill * ;* * ;******************************************************** notw: ; not the quit command, random write zero fill? cpi 'F' jnz notf ; ; this is a random write, fill buffer until cr lxi d,datmsg call print ;data prompt mvi c,127 ;up to 127 chaon ranovf equ fcb+35 ;high order (overflow) byte buff equ 0080h ;buffer address ; cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ;*************************************************** ;* * ;* load SP, set-up file for random access * ;* * ;*************************************************** lxi sp,stack ; ; version 3.1? mvi c,version call bdos cpi 31h ;version 3.1 or better? jnc versok ; bad version, message and go back lxi d,badver call print jmp reboot ; versok: ; correct version for random access mvi c,openf ;open default fcb rdname: lda fcb+1 cpi ' ' jnz opfile lxi d,entmsg call print call parse jmp versok opfile: lxi d,fcb call bdos inr a ;err 255 becomes zero becomes 0 jz error ;error message, retry jmp reboot ;back to ccp ; ;*************************************************** ;* * ;* end of quit command, process write * ;* * ;*************************************************** notq: ; not the quit command, random write? cpi 'W' jnz notw ; ; this is a random write, fill buffer until cr lxi d,datmsg call print ;data prompt mvi c,127 ;up to 127 characters lxi h,buff ;destination rloop: ;read next character to buff push b ;save counter push h ;next destination call getchr ;character to a pop h ;restore counter pop b ;restore next to fill cpi cr ;end of line? jz erloop ; not end, store character racters lxi h,buff ;destination rloop1: ;read next character to buff push b ;save counter push h ;next destination call getchr ;character to a pop h ;restore counter pop b ;restore next to fill cpi cr ;end of line? jz erloop1 ; not end, store character mov m,a inx h ;next to fill dcr c ;counter goes down jnz rloop1 ;end of buffer? erloop1: ; end of read loop, store 00 mvi m,0 ; ; write the record to selected record number mvi c,wrtrzf lxi d,fcb call bdos ora a ;error code zero? jnz error ;message if not jmp ready ;for another record ; ;*************************************************** ;* * ;* end of write commands, process read ************************************************ ;* * ;* end of read command, all errors end-up here * ;* * ;*************************************************** ; error: lxi d,errmsg call print jmp ready ; ;*************************************************** ;* * ;* utility subroutines for console i/o * ;* * ;*************************************************** getchr: ;read next console character to a mvi c,coninp call bdos ret ; putchr: ;write character from a to console mvi c,conout mov e,a ;character to send call bdos ;send character ret ; crlf: ;send carriage return line feed mvi a,cr ;carriage return call i 10 ;carry if numeric jnc endrd ; add-in next digit push psw mov a,c ;value = ahl dad h adc a ;*2 push a ;save value * 2 push h dad h ;*4 adc a dad h ;*8 adc a pop b ;*2 + *8 = *10 dad b pop b adc b pop b ;+digit mov c,b mvi b,0 dad b aci 0 mov c,a jnc readc jmp readcom endrd: ; end of read, restore value in a adi '0' ;command cpi 'a' ;translate case? rc ; lower case, mask lower case bits ani 101$1111b ret ;return with value in chl ; ;*************************************************** ;* * ;* string data area for console messages * ;* * ;*************************************************** badver: db 'sorry, you need cp/m version 3$' nospace: db 'no directory space$' datmsg: db* ;* * ;*************************************************** notf: ; not a write command, read record? cpi 'R' jnz error ;skip if not ; ; read random record mvi c,readr lxi d,fcb call bdos ora a ;return code 00? jnz error ; ; read was successful, write to console call crlf ;new line mvi c,128 ;max 128 characters lxi h,buff ;next to get wloop: mov a,m ;next character inx h ;next to get ani 7fh ;mask parity jz ready ;for another command if 00 push b ;save counter push h ;save next to get cpi ' ' ;graphic? cnc putchr ;skip output if not pop h pop b dcr c ;count=count-1 jnz wloop jmp ready ; ;***putchr mvi a,lf ;line feed call putchr ret ; parse: ;read and parse filespec lxi d,conbuf mvi c,rstring call bdos lxi d,pfncb mvi c,parsef call bdos ret ; print: ;print the buffer addressed by de until $ push d call crlf pop d ;new line mvi c,pstring call bdos ;print the string ret ; readcom: ;read the next command line to the conbuf lxi d,prompt call print ;command? mvi c,rstring lxi d,conbuf call bdos ;read command line ; command line is present, scan it mvi c,0 ;start with 00 lxi h,0 ; 0000 lxi d,conlin;command line readc: ldax d ;next command character inx d ;to next command position ora a ;cannot be end of command rz ; not zero, numeric? sui '0' cp 'type data: $' errmsg: db 'error, try again.$' prompt: db 'next command? $' entmsg: db 'enter filename: $' ; ;*************************************************** ;* * ;* fixed and variable data area * ;* * ;*************************************************** conbuf: db conlen ;length of console buffer consiz: ds 1 ;resulting size after read conlin: ds 32 ;length 32 buffer conlen equ $-consiz ; pfncb: dw conlin dw fcb ; ds 32 ;16 level stack stack: end ssages * ;* * ;*************************************************** badver: db 'sorry, you need cp/m version 3$' nospace: db 'no directory space$' datmsg: dbfloppy equ 0 ldrbios equ -1 drives equ 5-1 $txrdy equ 4 edv equ 40h rev equ romrev-30h fmthst equ 026h primary equ 0 .z80 ;Set switch for zilog nmenonics ; Rom Jump Table Definitions ;--------------------------- ; rom equ 0 msgrm equ rom+3 ;rom print signon message routine hmrm equ rom+6 ;rom home disk routine rdhsrm equ rom+9 ;rom read disk routine wrhsrm equ rom+0Ch ;rom write disk routine disrm equ rom+0Fh ;rom direct disk i/o routine bterm equ rom+18h ;rom print boot err routine APIFrm equ rom+1Bh ;rom default for application interface area rdlsec equ rom+20h ;rom read a logical sector wrlsec equ rom+23h ;Rom write a logical sector dpboff equ 12 ;offset into dph for dpb pointer physoff equ 15 ;offset from spt to psh in dpb ERwp equ 1 T\*`\``\#a;Copyright (c) 1984, Morrow Designs, Inc., Bill Smith ;naming conventions: ; macros defined by DEFINE begin with the structure name MT, DPH, DPB, ; have the letter M in them, ; and end with the drive letter, ; as in DPBMA, the dpb for drive a ;this macro will compile DPBxxxx where xxxx is the drive type (see below) ;these macros generate labels which are the same as the macro name without M, ; as in DPBA: ; ;the following drive type codes are either defined or reserved: ; ;DSDD 5.25 inch double sided double density 48 tpi drive ;DSQD 5.25 inch double sided double density 96 tip drive ; ;CM11 Computer Memories Inc. Model 5412, 11 meg drive ;SA11 Shugart Associates, Model SA712 11 meg drive ;ST06 Seagate Model ST506 5 meg drive ;CM34 Computer Memories Inc. Model 6640, 34 meg drive ;---------------------------------------------------------------------- ;the define macro is called once for each drive. ;each time it is called it generates 3 new macros which are unique for ;the logical drive, and contain the logical drive's name. ;it generates macros which when used, create the MTAB, DPH, and DPB for the drive. define macro dv,typ mt&m&dv macro mt&dv: mt&typ endm dpbm&dv macro dpb&dv: dpb&typ endm dphm&dv macro dph&dv: dphgen dv endm xl&dv equ xl&typ csv&dv equ csv&typ endm table_gen macro typ drive aset 0 irpc dv,ABCDEFGHIJKLMNOP if drive lt drives drive aset drive+1 dw typ&dv else exitm endif endm endm struct_gen macro typ drive aset 0 irpc dv,ABCDEFGHIJKLMNOP if drive lt drives drive aset drive+1 &typ&m&dv dv else exitm endif endm endm ;---------------------------------------------------------------------- ;prototype data structures ;---------------------------------------------------------------------- ;prototype dph for all drives, do not change dphgen macro dv dw xl&dv ds 10,0 dw dpb&dv dw csv&dv dw -2,-2,-2,-2 db 0 endm ;------------------------------------------------------------------- write lo-current db 0 ;format type, odd track on alternate head endm mtcm11 macro ;media table (mtab) for standard Morrow 5.25 inch 11 meg winchester ;see file HD??DEF.MAC for full description of field assignments db 00101110b ;sector numbers start at 0, 4 heads, drive address = 2 db 01101111b ;drive has ready line, "double density", has bad map, has fast seek, 1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 /3 ;no step rate for fast seek db 765 /3 ;recal step rate is recal settling time, long time db 3 /3 ;1 ms recal step rate db 0 /3 ;0 ms head load time db 0 /3 ;0 ms motor on time dw 128 ;starting track of write precompensation dw 128 ;starting track of write lo-current db 0 ;format type, normal endm ;---------------------------------------------------------------------- ;prototype dpbs ;---------------------------------------------------------------------- dpbdsdd macro ;dpb for standard Morrow 5.25 inch 400k ds--- ;make an entry here for each drive type to define the name of the xlate xldsdd equ xlt1k ;standard floppy xlcm11 equ 0 ;no xlate ; ;make an entry here for each drive type to define the name of the csv csvdsdd equ -2 ;gencpm does it csvcm11 equ 0 ;none ;---------------------------------------------------------------------- ;prototype mtabs ;---------------------------------------------------------------------- mtdsd macro ;media table (mtab) for standard Morrow 5.25 inch double sided double density drives ;see file HD??DEF.MAC for full description of field assignments db 10000100b ;virtual drive, double sided, drive address = 0 db 00100011b ;double density, 1024 bytes per sector db 00000000b ;reserved byte db 0 ;no park offset dw 40 ;40 cylinders db 6 /3 ;6 ms step rate db 15 /3 ;15 ms settling time db 6 /3 ;6 ms recal step rate db 0 /3 ;0 ms head load time db 500 /3 ;500 ms motor on time dw 23 ;starting track of write precompensation dw -1 ;starting track ofdd floppy dw 40 ;records per track db 4,0Fh ;2k blocks db 1 ;2 logical extents per physical extent dw 195-1 ;195*2k drive capacity = 390k (including directory) dw 192-1 ;192 directory entries in db 0E0h ; 3 blocks (2k blocks * 3)/32bytes/entry db 000h ; dw (192/4)-1 ;cks size dw 2 ;2 system tracks db 3,7 ;physical sectors are 1k each endm dpbcm11 macro ;dpb for standard Morrow 5.25 inch 11 meg winchesters dw 72 ;records per track db 5,1Fh ;4k blocks db 1 ;2 locical extents per physical extent dw (306-2)*36/4-1 ;306 cyl-2 reserved * 36sec/cyl / 4sec/grp - 1 = 11.2 million bytes dw 16*4*32-1 ;16 groups * 4k per group * 32 dirs per k = 2048 directory entries db 0FFh ;reserve 16 groups for directory (max) db 0FFh ; dw 8000h ;drive is permanent, no checking for cks dw 8 ;eight tracks (two cylinders) reserved for system and bad map db 3,7 ;physical sectors are 1k each endm ;m80 =ldrbios ;link bootldr[l4000]=cpmldr,ldrbios,scb .z80 true equ -1 false equ not true $txrdy equ 4 rev equ romrev-30h ; Rom Jump Table Definitions ;--------------------------- ; rom equ 0 rdhsrm equ rom+9 ;rom read disk routine wrhsrm equ rom+0Ch ;rom write disk routine include HD19DEF.MAC include DRIVES.MAC include DEFINE.MAC ;---------------------------------------------------------------------- extrn @civec, @covec, @aivec, @aovec, @lovec, @bnkbf extrn @crdma, @crdsk, @vinfo, @resel, @fx, @usrcd, @mltio extrn @ermde, @erdsk, @media, @bflgs extrn @date, @hour, @min, @sec extrn ?erjmp, @mxtpa ;---------------------------------------------------------------------- ; cp/m plus version 3.0 jump table ;---------------------------------------------------------------------- cseg ;resident jp boot ;arrive here from cold start load warmpt: jp wboot ;arrive here for warm start jp const ;return console input status jp conin ;read console character jp cot ;reserved for DRI jp wboot ;reserved for DRI ;---------------------------------------------------------------------- const: conost: listst: auxist: auxost: list: auxout: conin: auxin: flush: time: write: setbnk: userf: selmem: xmove: multio: home: wboot: devtbl: devini: drvtbl: ret ;---------------------------------------------------------------------- boot: ;save interrupt vectors ld hl,0fff0h ;source ld de,irq_vec_buf ;dest ld bc,16 ;leng ldir ;copy ret ;---------------------------------------------------------------------- conout: in a,(s1stat) and 4 jr z,conout ld a,c out (s1data),a ret ;---------------------------------------------------------------------- settrk: ld (hsttrk+ramdaty),bc ;set track in ramdaty ret ;---------------------------------------------------------------------- setsec: ld (hstsec+ramdaty),bc ;set sector in ramdaty ret ;---------------------------------------------------------------------- setdma: ld (de: ;first call here is to move highest 128 bytes (ff80-ffff) ;on first call, replace vectors ex de,hl ldir ex de,hl ld a,h or l ret nz ;if [hl] = 0, just clobbered vectors push hl push de ld hl,irq_vec_buf ;source ld de,0fff0h ;top 16 bytes of memory ld bc,16 ldir pop de pop hl ;restore ret ;---------------------------------------------------------------------- ramdatY: db 0 ;(SEKDSK) BDOS disk number dw 0 ;(SEKTRK) BDOS track number ; dw 0 ;(SEKSEC) BDOS sector number ; dw 0 ;(SEKHST) Actual sector number on the disk ; db 0 ;(UNACNT) Unallocated record count db 0 ;(UNADSK) Unallocated disk number dw 0 ;(UNATRK) Unallocated track number ; dw 0 ;(UNASEC) Unallocated sector number ; db 0 ;(UNAMAX) Sectors per Unallocated block dw 0 ;(SECTRK) Logical Sectors per track ; db 0 ;(PHYSPT) Physical sectors per track db 0 ;(WRTYPE) Write type db 0 ;(CFLAG) Flag Byte db 0 ;(DFLAG) Flag Byte db 0 ;(TRSEC) Offset to logicnout ;write conlole character jp list ;write list character jp auxout ;write aux character jp auxin ;read aux character jp home ;move to track zero on selected drive jp seldsk ;select disk drive jp settrk ;set track number jp setsec ;set sector number jp setdma ;set DMA address jp read ;read selected sector jp write ;write selected sector jp listst ;return list device status jp sectrn ;translate logical to physical sector number jp conost ;return console output status jp auxist ;return aux device input status jp auxost ;return aux device output status jp devtbl ;return address of character i/o table jp devini ;init character i/o devices jp drvtbl ;return address of disk drive table jp multio ;set number of consec. sec. to read/write jp flush ;flush user [de]blocking buffers jp move ;copy memory to memory jp time ;clock support jp selmem ;select memory bank jp setbnk ;set bank for next DMA jp xmove ;set banks for next move jp userf ;reserved for me. jp wboomaadr+ramdaty),bc ;set dma address in ramdaty ret ;---------------------------------------------------------------------- sectrn: ld l,c ;hl=bc ld h,b inc hl ;start sectors at 1 ld a,d ;see if xlat table or e ret z ;return if no xlat ex de,hl ;hl=xlt add hl,bc ;add to table ld l,(hl) ;get xlated sector ld h,0 ret ;---------------------------------------------------------------------- seldsk:: ;select drive 0, 1k sectors, others set-up if floppy ld a,5 else ld a,9 endif ld (physpt+ramdaty),a ;set sectors for BAD ld hl,dpha ret ;---------------------------------------------------------------------- read:: ld iy,ramdaty ;set-up iy -> ramdaty call rdhsrm ;read from disk ld de,(dmaadr+ramdaty) ;destination address ld hl,dskbuf ;source address ld bc,400h ;number of bytes to transfer ldir or a ret z ;if error, ld a,1 ; say so ret ;endif ;---------------------------------------------------------------------- moval sector within physical sector dw 0 ;(VMSGP) Pointer to virtual drive message ; dw 0 ;(VDRVP) Pointer to virtual drive in message ; db 0FFh ;(CDSK) Current drive db 0 ;(VDSK) Current virtual drive dw 0 ;(DMAADR) BDOS DMA address ; dw conout ;(CONOUT) Pointer to Current console output routine ; dw conin ;(CONIN) Pointer to Current console input routine ; dw const ;(CONSTS) Pointer to Current console status routine db 0 ;(CPYBNK) Copy of bank strobe (printer restore = false) ;---------------------------------------------------------------------- ; Default Application Interface area (13_Oct_83) ;----------------------------------------------- ; APIF: db 0 ;(HSTDRV) BDOS Drive Number (1st floppy) dw 0000 ;(HSTTRK) Desired Cylinder (lo) ; Desired Cylinder (hi) dw 1 ;(HSTSEC) Desired Sector (lo) ; Desired Sector (hi) db 1 ;(SECCNT) Number of sectors to transfer db 20 ;(RETRY) Retry Count dw dskbuf ;(HSTBUF) Buffer $ CP/M 3 Sys $ Memseg No. $ Bank $ Accept new memory segment table entries $Default entries are shown in (parens). Default base is Hex, precede entry with # for decimal $ Use GENCPM.DAT for defaults $Create a new GENCPM.DAT file $Display Load Map at Cold Boot $Number of console columns $Number of lines in console page $Backspace echoes erased character $Rubout echoes erased character $Initial default drive ($:) ? $Top page of memory $Bank switched memory $Common memory base page $Long error messages $Double allocation vectors $Accept new system definition $ CP/M 3.0 System Generation Copyright (C) 1982, Digital Research $ BNKBIOS3 SPR$BIOS3 SPR$BNKBIOS3 SPR$BDOS3 SPR$RESBDOS3 SPR$BNKBDOS3 SPR$ 64K TPA Copyright (C) 1982, Digital Research *** CP/M 3.0 SYSTEM GENERATION DONE ***$!Tq:UM*T&!Tp+q:Ud*T !Tp+q*T#6:UҀ:Tڀ*T *T#N! *T6 7 7!Tr+s+q+q!U6N*TDMN:TTN͜:T.:T/!U!]6 !m6 !TpAddress (lo) ; Buffer Address (hi) db 0 ;(ERFLAG) Error Code db 0 ;(OPFLAG) Options Flag dw 0 ;(PHYTRK) Physical track number (lo) ; Physical track number (hi) db 0 ;(PHYSEC) Physical sector number db 0 ;(PHYHD) Desired Head db 2 ;(PHYDRV) Physical Drive Number dw 0 ;(IOADD) Execution Address (lo) ; Execution Address (hi) ;---------------------------------------------------------------------- ; Ram MTABs (3_Oct_83) ;--------------------- ; mtab: mtma ;make mtab ;---------------------------------------------------------------------- dpbase: dpha: if floppy dw xlt1k ;xlt else dw 0 endif ds 10,0 ;scratch dw dpba ;dpb dw 0 ;csv dw 0 dw dirbcb dw dtabcb dw -1 ;hash db 0 ;hbank dphlen equ $-dpha dirbcb: db -1 ds 9,0 dw dirbuf ds 3,0 dtabcb: db -1 ds 9,0 dw dtabuf ds 3,0 dpbma ;make dpb xlt1k: db 1,4,2,5,3 irq_vec_buf equ $ dirbuf equ irq_vec_buf+16 dtabuf equ dirbuf+1024 END 1TdCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH1512826543210123456789ABCDEF ERROR: $Reading file: $Writing file: $Directory full$Reading file: $Writing file: $Invalid drive.$) ? $) ? $) ? $Bad character, re-enter $ $ Disk read error: $File cannot fit into GENCPM buffer: $Unable to open: $BDOS3 BIOS3 Setting up directory hash tables: $ Enable hashing for drive $: $Unable to allocate space for hash table.$ Setting up Allocation vector for drive $ Setting up Checksum vector for drive $ *** Bank 1 and Common are not included *** *** in the memory segment table. *** $Number of memory segments $ CP/M 3 Base,size,bank ($) $ Enter memory segment table: $ Base,size,bank $Zero length segment not allowed.$Bank one not allowed.$ ERROR: Memory conflict - segment trimmed. $Memory conflict - cannot trim segment.$ ERROR: Memory conflict - segment trimmed. $ ERROR: Memory conflict - segment trimmed. +q *T 6 *T 6*T!Tp+q*T!Tp+q*T!Tp+q*T] ͧ!Tp+q*T} ͧ!Tp+q*T ͧ *T 6!Tp+q*T!Tp+q*T! ͧ!Tp+q*T" ͧ!Up+q*T$!Vr+s+p+q+q:V *V*VDM*V -- !Vs+p+q:VJ *V*VM!VLS!Vq:V e > :Va/>z!V/H҄ :V_2V:V!Vq:V/>!V/HҦ >ͧ>!Vp+q(7*V~ Y7 N7NTe:T *TMV Y*Vw!Vq:VO! N7:VO! N7!Vp+q 7*V|O *V}O H7!Vq*V&+SDM$ !Vp+q!V6!V60!'"V>V͇S† *VM7 !V6>!V VVzSڽ !V6:V<2VVVzS+s#rÔ :V *VM7!V60*V! S"V:V<2V‹ !Vs+q(7:V  #7*V&DMZ  *VM N!Vs+p+q+p+q :T: ͜*V6:V<2VO!T NV 2V  :V,u *V#"V*V6!V6 :V#… !V6  :V02V:V> !VHҽ >!VҸ :V2Vý !V6!V:V *V^*V&+S*V& *Vq !V6*V6ͧ *&:U2!V!""V*!VM"V͟:!V2U! U6Û*U|!U2!V* U|!Uo&)##""V*T&+SDM*!V*!VM"V͟:!V2 U:U2!V!""V>T͇S+s#r*!VM"V͟:!V2U* U|!$V2T:T2T U(T(TͩC*$V&+ST͊S+s#r* U|!$V2!V:-Q/ *T&+SDM*!V"*T&+SDM*!V*!VM"V͟:!V!Uw:-QҢ!T6:T2TULTLTͩ*U|2!V*U|!Uo&)*"V""V*T&+SDM*!V*!VM"V͟:!V! Uw:,Q/Ҳ:V2V *V&U  :T2T*T&! S!0*V& U q*T&! S0*V&!U q:V 2V*T&+S"!U$-U RUW !T6#6#6:.Q2U:/Q2UTqT TyT Uͧ pT !T6Uͧ pT pT :;Rһ!;R6:%V2.Q:4Q/24QTT TT L!U6N!Vr+s+p+q*V6 *V#6 *V|O! *V## w*V|O! *V w*V}O! *V w*V}O! *V w!T:TO`iPSW "V*V :0Qw*V :2Qw*V :1Qw.*V :3Qw*V :4QwX*V   :+Q/ҼW*V >*V w:@*V wW*V >*V w^*V :/Qw!)X"V* *Ws#r*VDM> !V6&VS(>!V6>!V*V&)*&V>͒S*V&)*&VWR"(V *(V## *(V ͕S*(V ͕SH*(V ͕SH*(V ͕SH*(V ͕SH!V6:V<2V-:V!V6!V6!V6>!V*V&)*&VWR"(V*V&)*&V>͒S*(V S?!V6*(V ͕S:V/c!V6N:VO!=R ~2T *(V WR"*V**V N#F`i))"VN:VAO7N*V&6Q DMʹ ͜*V&6Q ~/*(V q#p:-Q/!V6*V&,V) *Vs#r*V*LV"LV*V͛ 2V'ͧ*V&+SFQ  *(V w*V&+SFQ N`iPS*V&+SFQ  N`iPS*V&+SFQ  ͕S *(V q#p*V&+SFQ  VzS*V&+SFQ  q#p:V<2V:-Q/!V!$V6:T<<2T:T<<2T!V6>!V8*V&NV) >w#6*V&pV) >w#6:V<2V:!Vڡ*V&)*&V>͒Sʗ*V&)*&VWR"(V *(V WR"*V*(V ͕SN:VAO7:7!V6**V ^#V!S*V&+S*V&NV) q#p*V6? ͜*VDMN*V~  (7*VN !V6>!Vn *V#"V:V:-Q/HX *V6d ,7*VN :V<2V, *V++"VNÊ *VN*V !V6!V6Te!Vr+s+q:-Q/Ү >!V6#q#p!V6:5Q!Vڳ*V&+SFQ  VzSک:VM*V&+SFQ  ~*V&+SFQ  VzSHJ:V2V*V&+SFQ  ^#V"Vé*V&+SFQ  ~*V&+SFQ  VzSHҩ:V2V*V&+SFQ  ^#V"V:V<2V¿ :V:VH`!V6:5Q!V`*V&+SFQ  VzS/*V&+SFQ  ~H*V&+SFQ  VzSHV:V2V*V&+SFQ  ^#V"V:V<2V:V!$V6!U6ͬ#Q$!H> U͇Sʔ* U|2Uß*U|2U!U:.Q2T*U|!UO:/Q2T*U|O:T2TUTI:-Q/!$V>O:T2T* U|O:T!$V2T:T=2T* U|O:T2TҮ:-Qқ*nV*U*V |!UO:/Q2T*U|O:T2T2Uͬ:U/Ҙ!!V6>!!Vژ*!V&$SQ  6:!V<2!Vsà!U6:V/ҫ*:U2T:T2TTͩ:-Q*T&+SDM*U*T&+SDM*U:-Q/VN#F!W "V*V"V*V͕S(!$V6-!$V6*VSD*VWR!"&V!V6&VS!V6>!Vڷ*V&)*&V>͒Sʭ*V&)*&VWR"(V*(V ͕Sʭ!V6:V<2Vf:-Q/!V!$V6!$V6V>X W*V"V*V~>>!Vs+p+q+p+q%N*VDMN 7*VDM$  7*VME :,QҨ *V&U *VDM :V 2V*V&U DM*V:V2V*V&U *V&+S:V2V*V&U ) :V2V!Vp+q*V"TͣN,ͧ*VDM !Vr+s+p+q*V^#V"T*V##^#V"T*V ^#V"T*V#DMT  *VDMT *TZSU͊S@?ͧ*T+ZS}<2V!V6!V:V҆*V&+SW "TDMͧ *VDM> :V<2VS*TDMO W*T"T!Vr+s+q:VGTqT TyT *Vn}2T*V#~2TpT WTS}pS}TR+s#r*V&)+!Vs+6:V!V4>T͇S+s#rBKͧ pT^ :V<2VpT *VT :-Q/k)Tw T z!LT"V!U"V͙!T"V!U"V͙!(T"V! U"V͙*V#DMT  *VDMT *VDMeͧWͧ *VDM> *V*Ws#r*V##*Ws#r*VV&NV) nVR+s#r*(V ͕S—'N:VAO7:7!V6**V >R!S*V&pV) s#r*V&) VR+s#r **V R*V&pV) CS **V q#p:V<2Vk:Vҫ͜:T2FQ!T:/Q2GQ!"IQ!HQ6!V6ON:GR2T 5Q N*FQM ,7*GQM ,7*HQM N:V/҈!N!V6:5Q!V !V6:V/ :V =O!=R ~2T*V&+SFQ DM *V&+SFQ  N`iPS*V&+SFQ  q#p*V&+SFQ  ~ͧ *V&+SFQ  ~7ͧ *V&+SFQ ~2V*V&*V&+SFQ  N "V*V|*V}O:/QH҆MN!V:/Q*V&+SFQ  Hq!V:/QO`iPS*V&+SFQ  q#p *V}2V!V6!V6!V:V# *V&+SFQ ~2V*V&+SFQ  :V2V*V&+SFQ  *V&+SFQ  !V:V/+~!V/H+ |ͧ!V6 :V!V+~!VHc N*V&+SFQ :Vw!V6 :V!V+~!VH N!V:V*V&+SFQ  Hq!V:VO`iPS*V&+SFQ  q#p!V6:V<2V×1:V<2V"͜!V6:5Q!Vo!:V!byte pages: $TPA =$, Bank 0 =$, Other banks =$Unable to allocate Dir deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Unable to allocate Data deblocking buffer space.$Drive specified has not been defined. $0FFFFH is an invalid value in the DPH directory BCB address field.$ Setting up Blocking/Deblocking buffers: $ The physical record size is$: $ *** Directory buffer required *** *** and allocated for drive $: *** $ Overlay Directory buffer for drive $: $ Number of directory buffers for drive $: $Minumum number of buffers is 1. $ Number of directory buffers for drive $: $ *** Maximum number of directory buffers *** *** for the current drive is$. *** *** Number of directory buffers reduced *** *** accordingly. *** $ Share buffer(s) with which drive ($:) ? $ *** Data buffer required and *** *** allocated for drive $: *** $ Overlay Data buffer for drive))lW  ^#V"JW*W&))lW >͒S:WH3:WE-1&N!W6]&N*W&))lW N#F$ {&N!W6>JWR>fS:WHҚ-!JWVS+s#r!W4g-!JWVS+s#r:W3*W&)*&VWR"(V WR"*V >RZS"^W **V ͕S-!W6-!W6*(V ͕Sc0bB*W&$SQ  >w:-Q.: Wd.! W6*W&$SQ  6&N:WAO7&N.:W{O!=R ~2T&N:WAO7'N*W&$SQ  DMʹ ͜*W&$SQ  ~.*W&$SQ  6.*W&$SQ  6t/:W;O!=R ~2T'N:WAO7>'*W&$SQ  DM  : Wt/! W6*W&$SQ  ~t/A'ͧb'N:WAO7'*W&$SQ  DM  &/*W&$SQ  ~^W͇Sҹ/'N*^WDM$ 'N*W&$SQ  *^Ws*W&$SQ  ~R0:W[O!=R ~2TM(N*W&$SQ  ~AO7(NTe:TL0*TMV A2 W* WM͈ *0/* WMF80/*W&$SQ  : Ww͜c0*WMTCc0 4*(V ͕Sn3!W6*W&$SQ >͒S°0*(V q#p*W&$SQ  6n3bB*W&$SQ  >w:-Qګ1: W1:W1! W6!W6*W&$SQ  6(N:N!N:V=O *V&+SFQ NE *V&+SFQ  NE :-Qb!N*V&+SFQ  N ͜:V<2V !T6!V6%NVʹ ͜PNT2V!TT TT N!V6Vʹ ͜:V!FT !!U6+6!W6͌!:W/җ#:R2T͜N;Rʹ :=R2T͜͜N,Qʹ ͜͜:>R2T:2Q<22Q  2Q :2Q=22Q:?R2T:1Q<21Q' 1Q :1Q=21Q:@R2THN3Qʹ ͜:AR2TkN4Qʹ ͜͜:BR2TN:0QAO7NTe:T"*TMV A2W*WM͈ /"Þ":W20Q͜͜:CR2T.Q *.Q&PS"U:DR2TN-Qʹ ͜:-Q/2T:-Q[#:ER2T/Q ͜:FR2TN+Qʹ ͜x#:R2T͜N!W#*W&U 6:W<2W#!W6>!W $*W&U 6$:W<2W#!V6*V&U  !V6TqT TyT Wͧ pT^ pT^ WS#ZS"U!W6>!Wڋ$*W&,V) >w#6:W<2Wh$!"LV:]A$!U6#6!W6>!W$*W&=R 6:W<2W¦$$!U6#6:mD$!U6!T6 Available space in 256  $: $ Number of data buffers for drive $: $Minumum number of buffers is 1. $ Number of data buffers for drive $: $ Share buffer(s) with which drive ($:) ? $ Allocate buffers outside of Common $ Accept new buffer definitions $!W6>!W**W&)*&V>͒S**W&)*&VWR"(V ͕S*(V ͕SHҸ* *(V WR"*V**V ^6 *W&$SQ q#p*W&$SQ  6*(V ͕S*%ͧ!W4*!W6>!W+!"HW}2W>!W=+*W&$SQ HW|S ~H6+*W&$SQ ^#V"HW!W4**W&))lW *HWs#r*W&))  >w#6!W6>!W+*W&$SQ HW|S>͇SH+*W&))lW  *W6 DS+s#r*W&$SQ  6!W4h+!W4*!W6>!W7,*W&+SFQ  *W&W) N#Fq#p*W&+SFQ  *W&7W w!W4+:-QF,!fW6K,!fW6 !W6:W4:fW=2iW!"gW"dW}2 W! W6*T&PS*LViS"bW:-Qڞ,nVbWzS*ViS"bW!W6>!W,*W&W) *W&+SKQ  N#Fq#p*W&$SQ  6!W4£,!W6! W6#6!W6n&WAO7(N1: W1!W6! W6:Wʨ1:WƋO!=R ~2T(N:WAO7)N*W&$SQ  DMʹ ͜*W&$SQ  ~ґ1*W&$SQ  6è1*W&$SQ  6! W6S2:WKO!=R ~2T)N:WAO76)*W&$SQ  DM  *W&$SQ  >w: WS2! W6*W&$SQ  ~S29)ͧZ)N:WAO7)*W&$SQ  DM  2*W&$SQ  ~$3: WҌ2! W6*W&$SQ  :Ww 3:WkO!=R ~2T)N*W&$SQ  ~AO7)NTe:T 3*TMV A2 W* WM͈ 2Ü2* WMF2Ü2*W&$SQ  : Ww͜*W&$SQ  :Wwn3:U!W]3:W+O!=R ~2T)N*W&$SQ  DMʹ ͜*WMTCn3 4! W6*W6 dWDS+s#r!W4>JWR>fS:WHҿ3!JWVS+s#r!W4Ì3!JWVS+s#rç-!W4n&))lW  ^#V"JW-!T6!W6:W 4bB)NWʹ ͜P,!"PW}2Wo&"TW2W>!Wu5*W&$SQ  ~n5*W&$SQ  ~ >Hһ4:-Q|4!W4á4*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW*W&$SQ  ~ >Hn5:-Q/5!W4*W&$SQ JW\6!W6>!Wc9*W&,V) >͒S\9*W&)*&VWR"(V *VWs#r*W&,V) VWR+s#r!W4 9!W6>!W9*W&)*&VWR"(V*W&NV) >͒Sʽ9*(V *VWs#r*W&NV) VWR+s#r*W&pV) >͒S9*(V *VWs#r*W&pV) VWR+s#r!W4h9aB!W6>!W::*W&W) *W&+SFQ  N#Fq#p!W4:*V*RW*nV "RW> U͇SUzSH҇:*TW*U|O:.QO:T2Uá:*TW* U|O:.QO:T2U!U:T2T:T2T:T2T:.Q2.Q* U}pS} URU͊S"`W> U͇SUzSHB;*RW|O:/Q2T*U}pS}URW"\W*T&PS"XW*T&PS*U "VWÇ;*RW*`W|O:/Q2TW*U"\WO`iPS*`W "XW*T&PS* U "VW*RW*\W"T*U|O:T2T*W&)*\W"jW*XW"ZWWTS"U*T"`W*`WW !T͕S;*`WW 6*`W#"`W;!W6!W6!W6:5Q!WS<*W&+SFQ  2W!FQ  ~:W!WHL<:W2W:W2W!W4;:T2FQ!T:/Q2GQ:W<*W&+SFQ  O:T<*W&+SFQ  N`iPS!͕S"`W!FQ :T w*W&+SFQ  N`iPS*`WiS!q#p!W6n&))+s#r!W4?:fWjW͇S+s#r! >w#6:fWjWR+s#r!W4>JWR>fS:WHhA!JWVS+s#r!W45A!JWVS+s#ru=!W4n&))lW  ^#V"JW=!W6>!WA*W&7W *W&+SFQ  w!W4˜A!W6>!WaB*W&)*&VWR"(V*W&NV) >͒S"B*(V *ZWs#r*W&NV) ZWR+s#r*W&pV) >͒SZB*(V *ZWs#r*W&pV) ZWR+s#r!W4A!"W"W!W6:5Q!WB*W&+SFQ  ~¶B*W&+SFQ  VS*W"WB*W&+SFQ  VS*W"W!W4pB$N%N!bWVSDM$ :-QMC%N*WDM$ :U C$%N*WDM$ >W͇S>W͇SHHC!W6MC!W6͜͜!Ws+q*W&$SQ ^#V"W:-QڋC:fWWRbW͊S+s#rF!iW55:W®D*W&$SQ  ~2W!W6:W!WګD!fW:iWYD!iW6*gW#"gW!W6!W6!W6:5Q!W7D*W&+SFQ  2W!FQ  ~:W!WH0D:W2W:W2W!W4C*W&+SFQ  S+s#rcD!fW:iW2iW*W͛ 2W…D4%ͧ>äD*W&+SFQ  WzS+s#r!W4±CF*W&$SQ  ~2W!W6:W!WF!fW:iWoE!iW6*gW#"gW!W6!W6!W6:5Q!WME ~,5*W&$SQ !^N#F-S*TW"TWT5*W&$SQ !^N#F-S*TW"TW*W&$SQ  ^*PW"PW!W4#4*fW&*PW+S*W&) "RW:-Q9W*U"jW*RW*U*TW *LV *V *nV |O:.QO:T2UO:T2T:T2T:T2T|2U!T2.QW"T*T&PS*U "ZW*RW "VW*T"`W*`WW !T͕SC6*`WW 6*`W#"`W6!W6n&))lW  ^#V"JW*W&))lW >͒S:WH9!W6>JWR>fS:WHҶ6!JWVS+s#r!W4Ã6!JWVS+s#r:W8*W&)*&VWR"(V*W&$SQ  >«7*W&$SQ  ~h7*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rë7*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r*W&$SQ  >£8*W&$SQ  ~48*jW6 *jW *VWs#r*W&$SQ VWR+s#r*(V *ZWs#r:fWZWR+s#r:fWjWR+s#rã8*(V"LW*W&$SQ  >o&)*&VWR"(V!Q  >ʂ8*(V ^#V"NWÐ8*(V ^#V"NW*LW"(V *NWs#r!W4>JWR>fS:WH8!JWVS+s#r!W4ç8!JWVS+s#r6!W4n&))lW  ^#V"lW  ^#V"JW*W&))lW >͒S:WHғA!W6>JWR>fS:WHh=!JWVS+s#r!W45=!JWVS+s#r:WxA*W&)*&VWR"(V*W&$SQ  >0?*W&$SQ  ~>*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r0?*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W ?*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p *jW 6*W&+SFQ  *W&$SQ |S+s#r:fWZWR+s#r *jW s#r:fWjWR+s#r!W46>:fWjW͇S+s#r! >w#6:fWjWR+s#r*W&$SQ  >1A*W&$SQ  ~¤?*(V"LW*W&$SQ  n&)*&VWR"(V ^#V"NW*LW"(V *NWs#r1A*\W*ZWs#r*(V *XWs#r*XW##"XW*\W##"\W!W6*W&$SQ  ~!W A*W&$SQ  ~ҩ@*W&$SQ ^#V͛ 2W*jW6*W&+SFQ N`iPS!N`iPS!͕S  *jW q#p*W&+SFQ   *jW w*W&+SFQ  *W&$SQ |S+s#r@*jW6 *jW *VWs#r*W&$SQ VWR+s#r *jW 6:fWZWR+s#r *jW s#r:fWjWR*W&+SFQ  2W!FQ  ~:W!WHFE:W2W:W2W!W4D*W&+SFQ  S+s#ryE!fW:iW2iW*W&$SQ  ~ڼEWbWzS+s#rYS:/QpSҹEd%ͧ>E*W͛ 2WE%ͧ>E*W&+SFQ  WzS+s#r!W4D>!Wq*W6 dWR>fS'F>%ͧ>ERROR: $ at line $Missing parameter variable$Equals (=) delimiter missing$Invalid drive ignored$Invalid character$Invalid parameter variable$!"WWͧ !W6!W6:W GG:WG͈K2W:WFIGF GF!Wr+s+q:U2W!U65FN*WDMN>FN*WDMZ :WCG.͜:W2U:WoG!W6TlG!W6sG!W4MG*W&W ~2W:W :W H:W HG:W ·G*W#"WMG*W&W ~2WÄG:Wa/>z!W/HG:W_2W:WG!W6:W!W6:W/:W/HI!W6>!W/H*W&W 6 !W4HtG2W!W6:W:W=H:W H:W/H~H*W&W :WwtG2W!W4:H:W=:W H:W/HҧHtG2W~H:W I:W=>!WHH!W6 I:W=HHF GH:WHcF G:W :W/HW 6 'N*W&W 6='N*W&W 6  *W&+S P  !^*W&+SR"W:WmM'N*W~A*W&W wM:WʞM'N*W~ҐM*W&W 6YÛM*W&W 6NM*WNbN:WM'N*W&W 6,*W#"W*WNbN'N*W&W 6,*W#"W*WNbN'N*W&W 6 'N*W&W 6 !W4PL!W4'L>!W NT^ T :W]NT^ !W6>!WUN*W&W 6!W4:N!W6aN!W4!Wq'N:WO! *W&W w'N:WO! *W&W wO*TDM}oN*T†O]!O> 2 PW:TgxʀO { O: PO*T!O†O~#o}o|O<O:TzO<.O:TƜzO<8O:TzO:TzO:TotOzO:TgN!|!|PRTMSG ,QPAGWID 2QPAGLEN 1QBACKSPC 3QRUBOUT 4QBOOTDRV 0QMEMTOP .QBNKSWT -QCOMBAS /QLERROR  +QNUMSEGS  5QMEMSEG00 KQHASHDRVA6QALTBNKSA +QNDIRRECA ;QNDTARECA KQODIRDRVA [QODTADRVA kQOVLYDIRA  ItG2WHGtG2W!W6!T:W:W H:W/H[I*W&T :Ww!W4~`i+wtG2WI:W :W/HxItG2W[I!W6#6>!W҇K *W&+S P  ^#V"W! P  ~2WJ:WI:WA2WI:W0/>9!W/HI:W02WI:WA 2W *W&+S P  ^*W&+S*W"W*W&T ~?[J *W&+S P  :WO!=R 6!U6!W4!T5>!T҇K:WʧJ*W&T ~A/>P/HҜJ*W&T ~A*WwäJF GÇK:WJ*W&T ~Y*WwÇK!W6*W6!W6:T=!WڇK:W!WO!T ~2W, K*W#"W6!W6ÀK:W#K!W6 ÀK:W02W:W> !WHQK>!WLK:W2WQK!W6!W:WxK*W^*W&+S*W& sÀKF G!W4J!W6!W6:W:W/HK!W6:W *W&+S P *W& *W&W HK!W4éK:WK!W6K!W4ÒK:WL>:WWͧ T. T~ !W6!W6>!WN!W6#n& +S P  ~2W!W6:W:W/H N!W6>!WڞL'N *W&+S P *W& *W&W w!W4gL:W°L!W6L:WL:WA*W&W wL:W L:W0*W&W wL:WA *W&W w'N*W&{QOVLYDTAA QCRDATAF ;RDBLALV ))덑o|gS =S^#V))) DM!>)):S =2S_og^#V) PS^#V|g}o ZS_{ozgO{ozgi`N#Fogo&og_{_z#WBNKBIOS3SPRRESBDOS3SPRBNKBDOS3SPRCPM3 SYSGENCPM DAT . $PRTMSG = N PAGWID = 4F PAGLEN = 17 BACKSPC = N RUBOUT = N BOOTDRV = A MEMTOP = FF BNKSWT = Y COMBAS = F0 LERROR = Y NUMSEGS = 02 MEMSEG00 = 00,27,00 MEMSEG01 = 31,7F,00 MEMSEG02 = 00,C0,03 MEMSEG03 = 00,C0,04 MEMSEG04 = 00,C0,05 MEMSEG05 = 00,C0,06 MEMSEG06 = 00,C0,07 MEMSEG07 = 00,C0,08 MEMSEG08 = 00,C0,09 MEMSEG09 = 00,C0,0A MEMSEG0A = 00,C0,0B MEMSEG0B = 00,C0,0C MEMSEG0C = 00,C0,0D MEMSEG0D = 00,C0,0E MEMSEG0E = 00,C0,0F MEMSEG0F = 00,C0,10 HASHDRVA = Y HASHDRVB = N HASHDRVC = N HASHDRVD = N HASHDRVE = N HASHDRVF = Y HASHDRVG = Y HASHDRVH = Y HASHDRVI = Y HASHDRVJ = Y HASHDRVK = Y HASHDRVL = Y HASHDRVM = Y HASHDRVN = Y HASHDRVO = Y HASHDRVP = Y ALTBNKSA = Y ALTBNKSB = N ALTBNKSC = N ALTBNKSD = N ALTBNKSE = N ALTBNKSF = N ALTBNKSG = N ALTBNKSH = N ALTBNKSI = N ALTBNKSJ = N ALTBNKSK = N ALTBNKSL = N ALTBNKSM = N ALTBNKSN = N ALTBNKSO = N ALTBNKSP = N NDIRRECA = 08 NDIRRECB = 00 NDIRRECC = 00 NDIRRECD = 00 NDIRRECE = 00 NDIRRE= Y OVLYDIRN = Y OVLYDIRO = Y OVLYDIRP = Y OVLYDTAA = Y OVLYDTAB = Y OVLYDTAC = Y OVLYDTAD = Y OVLYDTAE = Y OVLYDTAF = Y OVLYDTAG = Y OVLYDTAH = Y OVLYDTAI = Y OVLYDTAJ = Y OVLYDTAK = Y OVLYDTAL = Y OVLYDTAM = Y OVLYDTAN = Y OVLYDTAO = Y OVLYDTAP = Y CRDATAF = N DBLALV = Y NDTARECP = 01 ODIRDRVA = A ODIRDRVB = A ODIRDRVC = A ODIRDRVD = A ODIRDRVE = A ODIRDRVF = A ODIRDRVG = A ODIRDRVH = A ODIRDRVI = A ODIRDRVJ = A ODIRDRVK = A ODIRDRVL = A ODIRDRVM = A ODIRDRVN = A ODIRDRVO = A ODIRDRVP = A ODTADRVA = A ODTADRVB = A ODTADRVC = A ODTADRVD = A ODTADRVE = A ODTADRVF = A ODTADRVG = A ODTADRVH = A ODTADRVI = A ODTADRVJ = A ODTADRVK = A ODTADRVL = A ODTADRVM = A ODTADRVN = A ODTADRVO = A ODTADRVP = A OVLYDIRA = Y OVLYDIRB = Y OVLYDIRC = Y OVLYDIRD = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM R: Morrow Designs Micro-Menu system - Rev 3.0 (HARD DISK) R: Module - INIT.PIL R: Copyright 1982, 1983 Morrow Designs, Inc. R: All Rights Reserved R: Written by Harrison Schreppel for Morrow Designs R: Modified by John VanderWood for MD-11 R: CLRS: LF:7 T: T: Congratulations on getting an MD-11. Since this is the first time you T: have used this machine, certain things must be done before you can put T: it to work. Most of what is about to be done is automatic. It takes T: about 15 minutes. Just follow the instructions as they appear on the T: screen. T: T: During transportation, too much vibration of the hard disk sometimes T: causes information recorded on the hard disk to change. I'm going to T: run a quick test now to make sure everything's still OK. T: T: This takes a little time, so please be patient. T: WAIT: CLRS: CPM:VERIFILE; C:FAIL=@64 J(FAIL):*ER J:*AP *ER CLRS: LF: 3 T: }Unfortunately, I found some errors when testing your hard disk. CF = 01 NDIRRECG = 01 NDIRRECH = 01 NDIRRECI = 01 NDIRRECJ = 01 NDIRRECK = 01 NDIRRECL = 01 NDIRRECM = 01 NDIRRECN = 01 NDIRRECO = 01 NDIRRECP = 01 NDTARECA = 18 NDTARECB = 00 NDTARECC = 00 NDTARECD = 00 NDTARECE = 00 NDTARECF = 01 NDTARECG = 01 NDTARECH = 01 NDTARECI = 01 NDTARECJ = 01 NDTARECK = 01 NDTARECL = 01 NDTARECM = 01 NDTARECN = 01 NDTARECO = 01 NDTARECP = 01 ODIRDRVA = A ODIRDRVB = A ODIRDRVC = A ODIRDRVD = A ODIRDRVE = A ODIRDRVF = A ODIRDRVG = A ODIRDRVH = A ODIRDRVI = A ODIRDRVJ = A ODIRDRVK = A ODIRDRVL = A ODIRDRVM = A ODIRDRVN = A ODIRDRVO = A ODIRDRVP = A ODTADRVA = A ODTADRVB = A ODTADRVC = A ODTADRVD = A ODTADRVE = A ODTADRVF = A ODTADRVG = A ODTADRVH = A ODTADRVI = A ODTADRVJ = A ODTADRVK = A ODTADRVL = A ODTADRVM = A ODTADRVN = A ODTADRVO = A ODTADRVP = A OVLYDIRA = Y OVLYDIRB = Y OVLYDIRC = Y OVLYDIRD = Y OVLYDIRE = Y OVLYDIRF = Y OVLYDIRG = Y OVLYDIRH = Y OVLYDIRI = Y OVLYDIRJ = Y OVLYDIRK = Y OVLYDIRL = Y OVLYDIRM There- T: fore we have to replace the information on the hard disk. Putting the T: information back on the hard disk from your floppies is a simple semi- T: automatic procedure. T: T: To begin, find the diskette labelled: T: T: {CP/M DISTRIBUTION MASTER DISKETTE I T:} T: and insert it in the floppy disk drive. Remember to close the latch on T: the drive. Do this now. T: T: In a moment you'll press the RESET button on the lower righthand corner T: of the MD-11's front panel. On the screen you'll see: {Do you want to T: boot from the floppy drive (Y/N)?} Respond {Y}. An automatic program T: will lead you through inserting the rest of your Distribution Diskettes T: so they can be copied onto the hard disk. When that's finished, this T: program will start again, and should not find any problems this time. LF: 2 TNR: {When you're ready, press the RESET button. } HOLD: *INF J:*INF *AP CLRS: LF:10 T: Good news! T: Your hard disk appears to have survived its journey unscathed. T: T: Now the next step: installing your programs for your particular system. TNR: Type any key to begin: INMAX: 1 A: CH: go.pil  {CP/M DISTRIBUTION MASTER DISKETTE I T:} T: and insert it in the floppy disk drive. Remember to close the latch on T: the drive. Do this now. T: T: In a moment you'll press the RESET button on the lower righthand corner T: of the MD-11's front panel. On the screen you'll see: {Do you want to T: boot from the floppy drive (Y/N)?} Respond {Y}. An automatic program T: will lead you through inserting the rest of your Distribution Diskettes T: so they can be copied onto the hard disk. When that's finished, this T: program will start again, and should not find any problems this time. LF: 2 TNR: {When you're ready, press the RESET button. } HOLD: *INF J:*INF *AP CLRS: LF:10 T: Good news! T;usage: BOOT {null|F} F generates a floppy based system loader (must be cap) ; ;system tracks (1k)| boot | ldr | ldr | ldr |free | ccp | ccp | ccp | ccp | ;sysgen image | 900h | 0d00h --- 18ffh | |1d00h ----------- 2cffh| ;note, boot contains bad map, "free" reserved for future transient. ;warning: single sided boot diskettes not supported, ldr limited to 4k ws define.mac era session.txt put console output to file session.txt [system] m80 =ldrbios3 m80 =boot3 rmac scb era scb.sym era scb.prn link boot3 link cpmldr[l4000],ldrbios3,scb sid ramdaty @ fc00 ;Copy MTAB behind RAMDATY strsk1: push iy ;calc. mtab position pop hl ld de,mtoff ;offset to mtab position addgt 200h error ;code is too long for memory endif .dephase end Title MD-11 CP/M Plus (CP/M-3) Copyright (c), 1983, Morrow Designs, Inc. Subttl Disk Resident Track 1 Loader .Z80 true equ -1 false equ not true xlt1k equ 0 ;dummy include HD19DEF.MAC include DRIVES.MAC include DEFINE.MAC ;used for floppy, hard disk, and file "BOOTHD.COM" boot equ 0FE00h ;Start of boot loader revnum equ 10h ;Revision Number of boot loader revadd equ 50h ;Address of the revision number in rom ldrbdos equ 4000h ;Load address of CPMLDR ;load length is 4k ; Rom Jump Table Definitions mesg equ rom + 3 ;output a message string (I/O mod.) rdhst equ rom + 9 ;read a sector (disk mod.) bterr equ rom + 18h ;output boot error and halt (disk mod.) page ;---------------------------------------------------------------------- ; begin the cold boot loader ;--------------------------- ; .phase boot start: in a,(clrint) ;Clear any pending interrupts ld sp,boot ld a,(revadd) ;Check revision level ?.x and 0f0h ;high only cp revnum jp z,str hl,de ex de,hl ;DE:= Destination ld hl,btab2 ;HL:= Source (Start of Boot MTAB) ld bc,16 ;BC:= Count (length of an MTAB) ldir ;Move the boot mtab into ramdatY MTAB ; Set up to read starting at track-0 sector-2 sptsk1: ld (iy+hsttrk),0 ld (iy+hsttrk+1),0 ;Track:= 0 ld (iy+hstsec),2 ld (iy+hstsec+1),0 ;Sector:= 2 ld (iy+hstbuf),0 ld (iy+hstbuf+1),high ldrbdos ;Disk Buffer address:= cpm load base ld b,4 ;4 sectors = 4k rdlop: push bc ;save count call rdhst ;Loop Read a Sector ld a,(iy+erflag) ; If (returned status eq error) or a jp nz,bterr ; exit to rom ld hl,dskbuf ; HL:= Source (Disk buffer) ld e,0 ld d,(iy+hstbuf+1) ; DE:= Destination (cpm system) ld bc,1024 ; BC:= Length (1 sector) ldir ; Move disk buffer to system area ld (iy+hstbuf+1),d ; Host_Buffer:= Host_Buffer+1024 inc (iy+hstsec) ; Sector:= Sector + 1 pop bc ;restore count djnz rdlop ;again jp ldrbdos ;Start CPM page ends: if ends-boot R: Morrow Designs Micro-Menu system - Rev 2.3 R: Module - CPMENU.PIL R: Copyright 1982, 1983 Morrow Designs, Inc. R: All Rights Reserved R: Written by Harrison Schreppel for Morrow Designs R: Modified by P. Ledbetter for MD11 R: R:Put message on the screen, and chain to MICRO.PIL or MDINST if first time up EXIST:INIT.PIL CLRS: LF: 11 R: if not, go to Micro Menus Tn:{Now loading Co-Pilot Menu System, Rev. 3.0 Tn: Please stand by . . .} CHn:MICRO.PIL T:{Loading Software Installation program, please stand by . . .} CH:MDINST.PIL END: ?D, 3EH ENDM SRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM _#*_*n*ͪ> G͋*n** _ s#r* _"w#w* _w#wbj* _s#rgo* _(s#r:*D*n*+"a!a7*^+*n* GE*R: SUPERCALC VERSION with QUEST, BACKFIELD, and FUNCTION KEYS R: Morrow Designs Micro-Menu system - Rev 3.0 R: Copyright 1984 Morrow Designs, Inc. R: All Rights Reserved R: Written by Harrison Schreppel for Morrow Designs R: Modified to the point of non-recognition R: by J. VanderWood for Hard Disk System MD11 *BEGIN R: display main menu ESC:*EXITMENU ERASTR: C: UN1 = 0 C: UN2 = 0 C: UN3 = 0 U: *MENU1 *LABEL1 M: 1 , JY: *NEWWORD M: 2 , JY: *SUPERCALC M: 3 , JY: *CORRECT M: 4 , JY: *PEARL M: 5 , JY: *QUEST M: 6 , JY: *BACKFIELD M: 7 , JY: *MBASIC M: 8 , JY: *BAZIC M: 9, JY: *PARK M: U , J: *UTILITY *NEWWORD ESC: *BEGIN DEF: $PROGRAM NewWord C:a=@9 C:b=(-3+a) DEF(B):$COMMAND key nw|key default J(B):*NWKEY DEF: $COMMAND nw *NWKEY DEF: $OPT}To exit from NewWord, type{X}at the Opening Menu.{ C: UN1 = 1 C: UN2 = 2 C: UN3 = 3 U: *USER J: *BEGIN *SUPERCALC ESC: *BEGIN DEF: $PROGRAM SuperCalc C:a=@9 C:b=(-3+a) DEF(B):$COMMAND key sc|key default J(B):*. . . CPM: WELCOME| J: *BEGIN *QUEST ESC: *BEGIN DEF: $PROGRAM Quest DEF: $COMMAND kp DEF: $OPT To exit from Quest, enter function code{99}at its main menu. C: UN1 10 C: UN2 11 C: UN3 12 U: *USER J: *BEGIN *MBASIC CLRS: LF:10 T:To{exit}from Microsoft BASIC, type{SYSTEM}at the "Ok" prompt. T: T:Preparing to run Microsoft BASIC. Please stand by...{ CPM:user 13; MBASIC|; user 0 T:} J:*BEGIN *BAZIC CLRS: LF:10 T:To{exit}from BAZIC, type{BYE}in capital letters at the "READY" prompt. T: T:Preparing to run BaZic. Please stand by...{ CPM:user 14; BAZIC10|; user 0 T:} J:*BEGIN *PARK CLRS: LF:11 T:{ T:Preparing to run PARK. Please stand by... CPM:PARK; T:} J:*BEGIN *BACKFIELD CLRS: LF: 11 TNR:{Loading Backfield Selection Menu; please stand by . . . CH: bkfield.pil *TUTORIAL CUR:0,22 T: {Loading tutorial menu... CH:TUTORIAL.PIL *UTILITY ERASTR: ESC:*BEGIN U:*MENU2 *UTILCHECK CUR:0,22 TNR: SCKEY DEF: $COMMAND sc *SCKEY DEF: $OPT{To exit from SuperCalc, type "{/Q}" at the "active cell" prompt.} C: UN1 = 4 C: UN2 = 5 C: UN3 = 6 U: *USER J: *BEGIN *CORRECT ESC: *BEGIN DEF: $PROGRAM Correct-It DEF: $COMMAND correct DEF: $OPT C: UN1 1 C: UN2 2 C: UN3 3 U: *USER J: *BEGIN *PEARL ESC:*BEGIN U:*PEARLMENU *INPUTLOOP4 CUR:21,22 TNR: CUR:21,22 TNR:{Enter your selection: } INMAX: 1 A: M:1,2,3,4,5,6, BELLN: JN:*INPUTLOOP4 M: 1 , DEFY:$COMMAND WELCOME JY: *WELCOME M: 2 , DEFY:$COMMAND PEARLDF DEFY:$PROGRAM Design Forms M: 3 , DEFY:$COMMAND PEARLDR DEFY:$PROGRAM Design Reports M: 4 , DEFY:$COMMAND PEARLED DEFY:$PROGRAM Enter Data M: 5 , DEFY:$COMMAND PEARLPR DEFY:$PROGRAM Print Reports M: 6 , DEFY:$COMMAND PEARLFM DEFY:$PROGRAM File Maintenance DEF: $OPT C: UN1 = 7 C: UN2 = 8 C: UN3 = 9 U: *USER T:} J: *BEGIN *WELCOME CLRS: CUR: 0, 13 TNR:{Preparing to run WELCOME  CUR:0,22 TNR: {Enter your selection:} INMAX:1 A: M: 1,2,3,4,5,6,7,8,9 JN:*UTILCHECK M: 1 , JY:*DIR M: 2 , JY:*TYPE M: 3 , JY:*COPY M: 4 , JY:*FORMAT M: 5 , JY:*SHOW M: 6 , JY:*CPM M: 7 , JY:*OTHER M: 8 , JY:*TUTORIAL M: 9 , JY:*QINSTAL *QINSTAL CLRS: LF:12 TNR:{Preparing to run the QUEST Load program; please stand by . . . CH: quest.pil J: *BEGIN *DIR ESC: *BEGIN CLRS: CUR:0,12 T:Please specify the user number{(0-15)}and RETURN T:for the hard disk directory you wish to view, T: T:or T: TNR:press{F}and RETURN to see the directory of a floppy disk: { INMAX: 2 A: SAVE: $USNO M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,11 , 12 , 13 , 14 , 15 , F JN: *DIR M: F CPMY: dir B:[user=all,full]| CPMN: dir [user=$USNO,full]| T:} TNR:Press any key to return to the Utility Menu: { INMAX: 1 A: J: *UTILITY *TYPE CLRS: LF: 3 T:If the file you want to look at is on a floppy diskette, put "B:" in front T:of the file name, when yoe display with{CONTROL-S. T:Resume}the display with{CONTROL-Q. T: T:Get ready with your fingers on CONTROL-S now. It moves pretty fast. . .} WAIT: CPM: pip CON:=$FILE[g$USERNUM R]| LF:1 TNR:Type any key to return to the Utility Menu: INMAX: 1 A: J:*UTILITY *PRINT CLRS: LF: 9 T:Be sure your printer is turned on and on-line, with paper in place. T:You can{abandon}the printout at any time by pressing{CONTROL-C.} If T:your printer has a problem and things lock up, press the {RESET} T:switch on the MD-11 to restart. T: TNR:Type the ESC key to quit or anything else to proceed: A: CPMY:PIP LST:=$FILE[g$USERNUM E R]| LF:1 TNR:Type any key to return to the Utility Menu: INMAX: 1 A: JY: *UTILITY E: *COPY R: PIP utility CLRS: LF: 8 T: If you intend to copy to or from a diskette, put "B:" in front of the file T: name that is on the diskette, when you are prompted for it. For example, T: to copy GOODST.UFF from a floppy, when asked for the original file's name, T: typ INMAX: 1 A: J: *UTILITY E: *FORMAT ESC: *UTILITY CLRS: LF:4 T: This selection may be used to format diskettes for use with your Micro T: Decision. Formatting a diskette completely erases any information on it, T: so{be careful}about which diskette you insert in the drive for formatting. T: T:{Insert the diskette you want to format now.} T: T: If you want to format a diskette for use on a Morrow MD-2 computer, select T:{2}below. Otherwise choose{1.} Press {ESC} to return to the Utility Menu T: without formatting any diskettes. *RECYCLE CUR: 0,15 T: CUR: 0,15 TNR:{Type 1, 2, or ESC:} INMAX: 1 A: M: 1, 2 JN:*RECYCLE M: 1 CPMY: FORMAT B D CPMN: FORMAT B S CLRS: LF: 10 T: Would you like to format another diskette? T: TNR: Type{Y}for Yes or anything else to quit: INMAX: 1 A: M: Y UY: *FORMAT J:*UTILITY *SHOW ESC: *UTILITY CLRS: LF: 10 T: You have four choices: {1} Check the size of a file T: u are asked for it (example: B:FLOPPYF.ILE). T: T:A "No File" or "File not found" error message can mean three things: You T:mistyped the file name, entered the wrong user number, or the file simply T:isn't there. LF: 3 T:Type the name of the file you want to see, including period and last name, T:if used (example: SAMPLE.FIL), then press RETURN: T: TNR:Filename >>>{ INMAX: 12 A: SAVE: $FILE T:} TNR:Type the user number (0-15) that contains the file and RETURN: { *UNER INMAX: 3 A: SAVE: $USERNUM T:} M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, TNRN:That is not a valid user number. Please retype: JN: *UNER R: "EXIST" Block extracted from here!!!!! LF: 2 T:Would you like it to be sent to your screen, or to your printer? T: TNR:Type{S}for screen or{P}for printer: *TYPE1CHECK INMAX: 1 A: M:S,P TN: TNRN:Please type S or P: JN: *TYPE1CHECK M: P UY: *PRINT CLRS: LF:10 T:{ T:Abandon}the display at any time by pressing{CONTROL-C. T:Pause}the B:GOODST.UFF. T: TNR: Type the name of the original (source) file and press RETURN: { INMAX: 14 A: SAVE: $SOURCE TNR:}Type its user number (0-15): { *ERR INMAX: 2 A: SAVE: $SOURCENO M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, TN:} That is not a valid user number. TNRN: Please retype: { JN: *ERR T: TNR:}Now type the name to give the copy (destination) file: { INMAX: 14 A: SAVE: $DEST TNR:}Type its user number (0-15): { *ERR1 INMAX: 2 A: SAVE: $DESTNO M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, TN: }That is not a valid user number. TNRN: Please retype: { JN: *ERR1 LF: 2 T:}You want to copy{$SOURCE}from{user $SOURCENO}to{$DEST}in{user $DESTNO.} TNR: Is that right?{(Y or N): } *ERR2 INMAX: 1 A: M: Y,N TN: TNRN: Please type Y or N: JN: *ERR2 M: Y JY: *COPY1 J: *COPY *COPY1 CPM: pip $DEST[g$DESTNO]=$SOURCE[g$SOURCENO r]| LF: 2 TNR:Copy utility finished. Press any key to return to the Utility Menu:  {2} Check space remaining on a floppy disk T: {3} Check space remaining on the hard disk T: {ESC} Return to Utility Menu *SHOWCHK CUR:0,15 TNR: CUR:0,15 TNR: {Type 1, 2, 3, or ESC: } INMAX: 1 A: #OPTION M:1,2,3 JN: *SHOWCHK CASE (#OPTION): *FILE, *FLOPPY, *HARD *FILE LF:3 T: If the file you want to check is on a floppy disk, insert the disk now, T: and put "B:" in front of the file's name when you are asked for it, as T: in B:ITSYBTSY.FIL. LF: 2 TNR: Type the name of the file (example- GREATBIG.FIL) and RETURN: { INMAX: 14 A: SAVE: $SHFILE T: TNR:}Now type its user number (0-15):{ *SHCHK1 INMAX: 2 A: SAVE: $SHUN M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, T:} TNRN: Sorry, $SHUN is not a valid user number. Please retype: JN: *SHCHK1 T:{ CPM: dir $SHFILE [user=$SHUN] J:*CONT *FLOPPY LF: 3 TNR: Insert the displease stand by...{ CPM:$COMMAND| T:} J:*UTILITY *OTHER ESC: *UTILITY CLRS: LF: 9 T: You have three choices: {1} Erase a file T: {2} Rename a file T: {ESC} Return to the Utility Menu *OTHCHK CUR:0,14 TNR: CUR:0,14 TNR: {Type 1, 2, or ESC: } INMAX: 1 A: #OPTION M:1,2 JN: *OTHCHK CASE (#OPTION): *ERA, *REN *ERA DEF: $VERB erase DEF: $FILE $ERAFL DEF: $ADJ U: *ERAREN T:}You want to erase{$FILE.} Are you sure? TNR: Type{Y}to proceed or anything else to start over: INMAX: 1 A: M: Y JN: *OTHER CPM: user $UN; era $FILE; user 0 T:{ TNR: Type any key to return to the Utility Menu: } INMAX: 1 A: J: *UTILITY *REN DEF: $VERB rename DEF: $FILE $RENFILE DEF: $ADJ old U: *ERAREN TNR:}Type the new name for the file: { INMAX: 12 A: SAVE: $NEW T: T:}You want to rename{$FILE}to{$NEW}. Is that right? TNR: Type{Y}to proceed or anything else to start over: ow the instructions given. LF:3 T: {1 NewWord} Word Processing T: {2 SuperCalc} Financial Analysis T: {3 Correct-It} Spelling Checker / Corrector T: {4 Personal Pearl} Data Base Manager T: {5 Quest} Bookkeeper System T: {6 Backfield} Hard Disk Backup Programs T: {7 MBASIC} Microsoft BASIC T: {8 BaZic} North Star Compatible BASIC T: {9 PARK} Hard Disk Head Parking Utility T: {U Utility menu} T: {ESC Exit to CP/M} *VALID1 CUR: 0,23 TNR: CUR: 0,23 TNR: {Enter your selection:} INMAX: 1 A: M:1,2,3,4,5,6,7,8,9,U, UN:*VALID1 U:*LABEL1 E: R:===================================================================== *MENU2 CLRS: LF: 2 T: {C O P I L O T U T I L I T Y M E N U} T: T: T: This menu allows you to perform a number of everyday utility functions. T: Simply type the number next to the function you desire. T: T: T: T: {1} Display a directory T: {2} kette you want to check and press RETURN: { INMAX: 1 A: T: CPM: show B:[space]| J: *CONT *HARD T:{ CPM: show a:[space]| J: *CONT *CONT T:} TNR:Type any key to return to the Utility Menu: { INMAX: 1 A: J: *UTILITY *CPM ESC: *UTILITY CLRS: LF: 5 T: This selection allows you to enter CP/M commands directly. It can be T: used by the curious for experimental reasons, and to learn about CP/M. T: It can also be used by experienced CP/M users to perform more complex T: commands than those provided in the Co-pilot menus. T: T: To use this feature, just type a valid CP/M command followed by RETURN. T: {NOTE: After certain commands are finished executing, you must press T: CONTROL-C when ready to return to the Co-pilot menus.}You'll know that T: this is the case when the system stops, showing "A>" when the command T: is done. T: T: To return to the Utility Menu now, press ESC. LF: 3 TNR: {COMMAND:} INMAX: 80 A: SAVE: $COMMAND T: T:Now executing command,  INMAX: 1 A: M: Y JN: *OTHER CPM: user $UN; ren $NEW=$FILE; user 0 T:{ TNR: Type any key to return to the Utility Menu: } INMAX: 1 A: J: *UTILITY *ERAREN LF: 3 T: If the file you want to $VERB is on a floppy disk, insert the disk now, T: and put "B:" in front of the file's name when you are asked for it, as T: in B:USELESSF.ILE. LF: 2 TNR: Type the $ADJ name of the file and RETURN: { INMAX: 14 A: SAVE: $FILE T: TNR:}Now type its user number (0-15):{ *OTHCHK1 INMAX: 2 A: SAVE: $UN M: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, TNRN: Sorry, $UN is not a valid user number. Please retype: JN: *OTHCHK1 T:} E: R:===================================================================== R: R: Menu displays R: *MENU1 CLRS: T: {C O P I L O T M A I N M E N U} T: T: T: This menu is your copilot through the CP/M operating system. To perform T: these functions, just type the appropriate number after the prompt below, T: then foll View or Print a file T: {3} Copy a file or files T: {4} Format a diskette T: {5} Check disk space and file size T: {6} Execute a CP/M command T: {7} Rename or erase a file T: {8} Fundamental training in CP/M T: {9} Load QUEST Bookkeeper T: {ESC} Return to Main Menu E: R:===================================================================== R:PEARL MENU *PEARLMENU CLRS: LF:4 T: {P E R S O N A L P E A R L F U N C T I O N M E N U} LF:2 T: See your Personal Pearl manual for a description of the options given. LF:2 T: {1} Welcome (Demonstration) T: {2} Design Forms T: {3} Design Reports T: {4} Enter Data T: {5} Produce Reports T: {6} File Maintenance T: {ESC} Exit to Main Menu E: R:=========================================================================== *USER ESC:*BEGIN CLRS: T: __________________________ T: ||------------------------|| T: || || T: ||| ==== || T: ||________________________|| *CHECK CUR:0,23 TNR: CUR:0,23 TNR: ---------------------------- {Select 1, 2, 3, or D: } INMAX: 1 A: $u M:1,2,3,D JN:*CHECK M: D , UY: *DIRUN CLRS: LF: 11 T:$OPT} T:Preparing to run $PROGRAM. Please stand by . . .{ M: 1 , CPMY: user #UN1; $COMMAND|; user 0 M: 2 , CPMY: user #UN2; $COMMAND|; user 0 M: 3 , CPMY: user #UN3; $COMMAND|; user 0 E: *DIRUN CUR: 0, 23 TNR: CUR: 0, 23 TNR: ---------------------------- {Select directory 1, 2, or 3: } A: M: 1,2,3, JN:*DIRUN CLRS: LF: 10 T:{ TNR:Reading directory; please stand by . . . M: 1 CPMY: dir [user=#UN1]| M: 2 CPMY: dir [user=#UN2]| M: 3 CPMY: dir [user=#UN3]| T:{ TNR:Type any key to proceed: } INMAX: 1 A: J: *USER R:============================================================================ *EXITM| 1. || You have three $PROGRAM filing T: || || drawers available. They correspond T: || || to User Areas #UN1, #UN2, and #UN3. Files T: || || you create will go in the drawer you T: || ==== || open now. To work with an existing T: ||________________________|| file, first select the drawer which T: || || contains the file. T: || 2. || T: || || {1} Open drawer 1 T: || || {2} Open drawer 2 T: || || {3} Open drawer 3 T: || ==== || T: ||________________________|| {D} Display a drawer's contents T: || || {ESC} Return to Main Menu T: || 3. || T: || || T: || || T: || || T: ENU CUR: 0,23 TNR: {Exiting; please stand by . . . CPM: user 0 CLRS: LF: 12 T: {To re-enter the menu system, type "PILOT GO" followed by [RETURN]. LF: 8 END:  R:QUEST HARD DISK LOAD MODULE R:Copyright 1984 by Morrow Designs R:Written by John VanderWood 2/17/84 ESC: *ESCAPE CLRS: T: T: {Q U E S T L O A D E R P R O G R A M} LF: 3 T: }This operation copies the Quest Bookkeeper System from your Distribution T: diskettes onto the hard disk. You will need all four Quest Distribution T: diskettes before proceeding. T: T: You can establish 1, 2, or 3 sets of books. Each set will require about T: 1 megabyte of space, not including data, so be sure you have 1.5 megabytes T: (1,500 k) available per set. T: T: I'll run a program now that tells you how much space you have left. CPM: show A:; T: TNR: }Press any key to proceed: INMAX: 1 A: *NUMBER CLRS: LF: 5 T: {You may press the ESC key now to QUIT without loading Quest.} T: T: The Co-Pilot menus are programmed to assume that Quest will reside in user T: numbers 10, 11, and 12. If you want only one copy (normal for the indepen- T: dent businessperson kTIONAL (DATA) DISKETTE}into the drive TNR: and press RETURN. INMAX:1 A: CLRS: EXIST: B:kins.com JY: *CPM1 U: *WRONGDSK J: *LOAD *CPM1 CPM:pip A:[g$UN]=B:*.*[g0 r]; *GL CLRS: LF:11 EXIST: kgsl.com JY: *AR TNR:}Insert the{GENERAL LEDGER PROGRAM DISKETTE}into the drive and press RETURN: INMAX:1 A: CLRS: EXIST: B:kgpl.com JY: *CPM2 U:*WRONGDSK J:*GL *CPM2 CPM: pip A:=B:*.*[r] *AR CLRS: LF:11 EXIST: krcr.com JY:*CD T:}Insert the{ACCOUNTS RECEIVABLE PROGRAM DISKETTE}into the drive TNR: and press RETURN: INMAX:1 A: CLRS: EXIST: B:krcr.com JY: *CPM3 U: *WRONGDSK J: *AR *CPM3 CPM: pip A:=B:*.*[r] *CD CLRS: LF:11 EXIST: kufl.com JY: *CPM5 T:}Insert the{CASH DISBURSEMENTS PROGRAM DISKETTE}into the drive TNR: and press RETURN: INMAX:1 A: CLRS: EXIST: B:karp.com JY: *CPM4 U: *WRONGDSK J: *CD *CPM4 CPM:pip A:=B:*.*[r]; *CPM5 CPM:set k*.*[sys]; set *.rpt[sys] J: *FINISH *WRONGDSK CLRS: LF: 10 T:{ TNR:That appears to be the wrong disk. Press any keyR: Morrow Designs Micro-Menu system - Rev 2.2 R: Module - TUTORIAL.PIL R: Copyright 1982, 1983, 1984 Morrow Inc. R: All Rights Reserved R: Written by Harrison Schreppel for Morrow R: Revised by J. VanderWood for CP/M 3.0 R: ESC:*RETURN *BEGIN CLRS: T:{ T H E F U N D A M E N T A L S O F C P / M 3 . 0} LF:2 T: This is the Co-pilot Menus' online crash course in CP/M. This screen T: is intended as a "quick reference guide" for people who are just T: learning to use CP/M. For additional information or variations on T: any of the commands shown, just enter the number next to the command. T: You can return to the Co-pilot Main Menu at any time by pressing ESC.} T: T: {1 Use of control keys in CP/M} T: {2 USER}- Change user number T: {3 DIR}/{DIRSYS}- Display a list of files on a disk T: {4 ERA}- Erase a file or series of files from a disk T: {5 REN}- Rename a file T: {6 SHOW}- Report system status T:eeping his own books), you should load Quest into user T: number 10. If you want multiple copies, start with 10 and work up to 11 T: and then 12. T: T: Incidentally, user numbers 10, 11, and 12 correspond directly to Quest "file T: cabinet drawers" 1, 2, and 3. *AGAIN CUR: 0,21 T: CUR: 0,21 TNR: Select the user number for Quest now. Type{10, 11,}or{12: } INMAX:2 A: $UN M:10,11,12, BELLN: JN:*AGAIN CLRS: CPM:user $UN EXIST:KCTL.DIR CPM:user 0 JY: *EXISTS JN: *LOAD *EXISTS CLRS: LF:8 T:{User number $UN already contains a copy of Quest!} T: T: If you load in a new copy, it will{erase all data}currently used with that T: copy. Please be absolutely sure that this is what you want to do. T: T: Press "!" to erase the existing copy of Quest and its data, or anything else TNR: to return to the previous screen: INMAX: 1 A: M: ! JY: *LOAD JN: *NUMBER *LOAD CLRS: LF:11 T:}Insert the{QUEST INSTRUC to review the correct title:} INMAX:1 A: E: *FINISH CLRS: LF: 5 T: {Quest is now installed in user number $UN. When you use it, it will be T: in "instructional mode." The data files contain sample data to help you T: learn to use Quest. Later when you're familiar with using Quest, you'll T: run a program called "KINS" that zeroes out the data files, letting you T: add real data of your own. Refer to the Quest manual for instructions T: on running KINS. T: T: If you want to load additional copies of Quest, start over at the Utility T: menu.} T: TNR: Press any key to return to the Main Menu: INMAX: 1 A: *ESCAPE CLRS: LF:11 TNR:{Returning to the Main Menu; please stand by . . .} CH:micro.pil   {7 TYPE}- Display a file on the screen T: {8 PIP}- Move or copy files T: {9 SET}- Set file characteristics T: {A Advanced course}(Digital Research's HELP Utility) T: T: {ESC }Return to Main Menu *ACTION CUR:0,22 TNR: CUR:0,22 TNR: {Pick a subject: } INMAX: 1 A: M:1,2,3,4,5,6,7,8,9,A, JN: *ACTION M: 1, JY:*CONTROL M: 2, JY:*USER M: 3, JY:*DIR M: 4, JY:*ERA M: 5, JY:*REN M: 6, JY:*SHOW M: 7, JY:*TYPE M: 8, JY:*PIP M: 9, JY:*SET M: A, JY:*HELP *CONTROL R: definition of control keys CLRS: T: {CONTROL KEY CODES} T: T: T: There are five control codes which have special meaning in CP/M. To T: enter a control code, hold the CTRL key down and press the appropriate T: letter key. The control codes that are used by CP/M and their meanings T: are as follows: T: T:{CONTROL-C}- This is used in CP/M to re-initialize the system. Any pressing RETURN. These commands bear some resemblance to comparable T: editing commands in NewWord or WordStar. They are listed on the next T: page. LF: 4 TNR: Type R to review the previous page or anything else to continue: HOLD: *CONTROL *CONTPAGE3 CLRS: T:{Control keys, continued} T: T: {Editing the Command Line} T: T:{CONTROL-A}- Moves the cursor one character space left. T:{CONTROL-B}- Moves the cursor to the beginning of the command line; if it's T: already there, moves it to the end of the line. T:{CONTROL-E}- Skips the command without erasing it; the cursor moves down to T: the next line. T:{CONTROL-F}- Moves the cursor one character space right. T:{CONTROL-G}- Erases the character under the cursor; the cursor doesn't move. T:{CONTROL-H}- Moves the cursor one space left; deletes the character there. T:{CONTROL-I}- Same as pressing TAB; moves cursor to next tab stop. T:{CONTROL-J / CONTROL-M}- Same as pressing RETURN; sendsal" association that you should use T: in a logical way. For example, you could assign all NewWord-generated T: memos the same user number. T: T: CP/M allows a total of 16 user numbers, 0 through 15. Your hard disk is T: preconfigured with certain user numbers dedicated to the data files you T: create when running your software. If you find this configuration to be T: less than optimal for your needs, you can "move" the files to different T: user numbers, or otherwise rearrange things as you see fit. But this T: requires a little experience with CP/M. T: T: In order to work with most files, especially data files, you first need T: to log into that file's user number. This is done automatically by the T: Co-pilot system when you select a program (and choose a "file drawer," if T: the program is set up to work with more than one user number). To log T: into various user numbers directly from CP/M, you employ the USER command. T: TNR: (Type anytime T: you change diskettes in a drive, you should type CONTROL-C so that the T: operating system will know that a diskette was changed. T: T:{CONTROL-P}- This code is used to tell CP/M that characters sent to the T: screen should also be sent to the printer. This will remain in effect T: until you press CONTROL-P a second time to turn off the routing to the T: printer, or until you reset the system. T: T: T: (Press any key to continue) A: *CONTPAGE2 CLRS: T:{Control keys, continued} LF: 3 T:{CONTROL-Q}- These keys are used to resume scrolling on the screen after T: scrolling was paused with CONTROL-S (see below). T: T:{CONTROL-S}- This is used to pause or "freeze" the characters that are T: scrolling by on the screen. Pressing any other character will resume T: output (scrolling) to the screen. T: T: There is a set of additional control keys that let you edit a CP/M com- T: mand line, if you notice corrections or changes you want to make before T: the command to CP/M. T:{CONTROL-K}- Erases the line from the cursor to the end of the line. T:{CONTROL-R}- Retypes the command line, keeping only what was to the left of T: the cursor. Puts "##" where the cursor was in the bad line. T:{CONTROL-U}- Discards the command line altogether. Puts "##" where the cur- T: sor was in the discarded command line. T:{CONTROL-W}- Recalls the most recently executed command line for editing or T: re-entry. T:{CONTROL-X}- Deletes the line from the cursor to the beginning of the line. T: TNR: Type R to review the previous page or anything else to continue: HOLD: *CONTPAGE2 J: *BEGIN *USER CLRS: T: {The USER Command} LF: 2 T: A hard disk can hold so many files, there has to be a scheme of grouping T: files into manageable sets. CP/M 3.0 does this by way of assigning every T: file a "user number." Files with the same user number are not grouped T: physically on the disk; it is a "logic! key to continue) A: *USERPAGE2 CLRS: T:{The USER command, continued} LF: 2 T: Your CP/M prompt tells you which user number you're presently logged into. T: If there's no number there, you're in user 0. For example: T: T: When you see: You're logged into: T: T:{ A>} drive A:, user 0 T:{ 5A>} drive A:, user 5 T:{ 14B>} drive B:, user 14 T:{ D>} drive D:, user 0 T: T: As is further discussed under DIR and SET, there is an exception to the T: rule that you have to log into a user number before using any of its files: T: If a file is in user 0 and has been set as a "system" file, it can be ac- T: cessed from any other user number. So you can presume that all of your T: Morrow-supplied software fits these "system" criteria. T: T:{Moving among the user numbers:} The USER command is one of the easiest to T: master. Examples and restrictions are presented on the next page. LF: 2 TNR: Type R to review the previous page or anything else tooption to it (see DIR). T: TNR: Type R to review the previous page or anything else to continue: HOLD: *USERPAGE2 J: *BEGIN *DIR R: description of directory command CLRS: T: {The DIR and DIRSYS Commands LF: 2 T:DIR -} This command displays a list of all "directory" files on a disk, T:within the current user number. Its format is: T: T: {DIR x:} T: T:Where x: is an optional drive letter (A:, B:, etc.). If no disk drive is T:specified, CP/M will give you a listing of the files on the drive that is T:currently logged, that is, the drive whose letter appears in the CP/M T:prompt (A>, B>, etc.). T: T:{EXAMPLE 1: }Assume you are on drive A:, in user number 0. (You can tell T: you're in user number 0 if no number appears in front of the letter in T: the CP/M prompt.) To get a list of all the files on this drive and user T: number, you would type: T: T: {DIR} LF: 2 T: (Tusing DIRSYS are the same as those for DIR. LF: 2 TNR: Type R to review the previous page or anything else to continue: HOLD: *DIR CLRS: T:{ The DIRSYS command, continued} LF: 3 T: Every file has either a {system}or a{directory}attribute. The practical T: difference is that directory files can be accessed only when you're al- T: ready logged into their user number. System files can be accessed from T: {any}user number, so long as they reside in user number 0 of their disk. T: Thus it is normal for all system files to be stored in user 0. T: T: The programs on your hard disk (such as NewWord) have been set up as T: system files so you can run them from any user number. Files are set to T: the directory flavor by default, unless you use the SET command to reset T: their status to system files. T: T: DIRS is an acceptable abbreviation of DIRSYS. T: T: See also SET. LF: 5 TNR: Type R to review the previous page or anything else to continue: HOLD: *DIRPAGE2 J continue: HOLD: *USER *USERPAGE3 CLRS: T:{The USER command, continued} T:{EXAMPLES:} T: T: To change to user 4 on the same drive, from whatever your current user T: may be, type: T: {USER 4} T: T: To change to drive B: while keeping the same user number, simply use the T: change logged drive command: T: {B:} T: T: If you want to do both of these, that is, change both drive and user num- T: ber, you have to enter both commands, in either order. (Hint: there is a T: shortcut--type "4B:" for example.) T: T: Remember that when you create a file using NewWord, SuperCalc, etc., it is T: assigned the user number that was in force when you started up the program. T: To change the user number, copy the file from one number to the other with T: PIP, using the "g" option; then erase the original file. T: T: Lastly, DIR displays only those files in the current user number, unless T: you attach the [user=##] ype any key to continue) A: *DIRPAGE2 CLRS: T:{The DIR command, continued} LF: 3 T:{EXAMPLE 2: }Your CP/M prompt reads "3C>", which means you're logged onto T: drive C: in user number 3. You want to examine the directory of user T: number 2 on drive A:. This requires that you use the "[user=##]" option: T: T: {DIR A: [USER=2]} T: T:There are several other options that can be specified on the DIR command T:line, the most notable of which is the "full listing" option. All files T:(both directory and system files) are listed alphabetically, along with T:their sizes and other information. An example of such a command line is T:"DIR [FULL]". Refer to the CP/M User's Guide for further details. LF: 2 T: {DIRSYS -}This command is very similar to DIR, except that it lists files T: that have the "system attribute" assigned to them. DIR will not show T: show these files but reports instead: SYSTEM FILES EXIST. All of the T: rules for !:*BEGIN *ERA R: description of the ERA command CLRS: T: {The ERA Command} LF: 3 T: This command is used to erase files from a disk. The format is: T: T: {ERA FILENAME} T: T: where FILENAME is any valid CP/M filename. The filename may be prefixed T: by a drive letter (as in ERA{B:}FILENAME ). If you don't type a drive T: letter then the currently logged drive will be used, that is, the drive T: whose letter appears in the CP/M prompt (A>, 4C>, etc.). T: T: Although you don't have to be logged onto the drive with the file to be T: erased, you do need to be in the same user number as the file. T: T: Note that you cannot erase files that have been set as "read only" with T: the SET command; nor can you erase files from write-protected diskettes. T: T: T: T: (Press any key to continue) A: CLRS: T:{EXAMPLE 1: }Assume you are on drive B:, in user number 0. (You can tell T: you're in user nr anything else to continue: HOLD: *ERA J:*BEGIN *REN R: description of the REN command CLRS: T: {The REN Command} LF: 3 T:You may change the name that you have given to a file with the REN (rename) T:command. To use REN, you would type: T: T: {REN NEWNAME=OLDNAME} T: T:The file you wish to rename need not be on the current drive (the one whose T:letter appears in the CP/M prompt - B>, 5A>, etc.), but it must be in the T:current user number. See USER for more details on user numbers. T:{ T:EXAMPLE:}Assume you are logged onto drive B: user 0, and you want to change T: the name of the file LETTER.TXT on drive A:, user 0 to the new name MEMO.- T: TXT. You would type: T: T: {REN B:MEMO.TXT=B:LETTER.TXT} LF: 4 T: (Type any key to continue) A: CLRS: T:{The REN command, continued} LF: 6 T:Note that you can't rename files that have been made read-only with the SET T:command, ands. T: {SHOW A:} - Statistics for drive A: only T: {SHOW [LABEL]} - Reports disk label info (see CP/M User's Guide) T: {SHOW [USERS]} - Reports file counts by user number T: {SHOW [DIR]} - Reports free directory entries LF: 3 T: (Type any key to continue) A: J:*BEGIN *TYPE R: description of the TYPE command CLRS: T: {The TYPE Command} LF: 2 T: The TYPE command is used to display text files on the screen. To use TYPE, T: first log into the user number (see USER) that contains the file, and enter: T: T: {TYPE x:FILENAME} T: T: where "x:" is the drive letter, if the file is on a drive other than the T: current one. (The current drive is the one whose letter appears in the CP/M T: prompt - A> 5C>, etc.) T: T: The contents of FILENAME will roll up your screen a screenful at a time. You T: can cause the "scrolling" to be continuous instead by typing: T: T: umber 0 if no number appears in front of the letter in T: in the CP/M prompt.) To erase a file named "USELESS" on this drive and T: user number, you would type: T: T: {ERA USELESS} T: T:{EXAMPLE 2: }Your CP/M prompt reads "12A>", which means you're logged onto T: drive A: in user 12. You want to erase the file "GOBBLDIG.OOK" in user T: number 6 on drive B:. First you must change user numbers: T: T: {USER 6} T: T: Your prompt now reads "6A>". You could either proceed to log onto drive T: B: by typing B: [RETURN], and then type ERA GOBBLDIG.OOK [RETURN]. Or T: you could use this shortcut instead: T: T: {ERA B:GOBBLDIG.OOK} T: T: The general rule is: You can erase files from on other drives, but only T: within the current user number. To erase files from another user number, T: first log into that number with the USER command, then use ERA. T: TNR: Type R to review the previous page o you can't rename files on write-protected diskettes. If you T:try to give a file a name that's already in use on the same drive and user T:number, you'll get an error message. You then have the option of deleting T:the file that possesses the name you wish to use. LF: 4 TNR:Type R to review the previous page or anything else to continue: HOLD: *REN J:*BEGIN *SHOW R: description of the SHOW command CLRS: T: {The SHOW Command} LF: 3 T: This command reports how much space is left on a disk, whether the disk is T: read/write or read-only (see SET), the number of files for each user number T: on the disk, and how many directory entries are still available on the disk. T: Thus SHOW can be useful for making sure that your hard disk isn't getting T: too crowded. T: T: The examples below show the options that are used with SHOW. "Statistics" T: refers to free disk space and read/write status. LF: 2 T: {SHOW} - Statistics for all logged drive"{TYPE FILENAME [NO PAGE]} T: T: When you do this, you can pause the scrolling with CTRL-S and resume it with T: CTRL-Q (see "Control keys in CP/M"). To{abort}the display before the end of T: the file, type CTRL-C. You can have your printer{print}the file at the same T: time as it appears on the screen by typing CTRL-P before the TYPE command. T: T: (Type any key to continue) A: J:*BEGIN *PIP R: PIP and its uses CLRS: T: {The PIP Command} T: T: This command is used to copy files and move them around. It is the most T: versatile CP/M command, and so it has a list of options as long as your arm. T: We'll just cover the most frequently used options here. For more info, see T: your CP/M User's Guide. T: T: PIP can move files from one disk to another, from a disk to the screen, or T: from a disk to the printer. The following examples illustrate the most T: common forms of using PIP. The one possibly confusing detail  working with multiple files.) The [V] option T: means PIP will verify that the files are copied T: correctly. T: T:{PIP A: [g1]=SOMEFILE [g2]}- Copies SOMEFILE from user 2 to user 1, keeping T: the same filename. (Files on the same disk but T: with different user numbers can have identical T: names. LF: 2 T: Additional PIP capabilities include combining several small files into one T: large one; sending files to peripheral devices (like LST:, which is usually T: your printer); clearing text files of form feeds and set high-order bits; T: converting characters in text files from lower to upper case; and more! LF:3 TNR: Type R to review the previous page or anything else to continue: HOLD: *PIP J:*BEGIN *SET R:a description of SET CLRS: LF: T: {The SET Command} LF: 3 T: This command only, you can't copy files onto it, T: erase files from it, or modify or rename any of its files. Note that read- T: only disks are reset to read/write whenever you reboot the system. T: T:{EXAMPLES:} To set file IMPORT.ANT on drive B: to read only, first be sure T: you are in the correct user number, and type: T: T: {SET B:IMPORT.ANT [RO]} T: T: (User numbers are discussed in detail under USER.) To set the entire disk T: in drive C: to read-only status, type: T: T: {SET C: [RO]} T: T: To return IMPORT.ANT back to read/write status, type: T: T: {SET B:IMPORT.ANT [RW]} LF: 3 TNR: Press R to return to the previous page or anything else to continue: HOLD: *SET *SETPAGE3 CLRS: T:{The SET command, continued} LF: 2 T: To return the read-only disk to read/write, type either CTRL-C or: T: T: {SET C: [RW]} LF: 2 T:{Protecting files with passwo to keep in T: mind is that the "destination" file comes {before}the "source file" in the T: command lines. T: T: {PIP B:=A:FILENAME} - Makes a duplicate copy on drive B, of the file T: FILENAME on drive A. You should be logged into T: FILENAME's user number; the copy will have the T: same user number as the original. T: T: {PIP C:NEWNAME=B:OLDNAME} - Makes a duplicate copy on drive C of OLDNAME on T: drive B, calling the copy NEWNAME. See above T: for user number details. T: T: (Press any key to continue) A: *PIPPAGE2 CLRS: T:{The PIP command, continued} LF: 2 T: {PIP B:=A:*.* [V]} - Copies all files in the current user number from T: drive A to drive B. (See your CP/M User's Guide T: for how to use "wildcards" in filenames when T: establishes a variety of your file's characteristics, such as T: whether it is read/write or read-only, and whether access to it requires a T: password. The same "attributes" can be applied to entire disks with SET. T: The general format of SET commands is: T: T: {SET x:FILENAME [attributes]} T: T: where x: is an optional drive letter and [attributes] are optional codes T: that control FILENAME's characteristics. LF: 2 T:{Read-only versus read/write:} When you create a file, CP/M sets it up as T: read/write by default. This means it can be modified or erased at your T: pleasure. However, you may want to make certain important, static files T: read-only, so they cannot be changed or erased by accident. (This will not T: protect them from physical damage or from erasure by disk reformatting.) T: T: T: (Type any key to continue) A: *SETPAGE2 CLRS: T:{The SET command, continued} LF: 2 T: When you a set a whole disk to be read-"rds:} Unfortunately, it's impossible to give a T: short and simple discussion of this involved (and potentially hazardous) T: function of the SET command. In brief, you must first enable protection T: for the whole disk, and then you may specify passwords for individual files. T: Finally, you should protect the SET command itself so others can't undo T: what you've done. All of this is generally impractical if you're the only T: person using the computer. T: T: A full discussion of password protection can be found in the CP/M User's T: Guide under the SET command. T: T: NOTE: If you do assign passwords to disks or files, make sure you keep T: written records of the passwords, lest you forget them. LF: 2 TNR: Press R to return to the previous page or anything else to continue: HOLD: *SETPAGE2 *SETPAGE4 CLRS: T:{The SET command, continued} LF: 2 T:{Directory vs. System status:} As discussed under DIR / DIRSYS, you can set T: a file up to have eitherthing else to continue: HOLD: *SETPAGE3 CLRS: T:{The SET command, continued} T: T:{EXAMPLE: }Suppose you've just purchased a new program "Wondersoft" that T: you've copied onto your hard disk (Drive A:, user 0) using PIP. You'd T: like to be able to run it from numbers 14 and 15, where you'll store T: its data files. Wondersoft uses two files: WONDER.COM and WONDER.OVR. T: The commands to set these files to system status are: T: T: {SET WONDER.COM [SYS]} T: {SET WONDER.OVR [SYS]} T: T:{NOTES:} 1. In the example above, you must have already logged onto drive T: A:, user 0 before typing the commands. T: T: 2. To change a system file to directory status, use the same com- T: mand, substituting [DIR] for [SYS]. T: T: 3. PIP will not copy system files. Reverse their status first. T: T: 4. The above example is a prime candidate for using "wildcards," T: which arlse to proceed: HOLD: *BEGIN EXIST: HELP.COM UN: *NOHELP CPMY: HELP| J: *BEGIN *NOHELP CLRS: LF: 12 T: The HELP utility program appears to be missing from your disk. TNR: Type any key to return to the first menu: A: J: *BEGIN R:========================================================================== *RETURN CLRS: LF: 11 T:{ T:Returning to Co-pilot Main Menu. Please stand by ... CH:MICRO.PIL  of these attributes. Directory files can only be T: accessed from their own user number; that is, you can't run a program in T: user number 3 from user number 4, if it has the directory attribute. Such T: files are listed with the DIR command. CP/M assigns files the directory T: attribute until you use SET to change this. T: T: "System" files, by contrast, can be accessed from any user number but they T: must reside in user number 0 for this to work. A normal use of this capa- T: bility is to keep a single copy of your software, set to system status, in T: user number 0, so you can run it with files that are scattered throughout T: other user numbers. For example, your hard disk comes from the factory T: with NewWord software set to run from any user number, so you can organize T: your documents in various other user numbers, as if they were so many file T: drawers. T: T: System files are listed with the DIRSYS command. LF: 2 TNR: Type R to review the previous page or anye covered in your CP/M User's Guide. The command with T: wildcards would be SET WONDER.* [SYS]. T: TNR: Type R to review the previous page or anything else to continue: HOLD: *SETPAGE4 J:*BEGIN *HELP R:Launches user into Digital's HELP system CLRS: LF: 2 T: {CP/M 3.0 ADVANCED COURSE} LF: 3 T: Your Co-pilot Menu System now turns you over to Digital Research's system T: of "help messages." This is the same function as if you were to type HELP T: at the CP/M prompt. T: T: These descriptions of the various CP/M commands have the advantage of being T: more complete than those presented by Co-pilot; however, they are also much T: more technical and condensed. Note that if you specify an optional subtopic, T: you need to precede the name of the subtopic with a period or comma, depend- T: ing on the context. T: T: When you're ready to return to Co-pilot, press RETURN at the HELP> prompt. LF: 5 TNR: Type R to return to the previous menu or anything e#;Drive Ogranization Definitions ; ; Make sure that the floppy flag is set to false for generating a loader ; for the hard disk. If you're generating a loader for a floppy disk then ; floppy should be set to true and you MUST have entered an F argument to ; the end of the boot.sub command invocation. ; floppy equ False ;Hard_Disk/Floppy_Disk System drives equ 5 ;number of drives you wish to define if floppy cvdsk equ 0 ;first floppy is current virtual, a: define a,dsdd define b,cm11 define c,dsdd define d,dsdd define e,dsdd else cvdsk equ 1 ;first floppy is current virtual, b: define a,cm11 define b,dsdd define c,dsdd define d,dsdd define e,dsdd endif :*2^P:*<2^:^og:^og AP*^$^#V|Y*^$s#r*^"^*^(^#V"^*_*^(s#rxN* _&^#V" _M>2*:*P!* " _* _ w#w!n*"a!a7*n*#"a!a7*n*##"a!a7* _d!ãQ!Y>t'!Y>'P!b7!"^*_" _* _|SQ*^#"^*^Ã"zw"|z !aF6c#6FCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH151282654321A͑"w*w}1ҫ!wE><0;!w!w6!w6!w"'x!%xy2w:w!)x"w*w~2w*w~og |2w:w !+x!/x!F:w_>͉:G!w>A;2wRf%!DB$![D>6;!!D;!!w>;!!-E> ;!@%*}!w;@!7Ewx͛:!8Ewx͛:"w*w:wog<,;!3x!rx*7C~og#))+"w*w#"w!HG"wbj"w!txDͺ(xx~# RE%!E>;%!F>;%@Ra%>B'!F>;%@*xx~2|x!F"w*w+:|xog!Gx͛:*w+:|xog*wx͛:R%!(DB$*w+:|xog>;!@!|x4nR%>B'@÷}x~# R%>B'!G> ;%@@%*=*w+*}x~og;@*w+*}x~og>;!9E>;!SE>;ͥ*w+*}x~og;*w+*}x~og#G>GA;*w+*}x~ogF>k}*xwÑ ̀*zw"w*w+"w*w+"w:w*w"w:w2w*w*w*w>og^^#V"x*vw*zw< *zw#"zw:w*~w*zw`;w*w#*x~og)))))*~w*zw`;> GA;*w *x~og)))))~*~w*zw`;w*w*x~og)))))*~w*zw`;>GA; *|w#"|w "x*x | !x/F><,;!x!8yC"~w*x)>og;"vw :w R9 %>B'!E>;%@!<,;!:ySx !w6!w6!{yD><,0;!yySu !w6{ ͔( ^#V"y*y^#V"y:y *w*y)))))~2w*w*y)))))*w:wog)))))> GA;:w!F :w *w:wog)))))6 :w *w#:wog)))))og^|n !w55r !w5*y+"y*w+"w:w *w | *w#*w^|± *w#"y!yͨ!yͨ*w*w<"w:w=2w:w !w4Ó ^#V"y>2y:zw2y:yog:yog< *~w:yog`;~c *~w:yog`;~*w*y~og))))) >2y:yog | *w*y~og))))):yog*~w:yog`;:yogx͛:ʳ !y4W *~w:yog`;6c*zw+"zw:y!y4 >I*xw"w!yL! <"w*7C^#V*w<*w<"w*w>og;#"w*w*w*w>og^<"w*7C^#V*w<!xE><0;!x*w>og;#"w*w*w*w>og^<"w*w*w^+++*w>og^}2w!Hg"w*w"w!HW"w*w*w<*!xͨ*w*w<"w*w+"w*w+*7C^#V<|z*w"w*w"xw!xD:w2w!x͂ :ww!xD!x͂ aÀ!xͨ!|w# À}!"w*7C^#V*w<|!xD*w"x2x:w2x:xog:xogw!F6*w:xog)))))~!Fe!HG:xog)))))6*w#"w!x4!xͨÚ!w6!"w"w"zw"|w!w6*w`~!F­!w6*7C^#V*w<2x:w2x:xog:xogog;#"w #*w#"w*w"w:yog#"w*xw*w< :y<2y:w2y:yog:yog*w+"w*y4nS^#V"y*7C~og*w *y~og)))))~og<*y"y!y 2y:y:wog#>og^"w*w<:wog"w*~w:yog`;*w*w)))))*w `;>GA;*~w:yog`;~*w+*w)))))*w `;w!w6P^#V"yR;%!-DB$!E>;!*y;!!E>;!@RL%>B'@(^#V"yR%>B'*y;%!-E> ;%@%*!w;@!7Ewx͛:!8Ewx͛:>m2y:w2y:yog:yogog^|*w:z^#V:zog)))))6>2z:zog |U*z^#V:zog))))):zog6!z4!z4*w+"w*z~og+"w*z"z*z"z!z͜2z:w2z:zog:zog<*z^#V:zog)))))6>2z:zog |*z^#V:zog))))):zog6!z4ý!z4Ë*w*w<$*z"z!zͨ*w*w"wA!z͵"Hw͖!z͛"twåz~# I*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!zͤʤ!G͊= z~# ­*z^#V*w;͍6!z>͓7!z͚"w!z͌!zp"w!z͘*z"z!z!zͩ ![͊=m^#V"z!z*zr::z52z9!z5!z͛"tw!z͵"Hw*Hw|f!zF><0;!z*Hw^#V"Jw*Hw ^#V"7C*7C^#V*7C~og#;͍6!Lw>͓7*7C###"{!{A#͍6!Pw>͓7!Tw"z*7C ~gj"z*7C~!z W#:>2z:zog |l*z++:zog)w#w*z!zF:|e*7C^#V |H:z=*z+:zogwe:zog+*z++:zog)s#r!z4×^#V"{*{>l7!Lw>l785"{!{^#V"{*{>l7>5!Lw>l78>55*7C ^#V^#V"{*{>l7>5!Pw>l78>55>^#))o |O#"9C[4BZ!9SJ~#$:> $J&9}x2LCy j2MC"){AE$:RC+-/x2LCy2MC"){Aͯ:LC!MCP& G7!9~#$&*){7<$2;C2PC2SC<2KC!9 V+iv-v>2PC#ҏ… ʉ ,v.¦#Ҧ,×eʰE+-#2QC$!LC5¡:MC!OC<_!;C>w w>+!NC~5>. G:QCx0:NC> !PC~ 5!NC4!KC5-2QCx!KC^4{# # !;C~0>0"+{*9C~2/{:PCA Ϳ"A <:/{20{>Vͬ"!0{S 5~/o :SC‰ >9ͬ"ʉ >*ͬ"w  y *:0{!9q#=€ Ï">21{<22{23{ 2.{:2{_:/{"*9C~2-{:-{9 :1{ :1{21{͟" :3{=O:1{##:3{O:.{#͖"Õ Z *A!O:1{!yyog)))))6+:F*w:yog)))))w>2y:yog |e*w:yog))))):yog6!y40!y4^#V"y!F6*w*y~og)))))"y!z"y>2z:zog |*y+:zog~g.*w *y~og)))))~g.`|!z:zogw!z4á*yGx͛:R-%>B'!G> ;%@RI%>B'!2G>;%@c%*`! z;@! z>;!9E>;!SE>;ͥ! z;>2z>2z:zog |! z:z_>͉:*y+:zog>͛:!zF><0;!z!z5!z4Ò!"w"w"w2Rz2Vz2Wz"w*w*w"Szgo"w!HW"w!Hg"w*Sz*w<!XzD2Uz:w2\z:\zog:Uzog*w#"w:Vzog*w<|!mz͜:Wzog*w<|!qz͜!*w+"w:Rz!uz!yzÙ}z~# %*w*z~og)))))*}z^#V*z~og)))))> GA;*w#"w*z4*z~og*w<|˜*z~og#>og^}*zwz~# ¡*z"z!zͨ*w*w"w*z6*w#"w%z~# *z~2z:w2z:zog:zog<\*V" {*7C^#V* {^#V<&!S͊=* {^#V͍6!Pw>l779`^#V""{!${"&{!"${*"{~*&{w*${ruq!U͊=Û͇!({;!GG({x͛:ʙ>ɯB^#V^͞#V ͪͪ"  Later CP/M or MP/M Version Required$*}**}{ozg|g}o!\!l!*:3>:͞!L*3>͞K* !*ͤ͞ ͤ  >  ͤͤͤͤͤͤͤͤͤ͞ͲͲͲͤͲͲ Ͳ͞ Ͳͤ!Ͳͤ"Ͳͤ#Ͳͤ$ͻͤ%ͻͤ(ͤ1^#V#^#V́"> ́"> > ́">́{2> ́"́">́"> 2!2`iPY*}~##~#fo##^#V#{_z/!T]W{_z<KB ^#V^#V)F<*}!9{ozg| #~wþ$21{:1{)!:.{0)!:3{O:-{*#!> #;!:1{21{:3{O:.{#͖"Õ :-{͟"!:-{"†!:-{"o!:3{O:-{##͖"Û :-{21{:3{O> #͖"Û :1{!:.{0¢!:3{O> #!:3{=O:-{##:3{O:.{#:1{21{!:3{O:.{#͖"Õ :-{V":1{":1{21{͟"":3{=O:1{##:1{ "<21{͚"Û :3{O:-{"H":1{3":-{B="?":1{*?"> #͖"Û :3{O:-{CV"D:PCi"> # #Æ":-{C}"# >R#Æ"# >B#͖"͖"Û :0{*+{!3{4!2{4S+-$G:/{Ox*9C## ¶"<>Sͬ">+ͬ">-ͬ">Cͬ">Dͬ":/,.B!2{N*9C# Ⱦ"G:2{_:/{O x*9C# Ⱦ#!i#9w$G:PC8#x+-L#SF#x+L#-SI#>+>-> F$ h#x=b#G#O# #:kCx#ډ#!ZCxO#ډ#$O#'O# £#O#> $Õ# µ#x¯#>$O# ##O#x#>O#='#$x!XC#$#:iC#$:XC> $#>29{!7{K':iC+$!XC+$> 3$> 3$3$26{!4{'!:{Ú=ê$$^$^#Vʃ$a$ͪ$F$#F|$#N|$#^#r+s#^#V++r+s~F$5F$$5^$q#pF$O$4~ $_$s#r#s#r#q!$Ú=$$C$$ Format Overflow*C-&C![{*|*| r:*| nb5)*| !|>=;O)!|>;*|:!|;*|~#{)*|^#V)))|{)*|6P#6*|~#µ)*|^#V))|)*|6#6õ)*|6<#6*|6#6*|6#6*|6#6*| 6*|^#V}4}2|*|^#V} *!|44*|^#V}"*>2|*|^#V}M**|~#M**|6#6*|"|*|"|*|"|!|(0*|^#V|Š**|"|!"|!|͚=^#V^#VOA:Cڨ*!*͚=2CO!C·*6ü* +~#w!C s#r!C4A**C** I/O Stack Overflow!9"|!|*+!9$>'+%~T]O ++~+>x^#V"|*|6͌+;,T+!C"}!" }!}͚=M,]+^,2}:}+,ͩ+:|> b€+,Æ+ͩ++>,;,+V,+D,+Ì+V,+:}+^,+,^,++D,+M,+,,é+!`C6M,+V,+D, ,:|!`Cw,+g,2|*|~!,:|*|#*|~ogw*|4:|:| :|,:| ?:|':`C‡,!TC"}! }81,! }6Ò,:`C2 }!`C6: } ڡ,*XC#"XC: } ±,!XC6#6: }"3" 3*3^#V#"3^#VͿ,,"$3,"(3|,|~Ϳ,,ya-A"3*(3(3w# 1*(3~#3*(3 B>3*$3w#w3͵,,34/Ϳ,q3͵,,3Ϳ,Nm/3*(3~" 4#4#4͵,,3~Œ11K43.>13͵,,3~.>13*(3~ʹ1>31P43*(3!*~!/2,3*(3|1(^#V,,{z1z]22'3z(2:,324/q#2Nm/#2*(3|]2*~]2=!'3Z2:,3ͨ/W2S2w:2^1>͵,,3|}3~> 3<3͵,,3|”2*$3w=3*(3$B*$3^#V6+6++<3͵,,3>3"N#F#~Ϳ,q#p#w>3͵,,3>3*~,!2=2>!*(3" s#r#w=3* 3 }!m}6 4>2l}*i}!4#4#4~#N#F#y#x#:l}*i}!!:k}ʈ3]3G3:m}~G~#~O?3#~3! p! y! q<33.3~3#!!3! 6?<04= _!x$4*4FN4wxG>O>G!$q#p#6R4"f}"i}2h}x2k}.32l}>3!h}~54m3ʘ4=4:k}4*i}<˜4G34*f}:k}O*i}:m}´4y O4:k}G3*f}w# 4N3:l}4*i}!]343*f}"f}g4:l}/g.>.%O:Cy+%!9G'%~#'%%y.%O:C=%Æ%͹%F%{N%*iC|w%j& *iC*XC<#<> %> %͹%> %{=>'%!9ʨ%=~#'¡%{>'%%Ì%{=>'%{>b%*XC++|2{!{'ɯ%>%>2|" |" |`i" |!9"|!{%[| ~# %*[|~n&*[|~C&!U|>;G3!!!C(!C"i|!g|͋*k&!U|>;G3!R.!!C(!C"m|!k|͋*À&*]|"o|!o|͋*!q|(*a|^#V!aCs#r*c|^#V!cCs#r*_|^#V:|*qC:|G&!u|('*_|^#V}*qC}G&!w|(':C '*_|^#V}*qC}G '!y|(':C''*_|^#V}''!{|('^#V"}|!C"|*}|"|!|͚=2|!|K'^#V"|:CZ':C'*|'*|5!|6:| ʀ'ͳ'r'a'ò'!|'*|'*|5!`C6!|':`Cʯ'*|6Ì'g,2|:|'!C"|!"|!|͚=!XC6#6!|6 :C'!|'^#V"|!TC"|*|"|!|K1%(!C"|!"|!|͚="((:C(*|~ ?(*XC#"XC(*|~ S(!XC6#6(:C(*|~ u(*\C#"\C!ZC6#6(*|~ (*ZC#"ZC!ZC#(!ZC6#6*ZC*kC#<|(!C"|!"|!|͚=('!`C6"|!9"|!|(! 9^|~# (*|^#V|) =.:;<>[]y *"3, -(-,$-,1J- o&))))\xH  g-#w g--"-*(3#ʖ-AҖ-G-,:ʛ- 6à-p4-+4--#,-#*½-6?-w-¬-,---#6 -..- 4-.,.#*-6?.w--,.-.#6 .%#6.*(3##^ ~?1.# *.xCON CON RDR PUN LST M!L. ~"-$.-,1ҕ.\|.l.$.!~ .-!9.,°. ʾ.-#Ý.x=GÚ.->ɯ*(3+.^#V.#{#z.6#6. r+s!}F#~*/!}6P  eA eA!}^r+s6 #6 !}4^N*(3|Z/}=G/.V/R.R/O>~f/f/>ͨ/N*(3|’/YR.=/y‹/eAÎ/>~ʞ/=ʞ/>ͨ/q2-3*(3/"*3./{..**3*(3#:-3O/.#s#r/../.è/.r+s{0!'34**3+>|0+}o͵,Ϳ,~2&3Ϳ,""3,:&3.1[.a0G:&3.1*$3p[04#63,:&3|00*3++"3Å0}+ʉ00}|23"3,0"31F<|.1##"(36*$3s#rv-š2{ ʚ2*(3:&3w060*3"3<1:&3š20<ʚ2!$Gx|g}o5@5!9VzwzO#5<599! 9/GO~9O9~q+d5!96#=w5O!9Fx7yҮ5! 9~WwzO+›55_ /!9~#=557"n}>6*n}"p}56*p}"p}56*p}G!9!xb6 ]6+/6$%?'w#6-!9~R7&7~#R77! 9~.87+60D70D76 #,7+r>o&9y>o&90w+i76.7w#Ì7 O~#¢7Gxڵ77 9> 79#7!9!97>?'w#7!9͛8! 9͛89! y@88!9o>g~18Gx8f848!9!w# L898!9!9!'#s8!9^{w{W#‡8~W8~+¶8ê87>?'w# þ88!9~#88!99#8>Q={zQ=}|Q={+=+=i`~sw#r##q#p i`N#F#^#V~Q=q4#p+i`##s#rW=Bs=B FREE Request Out-of-Range$ Free Space Overwrite$GKҲ=Mbkò=?F~?N~?N#F~?^#V"Cy2Cx=i&Ϳ@==x=>=!C{#z*aC*cC@xyx >c>_!?^#Vͺ>]>>(_>y͖>>)_>|@>R>'?|L>R>ͺ>>B>,_>]>> _eA eA eA0:_>_>m>m>]>|{>}{> ڦ>dԨ> ͨ>ڳ>ê>xm>N #~_>ü>!?ͺ>*}!9{_z>{> ?>]>>#_>*}>=^#V#͇>??>: "?>?_>!?ͺ>ͺ>>=_>^#V|W?}N?.))@ú>#F>A?> #r?~ >.?~ ?=c?^#V# File: Traceback:???????@ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!C~N@3@B Condition Stack Overflow$4Ox!t} w#s#r#s#r!9!C s#r!CN!t} +++++‡@#{ @#zʥ@++~Ç@++!C5!~# ´@ð@!CN!t} +++++@#~#@+{@#z@++~@#^#V=!C~u want to recover time/date directory space (Y/N)? YyABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzEnd of PASS 1. ERROR: INITDIR TERMINATED. Requires CP/M 3.0 or higher. Directory already re-formatted.Not enough room in directory. Wrong password.No time stamps present. Not enough available memory. Disk is READ ONLY. Cannot find last XFCB. 3Cannot re-format the directory with RSXs in memory. Unrecognized drive.Cannot select drive.! ABCDEFGHIJKLMNOPDRIVE: Enter Drive: :Directory is password protected.Password, please. >/?'w#•9'w#¦97>?'w##´9^{w{W#9!9Ú=9999!9MD^#V# + w9ȇ :):Wf.0:r~#fo0:s#r!>O @:)8:|W}_ W:|}o|gG:yx/Wy/_{zW{_e:yw# r:~#É:~#W #ÿ:F#"r}x;:*r}!9G_>WObk++:~+:y~#//); ;=;);ɯo>g{ozg!<Ú=<<O6# ŽB ~B=ɯ ~#fo++-B!}~#B*}$BBCBC  Insufficient Memory$ Invalid I/O List End of Execution$(CdSYSINSYSPRINT    30INITDIR WILL ACTIVATE TIME STAMPS FOR SPECIFIED DRIVE.1Do you want to re-format the directory on drive: Do you want the existing time stamps cleared0Do yo%%&x