IMD 1.17: 5/01/2010 22:25:44 master disk II 23 aug 84 cm34 1!"̀)À>A Not a SYSTEM Diskette (01!"̀)À>A Not a SYSTEM Diskette (0HIST UTL QUEST PILDRIVES MAC CPM3 LIB LDRBIOS3MACHCCP COMED COMITUTORIALPILK !"#$%&'()*BNKBIOS3MAC+,-./0123456789:BNKBIOS3MAC;<=>?@ABCDEFGHIJBNKBIOS3MACKLMNOPQRSTKP TXTUCPMLDR RELVWMDINST PILUXYZ[\]SCB ASM^_CALLVERSASM`DUMP ASM abECHOVERSASMcRANDOM ASMVdefghiBOOT3 MACjkGENCPM COM(lmnopqrstuvGENCPM DATwxBOOT SUByBIOS SUBzPILOT COMv{|}~TRACE UTL HD22DEF MACMICRO PILGO PILDRIVES MAC%MODEBAUDLIBZ80 LIB/INIT PILDEFINE MACT` !6* ` !6* ` !6* ` *& @AA I$DBD $I$BHA"DH!""@------------------------------------------------------------------ ; Index (19_Jul_84) ;------------------ ; ; Banked Bios: ; Include Files, External Declarations and Equates ; Dat Are (Characte Tables) ; Data Area (Virtual Drive Message) ; Data Area (Local Data Area) ; Data Area (Drive Tables/Dph's and Dpb's) ; Data Area (System RamDatY and Apif) ; Data Area (System Mtab's) ; Data Area (Free Space Pool) ; Cold Boot Routine ; Jump Table Entry Points ; Extended Bios Functions ; Console Input Translation Routines ; Console Output Translation Routines ; Character I/O (List Device Drivers) ; Character I/O (Physical Level) ; ; Resident Bios: ; Banking Considerations and Bios Jump Table ; Jump Table ; Bank Crossing Rout dent businessperson keeping 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:}I4!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 ` *&R:QUEST HARD DISK LOAD MODULE version 3.16 (MD-16) 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:nsert the{QUEST INSTRUCTIONAL (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 wro;Subttl CP/M+ Drive Data Structure Generator (31_May_84) ; ; Copyright 1984 ; Morrow Designs, Inc. ; San Leandro, Ca. ; Bill Smith, John Zalabak ; ; ; The following drive type codes are either defined [d] or reserved [r]: ;----------------------------------------------------------------------- ; ; Floppy Disks ; ------------ ; DSDD [d] 5.25" double sided double density 48 tpi drive ; DSQD [r] 5.25" double sided double density 96 tip drive ; ; Hard Disks ; ---------- ; ST06 [d] Seagate, Model ST506 (5 meg) ; ; SQ06 [d] SyQuest Technology, Model 306 (6 meg) ; ; SA11 [d] Shugart Associates, Model SA712 (11 meg) ; ; CM11 [d] Computer Memories Inc., Model 5412, (11 meg) ; CM16 [d] Computer Memories Inc., Model 5619, (16 meg) ; CM34 [d] Computer Memories Inc., Model 6640, (34 meg) ; ; CD31 [d] Control Data Corporation, Model 9415-5 (31 meg) ; ; MS11 [d] Mini-Scribe, Model 3212 (11 meg) ; ; TU34 [d] Tulin Corporation, Model TL 240 (34 meg) ; ;-----------------------------dm page ;---------------------------------------------------------------------- ; Proto-Type DPH ;--------------- ; 1) 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 ;---------------------------------------------------------------------- ; Table_Gen ;---------- ; 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 ;----------- ; 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 page ;====================================================================== ; DSDD: Floppy Disk - 5.25" Double Sided - Double Density ;======================================================== ; ; Translate Table and CheckSumng disk. Press any key 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 page 2-22 of the MD-11/16 User's T: Guide for instructions 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 !p ~87!p  :4=q!CS!7v!4:8:6q6 #:v+!4v8!5~8:4=r!SC----------------------------------------- ; Define Macro (22_Mar_84) ;------------------------- ; 1) the define macro is called once for each drive. ; 2) each time it is called it generates 3 new macros which are unique ; for the logical drive, and contain the logical drive's name. ; 3) it generates macros which when used, create the MTAB, DPH, and ; DPB for the drive. ; 4) macros defined by DEFINE begin with the structure name MT, DPH, DPB, ; include the letter M, 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:). ; define macro dv,typ mt&m&dv macro ;Mtab Definition mt&dv: mt&typ endm dpbm&dv macro ;DPB Definition dpb&dv: dpb&typ endm dphm&dv macro ;DPH Definition dph&dv: dphgen dv endm xl&dv equ xl&typ ;Translate Table csv&dv equ csv&typ ;Checksum Vector en Vector Definitions ;------------------------------------------------ ; xldsdd equ xlt1k ;Standard translate table csvdsdd equ -2 ;gencpm creates the checksum vector ; Mtab Definitions ;----------------- ; 1) media table for standard Morrow 5.25 inch double sided ; double density drives. ; 2) see file HD??DEF.MAC for full description of field assignments ; mtdsd macro db 10000100b ;virtual drive, double sided, drive = 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 ;0 ms head load time db 500 /3 ;500 ms motor on time dw 23 ;starting track of write precomp. dw -1 ;starting track of write lo-current db 0 ;format type, odd track on alt. head endm ; Floppy Disk DPB ;---------------- ; 1) dpb for standard Morrow 5.25 inch 390k dsdd floppy ; dpbdsdd macro dw 40 ;SPT (recordsd_map,1k sectors db 00000000b ;reserved byte db 0 ;No Park Offset dw 153 ;153 cylinders db 3 /3 ;3 ms Step Rate db 15 /3 ;15ms Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 128 ;Starting Track of Write precomp dw 128 ;Starting Track of lo-current db 0 ;Format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 5.432 meg ; 2) dpb for 5.25 inch 5 meg winchesters ; dpbst06 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (153-2)*36/4-1 ;DSM (153_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;===============================================================ed Capacity is 5.432 ; 1) dpb for 5.25 inch 6 meg removable media winchesters ; dpbsq06 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (((612-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw (16*4*32-1)/4 ;CKS (DRM/4) this is a removable disk dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; SA11: Hard Disk - Shugart Associates, Model SA712 (11 meg) ;=========================================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlsa11 equ 0 ;No Translate Table csvsa11 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a SA7712 ( per track) db 4,0Fh ;BSH, BLM (2k blocks) db 1 ;EXM (2 logical extnts/physical extent) dw 195-1 ;DSM (195*2k drive capacity = 390k) dw 192-1 ;DRM (192 directory entries in: 3 Blks db 0E0h ;AL0 (2k blocks*3)/32bytes/entry ) db 000h ;AL1 dw (192/4)-1 ;CKS (Checked directory size) dw 2 ;OFF (2 system tracks) db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; ST06: Hard Disk - Seagate ST 506 (2_Aug_84) ;============================================ ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlst06 equ 0 ;No Translate Table csvst06 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for an ST-506 (5.25" 5 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtst06 macro db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101011b ;ready_line,DD,ba======= ; SQ06: Hard Disk - SyQuest 306 (23_May_84) ;========================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlsq06 equ 0 ;No Translate Table csvsq06 equ -2 ;Have System create the CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a SyQuest 306 (5.25" 6 meg removable winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtsq06 macro db 00100110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatt5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtsa11 macro db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 12 /3 ;15 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 200 ;Starting track of Write PreComp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbsa11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh otor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbcm11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CM16: Hard Disk - CMI 5619 (22_Mar_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm16 equ 0 ;No Translate Table csvcm16 eqecords per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((1836-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CM34: Hard Disk - CMI 6640 (28_Mar_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm34 equ 0 ;No Translate Table csvcm34 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_6640 (5.25" 34 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm34 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CM11: Hard Disk - CMI 5412 (23_May_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm11 equ 0 ;No Translate Table csvcm11 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_5412 (5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm11 macro db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms mu 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for CMI_5619 (5.25" 16 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm16 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db 01101111b ;ready line,DD,badMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0FFh ;0 ms Settling Time (fast seek) db 0 ;0 ms Step Rate (Fast Seek) db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current control db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 16.448 meg ; 2) dpb for standard Morrow 5.25 inch 16 meg winchesters ; 3) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcm16 macro dw 72 ;SPT (r 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw 640 ;640 cylinders db 0FFh ;0 ms Settling Time db 0 ;3 ms Step Rate db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 0FFFFh ;starting track of write precomp dw 0FFFFh ;starting track of write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 34.484 meg ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcm34 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3840-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) e precomp dw 0FFFFh ;starting track of write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 29.480 ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcd31 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3285-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; MS11: Hard Disk - Mini-Scribe 3212 (31_May_84) ;=============================================== ; ; Translate Table and CheckSum Vector Definitions_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; TU34: Hard Disk - Tulin Corp. TU 240 (4_Jun_84) ;================================================ ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xltu34 equ 0 ;No Translate Table csvtu34 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) Media table (mtab) for a Tu 240 (5.25" 34 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mttu34 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;re dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CD31: Hard Disk - CDC 9415-5 (30_Mar_84) ;========================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcd31 equ 0 ;No Translate Table csvcd31 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_6640 (5.25" 31 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcd31 macro db 00110010b ;Has_Sector_0, 5 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 10 ;10 cylinder park offset dw 657 ;657 cylinders db 0FFh ;0 ms Settling Time db 0 ;3 ms Step Rate db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 0FFFFh ;starting track of writ ;------------------------------------------------ ; xlms11 equ 0 ;No Translate Table csvms11 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a Mini-Scribe (5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtms11 macro db 00100110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 612 ;612 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbms11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logicalserved byte db 0 ;no park offset dw 640 ;640 cylinders db 0FFh ;0 ms Settling Time db 0 ;0 ms Step Rate db 15 /3 ;15 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 34.484 meg ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbtu34 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3840-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm pa; 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 ;ge   BI$A$"@$I$!!""@H! $!@I$2'?:62626:626n$>(r>%͹$O*+?1*`5"6*6~!͔$a#+w#͟$~|rͪrڐrrG8y=ʢrx͔$}!+y)8ͩ$8Frͩ$8Frկ °rsr.r#r rͤ7rr rrr>  r~ s#.:*? пͤ#~+:3s~3s@##ͥ7$*`5&~!bk͔$L#ͤvsͤjs68LʲCڵC*7["7`iͰLzL͚D*7[F*7"7"7zL͏GïC*7"7RDͼL D csv ; 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  " External @lovec ;List " " " External @bnkbf ;128 byte buffer for banked bios External @crdma ;Current DMA Address External @crdsk ;Current Disk External @vinfo ;Bdos Variable Information External @resel ;FCB Flag External @fx ;Bdos Function for Error Messages External @usrcd ;Current User Code External @mltio ;Current sector count External @ermde ;Error Mode External @erdsk ;Error Disk External @media ;Door Open Flag External @bflgs ;Message Size Flag External @date ;Date (since 1_Jan_84) External @hour ;Hours (BCD) External @min ;Minutes (BCD) External @sec ;Seconds (BCD) External ?erjmp ;Error Message Jump External @mxtpa ;Top of the TPA page ;---------------------------------------------------------------------- ; Equates ;-------- ; ;Rom Jump Table Definitions rom equ 0 rdhsrm equ rom+9 ;rom read disk routine wrhsrm equ rom+0Ch ;rom write disk routine ;Other Definitions $txrdy equ 4 rev equ romrev-30h pagetbl ;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 page ;---------------------------------------------------------------------- ; Definitions of Null Routines (22_Mar_84) ;----------------------------------------- ; const: conost: listst: auxist: auxost: list: auxout: conin: auxin: flush: time: write: setbnk: userf: selmem: xmove: multio: home: wboot: devtbl: devini: drvtbl: ret page ;---------------------------------------------------------------------- ; Cold Boot Routine ;------------------ ; ;save interrupt vectors boot: ld hl,0fff0h ;source ld de,irq_vec_buf ;dest ld bc,16 ;leng ldir ;copy ret ;-------------------------Title System Loader for CPM3+ (23_Mar_84) Copyright 1984, Morrow Designs, Inc. ; ; Copyright 1984 ; Morrow Designs, Inc. ; San Leandro, Ca. ; Bill Smith ; .z80 cseg ; To Assemble and Link This File use the following command lines ; A>m80 =ldrbios ; A>link bootldr[l4000]=cpmldr,ldrbios,scb ; ;---------------------------------------------------------------------- ; Include Files ;-------------- ; .sall ;Suppress all Macro Expansions .xlist ;Supress Listing of Include Files Include HD22DEF.MAC ;General Definitions/Equates Include DRIVES.MAC ;Drive Definitions Include DEFINE.MAC ;Drive Selection .list ;Resume Listing page 64 ;---------------------------------------------------------------------- ; External Declarations (22_Mar_84) ;---------------------------------- ; External @civec ;Console Input Redirection Vector External @covec ; " Output " " External @aivec ;Aux Input " " External @aovec ; " Output "  ;---------------------------------------------------------------------- ; Jump Table (from cp/m plus version 3.0) ;---------------------------------------- ; 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 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 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 drv--------------------------------------------- ; Console Output Routine ;----------------------- ; conout: in a,(s1stat) and 4 jr z,conout ld a,c out (s1data),a ret ;---------------------------------------------------------------------- ; Set the Track ;-------------- ; settrk: ld (hsttrk+ramdaty),bc ;set track in ramdaty ret ;---------------------------------------------------------------------- ; Set the Sector ;--------------- ; setsec: ld (hstsec+ramdaty),bc ;set sector in ramdaty ret ;---------------------------------------------------------------------- ; Set the Current DMA Address ;---------------------------- ; setdma: ld (dmaadr+ramdaty),bc ;set dma address in ramdaty ret page ;---------------------------------------------------------------------- ; Sector Translation ;------------------- ; 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,be,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 page ;---------------------------------------------------------------------- ; Data Areas ;----------- ; 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 logical sector within physical sector dw 0 ;(VMSGP) Pointer to virtual drive message 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) page ;---------------------------------------------------------------------- ; 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 c ;add to table ld l,(hl) ;get xlated sector ld h,0 ret page ;---------------------------------------------------------------------- ; Select the Disk ;---------------- ; 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 a Sector ;-------------- ; 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 ;If (No Error) ret z ; Return (accm=0) ld a,1 ;Else ret ; Return (accm=1) ;---------------------------------------------------------------------- ; Move a Block of Memory ;----------------------- ; first call here is to move highest 128 bytes (ff80-ffff) ; on first call, replace vectors ; move: ex de,hl ldir ex d ; 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) page ;---------------------------------------------------------------------- ; 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 Address (lo) ; Buffer Address (hi) db 0 ;(ERFLAG) Error Code db 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 $No File$ required$ERASE $ (Y/N)? $ Press RETURN to Continue $ (User 0)$NON-SYSTEM FILE(S) EXIST$: $$$ SUB#-AJS@YuuJuu}ˋː*P̦(d'{AgXJv!)*^#V#^#Vw# ll!J ^#V̀:#!"(COPYRIGHT (C) 1982, DIGITAL RESEARCH 151282/ª(+17ȭ=}ȃȖȠȇɛ Ӹ654321"y2;!":2=2:=;!~;4#.{2!""9"2!;y3]K!Ƨo\b!,_^#V* !"*>o+"v- *!b("": r#~?w#>r# L=J! Lv w,b ?~O ͆=: <>w##~2( 4~?̓-¹:(<üAX2(r K:(w++~=wv 4͗O5:(2(X:(!(v q: v v Mڂ?Ͷ >T͓Â!"(>(Â:(G:(O:(h=2(7ryy/W!(:(lڈ>F6:(_/G:(ʧ:(ڨ|OͤG:(_OzW{|:(*(}|BKN zyGLOADER 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:'%  )!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:͟  ͟ :#+#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 > >d, want to make another? $ Don't Forget CPM3(F).SYS is required on the Boot Disk $ I like wizards and lizards, give me a cookie $ *=> Error$ Requires CP/M Plus $ No File by that name $ No Directory Space $ No Disk Space $ Drive Does Not have Boot $ Can't copy system from foreign drive $ Incompatible System $ File is too Small $ Disk Select Error $$ Unrecognized Error $ $\2 File is too Small $ Disk Select Error $$ Unrecognized Error $ $\654321"y2;!":2=2:=;!~;4#.{2!""9"2!;y3]K!Ʈo\b!,_^#V* X X X S 1-! j 1".~2.~2 :Xck*kͮ  b < .~=>$.w.6#w.6#w.61.~  .~~w@.p T~º>+~.~~! yͮ Ë.~~w2g !PROF͍*#}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$$$BAKR: Morrow Designs Co-Pilot system - Rev 3.16 (MD-16) R: Module - TUTORIAL.PIL R: Copyright 1984 Morrow Inc. R: All Rights Reserved R: Written 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: {7 TYPE}- Display a file on the screen T:uld 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: pressing RETURN. These commands bear some reseine 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 "logical" association that you should use T: in a logic {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. Anytime T: you change diskettes in a drive, you shomblance 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; sends the command to CP/M. T:{CONTROL-K}- Erases the lal 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 any key to continue) A: *US{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=##] option to it (see DIR). T: TNR: Type R to reviewT:{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 using DIRSYS are the same as those for DIR. LF: 2ERPAGE2 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 to continue: HOLD: *USER *USERPAGE3 CLRS: T: 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: (Type any key to continue) A: *DIRPAGE2 CLRS:  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:*BEGIN *ERA R: description of the ERA commandr 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 or anything else to continue: HOLD: *ERA J:*BEGItes. 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 drives. T: {SHOW A:} - Statistics for drive A: 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 number 0 if no number appears in front of the letteN *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, and you can't rename files on write-protected disket 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: {TYPE FILENAME [NO PAGE]} T: T: When you do thise 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: working with multiple files.) cs, 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-only, you can't copy files onto it, T: erase file, 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 to keep in T: mind is that the "destination" fil 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 establishes a variety of your file's characteristi s 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 passwords:} Unfortunately, it's impossible to give a T 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 anything else to continue: HOLD: *SETPAGE3 CLRSwith 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 else to proceed: HOLD: *BEGIN EXIST: HELP.COM : 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 either of these attributes. Directory files can only be: 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 are covered in your CP/M User's Guide. The command  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 1: ld a,(hl) ;Loop cp 0FFh ; If (Character eq End_Of_Table) jr z,LuSk2 ; Goto No Character Exit cp c ; If (Character Matches Table) jr z,LuSk1 ; Goto Match Exit inc hl ; Table_Pointer:= Table_Pointer+1 inc b ; Offset:= Offset = 2 inc b jr LuLp1 ;Character has been Found LuSk1: ld c,b ld b,0 ;BC:= Offset ld a,0FFh ;A:= Returned Status is Found ret ;Return ;Character has NOT been Found LuSk2: xor a ;A:= Returned Status is NOT Found ret ;Return Subttl Banked Bios -- Character I/O (List Device Drivers) page ;---------------------------------------------------------ines ; Non Bank Crossing Routines ; InterBank Utilities ; Interrupt Handling Routines ; Interrupt Handling Routines ; Local Data Area, 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 Subttl Banked Bios -- Include Files, External Declarations and Equates page 60 ;---------------------------------------------------------------------- ; Include Files ;-------------- ; .sall ;Suppress all Macro Expansions .xlist ;Don't List any of the Include Files include HD22DEF.MAC ;General Definitions File include DRIVES.MAC ;Drive Definitions (Dpb, Dph and Mtabs) include DEFINE.MAC ;Drive Type and Organization Definitions .list ;Resume Listing ;---------------------------------------------------------------------- ; External Declarations ;---------------------- ; External @civec ;Console Input Vector Exte------------------------ ; Local Equates (20_Jul_84) ;-------------------------- ; BioRev equ 19h ;Current Bios Revision Clevel equ 1 ;Compatibility Level ; Rom Entry Points Rom equ 0 ;Base of This Table MsgRm equ rom+3 ;Print signon message routine RdHsRm equ rom+9 ;Read disk routine WrHsRm equ rom+0Ch ;Write disk routine BtERm equ rom+18h ;Print boot err routine FmtHst equ rom+26h ;Format single track ; Default Baud Rate Settings Dflt1 equ 0FFh ;Console (9600 jumper OUT; 19200 jumper IN) Dflt2 equ 3 ;List 1200 Baud Dflt3 equ 6 ;Sio 9600 Buad ; Misc Definitions $Auto_Enables equ 00100000b ;Enables Cts and Dcd Status Inputs BootRam equ 0 Tpa equ 100h ;Start of the TPA Media_Offset equ 11 ;offset into dph for media flag PhysOff equ 15 ;offset from spt to psh in dpb Dpb_Length equ 17 DpbOff equ 12 ;offset from spt to dpb in dbh DsktLn equ 25 DskTb equ dskbuf+80h+dsktln ;address of end of table+1 DskTdb equ dskbuf+80h+9 Edv equ 40h ;bad Title MD-HD Bios for CP/M 3.x Copyright 1984 Morrow Designs, Inc. (13_Aug_84) ; ; Copyright (c), 1983, 1984 ; Morrow Designs, Inc. ; 600 McCormick ; San Leandro, Ca. 94577 ; Bill Smith ; .z80 ;This file is assembled using Zilog nmenonics ;---------------------------------------------------------------------- ; Index (19_Jul_84) ;------------------ ; ; Banked Bios: ; Include Files, External Declarations and Equates ; Dat Are (Characte Tables) ; Data Area (Virtual Drive Message) ; Data Area (Local Data Area) ; Data Area (Drive Tables/Dph's and Dpb's) ; Data Area (System RamDatY and Apif) ; Data Area (System Mtab's) ; Data Area (Free Space Pool) ; Cold Boot Routine ; Jump Table Entry Points ; Extended Bios Functions ; Console Input Translation Routines ; Console Output Translation Routines ; Character I/O (List Device Drivers) ; Character I/O (Physical Level) ; ; Resident Bios: ; Banking Considerations and Bios Jump Table ; Jump Table ; Bank Crossing Routrnal @covec ;Console Output Vector External @aivec ;Aux Input Vector External @aovec ;Aux Output Vector External @lovec ;List Output Vector External @bnkbf ;Bank Buffer for Booting External @crdma ;Last Error Current Dma Address External @erdsk ; " " Current Disk External @fx ; " " Bdos Function Number External @usrcd ; " " User Code External @crdsk ;Current Default Disk Drive External @vinfo ;Valid Fcb Address (only if @ReSel = 0FFh) External @resel ;If = 0FFh then VinFo is valid External @mltio ;Current Multi-Sector Count External @ermde ;Error Mode External @media ;If = 0FFh then drive door has been opened External @bflgs ;Error Message Type (bit7=Set=Long Error Msg) External @date ;Number of days since 1_Jan_78 External @hour ;Clock - Hours External @min ; " - Minutes External @sec ; " - Seconds External ?erjmp ;Bdos Error Vector External @mxtpa ;Address of the Top of the Tpa page ;---------------------------------------------- drive from format entry @Primary equ 0 ;Primary Disk Select Flag @Parity equ 7 ;Parity bit Cr equ 0Dh ;Carriage Return Esc equ 1Bh ;Escape Character Leadin equ 1Ch ;Leadin code for function keys Fast equ 9Fh ;Ims Status Response Fast Slow equ 9Dh ; " " " Slow ; SFlag Bit Defintions @PcStat equ 0 ;1=Physical Console Status Active @FunSeq equ 6 ;1=Last key part of function key seq @FunCode equ 7 ;1=Last key was a function key code Subtt Banke Bio -- Dat Are (Characte Tables) page dseg ;Begin the Code Section of Banked Bios ;---------------------------------------------------------------------- ; Boot Entry ;----------- ; 1) This entry has been placed here so that it may be used by external ; programs to size the system when examining the CPM3.SYS file. ; Boot: jp Boot2 ;Jump Past the Data Areas ;---------------------------------------------------------------------- ; Character Table (18_Jul_84) ;---------------------------- ; 1ers ;----------------------------- ; ETblPtr: dw EscTbl ;Pointer to the Escape Character Table CTblPtr: dw CtrlTbl ; " " " Control " " EVctPtr: dw EscVect ; " " " Escape Vector Table CVctPtr: dw CtVect ; " " " Control " " dw DcaStrt ; " " " Start of the Dca Struct ; Direct Cursor Addressing Area ;------------------------------ ; DcaStrt: db Esc,'=',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 Escape 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 Subttl Banked Bios -- Data Area (Virtual Drive Mesdw 13 *2 ;6 9600 dw 13 ;7 19,200 dw 1 ;8 Reserved dw 1 ;9 Reserved dw 1 ;10 Reserved Subttl Banked Bios -- Data Area (Drive Tables/Dph's and Dpb's) page ;---------------------------------------------------------------------- ; Drive Tables and System DPH's (9_Jul_84) ;----------------------------------------- ; drive_table: table_gen dph ds (16-drives)*2,0 dpbase: struct_gen dph dphlen equ dphb-dpha dph_struct_len equ $-drive_table ;---------------------------------------------------------------------- ; System DPB's ;------------- ; table defines logical to physical mapping of dpb's. ; structure is same as drive_table, all dph point at same dpb_buf ; in common. dpb_table: table_gen dpb dw 0 ;terminator struct_gen dpb 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 Area (System RamDat) These tables are provided for external programs ; 2) This section MUST follow the boot jump above ; Char_Tables: ; Default Serial Baud Rates ;-------------------------- ; Ser1Baud: db Dflt1 Ser2Baud: db Dflt2 Ser3Baud: db Dflt3 ; Misc Data ;---------- ; If Auto ;If (Auto Load is Enabled) Default_CFlag: db 11100011b ; Ims On,Translate-On,Cent-List Else ;Else Default_CFlag: db 00100011b ; Translations On,Centronics List EndIf VNumb: db Drives ;Number of physical drives TLev: db 4 ;Terminal level (default = MT60/MT70) Con_Stat_3: db 11000001b ;Console Format 8 bits, Rx_Enabled Lst_Stat_3: db 11000001b ;List Format 8 bits, Rx_Enabled Aux_Stat_3: db 11000001b ;Aux Format 8 bits, Rx_Enabled db BioRev ;Bios Revision Number db CLevel ;Compatibility Level dw APIF ;Pointer to Application Interface Area dw RamDatY ;Pointer to RamDatY dw Mtab ;Pointer to the base of the first MTAB dw Pool ;Pointer to free space page ; Console Translation Pointsage) page ;---------------------------------------------------------------------- ; Virtual Drive Messages ;----------------------- ; 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 -- Data Area (Local Data Area) page ;---------------------------------------------------------------------- ; Other Local Data Definitions (10_Jul_84) ;----------------------------------------- ; Before_After: db 2 ;Default = pre-reads on Sector_Length: dw 0 ;Initialized by seldsk Dma_Bank: db 0 ;Current Dma Bank SCount: db 0 ;Counter used in Get_Character SFlag: db 0 ;Status flag in Character Input Routines Ims_Length: db 0 ;Storage Used in Bank Inject Ims LstFlg: db 0FFh ;X-On X-Off (initial value = 0FF) BaudTbl: dw 1136 *2 ;0 110 dw 417 *2 ;1 300 dw 208 *2 ;2 600 dw 104 *2 ;3 1200 dw 52 *2 ;4 2400 dw 26 *2 ;5 4800  Y and 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) 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 (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 (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 Area (System Mtab's) page ;---------------------------------------------------------------------- ; System Mtabs ;------------- ; Mtab: struct_gen mt Subttl Banked Bios -- Data Area (Free Space Pool) page ;---------------------------------------------------------------------- ; Free Space Pool (27_Jun_84) ;---------------------------- ; Pool: ;beginning of managed space ; Disk Translation Table ;----------------------- ; XlTab: db 0 ;Standard Disk Tranlation Table Header dw 5 ; " " " " Length XlT1k: db 1,4,2,5,3 ; Console Translation Table ;--------------------------- ; db 0FEh ;Console Translation Table Header dw CLen ;e HDL String db 'HDL',Cr ; Startup with HDL Else ;Else dw 0 ; Ims Length:= 0 (No Ims) EndIf ; Function Key Translation Header ;-------------------------------- ; db 0FCh ;Function Table Header dw function_table_length ; " " 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,5,'HELP',Cr db 6Fh,5,'HELP',Cr db 0Fh,5,'HELP',Cr ;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 -- Cold Boot Routine page ;---------------------------------------------------------------------- ; Cold Boot Routine (18_Jul_84) ;------------------------------ ;  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 page ;---------------------------------------------------------------------- ; Default Application Interface area (13_Oct_83) ;----------------------------------------------- ; APIF: db 0 ;(HSTDSK) 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 ; " " " Length EscTbl: db 0FFh ;Escape Table (Null) CtrlTbl:db 0FFh ;Control Table (Null) EscVect:dw 0 ;Escape Vector Table (Null) CtVect: dw 0 ;Control Vector Table (Null) ; translation strings for the terminal go here CLen equ $-esctbl ;Define the Length of the Console Xlt ; Free Space Pointer ;------------------- ; db 0FFh ;Free Space Header dw 870 ; " " Length ; Sign On Message and Free Space Storage Allocation Definitions ;-------------------------------------------------------------- ; 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 Sol equ $ - Sign_On_Start ds (470 - Sol), 0 ; Ims Buffer Header ;------------------ ; db 0FDh ;Ims Buffer Header If Auto ;If (Auto Command Load is Enabled) dw 4 ; Save Space for th  Boot2: ;enter here from loader, rom is on, system bank is on call Init_Uarts ;Initialize the Uarts 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 Subttl Banked Bios -- Jump Table Entry Points page ;---------------------------------------------------------------------- ; Warm Boot Routine (10_Aug_84) ;------------------------------ ; Banked_WBoot: ld c,Esc ;ConOut:= Escape call conout ld c,'(' ;ConOut:= Open Paren. call conout ;[Brightnes;destination tpa call xmove ld hl,0 ;destination lo-mem ld de,lo_mem_copy ld bc,lo_mem_length call move jp WBoot_Return ;transfer control thru common ;Error has ocurred BwSk2: 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 ;---------------------------------------------------------------------- ; Home the Disk Heads ;-------------------- ; Home: ld bc,0 ;track 0 ld (RamDatY+hsttrk),bc ;set track in RamDatY ret page ;---------------------------------------------------------------------- ; Select a Disk (13_Jul_84) ;-------------------------- ; 1) Register Usage ; C -> enter equal to number of drive to select ; HL -> exit equal to dph, or equal to 0 If Bad Drive ; SelDsk: ld a,Drives-1 ;If (Drive is Non-Existant) cp c jp c,BDrv ; Goto Bad Drive Return ld a,c ;new drive ld (RamDatY+HstDsk),a ;set drive as current ld (RamDatY+SekDsk),a ;set drive as current 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 to s.s. dpb from ram pop hl ;restore ram mtab jr setsgl ;now we know that the media really is native morrow format dskdpb: 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 ;enter with z=1 if disk contains dpb to copy, pointed to by [DE] ;also, [HL] -> current MTAB skpset: push hl ;save current MTAB (in common) push af ;save z-boolean for ldir below push de s Now ReSet to HIGH] ld hl,RamDatY+CFlag res @FstSlw,(hl) ;Set Console Mode to Slow set @ImsAct,(hl) ;Set Ims to Active 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 (Dma_Bank),a ;moves to tpa bank ld hl,tpa ld (RamDatY+dmaadr),hl ;transfer to tpa ld b,4 ;4k to move ld iy,RamDatY BwLp1: push bc ;save sector count call read ;read a sector to dma jr nz,BwSk2 ;if no error, ld (RamDatY+dmaadr),hl ;dma ++ inc (iy+hstsec) ;sector ++, no track moves pop bc djnz BwLp1 ld hl,(@mxtpa) ld (lo_mem_copy+6),hl ;set bdos address ld bc,100h  ld hl,RamDatY ;pointer to RamDatY push de ;save primary/secondsry select call GDskHL ;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 call 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 ; Check ID info for correctness (checksum) dskchk: 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, ;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 pointer 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 ; 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 notab: 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-------------- ; Set the HL equal to HL indexed by the Accm ;------------------------------------------- ; get_indexed: add a,a ;*2 add a,l ld l,a jr nc,GiSk1 inc h ;HL:= HL + (2 * A) GiSk1: ld a,(hl) ;dph lo inc hl ld h,(hl) ld l,a ;[hl] -> dph ret ;------------------------------------------------------------------ ; Read the Boot Sector ;--------------------- ; 1) read boot sector of currently selected disk ; getab: ld hl,0 ld (RamDatY+hsttrk),hl ;set track 0 inc hl ld (RamDatY+hstsec),hl ;set sector 1 ld hl,RamDatY+opflag res @inmap,(hl) res @bufok,(hl) jp read2 ;read without move ;---------------------------------------------------------------------- ; Set the Current Track ;---------------------- ; SetTrk: ld (RamDatY+hsttrk),bc ;set track in RamDatY ret ;---------------------------------------------------------------------- ; Set the Current Sector ;----------------------- ; SetSec: ld (RamDatY+hstsec),bc ;set sector in RamDatY r----------------- ; Write a Sector (13_Jul_84) ;--------------------------- ; Write: ld a,(RamDatY+SekDsk) ld (RamDatY+HstDsk),a ;Insure that HstDsk is Valid ld hl,RamDatY+OpFlag ;HL:= Pointer to RamDatY ld a,(Before_After) ;check read before enabled 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 ;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,WrSk2 ;if write protected, say so ld a,1 ;error is permanent WrSk2: or a ;set flags = error ret r_a_w_check: ;no apparent error, ld a,(Before_After) ;check user enabled read-after-write bit 0,a ld a,0 ;if not enabled, no error re 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 ;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 page ;--------------------------------------------------------et ;---------------------------------------------------------------------- ; Set the Dma Address ;-------------------- ; SetDma: ld (RamDatY+dmaadr),bc ;set dma address in RamDatY ret page ;---------------------------------------------------------------------- ; Read a Sector (13_Jul_84) ;-------------------------- ; Read: ld a,(RamDatY+SekDsk) ld (RamDatY+HstDsk),a ;Insure that HstDsk is Valid 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 call Rom_Off ;turn the Rom Off (AF preserved) pop iy pop ix ld d,a ;[d]=physical error ret z ;if error, ld a,1 ; say so ret ;endif page ;----------------------------------------------------- t 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 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 call Rom_Off ;turn the Rom Off pop iy pop ix ret ;---------------------------------------------------------------------- ; Read/Write Move Routine ;------------------------ ; 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 ;itor Read/Write ;--------------------------- ; Multio: ret ;multi-sector count NOT implemented ;---------------------------------------------------------------------- ; Flush the Disk Buffers ;----------------------- ; Flush: xor a ;no error ret ;not needed ;---------------------------------------------------------------------- ; Set the Current Bank ;--------------------- ; SetBnk: ld (Dma_Bank),a ret ;---------------------------------------------------------------------- ; Setup for an Inter-Bank Move ;----------------------------- ; 1) build memory mask modifying $xfer, $bank2, $_rmenb. ; 2) result is always non-zero ; XMove: ld a,c ;source bank cp b ;same as dest? ld b,$_RMENB ;presume no xfer, rom off jr z,XmSk1 ld b,$XFER or $_RMENB ;set xfer, rom off XmSk1: 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 x Subttl Banked Bios -- Extended Bios Functions page ;---------------------------------------------------------------------- ; Bank Inter-Bank Execution ;-------------------------- ; 1) This is a continuation of inter_bank located in the Resident ; part of the bios. ; ; Begin Execution of a Bank Crossing Routine ;------------------------------------------- ; Bnk_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 ;Return from Executing a Bank Crossing Routine ;--------------------------------------------- ; Bnk_Return: ;prepare to exit system bank ex (sp),hl ;get saved bank bits in [h] push af ;preserve returned value ld a,h di ;DisAble Irq while bits ld (System_Baf write, ex de,hl ; reverse direction of transfer ld bc,0001h ; reverse banks too rwmov0: ld a,(bnkmsk) push af ld a,(Dma_Bank) ;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 ;---------------------------------------------------------------------- ; Sector Translation ;------------------- ; 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 page ;---------------------------------------------------------------------- ; Return the Address of the System Drive Tables ;---------------------------------------------- ; DrvTbl: ld hl,Drive_Table ret ;---------------------------------------------------------------------- ; Multiple Secmove ret page ;---------------------------------------------------------------------- ; Turn the Rom On/Off (13_Aug_84) ;-------------------------------- ; 1) 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. ; ; Turn the Rom ON ;---------------- ; Rom_On: di push af ld a,(RamDatY+CFlag) ld (Save_Ims_Status),a ;Save the Current Value of CFlag res @ImsAct,a ld (RamDatY+CFlag),a ;DeActivate Ims Buffering ld a,(System_Bank_Bits) and not $_RmEnb ;rom on jr RofSkp ; Turn the Rom OFF ;----------------- ; Rom_Off: di push af ld a,(Save_Ims_Status) ld (RamDatY+CFlag),a ;Restore the Previous Value of CFlag ld a,(System_Bank_Bits) or $_RmEnb ;rom off ; Rom On/Off Common Code ;----------------------- ; RofSkp: ld (System_Bank_Bits),a ;update out (BnkStb),a pop af ei ret  nk_Bits),a ;don't reflect system state jp Res_Bnk_Return ;continue above page ;---------------------------------------------------------------------- ; Extended Bios Functions (18_Jul_84) ;------------------------------------ ; 1) entry parameters ; bc = function number, 0 -> n (b=0) ; de,ix = parameters if needed ; hl_entry and bc_entry are also available ; 2) exit parameters vary ; Bnk_Services: 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 ;Read from System Memory dw func1 ;Write to System Memory dw func2 ;Copy RamDatY and Apif to Tpa dw func3 ;Copy System Mtabs to Tpa dw func4 ;Copy DrvTbl and Dph's to Tpa dw func5 ;Copy Dpb_Table and Dpb's to Tpa dw func6 ;Copy Character Table to Tpa dw func7 ;Copy Virtual Drive Message to Tpa dw func8 ;Copys Free Space to Tpa dw Bnk_Form; Tpa_Move: push bc ld bc,100h ;dest = tpa ;Common Code for Sys_Move and Tpa_Move Mskp1: call xmove ;Set the Source and Destination Banks pop bc ;(Restore the Entry Value of BC) push bc ;(Save all register pairs) push de push hl ex de,hl ;reverse source & destination for move call move ;Move the Block pop hl pop de pop bc ;(Restore all register pairs) ret ;Return ; OverLay the System's Apif with a User's Apif ;--------------------------------------------- ; 1) Enter with the IX pointing at the Apif in the Tpa ; Install_Apif: push ix pop hl ;Source is the User's Apif ld de,Apif ;DE:= Destination (System Apif) ld bc,AiLeng ;BC:= Length (Length of Apif) call Sys_Move ;Copy User's Apif to the System's ret ; Restore a User's Apif from the System's Apif ;--------------------------------------------- ; 1) Enter with the DE pointing at the User's Apif (in the Tpa Bank) ; Restore_Apif: push af push de ld hl,Apif ;HL:= Source (Systemage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func2: ld hl,RamDatY ;HL:= Pointer to start of RamDatY ld bc,MtOff ;BC:= Length of RamDatY and APIF jr Tpa_Move ;---------------------------------------------------------------------- ; 3 - Copy Mtabs to Tpa (10_Jul_84) ;---------------------------------- ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func3: ld hl,Mtab ;HL:= Pointer to start of Mtabs ld bc,Drives*16 ;BC:= Length (Drives * length of 1 mtab) jr Tpa_Move page ;---------------------------------------------------------------------- ; 4 - Copy DrvTbl and all DPH's to Tpa ;------------------------------------- ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func4: ld hl,Drive_Tableat ;Format a Track dw Init_Uarts ;Initialize the CTC dw Bnk_Inject_Ims ;Inject into the Ims Buffer dw func12 ;EnAble/DisAble Centronics Irq dw func13 ;EnAble/DisAble Read after/before write dw func14 ;Execute in System Bank dw func15 ;Verify Track (With Re:Mapping) dw func16 ;Verify Track (With-out Re:Mapping) dw func17 ;Alter CFlag dw func18 ;Copy System ID Frame to Tpa dw Init_Baud_Rates ;Initialize the Uart's Baud Rates dw Read_Host ;Read a Physical Sector dw Write_Host ;Write a Physical Sector Max_Func equ ($-Function_Table)/2 page ;---------------------------------------------------------------------- ; System/Tpa Move Routines (12_Jul_84) ;------------------------------------- ; ; Move a Block from the Tpa Bank to the System Bank ;-------------------------------------------------- ; Sys_Move: push bc ld bc,1 ;dest = system jr Mskp1 ; Move a Block from the System Bank to the Tpa Bank ;-------------------------------------------------- 's Apif) ld bc,Aileng ;BC:= Length (Length of Apif) call Tpa_Move ;Copy System's Apif to the User's pop ix ;Restore (User's pointer to Apif) pop af ret page ;---------------------------------------------------------------------- ; 0 - Read from System Memory ;---------------------------- ; 1) Register Usage: ; BC -> Length in bytes ; DE -> Destination in Tpa ; HL -> Source in System bank ; func0: ld hl,(HL_Entry) ;HL:= User Source ld bc,(BC_Entry) ;DE:= User Length jr Tpa_Move ;---------------------------------------------------------------------- ; 1 - Write to System Memory ;--------------------------- ; 1) Register Usage ; BC -> Length in bytes ; DE -> Destination in System bank ; HL -> Source in Tpa ; func1: ld hl,(HL_Entry) ;HL:= User Source ld bc,(BC_Entry) ;BC:= User Length jr Sys_Move ;---------------------------------------------------------------------- ; 2 - Copy RamDatY and Apif to Tpa ;--------------------------------- ; 1) Register Us  ld bc,32 + (Drives * DphLen) jr Tpa_Move ;---------------------------------------------------------------------- ; 5 - Copy Dpb_Table and all DPB's to Tpa ;---------------------------------------- ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func5: ld hl,Dpb_Table ld bc,Dpb_Table_Leng jr Tpa_Move ;---------------------------------------------------------------------- ; 6 - Copy the Character Table to Tpa ;------------------------------------ ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func6: ld hl,Char_Tables ld bc,Char_Table_Length jr Tpa_Move ;---------------------------------------------------------------------- ; 7 - Copy Virtual Drive Message to Tpa ;-------------------------------------- ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ;  with User's ld a,(iy+HstDsk) ;apif.drive from user ld (iy+SekDsk),a call GDskIY ;get its mtab bit @HrdDsk,(hl) ;see if harddsk pop de ;restore user's mtab jr z,BfSk1 ;If (This is a hard disk) ld e,1 ; secondary select ld c,(iy+HstDsk) call SelDsk ; secondary select jr BfSk2 BfSk1: push de ;Else DE:= Pointer to new MTAB (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 BfSk2: ld l,(iy+HstSec) ld h,(iy+HstSec+1) ;HL:= Source (Pointer to Gap Table) ld de,FmtBuf ;DE:= Destination (Format Buffer) ld bc,3 ;BC:= Length (3 bytes for gap table) call Sys_Move ;Move Gap Table from Tpa to System add hl,bc ;HL:= Pointer to Start of Sector Table push hl ld a,(RamDatY+HstDsk) call GDskIY ;(HL:= Disk's Mtab DskDef0) bit @HrdDsk,(hl) ;(test for hard disk) ld hl,FmtBuf+3 ;HL:= St,de ret page ;---------------------------------------------------------------------- ; 10 -Initialize the Uart Characteristics (18_Jul_84) ;---------------------------------------------------- ; Init_Uarts: ld a,(system_bank_bits) and not $cntrst ;Restore Centronics out (bnkstb),a ;(exiting this bank lifts restore) ld a,(Default_CFlag) ;defaults from SETUP.COM ld (RamDatY+CFlag),a ;Re:Initialize CFlag ld hl,RamDatY ;HL:= Pointer to RamDatY ;Setup Console Reciever Format ld a,3 out (s1stat),a ;Select Write Register 3 ld a,(Con_Stat_3) out (s1stat),a ;Console Format 8 bits, Rx_Enabled in a,(s1stat) ;Read status register once to clear it ;Setup List Reciever Format/Handshaking ld a,0FFh ld (LstFlg),a ;Enable X-On/X-Off ld a,3 out (s2stat),a ;Select Write Register 3 ld a,(Lst_Stat_3) ;Lst Format 8 bits, Rx_Enabled bit @hwsync,(hl) jr z,IntCt1 ;If (Hardware Handshake eq Enabled) or $Auto_Enables ; Set Auto_Enables Bit IntCt1: out (s2stat),a DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func7: ld hl,VMsg ld bc,VMsg_Length jr Tpa_Move page ;---------------------------------------------------------------------- ; 8 - Copy Free Space to Tpa ;--------------------------- ; 1) Register Usage ; BC -> Returned equal to number of bytes moved ; DE -> Destination in Tpa ; HL -> Returned equal to Source in System bank ; func8: ld hl,Pool ld bc,Pool_Length jr Tpa_Move ;---------------------------------------------------------------------- ; 9 - Format a Track (18_Jul_84) ;------------------------------- ; 2) Register Usage ; DE -> Enter equal old micro decision mtab/dpb pair, as on media ; IX -> Pointer to user's APIF area ; apif.hstdsk = logical drive to format ; apif.hsttrk = track for format ; apif.hstsec -> sector table (in reverse order) ; Bnk_Format: push iy ld iy,RamDatY push ix ;save for exit push de ;save mtab call Install_Apif ;Overlay the System's Apifart hard disk Sector Table ld de,0 ;DE:= Hard Disk Offset to Sector Table jp nz,BfSk3 ;If (This is a Floppy Disk) ld de,12-3 ; DE:= Floppy Offset Sector Table BfSk3: add hl,de ex de,hl ;DE:= Destination (Start Sector Table) pop hl ;HL:= Source (User Sector Table) ld c,(iy+PhySpt) ld b,0 ;BC:= Number of Physical Sectors/Track call Sys_Move ;Install Sector Table call Rom_On ;rom is on, but chario needs to know call FmtHst ;Format the Track pop de ;DE:= Destination (User's Apif) call Rom_Off ;Turn Off the Rom call Restore_Apif ;Update the User's Apif ld d,a ;D:= Returned Status pop iy ret ;Return ; Get a Disk's Mtab ;------------------ ; 1) Enter: A:=Drive and IY:=RamDatY (GDskIY) or HL:=RamDatY (GDskHL) ; 2) Return: HL:= Start of Drive's Mtab ; GDskIY: push iy pop hl ;HL:= IY GDskHL: 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  ;8bits/char, auto, rx on in a,(s2stat) ;Read status register once to clear it ;Setup Aux Reciever Format/Handshaking ld a,3 out (s3stat),a ;Select Write Register 3 ld a,(Aux_Stat_3) ;Aux Format 8 bits, Rx_Enabled bit @SioSyn,(hl) ;If (Hardware Handshaking eq Enabled) jr z,IntCt2 or $Auto_Enables ; Set Auto_Enables Bit IntCt2: out (s3stat),a ;8bits/char, auto, rx on in a,(s3stat) ;Read status register once to clear it call Init_Baud_Rates ;Initialize the Uart's Baud Rates ret ;Return page ;---------------------------------------------------------------------- ; 11 - Bank Ims Injection Routine (9_Jul_84) ;------------------------------------------- ; Bnk_Inject_Ims: ex de,hl ;source is [de] on entry ld bc,1 ;1 byte ld de,Ims_Length ;destination call sys_move ;read length byte ex de,hl ;point at user's string ld bc,1 ;destination is sys for move below call xmove ld a,(hl) ;get length byte from Ims_Length jp inject_ims2 ;[de] -> inp ld hl,Before_After ld d,(hl) ;return what it was before ld (hl),e ret ;---------------------------------------------------------------------- ; 14 - Execute in Bank 1 (sys) at [hl] ;------------------------------------- ; func14: ld iy,RamDatY ld hl,(hl_entry) ld bc,(bc_entry) jp (hl) page ;---------------------------------------------------------------------- ; 15 - verify track, destructive ;------------------------------- ; 1) This routine Verifies one track on the selected disk. ; 2) If an error is encountered then the bad sector is remapped if ; possible. ; func15: ld iy,RamDatY set @BufOk,(iy+OpFlag) jr Verify ;---------------------------------------------------------------------- ; 16 - verify track, non-destructive ;----------------------------------- ; 1) This routine Verifies one track on the selected disk. ; 2) Bad Sectors are reported but nothing is done about them. ; func16: ld iy,RamDatY res @BufOk,(iy+OpFlag) jr Verify ;------------------rSk3: ld a,(iy+hstsec) add a,c ; interleave cp d jr c,VrSk4 dec d sub d ; - sectors per track inc d VrSk4: ld (iy+hstsec),a djnz VrLp1 ;Until (all Sectors have been Checked) ld d,0 ;no errors ret ;normal exit ;------------------------------------------------------------------------- ; 17 - Modify Contents of CFlag ;------------------------------ ; 1) The value of CFlag is set to the entry value of the E register. ; 2) The previous value of CFlag is returned in the D register. ; func17: ld hl,RamDatY+CFlag ld d,(hl) ld (hl),e ret ;---------------------------------------------------------------------- ; 18 - Read the System ID Frame (13_Jul_84) ;------------------------------------------ ; 1) This routine moves the system ID Frame into the Tpa address ; specified by the user. ; 2) The ID Frame has the following format ; 1 Rom Revision number ; 1 Compatibility Level ; 8 Reserved for second source ID Information ; 2 Starting address of checksummeut string in tpa ;---------------------------------------------------------------------- ; 12 - 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. ; func12: 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,F12Sk1 set 7,a F12Sk1: push af ;back on stack jp (hl) ;and exit page ;---------------------------------------------------------------------- ; 13 - Enable/Disable Disk Read After/Before Write ;------------------------------------------------- ; 1) Register Usage: ; E -> Bit Mask ; bit 0 Read after Write 0=Disable, 1=Enable ; bit 1 Read before Write 0=Disable, 1=Enable ; func13:---------------------------------------------------- ; Verify a Track -- Common Code (9_Jul_84) ;----------------------------------------- ; 1) 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 ; 2) Register Usage ; B -> sector_count ; C -> interleave_increment ; D -> sectors_track+1 ; E -> remaps ; Verify: ld bc,0905h ;9 sectors interleaved ld de,0A00h ;10 is illegal sector bit @hrddsk,(iy+phydrv) jr nz,VrSk1 ;if floppy ld b,(iy+PhySpt) ; Number of Sectors to Physical Sectors ld c,01h ; No interleave VrSk1: ld (iy+hstsec),1 ;begin at sector 1 VrLp1: push de ;Repeat push bc res @inmap,(iy+opflag) ; reset @inmap call read2 ; Read a Sector pop bc pop de jr z,VrSk2 ld d,a ; D:= error code; E:= remapped sectors ret ; user abort error VrSk2: bit @inmap,(iy+opflag) ; If (Sector is now in Bad Map) jr z,VrSk3 inc e ; Inc remap count Vd block ; 2 Length of checksummed block ; 1 Ram Checksum ; 1 Rom Checksum ; func18: ld hl,50h ;Starting Location of Rom ID Block ld bc,10h ;Length of Rom ID Block ld a,(system_bank_bits) ;include centronics controls push af and 0FCh ;Enable Rom And Bank 1 or $Xfer ;Set the transfer bit out (BnkStb),a ldir ;Move the Rom ID Block into the Tpa pop af out (BnkStb),a ;Restore the Bank Strobe ret page ;---------------------------------------------------------------------- ; 19 - Initialize the Uart's Baud Rates (18_Jul_84) ;-------------------------------------------------- ; Init_Baud_Rates: ld a,(Ser1Baud) ;A:= Index for Console Baud Rate cp 0FFh ;If (Value is not Specified) jr nz,IntSk1 in a,(DrvSts) ; If (Baud Rate Jumper is IN) and $JBAUD ld a,6 ; (A:= default 9600 baud) jr z,IntSk1 ; Else inc a ; A:= 19200 baud IntSk1: ld (Ser1Baud),a ;A:= Baud Rate Index (Update for Setup) ld b,0BEh ;B:= Select Channel_2 - Mode 3 ld c,baith the ix set to an Apif Structure. ; Read_Host: push iy ld iy,RamDatY push ix call Install_Apif ;Install the User's Apif res @InMap,(iy+OpFlag) ;don't pre-read bad map res @BufOk,(iy+OpFlag) ;errors are not re-mapable set @ReadOp,(iy+DFlag) ;indicate read call Rom_On ;turn rom on call RdHsRm ;read from disk call Rom_Off ;turn the Rom Off (AF preserved) pop de ;DE:= Destination (User's Apif) call Restore_Apif ;Update the User's Apif pop iy ret ;Return ;---------------------------------------------------------------------- ; 21 - Write a Physical Sector (18_Jul_84) ;----------------------------------------- ; 1) Enter with the ix set to an Apif Structure. ; 2) It is up to the User to Set @InMap Properly (Jam it or PreRead). ; Write_Host: push iy ld iy,RamDatY push ix call Install_Apif ;Install the User's Apif set @BufOk,(iy+OpFlag) ;same as pre-read res @ReadOp,(iy+DFlag) ;indicate write call Rom_On ;turn rom on call WrHsRm ;wrnter to CFlag bit @ImsAct,(hl) ;If (Ims InActive) ret z ; Return bit @ImsWet,(hl) ;If (Ims Buffer Has NO Characters) ret z ; Return bit @FstSlw,(hl) ;If (this is Physical Status) ret z ; Return (Physical Status) ld a,0FFh ;Else ret ; Return (Active) ;---------------------------------------------------------------------- ; Get the Physical Console Status (10_Jul_84) ;-------------------------------------------- ; 1) This routine checks the physical console status. If the console ; status port shows that a character is ready then the Flag @PcStat ; (in SFlag) is returned set and the accm is returned equal to 0FFh ; else @PcStat is Cleared and the accm returned equal to 0. ; 2) Register Usage: ; A -> Returned 0=No_Character; 0FFh=Character_Ready ; HL -> Returned Pointing to SFlag ; CPhy: ld hl,SFlag ;HL:= Pointer to Status Flag res @PcStat,(hl) ;Clear Physical Console Status Flag in a,(S1Stat) ;A:= Console input status port and $RcvRdy ;Ifud0 ;C:= Port Select call SetVal ;Initialize the Console Baud Rate (Dart) ld a,(ser2baud) ;A:= Aux Baud Rate Index ld b,07Eh ;B:= Select Channel_1 - Mode 3 ld c,baud1 ;C:= Port Select call SetVal ;Initialize the Aux Baud Rate (Dart) ld a,(ser3baud) ;A:= List Baud Rate Index ld b,03Eh ;B:= Select Channel_0 - Mode 3 ld c,baud2 ;C:= Port Select call SetVal ;Initialize the List Port (Sio) ret ;Set the Baud Rate (A=Baud_Rate_Index B=Channel_Select C=Port_Select) SetVal: push bc ld hl,BaudTbl ;HL:= Base of Bit Rate Table add a,a ld c,a ld b,0 ;BC:= Index * 2 add hl,bc ;HL:= Pointer into Bit Rate Table pop bc ld a,b out (BaudSet),a ;Select the Channel ld a,(hl) out (c),a ;(Set Baud Rate Lo) inc hl ld a,(hl) out (c),a ;(Set Baud Rate Hi) ret ;Return page ;---------------------------------------------------------------------- ; 20 - Read a Physical Sector (18_Jul_84) ;---------------------------------------- ; 1) Enter wite to disk call Rom_Off ;turn the Rom Off pop de ;DE:= Destination (User's Apif) call Restore_Apif ;Update the User's Apif pop iy ret ;Return Subttl Banked Bios -- Console Input Translation Routines page ;---------------------------------------------------------------------- ; Logical Console Input Status (11_Jul_84) ;----------------------------------------- ; 1) This routine returns the Logical Console Input Status. If the ; Ims buffer is Inactive or it is empty then the Physical status ; is returned. If the Ims buffer is active and Has characters then ; the Flag @FstSlw (in CFlag) is tested. If @FstSlw is 0 then the ; physical console status is returned; Otherwise, the logical or ; of the Ims status and Physical status is returned (always = 0FFh). ; 2) Register Usage: ; AF -> Status Returned from CPhy (0=No_Char; 0FFh=Char_Ready) ; HL -> Pointer to CFlag ; Banked_ConSt: call CPhy ;Get the Physical Console Status ld hl,RamDatY + CFlag ;HL:= Poi (Status eq NOT ready) ret z ; Return (Accm:= 0) set @PcStat,(hl) ;Else Set Physical Console Status Flag ld a,0FFh ; Accm:= 0FFh ret ; Return page ;---------------------------------------------------------------------- ; Console Input with Function Key Translation (13_Jul_84) ;-------------------------------------------------------- ; 1) This routine returns the next character. This character can come ; from the Console I/O port, the ims buffer of from a function key. ; 2) If a character is the START of a function key sequence then it is ; thrown away and the next character of the sequence is read. If this ; character is in the function key lookup table then the string ; associated with it is placed in the ims buffer and the first ; character of that string is returned. If it isn't found then it's ; returned with it's parity bit set. ; Banked_ConIn: ld a,(RamDatY+CFlag) bit @Xl_In,a ;If (Console Input Translation eq OFF) jp z,Ser1_Input ; Goto Physinz,Inject_Ims ; Inject String into the Ims Buf jr CiLp1 ;Goto Start of ConIn page ;---------------------------------------------------------------------- ; Pause for Console Input (11_Jul_84) ;------------------------------------ ; PConIn: call GetChr ;Repeat jr z,PConIn ;Until (a Character is Available) ret ;---------------------------------------------------------------------- ; Get a Character from the Console or the Submit Buffer (11_Jul_84) ;------------------------------------------------------------------ ; GetChr: ld hl,SFlag ;HL:= Pointer to SFlag ld e,(hl) ;E:= Contents of SFlag res @PcStat,e ;Clear Physical Console Status Active in a,(S1Stat) and $RcvRdy ;If (There's No Character Ready) ret z ; Return in a,(S1Data) res @Parity,a ;A:= Char from Console without parity push af push hl ld hl,SCount ;HL:= Pointer to Time-out Counter inc (hl) ;If (Time-out Counter eq 0) jr nz,GcSk1 dec (hl) ; Reset Counter to 0FFh GcSk1: ld a,( ; (@ImsAct and @ImsWet) and e ; If (Not a Funct Key Seq) jr nz,GcSk5 ld a,0Ch cp d jr nc,GcSk4 ; If (Time_Out Error) pop af ; (fix Stack) ld a,0 ; Accm:= 0 ret ; Return GcSk4: pop af ; Else Restore Char ret ; Return GcSk5: pop af push af cp Leadin jr z,GcLp1 ;Until (Char ne Function Key Leadin) res @FunSeq,(hl) set @FunCode,(hl) pop af ;Restore Character ret ;Return page ;---------------------------------------------------------------------- ; Inject an IMS String into the Free Space (11_Jul_84) ;----------------------------------------------------- ; 1) This routine injects an Ims String into the free space pool. ; 2) If there was insufficient room then the carry is returned set, else ; its returned cleared. ; 3) If there was already an Ims String in the buffer but it was inactive ; then the last character of the new string will have its parity set ; to turn off the Ims buffer at the end of the new string. ; cal I/O CiLp1: call getchr ;get a character from current source CiLp2: push af ;While (There was a Character) And jr z,No_Char bit @FunSeq,(hl) ; (Start Funct Key Seq) jr z,No_Char pop af call PConIn ; Wait for Next Character jr CiLp2 No_Char:ld a,(RamDatY + CFlag) ;[*=> Re:Enter Here from Submt <=*] and 11000000b ;(remove all but @ImsAct and @ImsWet) cp 11000000b ;If (Ims eq Active AND Ims Buffer Active) jp z,Submt ; Goto Submit pop af ;If (there was really NO Character) jr z,CiLp1 ; Goto Start of ConIn bit @FunCode,(hl) ;If (Not 2nd Char of Funct Key Seq) ret z ; Return push af ld a,0FCh call Find ;Find the Function Key Struct inc hl ;HL:= Start of Function Key Struct pop af call Scan ;Look for the Function Key set @Parity,a ;If (Key NOT Found) ret c ; Return (Char has Parity Set) ld a,(hl) ;A:= Length Funct Key Tranlation String or a ;If (String Length ne 0) ex de,hl ; (DE:= Pointer to String Length) call hl) ld d,a ;D:= Current Time-Out Counter Value pop hl ;(restore HL pointing to SFlag) bit @FunCode,(hl) ;If (Last Char ne Funct Key Code) And res @FunCode,(hl) ; (Clear Funct Key Code Flag) jr nz,GcLp1 bit @FunSeq,(hl) ; (Last Char part of Funct Key Seq) jr z,GcLp1 set @FunCode,(hl) ; Set Funct Key Code Flag res @FunSeq,(hl) ; Clear Funct Key Sequence Flag cp 0Dh ; If (No Time-Out Error) jr nc,GcSk2 ; Skip Leadin Check GcLp1: pop af ;Repeat push af cp Leadin ; If (Char eq Funct Key Leadin Char) jr nz,GcSk2 set @FunSeq,(hl) ; Set Funct Key Seq Flag res @FunCode,(hl) ; Clear Funct Key Code Flag GcSk2: ld a,1 out (S1Stat),a ; Select Register 1 of Sio/Dart in a,(S1Stat) ; Read Register 1 of Sio/Dart and 00100000b ; If (there was NO OverRun Error) jr nz,GcSk3 pop af ; Restore the Accm ret ; Return GcSk3: xor a ld (SCount),a ; Clear SCount ld a,00110000b out (S1Stat),a ; Clear the OverRun Error ld a,1100000b4) Both the @ImsAct (Ims Active) and @ImsWet (Ims Buffer has Chars) ; flags are returned set if the Ims String was successfully installed. ; 5) Register Usage ; BC -> Used in Length Calculations ; DE -> On Entry Points to an Ims string with length byte first ; HL -> Used as general purpose pointer ; Inject_Ims: ld a,(de) ;get length byte Inject_Ims2: ld c,a ld b,0 ;BC:= Length of Ims String inc de ;DE:= Start of Ims String push de ;Find the Free Space Length ld a,0FFh ;A:= Free Space Block Header call find ;Find the Free Space Block push hl ld h,d ld l,e ;HL:= Free Space Length ;See If there's enough space for the new Ims String or a ;(clear carry) sbc hl,bc ;If (there's insufficient Free Space) jr nc,IiSk1 pop de ; (remove Free Space Length) pop de ; (remove Pointer to Ims Start) ret ; Return (Carry = Set) ;Update the Free Space Length IiSk1: ex de,hl ;DE:= New Free Space Length ex (sp),hl ;HL:= Free Space Address (ny) ;Deal with an Ims Buffer that has chars and is inactive ld hl,RamDatY + CFlag bit @ImsWet,(hl) jr z,IiSk2 ;If ((Ims Buffer Already has Chars) And bi @ImsAct,(hl jr nz,IiSk2 ; (Ims Buffer eq InActive)) dec de ; DE:= Last Char of New String ld a,(de) set @Parity,a ; Set Flag to turn-off Ims after ld (de),a ; processing this new Ims string IiSk2: set @ImsWet,(hl) ;Set the Ims Buffer has Char Flag set @ImsAct,(hl) ;Set the Ims Active Flag xor a ;(clear the carry) ret ;Return page ;---------------------------------------------------------------------- ; Search for a Function key (10_Jul_84) ;-------------------------------------- ; 1) This routine searches any table with the same structure as ; the Function Key Table. ; 2) The Function Key Table Structure starts with one byte giving ; the number of entries. Each entry consists of 1) a function Key ; Code followed by 2) the length of the Function Key Translation ; String followed byng ; routine after updating the Free and Submit String Block pointers. ; 2) If the character is the last in the buffer then the @ImsWet flag ; in CFlag is Cleared. ; 3) If the character has the Parity bit Set (bit 7) then the @ImsAct ; flag in CFlag is Cleared which deactivates the Ims Buffer until ; the next warm boot. ; AF -> Valid Character if Z-Flag is Cleared ; HL -> Pointing at CFlag ; Submt: pop af ;If ((There's a Char in the Accm) And jr z,SuSk2 bit @FunCode,(hl) ; (Last Key wasn't Funct Key Code)) jr nz,SuSk2 cp 3 ; If (Char eq Control C) jr nz,SuSk1 call Drop_Ims ; DeActive Ims ret ; Return SuSk1: ld hl, RamDatY + CFlag ; HL:= Pointer to CFlag bit @FstSlw,(hl) ; If ((Ims ConSt eq Inactive) And jr nz,SuSk2 bit @PcStat,e ; (Physical ConSt eq Active)) jr z,SuSk2 cp 13h ; If (Char eq Control S) ret z ; Return ld a,11h ; Else A:= Control Q ret ; Return SuSk2: ld a,0FFh ;A:= Free Space Header Code callsave old length) ld (hl),d dec hl ld (hl),e ;Update Free Space Length ;Calculate the New Ims Buffer Length and Starting Address inc hl inc hl ;(adj HL to point to free data area) pop de ;DE:= old Free Space Length add hl,de ;(HL:= pointer to Ims Code (FD)) inc hl ;HL:= Pointer to Ims Buffer Length ld e,(hl) ;read ims.len inc hl ld d,(hl) ex de,hl ;HL:= Ims Length (DE:= Pointer to Ims Length) add hl,bc ;(HL:= current ims len + string len) ex de,hl ;HL:= Pointer to Ims Length sbc hl,bc ;HL:= New Ims Starting Address ;Install the New Ims Header (Id code and Length word) ld (hl),d ;write new ims header, ims.len(hi) dec hl ld (hl),e ;Install New Ims Length dec hl ld (hl),0FDh ;Install Ims header ;Move the New Ims String Into Place inc hl inc hl inc hl ;HL:= Destination (Ims Buffer) pop de ;DE:= Source (new Ims String) call move ;copy string, may be from tpa or sys ex de,hl ;DE:= 1st Char of Previous Ims (if a 3) the Fuction Key Translation String. ; 3) If the Key is found then the carry is returned Clear else it is Set ; 4) Register Usage: ; A -> Key to Search for ; B -> used as a Counter ; HL -> Pointer to the Base of the Table ; Scan: ld d,0 ;(set hi-order byte of DE to 0) ld b,(hl) ;B:= Number of Entries inc b ;(Make sure there's a count of .ge. 1) inc hl ;HL:= Start of First Entry jr ScSk1 ScLp1: cp (hl) ;Repeat If (Entry Matches Desired Key) inc hl ; (HL:= string.length) ret z ; Return (carry clear) ld e,(hl) ; E:= Length of Entry inc e ; adjust add hl,de ; HL:= Start of Next Entry ScSk1: djnz ScLp1 ;Until (Whole Table has been Checked) scf ;Set the NOT Found Flag ret ;Return ;---------------------------------------------------------------------- ; Get the Next Character from the Submit Buffer (11_Jul_84) ;---------------------------------------------------------- ; 1) The next character from the Ims buffer is returned to the calli Find ;Find the Free Space Block inc de ld (hl),d dec hl ld (hl),e ;Update the Free Space Pointer add hl,de ;HL:= Pointer to the Ims Buffer inc hl inc hl ld e,(hl) ld (hl),0FDh ;Write the Ims Header Code inc hl ld d,(hl) dec de ;(adjust the Ims Length) ld (hl),e ;Write the New Ims Length Byte (Lo) inc hl ld a,e or d ;(Test for the last char in the Buffer) ld a,(SFlag) ld e,a ;E:= SFlag ld a,(hl) ;A:= Current Character from Buffer ld (hl),d ;Write the New Ims Length Byte (Hi) ld hl,RamDatY + CFlag ;HL:= Pointer to CFlag jr nz,SuSk3 ;If (This was the last char in Buffer) res @ImsWet,(hl) ; Clear Ims Buffer has Char Flag SuSk3: bit @Parity,a ;check parity bit of char. res @Parity,a ;If (we're clear to Continue) ret z ; Return cp Slow-80h ;If (Character eq Slow) jr nz,SuSk4 res @FstSlw,(hl) ; Clear Ims ConSt Flag jr SuSk6 SuSk4: cp Fast-80h ;Else If (Character ne Fast) jr z,SuSk5 res @ImsAct,(hl) ; DeA;---------------------------------------------------------------------- ; Locate a Header in the Free Space Pool ;--------------------------------------- ; 1) This routine searches the free space pool for the header ID ; passed in the accm. ; 2) Register Usage: ; A -> Header ID ; DE -> Returned equal to the Length of the block if Found ; HL -> Returned equal to the start of the block if Found ; Find: ld hl,pool ;HL:= Start of Free Space Pool FiLp1: cp (hl) ;Loop inc hl ld e,(hl) inc hl ; DE:= Length of this block ld d,(hl) ; If (ID matches desired ID) ret z ; Return inc hl add hl,de ; HL:= Pointer to start next block jr FiLp1 Subttl Banked Bios -- Console Output Translation Routines page ;---------------------------------------------------------------------- ; Console Output with escape sequence translation ;------------------------------------------------ ; on entry to xlate, register c contains the character to be output. ; a test is made to see und jp z,ser1_output ; if not, output char ld hl,(cvctptr) ; calculate string location page ; 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 value 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 ; Cursor/Escape_Sequence Translation ;----------------ctivate the Ims Buffer ret ; Return SuSk5: set @FstSlw,(hl) ;Else Set Ims ConSt Flag SuSk6: ld a,e ld (SFlag),a ;Update SFlag xor a ;(Set the Z-Flag) push af ;(fix the Stack) jp No_Char ;Goto Banked_ConIn's No_Char entry page ;---------------------------------------------------------------------- ; DeActivate the Ims Buffer (10_Jul_84) ;-------------------------------------- ; 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 page 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. ; Banked_ConOut: 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 jp c,ser1_output ; if not, then xmit it ld a,Esc ; 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 fo------------------- ; 1) 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 (row and column addresses) will 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 hla ; 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) ; get 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 ;---------------------------------------------------------------------- ; ASCOUT - Output a byte in decimal ascii ;---------------------------------------- ; 1) ascout takes a binary value in c and output its decimal ascii ; equivalent. ; AscOut: push bc ld a,c ld cith a character is offset from its ; table base by 2 * character offset from its table base). ; - There are some number of strings pointed to by the Vectors. ; 2) Register Usage: ; A -> Returned 0=Not_Found; 0FFh=Found ; BC -> Enter w/C = Character to Search for; Exit = Vector Offset ; HL -> Pointer to base of table to search ; Lookup: ld b,0 ;Offset:= 0 LuLp1: ld a,(hl) ;Loop cp 0FFh ; If (Character eq End_Of_Table) jr z,LuSk2 ; Goto No Character Exit cp c ; If (Character Matches Table) jr z,LuSk1 ; Goto Match Exit inc hl ; Table_Pointer:= Table_Pointer+1 inc b ; Offset:= Offset = 2 inc b jr LuLp1 ;Character has been Found LuSk1: ld c,b ld b,0 ;BC:= Offset ld a,0FFh ;A:= Returned Status is Found ret ;Return ;Character has NOT been Found LuSk2: xor a ;A:= Returned Status is NOT Found ret ;Return Subttl Banked Bios -- Character I/O (List Device Drivers) page ;---------------------------------------------------------,(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,Esc ; 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 ; set 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,,'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 page ;---------------------------------------------------------------------- ; Lookup a Character in Escape/Control table (10_Jul_84) ;------------------------------------------------------- ; 1) This routine can search any table with the same structure as ; the ecsape or control tables. ; 2) The structure of these tables is as follows: ; - There is a list of Characters (which is searched by this routine) ; - There is a second list of Vectors (not actually referenced in ; this routine) that is positionally related to the character list ; (i.e. the Vector associated w------------- ; List Device Drivers (20_Aug_84) ;-------------------------------- ; Banked_List: ld a,(RamDatY+CFlag) bit @CenLst,a ;If (Serial Device eq List Device) jr nz,BlLp2 BlLp1: call Banked_ListSt ; Repeat (get serial status) jr z,BlLp1 ; Until (List Device eq Ready) jp Ser2_Output ; do Serial Output BlLp2: call Cent_Status ;Else Repeat (Get Parallel Status) jr z,BlLp2 ; Until (Parallel Device eq Ready) jp Cent_Output ; Do Parallel Output Banked_ListSt: ld a,(RamDatY+CFlag) bit @CenLst,a ;If (List Device eq Centronics) jp nz,Cent_Status ; Goto Centronics List Status bit @hwsync,a ;If (handshake mode eq Xon/Xoff) jr nz,BlSk3 call ser2_input_status ; If (Character is Ready) call nz,ser2_input ; Read the Character and 01111111b ; (Strip the Parity) cp 13h ; if (Char eq xoff) jr nz,BlSk1 ld a,0 ld (lstflg),a ; Flag:= not rdy ret ; Return not rdy BlSk1: cp 11h ; Else If (Char eq Xon) jr nz,BlSk2 ld a,0FFh ;(move character to output to Accm) out (s1data),a ;Output the Character ret ;Return page ;---------------------------------------------------------------------- ; Serial Port 2 - (Default List Device) Drivers (11_Jul_84) ;---------------------------------------------------------- ; Ser2_Input_Status: in a,(S2Stat) and $RcvRdy ;If (Reciever Buffer ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser2_Input: call Ser2_Input_Status ;Repeat jr z,Ser2_Input ;Until (Reciever Buffer eq Ready) in a,(S2Data) ;A:= Input Character ret ;Return Ser2_Output_Status: in a,(S2Stat) and $TxRdy ;If (Transmitter Buffer ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser2_Output: call Ser2_Output_Status ;Repeat jr z,Ser2_Output ;Until (Transmitter Buffer eq Ready) ld a,c ;(move character to output into Accm) out (S2Data),a ;Output the Character ret ;Return page ;------------------------------------- ; Cent_Status: in a,(cstat) and $CntRdy ;If (Centronics Status ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Cent_Output: ld a,c ;get char out (CData),a ;write data di ld a,(system_bank_bits) or $CNTSTB out (bnkstb),a ;strobe on ld b,10 cntdly: djnz cntdly ;delay and not $CNTSTB out (bnkstb),a ;strobe off ei ret Subttl Resident Bios -- Banking Considerations and Bios Jump Table page ;====================================================================== ; Resident Bios - 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) The system_stack save/restore routines shall reside in common. ; 5) The call_bank/restore_bank ro ld (lstflg),a ; Flag:= rdy BlSk2: ld a,(lstflg) ; get status flag or a ; set flags ret z ; if zero, then xoff pending BlSk3: jp ser2_output_status ;Check Output Status Subttl Banked Bios -- Character I/O (Physical Level) page ;---------------------------------------------------------------------- ; Serial Port 1 - (Default Console Device) Drivers (11_Jul_84) ;------------------------------------------------------------ ; Ser1_Input_Status: in a,(S1Stat) and $RcvRdy ;If (Reciever Status ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser1_Input: call Ser1_Input_Status ;Repeat jr z,Ser1_Input ;Until (Input Port is Active) in a,(S1Data) ;A:= Input Character ret Ser1_Output_Status: in a,(S1Stat) and $TxRdy ;If (Transmitter Buffer ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser1_Output: call Ser1_Output_Status ;Repeat jr z,Ser1_Output ;Until (Transmitter Buffer eq Ready) ld a,c ----------------------------------------- ; Serial Port 3 (Default Auxilary Device) Drivers (11_Jul_84) ;------------------------------------------------------------ ; Ser3_Input_Status: in a,(S3Stat) and $RcvRdy ;If (Reciever Buffer ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser3_Input: call Ser3_Input_Status ;Repeat jr z,Ser3_Input ;Until (Reciever Buffer eq Ready) in a,(s3data) ;A:= Input Character ret ;Return Ser3_Output_Status: in a,(S3Stat) and $TxRdy ;If (Transmitter Buffer ne Ready) ret z ; Return 0 ld a,0FFh ;Else ret ; Return 0FFh Ser3_Output: call Ser3_Output_Status ;Repeat jr z,Ser3_Output ;Until (Transmitter Buffer eq Ready) ld a,c ;(move character to output into Accm) out (S3Data),a ;Output the Character ret ;Return page ;---------------------------------------------------------------------- ; Centronics Parallel Device Driver (11_Jul_84) ;--------------------------------------utines 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. ; ;---------------------------------------------------------------------- ; External Declarations ;---------------------- ; Public devtbl Public time Public devini Public userf Public services Public wboot Public const Public conin Public conost Public auxin Public auxist Public auxost Public auxout Public listst Public list Public conout Public selmem ;select memory now, [a]=desired bank, 0 or 1 Public move Subttl Resident Bios -- Jump Table page ;---------------------------------------------------------------------- ; Resident Bios - Jump Table ;--------------------------- ; csegsh ;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 Subttl Resident Bios -- Bank Crossing Routines page ;---------------------------------------------------------------------- ; Bank Crossing Routines (14_Jul_84) ;----------------------------------- ; Services: ;Cold Boot (Access to bios extensions) ld (HL_Entry),hl ;Save Entry Value of HL ld (BC_Entry),bc ;Save Entry Value of DE ld b,0 ld c,a ;BC:= Entry Value of A ld hl,Bnk_Services ;HL:= Vector to Banked Services jr Inter_Bank WBoot: ld hl,Banked_WBoot ;Warm Boot jr Inter_Bank ;(-Does NOT return via Res_Bnk_Return-) WBoot_Return: ;Return from Warm Boot ld hl,(VNumb) ;(get drive & terminal level) ld a,1 call SelMem ;Set Current Bank to Tpa ld (8),hl ;Save drive & terminal l ; 2) The rom is turned on here because any or all of these routines ; may be moved into the rom (although none of them are in there now). ; 3) Note that res_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. ; 4) The last half of Inter_Bank and the first half of Res_Bnk_Return ; are located in the Banked portion of the Bios in the Extended Bios ; Functions Block under the banner 'Bank Inter-Bank Execution'. ; Inter_Bank: ld a,(System_Bank_Bits) ;If (The Rom eq Active) bit 0,a jr nz,IbSk1 jp (hl) ; Goto the Routine via HL IbSk1: and Not ($Bank2 + $_RmEnb) ;Select System Bank and Enable the Rom di ;IRQ Off while system_bank_bits Invalid 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: ;retur ;Begin the Resident Bios Module Code 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 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 fluevel in page 0 jp Tpa ConSt: ld hl,Banked_ConSt ;Console Input Status jr Inter_Bank ConIn: ld hl,Banked_ConIn ;Console Input jr Inter_Bank ConOut: ld hl,Banked_ConOut ;Console Output jr Inter_Bank List: ld hl,Banked_List ;List Output jr Inter_Bank AuxOut: ld hl,ser3_output ;Aux Output jr Inter_Bank AuxIn: ld hl,ser3_input ;Aux Input jr Inter_Bank ListSt: ld hl,Banked_ListSt ;List Status jr Inter_Bank ConOSt: ld hl,ser1_output_status ;Console Output Status jr Inter_Bank AuxISt: ld hl,ser3_input_status ;Aux Input Status jr Inter_Bank AuxOSt: ld hl,ser3_output_status ;Aux Output Status jr Inter_Bank Subttl Resident Bios -- InterBank Control Transfer page ;---------------------------------------------------------------------- ; Control Transfer to and from the System Bank (14_Jul_84) ;--------------------------------------------------------- ; 1) These two routines prvide access to the System Bank and the Rom ; for the Bank Crossing Routines. n 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 -- Non Bank Crossing Routines page ;---------------------------------------------------------------------- ; InterBank Move ;--------------- ; 1) Register Usage ; BC -> Enter = Count Exit = 0 ; DE -> Enter = Source Exit = Source + Count ; HL -> Enter = Destination Exit = Destination + Count ; move: 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 ;---------------------------------------------------------------------- ; Select Memory ;-------------- ; 1) select memory now, [a]=desired bank, 0 or 1 ; selmem: push hl ld hl,system_bank_bits di res 1,(hl) ;presume bank 0 ades 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 -- Local Data Area, Stacks and Interrupt Vectors page ;---------------------------------------------------------------------- ; Local Data Area (19_Jul_84) ;---------------------------- ; 1) 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) Save_Ims_Status: db 0 ;Save Location for CFlag for Rom_On/Off BnkMsk: db 0 ;desired bank bits set in xmove HL_Entry: ds 2,0 BC_Entry: ds 2,0 Dpb_Buffer: ds Dpb_Length,0 ;current dpb must be in common ;---------------------------------------------------------------------- ; Stacks and Interrupt Vectors d a,a ;*2 for bnkstb or (hl) ;switch to bank 1 ld (hl),a ;update pop hl out (bnkstb),a ;set hardware ei ret ;---------------------------------------------------------------------- ; Misc Null Routines ;------------------- ; devtbl: ld hl,0 ;no table time: devini: userf: ld a,-1 ret Subttl Resident Bios -- Interrupt Handling Routines page ;---------------------------------------------------------------------- ; Interrupt Handling Rotuines ;---------------------------- ; 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 r(14_Jul_84) ;----------------------------------------- ; 1) high ram definitions, not much space, be sparse ; 2) note, the interrupt stack is overwritten by the system stack ; (which is small) during warm boot. This is the only time the ; rom uses the system stack. It goes as low as 0FFAAh; But, ; Character interrupts are off by then. ; ; Stack Definitions ;------------------ ; Interrupt_Stack equ 0FFA6h Save_Int_Stack equ 0FFA6h System_Stack equ 0FFD6h Save_User_Stack equ 0FFD6h ;Reserved Space for 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 ŽK*72 v/2 v*7ژK*7[:WvʾK:v¾K*v|KPY͎ڽKDMɯ2WvI*72 vKxK~# ! v~6K2 v*7*7[x  In order to conserve disk space, Quest has not been loaded into this user number. If you want to load Quest into this user number, use the Utility Menu option "Load QUEST Bookkeeper." You can have up to three copies of Quest, for three sets of books. (You can actually have more than three, but they won't be accessible through the menus.) ) Type any key to return to the Main Menu.( $e more than three, but they won't be accessible through theine e,dsdd else ; Hard Disk Definitions ;---------------------- ; cvdsk equ 1 ;first floppy is current virtual, b: define a,CM34 ;Cmi 34 meg hard disk define b,dsdd define c,dsdd define d,dsdd define e,dsdd endif page Ã1Oj$|Ãà à Ã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'GET COM3 !"KP COM#SET COMS$%&'()LIB COM8#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@ process, unless everything stops and you're specifically T: asked to type something.} LF: 2 TNR: Press any key to continue: INMAX: 1 A: R:=============================================== *NEWWORD CLRS: LF:2 T: {INSTALLING NEWWORD} LF: 2 T: Before NewWord can be installed for your system, you must select your T: printer type from the list below. If you are not sure what to choose, T: talk to your dealer. If you have no idea how to respond and no-one is T: around to help, select "2 Draft Printer." T: T: {1} Simple {8} NEC Spinwriter 2000 series T: {2} Draft printer {9} NEC Spinwriter 3500 series T: {3} Typewriter printer {10} NEC Spinwriter 5500 series T: {4} Qume Sprint 11 {11} Okidata Microline 84 (step 2) T: {5} Silver Reed EXP550 {12} Okidata models 92/93 T: {6} Diablo 1610/20/40/50 {13} Epson MX80/100 & FX80/100 T: {7} Diablo 630  J: *SELTERM *9 DEF: $PRINT byinxn J: *SELTERM *10 DEF: $PRINT byknxn J: *SELTERM *11 DEF: $PRINT bylnxn J: *SELTERM *12 DEF: $PRINT bymnxn J: *SELTERM *13 DEF: $PRINT bynnxn J: *SELTERM *14 DEF: $PRINT byonxn J: *SELTERM *15 DEF: $PRINT xn J: *selterm *SELTERM c:a=@9-3 j(a):*lvl4nw c:a=a+1 j(a):*lvl3nw c:a=a+1 j(a):*lvl2nw c:a=a+1 j(a):*lvl1nw C:a=a+1 j(a):*lvl0nw *lvl4nw def: $TERM ayonha'M'i'c'r'o' 'D'e'c'i's'i'o'n' 'L'e'v'e'l' 'I'V' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *lvl3nw def: $TERM ayonha'M'i'c'r'o' 'D'e'c'i's'i'o'n' 'L'e'v'e'l' 'I'I'I' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *lvl2nw def: $TERM aynnha'M'i'c'r'o' 'D'e'c'i's'i'o'n' 'L'e'v'e'l' 'I'I' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *lvl1nw def: $TERM ayrnha'M'i'c'r'o' 'D'e'c'i's'i'o'n' 'L'e'v'e'l' 'I' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *lvl0nw def: $TERM ayknha'M'i'c'r'o' 'D'e'c'i's'i'o'n' 'L'e'v'e'l' '0' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *DRAFT CLRS: LF: 7 T:} With{2}, your printer is going to R: Morrow Designs Micro-Menu system - Rev 3.16 (MD-16) R: hard disk version, including BACKFIELD, SUPERCALC, & dummy QUEST R: Module - MDINST.PIL R: Copyright 1984 Morrow Designs, Inc. R: All Rights Reserved R: Written by John VanderWood R: DI: *SELECT CLRS: LF:2 T: { - I N S T A L L I N G Y O U R P R O G R A M S -} LF: 3 T: "Installing your software" is traditionally a complex and irritating T: process, fraught with dangers for the computer novice. T: T: That is why Morrow has programmed the MD-16 to install your software T: for you. The only decision that you have to make during this phase T: is selecting your printer from a list of popular makes and models. T: T: Some things may whip by on the screen faster than you can read them, T: but don't let this bother you. The screen will "freeze" any crucial T: information and wait for you to press a key before it continues. LF: 2 T: {Don't press any keys on the keyboard during this whole T:  {14} C.Itoh Prowriter T: T: {15 Morrow's MP100/200/300 series} *again CUR:0,20 T: CUR:0,20 TNR:}Please select your printer and press RETURN: { INMAX:3 A: #ptr M: 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , BELLN: JN:*again *again1 CUR: 0,20 TNR: CUR: 0,20 TNR:}You selected printer number{#ptr.} Is that correct? Type{Y}or{N}: INMAX: 1 A: M:Y,N BELLN: JN: *again1 M: N JY: *again CASE (#ptr):*1,*DRAFT,*3,*4,*5,*6,*7,*8,*9,*10,*11,*12,*13,*14,*15 *1 DEF: $PRINT byanxn J: *SELTERM *2 DEF: $PRINT bybnxn J: *SELTERM *3 DEF: $PRINT bycnxn J: *SELTERM *4 DEF: $PRINT bydnxn J: *SELTERM *5 DEF: $PRINT byenxn J: *SELTERM *6 DEF: $PRINT byfnxn J: *SELTERM *7 DEF: $PRINT bygnxn J: *SELTERM *8 DEF: $PRINT byhnxn be installed as a{DRAFT PRINTER.} T: This will be fine for general-purpose printing; however, there may T: be some printing features (like superscripting) that will not work T: unless you reinstall NewWord with the NWINSTAL.COM program. Refer T: to the{Nuts & Bolts}section of the NewWord User's Guide for details T: on reinstalling NewWord for a specific printer. LF:2 TNR: Press any key to continue: { INMAX: 1 A: J: *2 *install CLRS: LF: 11 T:} T:Preparing to install NewWord . . .{ T:Don't press any keys unless I ask you to!} WAIT: CPM:nwinstal;nwu;nw;$TERM$PRINT R: The next lines are the only way I could come up with to branch on a Morrow R: printer selection; it HAS to be the highest numbered item on the list. C:b=(#ptr) - 14 J(b):*MPINST *FLOW CPM:pip;a:[g1]=practice.doc[r];A:[g1]=sample1.doc[r];a:[g1]=sample2.doc[r];; CPM:era practice.doc; era sample1.doc; era sample2.doc; J: *SUPERCALC *MPINST CPM: nwinstal;nw;nw;byenh3a'M'o'r'r'o'w' 'M'P'1'0'0'/'2'0'0'/'3'0 This is possible only if you{BACKUP YOUR HARD DISK FILES ON A REGULAR T: BASIS!} We can't overstress the importance of doing so. The Backfield T: programs are a very convenient way of doing this. So . . . T: T:{ ||||||| /||\ |||||| || || || || ||||||| T: || || // \\ || || // || || || || T: ||||||| |||||||| || |||| || || ||||||| T: || || || || || || \\ || || || T: ||||||| || || |||||| || || \||||/ || T: T: |||||\ /||\ ||| ||| || || ||| ||| ||| T: || \\ // \\ ||| ||| \\ // ||| ||| ||| T: || || |||||||| ||| ||| \|/ \|/ \|/ \|/ T: || // || || ||| ||| ||| T: |||||/ || || ||| ||||||| ||| ||| ||| ||| LF: 2 TNR: }Press any key when you're sure you've gotten the message: INMAX: ACE IN IT.} *CP1 CUR:0,16 T: ______________________________ CUR:0,16 TNR: Type your name and press RETURN: { INMAX: 30 A: $NAME *CP2 CUR:0, 18 T: }You have entered your name as{$NAME}. TNR: }Is it{exactly}as you want it? Type{Y}or{N}: INMAX: 1 A: M:Y,N JN: *CP2 M:Y JN: *CP1 CLRS: LF: 7 T: Okay. A lot of stuff is going to show up on your screen now, and it T: may appear that you're being asked to enter information, but ignore T: this and just let it keep running. T: C:TERNO=@9-3 DEF(#TERNO): $TER Level 3 DEF(#TERNO): $NUM 5 J(#TERNO): *CPMS C:TERNO=@9-2 DEF(#TERNO): $TER Level 3 DEF(#TERNO): $NUM 5 J(#TERNO): *CPMS C:TERNO=@9-1 DEF(#TERNO): $TER Level 2 DEF(#TERNO): $NUM 2 J(#TERNO): *CPMS DEF: $TER Level 1 DEF: $NUM 1 J:*CPMS *CPMS CPM: era install.dat; pip install.dat=instalh.dat; CPM: WELCOME;$NUM;p;2;;$NAME;y; CLRS: LF: 5 T:} Something you may wish to do later is to run the same "Welco'0' 'S'e'r'i'e's' 'P'r'i'n't'e'r0D0A00.xxxn J: *FLOW *SUPERCALC CLRS: LF: 9 T:{ T:NewWord is now installed for your terminal and printer.} T:Your sample documents have been placed in drawer 1 T:of your NewWord filing cabinet (user number 1). T:{ T:On to SuperCalc . . .} WAIT: *seltermsc c:a=@9-3 j(a):*lvl4sc j:*lvl123sc *lvl4sc CPM: sid install.com;s1b99;1;.;g100;y;oyay;pip A:[g4]=*.cal[r] j:*instsc *lvl123sc CPM: sid install.com;s1b99;1;.;g100;y;f1ay;pip A:[g4]=*.cal[r] j:*instsc *instsc CLRS: LF: 9 T:{ T:SuperCalc is installed!} T:Your sample spreadsheets have been placed in drawer 1 T:of your SuperCalc filing cabinet (user number 4). T:{ T:Next comes Backfield . . .} WAIT: J: *BACKFIELD *backfield CLRS: T:} This operation creates a {Backfield Working Diskette} from a new, T: blank diskette. The working diskette enables you to rebuild your T: hard disk in case of the unlikely, but conceivable catastrophe of T: wiped-out-data. T: T: 1 A: CLRS: LF: 10 T:Please insert the{new, blank}diskette into the drive and close the latch. TNR:Press any key when you're ready: INMAX: 1 A: CPM: format b d; pip; B:=restore.com[r]; B:profile.sub=profbak.sub[r];; CPM: pip; B:=pip.com[r]; B:=setdef.com[r]; B:=format.com[r];; CPM: pip; B:=bf?.com[r]; B:=cpm3f.sys[r];; copysys sysldrf.com B:;n; CPM: pip; B:=copysys.com[r]; B:=sysldr.com[r]; B:=submit.com[r]; B:=suxims.com;; CLRS: LF:9 T:} T:Your Backfield diskette is now ready in case T:you ever need to restore your whole hard disk.{ LF:2 TNR:Press any key to move along to Personal Pearl: INMAX: 1 A: J:*pearl *pearl CLRS: LF:2 T: {INSTALLING PERSONAL PEARL} LF:2 T: The only thing you have to do during this phase is type your name, T: first and last, exactly as you would like it to appear on Personal T: Pearl screens. This is called "personalizing" Pearl. T: T: The name you type can be up to thirty characters, and{THERE MUST BE T: AT LEAST ONE SPme" program T: that you just saw whiz by. It has a{Demonstration}option that gives you T: a tour of Pearl's capabilities, and basic instructions on their use. T: The sample data files for Welcome will be in Personal Pearl Drawer ##1 T: (user number 7). T: T: When running Welcome, you'll be asked to select a terminal from a list. T: Respond{$TER}, or pick your Morrow terminal if appropriate. Avoid T: the "Personalize" option, since we just took care of that. LF: 4 TNR: Press any key when you're ready to continue: INMAX: 1 A: CLRS: LF: 10 T: Okay; Just a few housekeeping chores remain. You don't have to do T: anything from here on. When I'm finished, the "Co-Pilot Main Menu" T: should be on your screen, ready to go to work. WAIT: CLRS: LF:11 T:{ Preparing to install Personal Pearl Reports. T: }This will take several minutes, and there will be some fairly long pauses. WAIT: CPM:pearldr;;calendr;daily;5;2;diary;5;2;history;5; CPM:pearldr;;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, cash;deduct;5;2;expense;5;2;journal;5;2;ledger;5; CPM:pearldr;;people;labels;5;2;phone;5;2;profile;5; CLRS: LF: 11 T:{ T:Preparing to copy Personal Pearl files . . .} CPM: pip; A:[g7]=*.?00[r]; A:[g7]=*.dir[r];; ren startup.pil=init.pil; CPM: ren pearl.tmp=pearl.a00; era *.?00;y; ren pearl.a00=pearl.tmp; CPM: pip; A:kp.com[g10]=kp.txt[r]; A:kp.com[g11]=kp.txt[r]; A:kp.com[g12]=kp.txt[r];; CPM: set *.*[sys]; era hdl1.com; era hdl2.com; era profile.sub; CPM: ren profile.sub=prof3.sub; set *.com [ro]; set *.ovr [ro]; set *.ovl [ro]; CH: micro.pil  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 &w- A4:c5:ª>®>:ʰ>>2d52e5>:2[5ͤ!ͮ!~"!N6 ! t6!q66.!66/:26ɛ0 jmp bdos call$msg: db cr,lf,'**** CALLVERS **** $' curvers db 0 end ual sign, then two ; more characters (row and column addresses) will be accepted, ; after-which a string will be output  ; 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 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 'e'c'i's'i'o'n' 'L'e'v'e'l' '0' 'T'e'r'm'i'n'a'l0d0a00xx j:*install *DRAFT CLRS: LF: 7 T:} With{2}, your printer is goin; 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 ;*************************************************** ;* * ;* 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  W:W++X͔X͛XXͤXKX!hc^#V}*dcw! +"qc*dc"sc*fc"oc!kcZJXͤX!"hc͛XYX*hc#"hc:jc*dc*hcw*hc*fc^#V+ |…X:jc ŽX͔XQXP2jc:jc!9+"yc!"}c!uc͗$Wf.Xr~#foXs#r!>O X)X|W}_ X|}o|gXyx/WTitle Disk Resident Loader for MD-HD Copyright 1984 Morrow Designs, Inc. ; ; Copyright (c), 1983, 1984, ; Morrow Designs, Inc. ; 600 McCormick ; San Leandro, Ca. 94577 .z80 ; This is the Part of the Loader that is resident on the first ; track of a bootable Floppy or Hard Disk. ; ;---------------------------------------------------------------------- ; Include Files ;-------------- ; .sall ;Suppress all Macro Expansions .xlist ;Suppress Listing of Include Files Include HD22DEF.MAC ;General Definitions/Equates File Include DRIVES.MAC ;Drive Definition Include DEFINE.MAC ;Drive Selection .list ;Resume Listing ;---------------------------------------------------------------------- ; Equates ;-------- ; xlt1k equ 0 ;dummy 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 len=4k) ; Rom Jump Table Definitions mes-------------------------------------- ;these are located at boot+80h btab: db 0 db 4 ;double sided system db 0 db 0 db 0 db 0 db 0 db 0 db 0 dw 40 ;Disk Parameter Block db 4 db 15 db 1 dw 194 dw 191 db 0e0h db 0 dw 48 dw 2 db 89h page ;---------------------------------------------------------------------- ; Remainder of the Cold Start Loader ;----------------------------------- ; 1) The rom is on, bank 1 is selected, iy -> ramdaty @ fc00 ; ;Copy Mtab behind RamDatY strsk1: push iy ;calc. mtab position pop hl ld de,mtoff ;offset to mtab position add 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 Bg 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 60 ;---------------------------------------------------------------------- ; 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,strsk1 ;if not compatible, exit ld de,rvmsg call mesg ;"Wrong revision of rom... jp bterr ;"Press Reset...halt rvmsg d cr,lf,'wron revisio o rom.' db ' This version of cp/m requires rom rev. ' db ((revnum and 0f0h) shr 4) + 30h db '.x' db cr,lf,0 ds start+70h-$,0 ;fill, locate mtab at boot+70h ;MD-11 MTAB for floppy or hard disk btab2: MTMA ;DRIVE A: MTAB ;---------------------------------------------------------------------- ; disk format tables for old udecision compatibility ;-------------uffer address:= cpm load base ld b,4 ;4 sectors = 4k rdlop: push bc ;Loop save count call rdhst ; 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 ends: if ends-boot gt 200h error ;code is too long for memory endif .dephase end Direct console input (waits until char ready) InjIMS equ 11 ;Extended Function - Inject IMS String ; Offsets ;-------- ; CclOff equ 10 ;Offset to Clevel from start of char. struct. KeyOff equ 0 ;Key File Offset ImsOff equ 2 ;Ims Sting Offset $ 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 !TpV6? ͜*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/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*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 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: ~,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" $: $ 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 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&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 CF = 00 NDIRRECG = 00 NDIRRECH = 00 NDIRRECI = 00 NDIRRECJ = 00 NDIRRECK = 00 NDIRRECL = 00 NDIRRECM = 00 NDIRRECN = 00 NDIRRECO = 00 NDIRRECP = 00 NDTARECA = 19 NDTARECB = 00 NDTARECC = 00 NDTARECD = 00 NDTARECE = 00 NDTARECF = 00 NDTARECG = 00 NDTARECH = 00 NDTARECI = 00 NDTARECJ = 00 NDTARECK = 00 NDTARECL = 00 NDTARECM = 00 NDTARECN = 00 NDTARECO = 00 NDTARECP = 00 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 {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,7D,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 = 06 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 er to FCB1 ld c,Bdos_Close_File ;C:= Close file function call Bdos_Entry ;Close the command file ;Move the old command line back into place ld hl,(6) ;HL:= Start of the Bdos ld de,OIL_offset ;DE:= Offset to start of Old Input Line or a sbc hl,de ;HL:= Pointer to remainder of Old Input Line ld de,Default_Dma ;DE:= Command line buffer LGlp2: ld a,(hl) ld (de),a ;Move The Line Length into place inc de ;DE:= Pointer 1st char of Dest. inc hl ;HL:= Pointer 1st char of Source or a ;If (line length ne 0) jr z,LGsk1 ld c,a ld b,0 ldir ; Move remainder of line LGsk1: ld a,0 ld (de);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 -> Define.Mac is usually the only file that needs to be changed era boot$1.txt put console output to file boot$1.txt [system] m80 =ldrbios3 m80 =boot3 rmac scb era scb.sym era scb.prn link boot3[NL,NR] link cpmldr[l4000],ldrbios3,scb[NL,NR] sid Define.Mac is usually the only file that needs to be changed era bios$1.txt put console output to file bios$1.txt [system] era cpm3$1.old era cpm3$1.new m80 =bnkbios3 rmac scb era scb.sym era scb.prn link bnkbios3[b]=bnkbios3,scb[NL,NR] ren cpm3$1.old=cpm3$1.sys gencpm auto display ren cpm3$1.new=cpm3.sys ren cpm3$1.sys=cpm3$1.old era bnkbios3.spr era bnkbios3.rel era scb.rel put console to console  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 a*v>z*v#"v!v:v':v#-o:v2v:v2v*v*v~aj*v>zj*v~OG!A MD! MDr*v~OGyw*v~Yʎ*v~Nʎ*v#"v*v6*v;!n!v~#ʼ*v*v>"o>2!v!!!!v͉:!va!!v>z:!vOG!A MD! MD:!vOGy2!v:!vR¼*v0ü!*q!o͉!*v͸ !~$V!o!uü!~#¼!ob!͙ü>2$v2%v*v""v!*"v͸ i`""v!~!͙yʆ!bi`"$v!$v~#ʆ*$v*q!o͉!*v͸ !~$!o!uü!~#¼!ob!͙ü!͡ ü!u:q;:qN!͍ !>E*q*q####"q:qw:q#w:q#w:q#w*v0ü!͡ ü*vwü*v ü!*v͸ i`"&v*&v~ʾ*&v#"&v*&v#*&v͵*&v!uü>2oü>2oü*oC>2o!*v͸ !Fy"2o2oü!ji`"oüͶüͽü!>E*v͵*v i`"v!*v͔*!͢y2oü*vFyʔ>P2q2qü*v1i`"qü*v1i`"(v*(v:(v2(v:)v2)v}ʼ!\͍ ñ!,*v6 ü!^*v6 ü*v#*{*{*{#"{~ *{6*{MDo o!~#fo"{*{~*B *{#"{*q#"q*qMD) )*uͳ?i`"u!*qMD) )*u  }|!~#fo*{jywx#w!~#fo##!~#~#~#~on2+v2,v!q:+v:,v# *+vMD) )*u N#FC*+v#"+v 2q2qon!9ͺ !w#w#w#w*u+7*u!!8*u ~#fo}0x*u+7o!!cix2{2{x2{y2{!{j! i`"-v*-v~*N!*-v͸ !~N!##N#F+++N#F!# Nread.pil o!9!~#fo"{*{!.fy!!*{!~f!"{!u~#$*u45!!!*{Xyw!~W*{!!>E!!~OGK3i`"u*oC*{ji`"o!q"q2q2q2q2q*oC2o2oo: Label not found Missing label o!~#fo"{*{~**{#"{*{~!͍ !>E*u"/v*qMD) )*u :/v:0vI*/vN#F*{͍yd*/v##{Pko*{͍ !͍ !>Eo*/v}o|g"/v  o!~#fo"{!~#fo"{*{~$ž*{#"{*{~(*{#"{*{cii`*{  "1v*1v~)*1v6*{~o*u"3v*q))*u :3v:4v5*3vN*͂G>E!9N#F#^#V#~#fo"okb"oi`"oOGPilot - L. W. Edmondson - Morrow Designs - 1982CASEDIEIEXISTINSTALLOUTCPMCHCALLLOADLFCURCLRSCOMPILEHOLDSAVEWAITESCDEFERASTRBELLRCENDEUJMCMINMAXAPRTNRTnon!>>#͡'y+!>E+͆*!~#fo##N#F4o o!9!~#fo"{*u!!8*u ~#fo}0no!͞#!cii`"q!q:q2{2{:q2{:q2{!{j!^GStack overflow    <  zG ? 9#3!" {p-" v$ : Unrecognized instruction o!9!~#fo"{*{ i`"v*v~*¢*v#N i`"v*v i`"v2v2 v*{"v*v~*v~:*v~(!v~#*v#"v*v~ o*v#"vï*v~)!v~#*v6*v#"v>2v*v"v*v~L*v~:L*v~(L*v~A*v>ZÚ:vas!v>zs:vOG!A MD! MDz:vOGy2v:vY¶:o¶o*v#"v*v~a*v>z*v~2vÐ:vN:oo!v~#*v>o*v"v*v~A*v>Z*v~v͵*vü*v͵!*v͸ !~ʼ!ü!q:qJ :qX !>Eü:q2q:q2q*q~2q#~2q#~2q#~2q!!q##N#F+++N#F*u5ü!*v͸ !o!uü*v#*v͵*v͍ ü*v͵*vüü*v+.*v͍ !@͍ !>Eü o!~#fo"{*{~ < *{~ < *{~ F *{#"{! *{MDo o!~#fo"{*{ i`"{*{> *{~ *{#"{i *{MDo o!~#fo"{*{~ *{~2*v:*v{ ! ͡ !͡ !(͡ × o:*v} ! ͡ !͡ !)͡ × :*v  ! ͡ ! ͡ × :*v^‹ *{ ~^‹ *{ ~OG'"yʋ *{ ~OG'"yʋ *{ ~2*v*{ 6*{ ͡ *{ :*vw*{###"{× :*vOG͡ *{#"{Û n!N#F! o o!~#fo"{!~#fo"{*{ i`"{*{~@ *{~$ *{~* *{~#3 *{*{#"{*{*{#"{~*{~A *{>Z *{~0v *{>9v *{~0 *{>9 *{*{#"{*{*{#"{~E *{~A *{>Z *{~a *{>z *{~_ *{~ *{*{#"{*{*{#"{~ *{~a *{>z *{~0 *{>9 *{~_ *{*{#"#F*{͍yʌ*3v##N#FC*3v##*{jywx#wo*q#"q*q))*uͳ?i`"u*q))*u  "3v*3v*{jywx#w*3v##*{jywx#wo*3v####"3v o!~#fo"{*{~#*{  i`"{*{~o*u"5v*q))*u :5v:6v*5vN#F*{͍yf*5v##!~#~o*q#"q*q))*uͳ?i`"u*q))*u  "5v*5v*{jywx#w*5v##!~#~o*5v####"5v o!~#fo"{*{~$‘*{#"{*{~(*{#"{*{cii`*{  "7v*7v~)*7v6*u"9v*q))*u :9v::v*9vN#F*{͍y*9v##~#foMDo*{MDo*9v####"9v o!~#fo"{*{~#:*{#"{*u"=v*q))*u :=v:>vz*=vN#F*{͍yʀ*=v##~#foMDoo*=v####"=v@ o!~#fo"{!~#fo"{*{~2?v*{~2@v:?vA!?v>Z:?vOG!a MD! MD:?vOGy2?v:@vA !@v>Z :@vOG!a MD! MD:@vOGy2@v!@v:?v9o*{#"{*{#"{æ:?v(o o!~#fo"{*{~t*{> z*{~zoo*{#"{T o!~#fo"{!~#fo"{*{~«o*{~*{"Av*{"Cv*Av~oo*Av#"Av*Cv#"Cvÿ*Av~2Ev*Cv~2Fv:EvA!Ev>Zn!N#F +y!N#F5e$!>Eoa:pilotn!N#FFyLo!-!N#Fcii`!~#fo "]v!:]v:^v#ڦ*]v~;ʦ*]v~|ʦ:]v2]v:^v2^vq*]v#!:]v:^v#o*]v:]v2]v:^v2^v6qA:$$$.SUBA:$$$.SUBn!z9:_v,!!!CVy2_v:_v,!!!>E!z!N#Fciyw!!N#F!{f!!z:_vOGOo-+= o!9!~#fo"{!*{͸ i`"{!6+2`v2av!*{͸ i`"{!~*`v!͙o!u!eyª!s!ey!6+ê!q!ey"!6-ê!͙yA!bi`"bvÎ!~$a!sbi`"bvÎ!~@€!b 2bv2cvÎ!i`"bv!~+¨*`v*bv "`vê!bv:`v2`v:av#2avên*u"dv*q))*u :dv:ev*dvN#FC*dv##N#FC*dv####"dv2q2qo o!~#fo"{*{1y2fv*{~A*{~,A*{#"{&*{~P*{#"{*{1y2gv!͡ !=͡ :fv 2fv:gv 2gv:gvOG͡ :fvOG͡ o o!~#fo"{*{y2iv*{~*{~,*{#"{ñ*{~*{#"{*{y2hv:ivOG:hvOG͖io!{y !x#v *tv*tv#"tv6v o*rv##"rv o!9!~#fo"{!~#fo"{!!-!*{!/!!~f! 9!"{*{ͫ!*{ͫ!*{Fyʛ!*{Fo*{*{̈́on!~#fo"vv!~#fo"xv*vv~!*vv~ !*vv#~ !*vv#"vv!*xv6o*xv*xv#"xv*vv*vv#"vv~!0123456789abcdefABCDEFn!"!N#Ffo o!~#fo"{!>#\"o*{"zv!~w#~w!~#ʔ"*zv~ʡ"*zv~,ʡ"*zv#"zvy"!~#"o*zv~ʔ"*zv#"zv!~w#~wo"*{~"*{~,"*{6"*zv0o*{#"{"n!~A#~ #!>Z>#:#!~a#~)#!>z>#:#!~-7##~@#C#on!~A#~e#!>Z>##!~a#~#!>z>##!~_##~˜#Û#o o!~#fo"{*{~#*{~w*{~#*{6#o*{#"{ì# o!~#fo"{*{~$*{~ $*{~ $$o*{#"{#*{6$ >- + : . ^ * # $A:XSTATEX.PILwriteA:XSTATEX.PILn!ͫ1i`"v!ͫ1!Q$!W$k2i`"v!v~#«$*vͫ1!C$!o*u"|v*q))*u :|v:}v%*v!A$E:*v*|vN#FE:*v!?$E:*v*|v##N#F:EvOG!a MD! MD :EvOGy2Ev:FvAK!Fv>ZK:FvOG!a MD! MDR:FvOGy2Fv!Fv:Ev*{#"{ën!!N#FciBywx#w!!N#F!N#F~f!~#foMDo o!9!~#fo"{*{"Gv*Gv~*Gv~$*Gv~#*Gv~`*Gv~o*Gv#"Gv!"Gv*{"Iv2Kv2Lv*Iv~=*Gv6!!*{~fo*Iv~$i*Iv#~$•*Gv*Gv#"Gv6$*Iv##"Iv*Iv~#*Iv#~#*Gv*Gv#"Gv6#*Iv##"Iv!*Iv͸ i`"Iv!!s*Gv~fi`"Gv*Iv~`,*Iv#~`Z*Gv*Gv#"Gv6`*Iv##"Iv!*Iv͸ i`"Iv!!*Gv~fi`"Gv*Iv~.z*Iv"Kv*Gv*Gv#"Gv*Iv*Iv#"Iv~!Kv~#i*Kv"Gv*Iv#"Iv2Kv2Lv*Gv*Gv#"Gv*Iv*Iv#"Iv~ o!~#fo"{*{~µo*{~*{~0*{>9o*{#"{õon!!N#F!Mv/gi`Mv 6!MvMDo: can't access n!N#F͍ !͍ on!uywx#w!~#fo#~#ʌ!~#fo#N#F!N#F͍yʒ!~#fo~OGoo!~w#~wNn!U9!U!N#F͆.!y! !!U! yw!~!>o o!~#fo"{!!jv*{ci*{Dc*jvMDo o!9!~#fo"{!*{͸ !"{*{~0v*{>9v*{bo*{oTIMEOUT o!~#fo"{!~#fo"{!~#>2nv!!#~~+~ !>2{2{>2{>2{!{m>2nv*{"lv"y-:nv!~###M*{!*{fo>2nvy2ov:ovq*{"lv͍!>2{2{>2{>2{!{ͫn:ov’*{"lv! ͡ ! ͡ :ovʢ:ov!{:lv±:mv#:lv2lv:mv2mv:ov :ov ! ͡ *lv6o*lv*lv#"lv:ovw*lv!{yOx#G!{yx#n! on! on!9!!N#F͸ !:{2q:{2q:{2q:{2q!!q##N#F+++N#F*u5on:ošo!o~#«!>E*o0on*u"pv*q))*u :pv:qv*pv##w#w*pv####"pvÿo o!~#fo"{*{~ *{~OG *{#"{on!N#F! o o!9!~#fo"{!~#fo"{>2o!"rv*{͵*{#*{"tv*tv~ʼ *rv*rv##"rv:tvw:uv#w*tv~ *tv~OG!{y¯ x# *tv#"tvÔ *rvw#w!"rv*rv~#!!o*rvN#F1!y"!>2o"!*tv~ʼ *tv~OGE:*v!=$E:*|v####"|vñ$*u"~v*q))*u :~v:vҖ%*v!;$E:*v*~vN#FE:*v!9$E:*v*~v##N#FE:*v!7$E:*~v####"~v$%*u"v*qMD) )*u :v:v!&*v!5$E:*v*vN#FE:*v!3$E:*v*v####N#F+++N#F*E:*v!1$E:*v}o|g"vÜ%*v!/$E:!q"v!q:v:v#|&*v*v##N#F+++N#F*E:*v!-$E:*v####"v4&*v!+$E:*v!)$E:*v!q##N#F+++N#F*E:*v!'$E:!o~#&*v!%$E:*v*oE:*v!#$E::o '*v! $E:'*v!$E:*v!$E:*v*oE:*v!$E:*v451*vͫ1o)^(-(+(:(>(.|(#W($(*T(A:XSTATEX.PILreadreadA:XSTATEX.PILn!9!'!'k2i`"v!v~#'o*v!!8*v ~#fo}0'!o~#\)o!#!"v*v~OG!S'n!*v͸ i`"v*v _!{##N#F+++N#F!# ''!*v͸ i`"v*v#!u'!*v͸ i`"v*vb!͙'*v# _:{2q:{2q:{2q:{2q'*oC*v#ji`"o'*v#ji`"o'>2o'>2o2v:v#2v*v#:vw:v#w*v###*v "v*v6*v#:vw:v#w*v###!N#Fͳ->2v2v*v~#fo? "v*< ~@-*v~#fo "vÒ-*v~#fo "v*v~wo a:pilot a:pilot o!~#fo"{!~#fo"{*{~-*{~;-*{6 .!-ci!-*{fo*{~|.*{6.*{*{~*{#"{*{#"{- o!~#fo"{*{~ʃ.*{*{~An.*{>Zn.*{~OG!a MD! MDv.*{~OGyw*{#"{9.o o!~#fo"{!N#F.1!~#fo~A.!~#fo>Z.!~#fo~a/!~#fo>z/!~#fo#~:/*{!~#fo~OG! }!~w#~w/*{6*{ 6!~#fo~C/!?! *{ dbo! ! *{ db>2v:vҪ/!~#fo~*/!?!:vOG}o|g*{ :vOG db!~w#~w!~#fo~.e0!~w#~we0!~#fo~./!~w#~wê/!~#fo~/o*{ :vOG !~#fo~a=0!~#fo>z=0!~#fo~OG!A MD! MDJ0!~#fo~OGyw!~w#~w:v2v^/>2v:v҂0!~#fo~…0oo!~#fo~*¿0!?!:vOG}o|g*{ :vOG dbo*{ :vOG !~#fo~a1!~#fo>z1!~#fo~OG!A MD! w#w*{ w#w*{ *{~r(5+5ywx#wo o!~#fo"{*{!Ͳ<*{ N#FͽU*{ ~w#~w*{ ~#fo}ʲ5*{ ~#fo|ʵ5*{ N#F"?*{ ~w#~wõ5o*{ w#w*{ ~w#~wò5 o!9!~#fo"{! ~#fo"{*{ ~#6*{>:{6:{.6!*{{7!{jç6:{;6:{§62v2v2v2v!*{ N#F͢1x7!2v2v~2v2v!v!m!v!2{2{~2{#~2{!{ͅn7*{!Ͳ **{~**{*{#"{*{*{#"{~ú**{6*{MDo a:pilot a:pilot n!q9! y1x+!y!N#Fcii`!+ci }!z!N#Fͳ-!q6!r6 !u!y}|!q!2 o>2v2v*v~#foC ! >">+0÷+ "v*v~#fo"v!v:v:v#+o*v"v*v~+o>2v>2v:v,*v~OGy,x3,>2v3,:vp,o:v2v+*v~OGyC,x,*v*v#~#fo ###"v!v:v:v#(,o:v},o*v#~#fo"v*v*v#~#fo ###"v*v~OGy­,x,*v*v#~#fo "v!N#Fcii`!*ci "v!v:v:v#,oo!v:v MD1!~#fo~OGyw!~w#~w:v2vj0n!~#fo~ʟ1!~#fo!~#fo~a1!~#fo>z1!~#fo~OG!A MD! MDÌ1!~#fo~OGyw!~w#~w11onon!!N#F! ywx#w!~#foMDoXSTATEX PILn!9!1ywx#w!w#w!!~#fo !~#fo!~#fo ~ @2!~w#~w2!!~OGyOyw!6!! o o!~#fo"{!~#fo"{͇3i`"v!v~#›2o*{*{3i`"v:vº2:v2o*{*v*v4*vMDo o!~#fo"{!~#fo"{!~#fo"{*{*{3i`"v:v 3:v)3o*{45*{*v*{4*{MDon͇3i`"v!v~#e3o!N#F!N#F*v4*vMDon2v2v>2v:v3:vOG!ͨjw ~#fo}3:vOG!ͨj w "v3*vMDo:v2vÖ34r?4a 4w4 o!~#fo"{!~#fo"{*{~OG!3n!!*{CVi`"v*vMDo!!*{Xi`"v:vc4:v}4!!*{CVi`"v!!v##N#F+++N#F*vnF74!!*{Xi`"v74!"v74 o!9!~#fo"{!~#fo"{!~#fo"{*{ :{w:{#w*{{#w:{2{:{2{!{>#9!*{ ~w#~w+[9*{N#F*{~w#~w~OGyOGc9*{:ywx#w+~t9#~ʛ9!N#F!~w#~w!~ 9!~#fo6!~³9#~9!!{ 9 #99*{MDo o!~#fo"{!w*{E::w2w:w2w:*w*w#"w6 %:!w! Ͳ<* w}@o|g}B:!w!Ͳ<o o!~#fo"{!~#fo"{*{*{#"{~2{2{!{~#ʫ:*{ ~w#~w+:*{N#F*{~w#~w:{w:o*{*{}ogͲ<:{ ::{^:*{ ~#fo}@o|g}^:*{!Ͳ<^: o!~#fo"{*{ ~#fo});*{ ~#fo}0/;o*{ ~#D;*{>*{ ~#fo}@o|g}ʮ;2v2v:v:v;*v!ͨjw ~#fo}@o|g};<*v!ͨj w !Ͳ<;<*{ *{ ~#fo};;*{ N#F*{ N#FJywx#w*{*{ ~#~*{ ~w#~w+E<*{ ~*<#~–<*{ ~wá<*v#"vc;*{ *{ ~#fo#MDx2{2{x2{y2{!{j*{N#F*{~w#~w~OGyOGo*{ ~ w*{ w#wo o!~#fo"{!~#fo"{*{ ~#fo}<*{ ~#fo} <*{MDo*{ ~#:v#$A*{Bi`"v!v~#\Ao!v~#ʝA*v##*v##~#~ i`~#fo"w*{*v  #ÝA*{>>#҉A*{~#fo)) *{ *vf*{ C*vMDo!v~#B*{!v  #B*v##*v##~#~ i`~#fo"w*v*{  #*{>>#yB*{~#fo)) *{ *v####fyB*{:v:v#҂B*v))*{ *{~#fo!vyOx#Gywx#w*{:vw:v#w*v))*{ C*{ MDo*v"{B*{ MDon!w~#­B!v"v*v"w2v2v*wMDo o!~#fo"{*{ !rj#MDo o!~#fo"{*{͵Bi`"w͎Bi`"w*w##~#fo"w*w!w  #WC*w!w *C #…C*w##*w##~#~ôC*w"w*w##~#fo"wC!w:wfC:w#BC!Ni`"w!w~#Co*w!w  #*w*w~#fo)) "w*w:ww:w#w*w"w*w####MDo*w> w>#w*w####C*w"wBC o!~#fo"{!{~#Co:{2{:{2{͎Bi`"w!{:w: w#ҌD*w##:{:{#ҌD*{~#fo))*{ *w##yVDx#D*{*w##~#fo  #*{ *w##~#fo##~#~D*w##:w: w#ڽD!{:w: w#7D*w##:{:{#7D*w##~#fo"wD*{ *w##~#~*w~#fo))*w !{yDx#'Eexw:fx#w3I*ex~>'I*gx"cx-I*gx#"gxH*gx"ax*gx"ex*ex> H*ex~H*ex#"ex3I!cx~#ʸI!ͽU!!*cxCVi`"ix:ix„I:jxʸI*cx]*cx!O!!dG!O!,U!x*_xx}o|g!rj>EoAJAJJ#KCJTJLJPJDKn!9!N#FWi`"wx!~#-J!wx~#3Jo*wx~OG!In!~#fo"mx!~#fo!~#fo "qx*wx ~#vJyJy2sx*wx ~OG!Ino!N#F!N#F*wxKoo!qx:mx:nx# K! y2tx:sxJ:txOGyJxK K*mx*mx#"mx:txwøJ:tx JøJ*mx!yOx#Go K!6!! ! ! !"ox!~OG!yx#jK!~OGqK!N#Fy2tx:txʕK*ox~OGyKx¼K>2tx!qx:mx:nx# K:tx K*mx*mx#"mx6 K*mx*mx#"mx*ox*ox#"ox~:tx2txuKon!z9pU!~#fo"{x!~#fo"x!~#fo "x!~#fo#{Pk!{>2{2{2{2{!{k##~2x!~#fo ~#ʯL!x~#N!N#FX:xր:x9M:x9M!"x*{x! *x!! yʦMN2x2x!"yx*yx"}x!x~#M!yx:}xL:~x#*N!~#fo#2{2{:x2{:x2{!{ =*{>*{~#fo*{ yOx#Gi`"v!v~#n=*v*{ N#F*{ N#FO!vyZ=x#n=*{ ~ wo*{ :v2{2{:v2{:v2{!{j*{*{ ~#~*{ *{ ~#fo}==ywx#w:{=:{>*{N#F*{~w#~w:{w*{ ~w#~w*{MDo o!9!~#fo"{*{ ~#o>*{ ~#fo}ʘ>*{*{ !v*{ ~#fo }| w #w">!*{ N#F'Fx>*{ #~w>*{*{ !!4?ywx#w+~#~ i`~#>*{ ~w">*{ ~w#~w">!!v##N#F+++N#F*{ N#FnFx?*{ ~@won!N#FCo o!~#fo"{!~#fo"{*{*{ͨji`"{*{Bi`"{*{"{!{~#€?o*{:{2{:{2{}ʫ?*{*{#"{6À?*{MDo o!~#fo"{!~#fo"{!{~#?*{Bo:{2{:{2{*{͵Bi`"v*{:v @:v#@*{ MDo*{:v:v#&B͎Bi`"v2v2v*v"v*{~#fo"v*v##~#fo"v*v~#fo))*v !{yr@x#ª@*v"v*v"v*v*v~#fo "v@*v"v*v##~#fo"vU@*{~#fo))*{ !vy@x#@*v"v*v"v*v*v~#fo "v!w:v@:v#•@!v:v*w*{  #*w##*{ ~#~5E*w##:{w:{#w*w"wo o!~#fo"{>2 x: xF: xOG!ͨj w ~#fo: xOG!ͨjw yOx#Gi`" x! x~#F: xOG!ͨjw ~#fo}F: xOG!ͨjw ~#F* x: xOG!ͨjw N#F: xOG!ͨjw N#FOF*{,Uo: x2 xQEn!! x##N#F+++N#F!N#FnFxXFooGFF^Gn!N#FWi`"x!x~#‘Fo*x ~DʤFo! ~#foMD!^Fn!~2x#~2x#~2x#~2x*x#:xw:x#w:x#w:x#w!~#foMDo*x#{Pk!{!j~2x#~2x#~2x#~2xF*x Wx2{2{x2{y2{!{!j~2x#~2x#~2x#~2xFo: can't write : can't read n!"ex!"gx:2kx2lx*kx*gxR]!kx~#G*ex*ex#"ex*gx*gx#"gx~:kx2kx:lx2lxèG*ex*ex#"ex6!x"_x*_x*_x##"_xGywx#w!"ex*ex~4H*ex~ʠH*ex> H*ex~HýH*_xw#w!ax~#OI!ͽU!!*axXi`"ix!ix~#OI*ax]*ax!O! !sG!O!,UOI*ex~3I*ex~HH*ex*ex#"ex6H*ex#"gx*gx~ I*gx> I*gx~ II*_x*_x##"_x:j2x2x!N#FX!z! *x!! yGNM!z! *x!! yN!:xOG}o|g"x!x:x:x#҂M*xMDÇM*xMDi`"x*x!z:xOG *{x\^*{x*x "{x!x:x2x:x#2x!~#fo#2{2{:x2{:x2{!{j>2x^L!~#fo#2{2{:x2{:x2{!{j*{x!yOx#Go*}x~2x:xOGyANx]NM!z:xOG "}x>2x*N*}x#"}x*x#"x:x L:xL*{x*{x#"{x:xw:x2x:x2xLn!9!!N#FYyNo!! yNxNoon!9!:xw:x#w!*x!~#fo }|!:w:#w!!}|!w>#w!!xyOx#G!yx#^Oo!!  #үO!!  #үO!!  #үO!~#fo"x!~#foMDoo#P#P5PPTPLPPXPC;PDPQ PAQnpU!~#P!N#FWi`"x!x~#Po*x~OG!On*x ~OG!Ono!N#F!N#F*xwQo>2x!~#fo"x!~#fo!~#fo "x*x ~#P!x:x:x#P*x*x#"x~OG:xOG ÌP>2x]P>2x]P!~#foMDoo!x:x:x#P*x~OG!On*xx*x#"x6 !x~#¬SûS*x!yOx#Gon!w#w!~#~eU!N#FͽU!~w#~w;U! on! yŠU2x2xo*x#"x:x:xU! y¯UxºU! on!N#FWi`"x!x~#Uo*x ~DV*x~V*x ! i`"x:x5V!x>>#5V*x 6!~#foMDo!>w>#wVn!~#lV!~^V#~lV!>w#weYi`"x!x~#ƒVo*x!N#FYyŸVo*x ~DV*x ! *x ! xVo*x 6!N#F!N#F!N#FXon!N#F!# y Wx/W!x{Pko!~#fo! MD 2{2{2{2{!{!~#fo" MD 2{2{2{2{!{!mͅn!~#fo# MD 2{2{2{2{!{!mͅn>2{2{>2{>2{!{mon!#~W!~#~Wo!N#F!,ͨjx "x*x ~Xo*xMDon!~#@X!~2X#~@X!>w#weYi`"x!x~#WXo*x!N#FYysXo*x ~D¥X*x ! xX*x 6o*x!~*x#w#w#w#w*x !~#~*xx}o|g!,rjMDon!~#fo#~2x#~2x#~ *x *x 6~ w~o*x*x#"x!N#F!~w#~w~*x#"x\n!N#F!~w#~w}]!~#fo!~#fo~A]!~#fo>Z]!~#fo~OG! MDø]!~#fo~OGyw!~w#~wU]on!!~#~!~#fo~^!~w#~w]!~#fo!yOx#Gon!N#F!~w#~w}Y^!N#F!~w#~w!~^on!N#F!~w#~w}ʭ^!N#F!~w#~w!N#F!~w#~w~_^!~#foMDon!~#fo!~#fo ^o!~w#~w!~w#~wý^!~#fo~^on! !{!!N#F4_!{{Pkon2{2{!~#fow#w#w#w! ~#~j_! >$>#p_o! > >#_! ~#fo/ }2{á_! ~#fo6 }2{!~#fo"{!~#fo!~#fo "{*{~ _*{~ _*{#"{_*{~-_>2{2{*{~-`*{~+ `*{#"{! ~`#~f`*{~0f`*{#~aJ`*{#>zJ`*{#~OG! MDR`*{#~OGyX[`xf`*{##"{!{:{:{#Ҭ`*{~aڗ`*{>zڗ`*{~OG! MDÞ`*{~OGy2{!{:{Ҿ`:{La*{#"{a:{0La!{>9La!~#fo!~#fo{Pk!{! #~2{2{~2{+~!yOx#Go!:x Q:x#0Q*x ~ AQ! :xOG *x*x#"x~OG:xOG PS pSpSpS Sn!9!~#fo"x!~#fo"x!~#fo "x!~#fo#{Pk!{>2{2{2{2{!{k##~2x!~#fo ~#=R!x~#U!N#FX:xր:xډR:x‰R!"x*x! *x!" yʿRo!y:xOG "x!"x*x:x2x:x2x}U*x*x#"x~2x:xOG!cQn!z! *x!! y S!!!z^ S*x*x "x!x:x2x:x#2x!~#fo#2{2{:x2{:x2{!{j>2xQ!:xOG}o|g"x!x:x:x#4S*xMD9S*xMDi`"x*x*x!z:xOG \^*x!" yʿRo!x~#ʻS!x:x:x#ڬSûS*x*x#"x6 *x*x#"x:xwpS!x:x:x#RR!x:x:x#SSi`"x!x~#S*x"x*x!y:xOG yOxGi`"x!N#FX:xր:xQT!! *x!! y}T!!!^}T!"x!y! *x!" yTo*x!y:xOG !:xOG \^!! *x!" yTo!y"x>2x!~#fo#2{2{:x2{:x2{!{j!x~#ʬS*2x#~2x!~#fo "x*x! !x!͊m##~*x" !x!͊m##~*x# !x!͊m##~on!xywx#w!{~#~ҘY!~#fo ~­Y!{~#~ڽYo!~,w#~wxY!~#foMDoRDR:PTP:CON:LST:n!9!~#Z!~#fo~Z!~# Zo!N#F]i`"x:x :x1Zo!"x!~#fo"x*x~ʕZ*x~w*x*x~ayZ*x>zyZ*x~OG! MDÁZ*x~OGyw*x#"x*x#"xCZ*x6!!}|:x¶Z:xZ!~#fo###~:Z!Y!N#Fͺ^yL[>L2x2xò[!~#fo 6D!~#fo "x*x6!~#fo#~:[!~#fo~2x2x:xA:x\!x>P>#\\!Y!N#Fͺ^yo[>C2x2xò[!Y!N#Fͺ^yʒ[>P2x2xò[!Y!N#Fͺ^y[>T2x2x!~#fo :xwo!~#fo 6o*x#"x2x2x:x:xz\!~#fo~9\!~#fo~.Q\9\o*x*x }!~w#~w[*x*x#"x6 *x#"x[*x*x#"x!N#F!~w#~w~G\!~#fo~ʥ\!~#fo~.ʥ\!~w#~wz\!~#fo~.\!~w#~w2x2x:x:x\!~#fo~"]*x*x#"x6 H]*x *x2{!{m2{2{:{2{2{!{j>2{2{2{2{!{j~#~#~#~a:{a]a!{>zna:{Aڬ`!{>Zڬ`!~#fo!~#fo{Pk!{! #~2{2{~2{+~2{!{m2{2{:{2{2{!{j>2{2{2{2{!{j~#~#~#~*{#"{f`!{~#+b!~#fo!~#fo{Pk!{dn~#~#~#~*{!yOx#G!~#~Qb!N#Fab*{!yOx#Go o!~#fo"{!~#fo!~#fo "{!~#fo"{!{:{:{#Ҷb*{*{#"{:{wÔb!~#foMDo o!~#fo"{*{~b*{> 2c*{~2c2{2{*{~09$>#|co! > >#c! ~#fo/ }2{íc! ~#fo6 }2{!~#fo"{!~#fo!~#fo "{*{~ c*{~ c*{#"{c*{~-c>2{2{*{~-d*{~+d*{#"{! ~%d#~rd*{~0rd*{#~aVd*{#>zVd*{#~OG! MD^d*{#~OGyXgdxrd*{##"{!{:{:{#Ҹd*{~aڣd*{>zڣd*{~OG! MDêd*{~OGy2{!{:{d:{Lne*{#"{ne:{0e!{>9e!~#fo!~#foN#F! N#Fͨj:{O{2{:{2{!{m>02{2{2{2{!{j##~2{!{>9@i:{'2{*{*{#"{:{w*{!yOx#Go o!~#fo"{*{~ʃi*{#"{qi*{!yOx#Go&}!!9o!9~w#~w#~w#~w+MD!9 _ #ڳi{ !94ói! 9~i+w>#w! 9N#FxjO>Gͩi!jO>G! 9q#pJo! 9~Cj+w>#w! 9N#FxWjO>GͩigjO>G! 9q#pJo! 9N#Fͩi! 9q#pJo! 9N#Fͩi! 9q#pJo!! 9~+j~j! 9N#F ! 9~w#~w! 9~w+~wîj!9q#pJo!9N#F!9~#fo ## # +++ #Jo!9N#F!9~#fo  # # #Jo~#~#~#~#~#~#~#~!9MD!9~#~#~#~ !9~w#~w#~w#~w#~w#~w#~w#~w!9MD! 9  # # #ڂk!9MD! 9  # # #!94Âk!9!9Jo#~#~+++~#~#~k#>#>+++>#~#~#~ #~{.l>#># >#k!9MD!9~#fol! 9MD!9~#fol_k!9N#F!9Alkk!9MD!9~#fol! 9MD!9~#fol_k!9N#F!9Alkk! 9MD!9~#fo#k!9MD!9~#fo#k_PG  }|de:{a!e!{>z2e:{Aڸd!{>Zڸd!~#fo!~#foN#F! N#Fͨj:{OG  }|*{#"{rd!{~#ʚe!~#fo!~#fo~#fo>o>g}|*{!yOx#G!~#~e!N#Fe*{!yOx#Go o!~#fo"{!~#fo"{*{*{ fo*{#"{*{#"{e*{~eo o!~#fo"{!~#fo"{!~#fo"{*{:{2{:{2{}{f*{*{#"{*{*{#"{~Bfo o!~#fo"{!"{*{~#f*{~#fo"{*{~f*{*{#"{*{~*{#"{æf*{6*{MDo*{##"{Óf o!~#fo"{!~#fo"{*{~g*{~OG:{g:{%goo*{#"{f o!~#fo"{!~#fo"{!~#fo"{:{g*{>o>g"{:{g*{>o>g"{*{*{#"{6-*{*{rj"{!{~#ʼg*{*{*{/g*{ "{*{*{͍j0 }2{!{>9g:{'2{*{*{#"{:{w*{!yOx#Go o! ~#fo"{!~#fo"{:{rh*{>o>g"{!#~rh!!{Pk!{dn~#~#~#~*{*{#"{6-!{Pk!{:{2{2{:{2{:{2{!{l~2{#~2{#~2{#~2{!{~###h*{!{##N#F+++N#F*{h*{ "{!{Pk!{:{2{2{:k!9N#Fkb9.lkkl!9~+m/#w>+++w>#w!9N#F!9~#fo  # # #Jo!9N#F!9~#fo ## # +++ #Jo~#n#~#foy#nx#n+++~#fo##n!9!9*{*{*{i`!"{"{"{!9N#F###q#p+++q!9N#F#q#pV2.1: copyright (c) 1979 by Whitesmiths, Ltd.2    #{s m!j"g$b{CC @@ I$B$!!D!$"H@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z copies of Quest, for three sets of books. (You can actually have more than three, but they won't be accessible through the menus.) ) Type any key to return to the Main Menu.( $e more than three, but they won't be accessible through thend to help, select "2 Draft Printer." T: T: {1} Simple {8} NEC Spinwriter 2000 series T: {2} Draft printer {9} NEC Spinwriter 3500 series T: {3} Typewriter printer {10} NEC Spinwriter 5500 series T: {4} Qume Sprint 11 {11} Okidata Microline 84 (step 2) T: {5} Silver Reed EXP550 {12} Okidata models 92/93 T: {6} Diablo 1610/20/40/50 {13} Epson MX80/100 & FX80/100 T: {7} Diablo 630 C is Found ret ;Return ;Character has NOT been Found LuSk2: xor a ;A:= Returned Status is NOT Found ret ;Return Subttl Banked Bios -- Character I/O (List Device Drivers) page ;---------------------------------------------------------!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 ` *&;Title MD-HD (Rev 22, Rel 1.9) 16_Jul_84 Copyright 1984 Morrow Designs Inc. ;Subttl -Global System Equates (10_Aug_84) ;----------------------------------------- ; ; Copyright 1983, 1984 ; 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 Definuates ;------------------------ ; 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 R ; Module Starting Addresses (16_Jul_84) ;-------------------------------------- ; 1) The UnUsed Space has been accumulated between O_Dsk2 and O_Test. ; O_Main equ 0h ;Main line (hd*main.mac) O_IO equ 220h ;Rom Level I/O (hd*io.mac) O_Bios equ 340h ;Rom Level Bios Support (hd*bios.mac) O_Dsk1 equ 4F0h ;Hi-Level Disk Drivers (hd*dsk1.mac) O_Dsk2 equ 0ED0h ;Lo-Level Disk Drivers (hl*dsk2.mac) O_Test equ 19A0h ;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 foequ 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 equ 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 savehl equ genbuf+12 ;Save Location for the HL register pair cyltbl equ genbuf+14 ;Table of drive's Current Cylinder positions badtrk equ genbuf+22 ;Bad Map Track Number (lo byte) ; " " " " (hi byte) badhd equ genbuf+24 ;Bad Map Head badsec equ genbuf+25 ;Bad Map Sector badoff equ genbuf+26 ;Offset to start of bad map (lo byte) ; " " " " " " (hi byte) badmap equ genbuf+28 ;Pointer to start of bad map buffer (loition Module ;--------------------------- ; ; Identification Information ; ASCII character equates ; ; Module Starting 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) ; page 64 ; ; Identification Information (20_Jul_84) ;--------------------------------------- ; RomRev equ 19h ;Rom Revision Number BadID equ 4B6Fh ;Bad Map ID Word (in the boot sector) BadRev equ 10h ;Bad Map Revision Number (in the bad map header) ;---------------------------------------------------------------------- ; Boolean Definitions (23_Mar_84) ;-------------------------------- ; true equ -1 false equ not true ; ASCII character eqr 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 dskbuf + 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 ; page ; 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  byte) ; " " " " " " " (hi byte) piobuf equ genbuf+30 ;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 equ 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 ; page ; 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 ;seria 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 ; page ; I/O Registers - Disk Write ;--------------------------- ; DrvStb equ 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 ITE 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_Jan_84) ;------------------------------------------------ ; 1) This is the table of the rom level error codes. These codes exist ; only in the disk module. ; 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 marl port 2 status s3data equ 70h ;serial port 3 data (sio) s3stat equ 71h ;serial port 3 status (sio) $TxRdy equ 00000100b ;Uart Transmitter Ready Bit $RcvRdy equ 00000001b ;Uart Reciever Ready Bit ; 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 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 (8_Jun_84) ;------------------------------------- ; DrvSts equ 0C0h ;Drive Status @Index equ 7 ; Index Status - Index Not Processed $INDEX equ 10000000b ; Index active $TRK0 equ 01000000b ; Track Zero active $JBAUD equ 00100000b ; Console Baud Rate Jumper (1=19200,0=9600) $CRCSETenable $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 01000000b ; 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 $WRk 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 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 Enf equ 21 ;Data not found (time-out looking for data) Euk equ 22 or $NOTRY ;Unknown Error Code ; Bios Level Disk Operation Error Codes (18_Dec_83) ;-------------------------------------------------- ; 1) This is a table of the error codes that ar 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 @FstSlw equ 2 ; 2 Function keys Fast/Slow Flag @siosyn equ 3 ; 3 Hardware handshake for SIO @hwsync equ 4 ; 4 Hardware handshake for list device @cenlst equ 5 ; 5 Centronics is list 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 @hstac equ 0 ; 0 hos activ fla (1=sector in buffer) @hstwr equ 1 ; 1 hos writte fla (1=buffer writte) @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 Bios copy of Mtab's @HasBad bit @maper equ 6 ; 6 Error  ; 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: (1=true) ; 0 Not Used @RomIO equ 1 ; 1 Rom is doing console io (Suppress IMS) @InMap equ 2 ; 2 Sector is in the bad map @BufOK equ 3 ; 3 Buffer Data is valid @Recal equ 4 ; 4 Recalibrate the drive @NoVer equ 5 ; 5 Supress Verification of track on seek @SerUR equ 6 ; 6 Suppress User response to errors @SerD equ 7 ; 7 Suppress Error Display 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 ;---------------------------e 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 (18_Jan_84) ;------------------------------------------------------------ ; 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 percan cause remapping of the sector @maprd equ 7 ; 7 Bad Map has been read TrSe equ 20 ;offset to logica secto withi physica secto 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 the 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 (18_Jan_84) ;---------------------------------------------------------- ; 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) ------------------------------------------- ; 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 Drive 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/se 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 *LOOP4 CUR:21,22 TNR: CUR:21,22 TNR:{Enter your selection: } INMAX: 1 A: M:1,2,3,4,5,6, BELLN: JN:*LOOP4 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 . . . CPM: WELCOME| J: *BEGIN *QUEST ESC: *BEGIN DEF: $PROGRAM Quest DEF: $COMMAND kp DEF: $OPT To exit from Quest, enter function code{99}at ictor ; 10 - 512 Bytes/sector ; 11 - 1024 Bytes/sector DskDef2 equ 2 ;Spare Disk Definition Byte PrkOff equ 3 ;Park offset (number of tracks past maxcyl) 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 X$@UaUzjH+{P@3k(3jK4K6`JYG&ml fհmIW, x@(dz¦.U _6J XKUw(A^Od`@F*K՛v#ץf@#sFI'R: MICRO.PIL VERSION with SUPERCALC, QUEST, BACKFIELD, and FUNCTION KEYS R: No BAZIC R: Morrow Designs Micro-Menu system - Rev 3.16 (MD-16) R: Copyright 1984 Morrow Designs, Inc. R: All Rights Reserved R: Written by John VanderWood for Morrow Designs *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:*PARK M:U, J:*UTILITY *NEWWORD ESC: *BEGIN DEF: $PROGRAM NewWord C:a=@9-3 DEF(a):$COMMAND key nw|key default J(a):*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-3 DEF(a):$COMMAND key sc|key default J(a):*SCKEY DEF: $COMMAND sc *SCKEY DEF: $OPT{To exit from SuperCalc, type "{/Q}" at the "active cell" prompt.} C: UN1 = 4 C: UN2 = 5ts 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 *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: CUR:0,22 TNR: {Enter your selection:} INMAX:1 A: M:1,2,3,4,5,6,7,8,9 BELLN: 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; : 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 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 plape 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: 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 nowplease 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 you 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 RETURNce. 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-16 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: type 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 ty.} 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: {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 y 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, please 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,: 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: 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 follow 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 PARK} Hard Disk Head Parking Utilit 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 diskette 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 b 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: 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 y T: {U Utility menu} T: {ESC Exit to CP/M} *VALID1 CUR: 0,22 TNR: CUR: 0,22 TNR: {Enter your selection:} INMAX: 1 A: M:1,2,3,4,5,6,7,8,9,U BELLN: JN:*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} 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:===============================__|| 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: || ==== || 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;R: Morrow Designs Co-Pilot Menu system - Rev 3.16 (MD-16) R: Module - GO.PIL R: Copyright 1984 Morrow Designs, Inc. R: All Rights Reserved R: Written by John VanderWood for Morrow Designs 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.16 Tn: Please stand by . . .} CHn:MICRO.PIL T:{Loading Software Installation program, please stand by . . .} CH:MDINST.PIL END: #bk))ܗs_ܗsys!*7*7R!'͎?!;8"J6o éMIj"&,48PAGE\ LINE\FC= FL= COL\MAR\RELINSERT\ONdecimalLINE\SPACING\Z=>68LʲCڵC*7["7`iͰLzL͚D*7[F*7"7"7zL͏GïC*7"7RDͼL D ====================================== 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: || 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: ||______________________ $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:============================================================================ *EXITMENU CUR: 0,22 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: 2WHO2WG:c2c:'>`͇Ax¹'"U _2:f Ğ2U!c~w ne macro is called once for each drive. ; 2) each time it is called it generates 3 new macros which are unique ; for the logical drive, and contain the logical drive's name. ; 3) it generates macros which when used, create the MTAB, DPH, and ; DPB for the drive. ; 4) macros defined by DEFINE begin with the structure name MT, DPH, DPB, ; include the letter M, 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:). ; define macro dv,typ mt&m&dv macro ;Mtab Definition mt&dv: mt&typ endm dpbm&dv macro ;DPB Definition dpb&dv: dpb&typ endm dphm&dv macro ;DPH Definition dph&dv: dphgen dv endm xl&dv equ xl&typ ;Translate Table csv&dv equ csv&typ ;Checksum Vector endm page ;---------------------------------------------------------------------- ; Proto-Type DPH ;-------;Subttl CP/M+ Drive Data Structure Generator (23_Aug_84) ; ; Copyright 1984 ; Morrow Designs, Inc. ; San Leandro, Ca. ; Bill Smith, John Zalabak ; ; ; The following drive TYPE codes have been defined ;------------------------------------------------- ; ; Floppy Disks ; ------------ ; DSDD 5.25" double sided double density 48 tpi drive ; ; Hard Disks ; ---------- ; ST06 Seagate, Model ST506 (5 meg) ; SQ06 SyQuest Technology, Model 306 (6 meg) ; SA11 Shugart Associates, Model SA712 (11 meg) ; CM11 Computer Memories Inc., Model 5412, (11 meg) ; CM16 Computer Memories Inc., Model 5619, (16 meg) ; CM34 Computer Memories Inc., Model 6640, (34 meg) ; CD31 Control Data Corporation, Model 9415-5 (31 meg) ; MS11 Mini-Scribe, Model 3212 (11 meg) ; TU34 Tulin Corporation, Model TL 240 (34 meg) ; QU36 Quantum Corporation, Model Q540 (36 meg) ; ;---------------------------------------------------------------------- ; Define Macro (22_Mar_84) ;------------------------- ; 1) the defi ; 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,5RO ?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, DW ?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 MAC!0CBH, ?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 ͔$}!+y)8ͩ$8@rկ ®rsr.r#r rͤ7rr rrr>  r~ 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-16'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.R: Morrow Designs Micro-Menu system - Rev 3.16 (MD-16) R: Module - INIT.PIL R: Copyright 1984 Morrow Designs, Inc. R: All Rights Reserved R: Written by John VanderWood 6/22/84 R: CLRS: LF:7 T: T: Congratulations on getting an MD-16. 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. There- T: fore we have to replace the information on the hard 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 * ;* 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 ";Subttl Drive Ogranization Definitions [Quantum 34 meg Floppy] (23_Aug_84) ; ; Copyright (c), 1983, 1984 ; Morrow Designs, Inc. ; 600 McCormick ; San Leandro, Ca. 94577 ; Floppy equ False ;True for Floppy system; False for Hard Disk Drives equ 5 ;number of drives you wish to define Auto equ False ;Auto Command Load from the Ims Buffer ; ; 1) Make sure that the floppy flag is set to FALSE for generating a ; loader for the hard disk. ; 2) 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/Bios.Sub command invocations (eg Boot F) ; 3) The currently defined drives are: ; ; DSDD Floppy Disk 5.25 inch double sided double density 48 tpi drive ; ; ST06 Winchester Seagate, Model ST506 (5 meg) ; SA11 " Shugart Associates, Model SA712 (11 meg) ; SQ06 " SyQuest Technology, Model 306 (6 meg) ; CM11 " Computer Memories Inc., Model 5412, (11 meg) ; CM16 -------- ; 1) 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 ;---------------------------------------------------------------------- ; Table_Gen ;---------- ; 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 ;----------- ; 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 page ;====================================================================== ; DSDD: Floppy Disk - 5.25" Double Sided - Double Density ;======================================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xldsdd equ xlt1k ;Standard translatM (195*2k drive capacity = 390k) dw 192-1 ;DRM (192 directory entries in: 3 Blks db 0E0h ;AL0 (2k blocks*3)/32bytes/entry ) db 000h ;AL1 dw (192/4)-1 ;CKS (Checked directory size) dw 2 ;OFF (2 system tracks) db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; ST06: Hard Disk - Seagate ST 506 (2_Aug_84) ;============================================ ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlst06 equ 0 ;No Translate Table csvst06 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for an ST-506 (5.25" 5 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtst06 macro db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101011b ;ready_line,DD,bad_map,1k sectors db 00000000b ;reserved byte db 0 ;No Park Offset dw 153 ;153 cylinders db 3 /3 ;3 " Computer Memories Inc., Model 5619, (16 meg) ; CM34 " Computer Memories Inc., Model 6640, (34 meg) ; CD31 " Control Data Corporation, Model 9415-5 (31 meg) ; MS11 " Mini-Scribe, Model 3212 (11 meg) ; TU34 " Tulin Corporation, Model TL 240 (34 meg) ; QU36 " Quantum Corporation, Model Q540 (36 meg) ; ; Floppy Disk Definitions ;------------------------ ; if floppy cvdsk equ 0 ;first floppy is current virtual, a: define a,dsdd define b,QU36 ;Quantum 36 meg hard disk define c,dsdd define d,dsdd define e,dsdd else ; Hard Disk Definitions ;---------------------- ; cvdsk equ 1 ;first floppy is current virtual, b: define a,QU36 ;Quantum 36 meg hard disk define b,dsdd define c,dsdd define d,dsdd define e,dsdd endif page ڈ>F6:(_/G:(ʧ:(ڨ|OͤG:(_OzW{|:(*(}|BKN zyGe table csvdsdd equ -2 ;gencpm creates the checksum vector ; Mtab Definitions ;----------------- ; 1) media table for standard Morrow 5.25 inch double sided ; double density drives. ; 2) see file HD??DEF.MAC for full description of field assignments ; mtdsd macro db 10000100b ;virtual drive, double sided, drive = 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 ;0 ms head load time db 500 /3 ;500 ms motor on time dw 23 ;starting track of write precomp. dw -1 ;starting track of write lo-current db 0 ;format type, odd track on alt. head endm ; Floppy Disk DPB ;---------------- ; 1) dpb for standard Morrow 5.25 inch 390k dsdd floppy ; dpbdsdd macro dw 40 ;SPT (records per track) db 4,0Fh ;BSH, BLM (2k blocks) db 1 ;EXM (2 logical extnts/physical extent) dw 195-1 ;DS" ms Step Rate db 15 /3 ;15ms Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 128 ;Starting Track of Write precomp dw 128 ;Starting Track of lo-current db 0 ;Format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 5.432 meg ; 2) dpb for 5.25 inch 5 meg winchesters ; dpbst06 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (153-2)*36/4-1 ;DSM (153_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; SQ06: Hard Disk - SyQuest 306 (23_May_84) ;========================================== ; ; Translat(records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (((612-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw (16*4*32-1)/4 ;CKS (DRM/4) this is a removable disk dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; SA11: Hard Disk - Shugart Associates, Model SA712 (11 meg) ;=========================================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlsa11 equ 0 ;No Translate Table csvsa11 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a SA7712 (5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtsa11 macro M (1k physical sectors) endm page ;====================================================================== ; CM11: Hard Disk - CMI 5412 (23_May_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm11 equ 0 ;No Translate Table csvcm11 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_5412 (5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm11 macro db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, nore Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlsq06 equ 0 ;No Translate Table csvsq06 equ -2 ;Have System create the CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a SyQuest 306 (5.25" 6 meg removable winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtsq06 macro db 00100110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 5.432 ; 1) dpb for 5.25 inch 6 meg removable media winchesters ; dpbsq06 macro dw 72 ;SPT  db 00101110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 12 /3 ;15 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 200 ;Starting track of Write PreComp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbsa11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PH#mal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbcm11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 groups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CM16: Hard Disk - CMI 5619 (22_Mar_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm16 equ 0 ;No Translate Table csvcm16 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for CMI_5619 (5.236-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; CM34: Hard Disk - CMI 6640 (28_Mar_84) ;======================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcm34 equ 0 ;No Translate Table csvcm34 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_6640 (5.25" 34 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm34 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw================================================================== ; CD31: Hard Disk - CDC 9415-5 (30_Mar_84) ;========================================= ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlcd31 equ 0 ;No Translate Table csvcd31 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a CMI_6640 (5.25" 31 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcd31 macro db 00110010b ;Has_Sector_0, 5 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 10 ;10 cylinder park offset dw 657 ;657 cylinders db 0FFh ;0 ms Settling Time db 0 ;3 ms Step Rate db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 0FFFFh ;starting track of write precomp dw 0FFFFh ;starting track of write lo-current db 0 ;format type, normal endm ; Hard Disk 5" 16 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtcm16 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db 01101111b ;ready line,DD,badMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw 306 ;306 cylinders db 0FFh ;0 ms Settling Time (fast seek) db 0 ;0 ms Step Rate (Fast Seek) db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current control db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 16.448 meg ; 2) dpb for standard Morrow 5.25 inch 16 meg winchesters ; 3) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcm16 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((18 640 ;640 cylinders db 0FFh ;0 ms Settling Time db 0 ;3 ms Step Rate db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 0FFFFh ;starting track of write precomp dw 0FFFFh ;starting track of write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 34.484 meg ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcm34 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3840-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====#Dpb ;-------------- ; 1) Total Formatted Capacity is 29.480 ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbcd31 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3285-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; MS11: Hard Disk - Mini-Scribe 3212 (31_May_84) ;=============================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlms11 equ 0 ;No Translate Table csvms11 equ 0 ;No oups * 4k/group * 32 dirs/k db 0FFh ;AL0 (16 groups for directory (max)) db 0FFh ;Al1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; TU34: Hard Disk - Tulin Corp. TU 240 (4_Jun_84) ;================================================ ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xltu34 equ 0 ;No Translate Table csvtu34 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) Media table (mtab) for a Tu 240 (5.25" 34 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mttu34 macro db 00110110b ;Has_Sector_0, 6 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw 640 ;640 cylinders db 0FFh ;0 ms Settling Time db 0 ;0 ms St(23_Aug_84) ;=========================================== ; ; Translate Table and CheckSum Vector Definitions ;------------------------------------------------ ; xlqu36 equ 0 ;No Translate Table csvqu36 equ 0 ;No CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a Q540 (5.25" 34 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtqu36 macro db 00111110b ;Has_Sector_0, 8 heads, drive = 2 db 01101111b ;ready line,DD,BadMap,fast seek,1k sect db 00000000b ;reserved byte db 0 ;no park offset dw 512 ;512 cylinders db 0FFh ;0 ms Settling Time db 0 ;3 ms Step Rate db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 256 ;starting track of write precomp dw 0FFFFh ;starting track of write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 36.788 meg ; 2) Note that the DSM figure is equal CheckSum Vector ; Mtab Definitions ;----------------- ; 1) media table (mtab) for a Mini-Scribe (5.25" 11 meg winchester) ; 2) see file HD??DEF.MAC for full description of field assignments ; mtms11 macro db 00100110b ;Has_sector 0, 4 heads, drive = 2 db 01101111b ;ready_line,DD,bad_map,fast_seek,1k sectors db 00000000b ;reserved byte db 0 ;no park offset dw 612 ;612 cylinders db 0 ;0 ms Step Rate (fast seek) db 0FFh ;No Settling Time db 3 /3 ;3 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No low write current adjust db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Capacity is 10.940 meg ; 2) dpb for 5.25 inch 11 meg winchesters ; dpbms11 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical_ext/physical_ext) dw (306-2)*36/4-1 ;DSM (306_cyl-2_res * 36sct/cyl /4sct/grp -1) dw 16*4*32-1 ;DRM 16 grep Rate db 15 /3 ;15 ms recal step rate db 0 ;0 ms head load time db 0 ;0 ms motor on time dw 8000h ;No write precomp dw 8000h ;No write lo-current db 0 ;format type, normal endm ; Hard Disk Dpb ;-------------- ; 1) Total Formatted Storage Capacity is 34.484 meg ; 2) Note that the DSM figure is equal to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbtu34 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((3840-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm page ;====================================================================== ; QU36: Hard Disk - Quantum Q540 $to: ( ( (Total Number of Tracks - ; Reserved Track) / Allocation Block size) * Physical Sectors/Track)-1 ; dpbqu36 macro dw 72 ;SPT (records per track) db 5,1Fh ;BSH, BLM (4k blocks) db 1 ;EXM (2 logical extents/physical extnt) dw (((4096-8)/4) * 9) - 1 ;DSM (1 less than total # of 4k blocks) dw 16*4*32-1 ;DRM (16_groups*4k/group*32dirs/k=2048) db 0FFh ;AL0 (reserve 16 groups for directory) db 0FFh ;AL1 dw 8000h ;CKS (drive is permanent) dw 8 ;OFF (8 tracks (2 cyl) 1_Sys, 7_BadMap db 3,7 ;PSH, PHM (1k physical sectors) endm 9bBI$"" HB@ UUUUUUUUUUUUUUUUUAPDA$! @I !@D@BDI@!B$ @$I$$ "@$$@@HHBD"D$H D@!IB@ A"B HBIB$$ "$ D$!"D$H$D$I@D BD" H$BHHBDHB"H!"$%%&&''