IMD 1.17: 10/06/2011 8:10:15 install package for the dj2d/b prl files supplied dj2d/b4 1982 morrow designs    INSTALL COM: INSTALL DOC MAKEPRL SUBIBIOS ASM#w!!  #!~#fo)!~#fo N#F!N#FH!~w#~w!~w#~w!~#fo##!~#fo)##!~#fo N#Fle2.prl address2 ...] Install Revision %i.%i !9!>w#w!>w#w* ! * ! !<!~#fo##~#fo~-IBIOS ASM !"#$%&'()*+,-.IBIOS ASM/0123456789:;<=>IBIOS ASM?@ABCDEFGHIJKLMNIBIOS ASMOPQRSTUVWXYZ[\]^pywx#w+~#!~#fo##!~#fo~#fo  !~#fo##~#fo}o|g}!~#fo)##!~#fo N#F!<͢!~w#!~#fo##~w#~w!>w>#w!~#fo##~#fo~!!N#F!~w#~w!~#fo##N#F!~#fo##~w#~w~!~#fo6á>2IBIOS ASM_`abcdefghijklmnIBIOS ASMopqrDJ2D/B4 PRL!stuvwFORMT# ASMPxyz{|}~~w!~w#~wu!!~#fo##N#F! Hywx#w!:w:#w!*3  Ҟ!~#fo~OGyOxGyvx !~#f!~#~>!<͢>!~w#~w!~w#~w!~#fo}o|g}^!<͢! ywx#w!>w#w!! FORMT# COM MAKEPRL COMMAKEPRL COM?MAKEPRL DOC* â Memory may be corrupted. Error reading %s. Next Load address: %h. Invalid CBIOS format in o##N#F!h<! <͢ !:w:#w!!~#fo~#fo }|!*3  !N#F!N#F1!~w#~w! #!~#fo!!!~#fo)!~#fo N#Fzywx#w+#~Z!~#fo)!~#fo N#F!<͢Z!ywx#w!>w%s. Invalid load address %s. Can not open %s. Odd number of arguments. Usage: install [-string] file1.prl address1 [ fi ~w#~w!~w#~wC!N#F!O<!9!!~#fo~!~#fo!~#fo~!~#fo!~!>w!~#ʾ ! ~#fo~OG!yOx#Gy !~#fo!  ! ~w#~wa !#~~w+~w!~w#~w!~w#~wv !9w!!  # !!~#fo!yOx#G>>  !N#F!yOx#Gywx#w!!N#F!}|!~#fo}o|gw!>w>#wÛ!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!!  #!>w#w!;<! <͢!~OGyOxGy­x!N#F!'<! <͢!!~#~!!~#~!~#fo##~#fo!~!  #V!~#fo~™ͩͩ!~#fo!~#fo#}|!~w#~w!~w#~wÙͩͩ!~#fo!~#fo#}|!~w#~#w!~#fo~!~#fo~0!~#fo>9!!~#fo~OG!~#fo))))  }|!~#foMD!~#fo~A!~#fo>Z!>w>#w!!}|!~w#~wͩ!N#F!~w#~w6!!N#F!~w#~w~OGyOxGywx#w!># !} !~w#~w !~#fo##~#fo!~#fo !~#fo }o|g} !~#fo##~#fo!~#fo !~#fo  }o|gMD!9!>w#w!|ywx#w!~#~!~#fo#~ !~#fo~ !~w#~wö!~w#~w!~Ʀw#~wÙ!~#fo~#fo !~#fo !~#fo##yx#B !N#F!<! <͢!>w#w!!~#fo!~#fo   !~#fo##~#fo!w!N#F!N#F1!~w#~w;!9!!~#~!N#F!} ~ !!N#F!| }!~#fo~OG! MD#!~#fo~OGyax!~#fo~A^!~#fo>Z^!~#fo~OG! MDk!~#fo~OG>f>!!~#f>#J!~#fo~ J!~w#~w!~w#~w~ !!}|!~w#~w!!~#fo#}|!!  #!!N#F!!~#foN#Fͬ!yª x# !N#F!;<! <͢!!N#F!~#fo##~#fo!~#fo !~#fo##N#F !~#fo#~:y!~#fo!~#fo~aT!~#fo>zT!~#fo~OG! MDa!~#fo~OG! }!~w#~wÃ!~#f~#fo !~#fo}o|g}!~#fo##~#fo!~#fo ~OGyOxG!~#fo}o|gy xf !~#fo##~#fo!~#fo !<|!!~#fo$ ~#~!>#v!~#›!~#fo& !~!N#F!~y!~#fo!yOx#G!~#fo$o~A!~#fo>Z!~#fo~OG! MDø!~#fo~OG!~#fo))))  }|!~w#~wÂCan not write in location %~#fo~!~#fo!~#fo~!~#fo!~!~w#~w!~w#~w !>#!~#fo~ ʦͩ!~#fo!~#fo~!A !~w#~wÁ !~#fo##~#fo!~#fo !~#fo MD!9!!N#F!}!~#ʻ !>w>#w!~#ʾ o6!!~#~!!~#fo#}|!!~#fo  !~#fo~ʫ!~#fo~.!~w#~w!!~#fo  ! <͢f !N#F!~#fo##N#F!~#foN#Fͬ!yD x#v !N#F!;<! <͢v !~w#~wM !>w# !~#~!~#foMD!!  #!N#F!N#F!~#fo& !!yOx#G ͤ!!  #!>w#h. Insufficient memory to read %s. Invalid PRL file format in %s. !9!!!~#foN#Fͬytxʓ!N#F!~w#~w!~w#~w!~w#~wJͩ!N#F!~w#~w6q !!~#~!!}|!~w#~w!>w#w! ҧ!N#F!~w#~w6 !~#fo !~#fo 6~!~#fo! !~#fo" !~#fo# 6~ w!~#fo$ >w#w! 9N#F#^#V"""O>/G!9N#F#^#V#~#foͻz w#û!9TT|xT~w#~wN#FͯS!~OG!~S!~#fo~!~#fo~ ! !~!N#F!~w#~w~OG! N#F!~y—x/!~#fo#6 !N#F!~w#~w6 ç!N#F!~w#~w!~#fo~a!~#fo>z!~#f DxTDLL|7xLTD(D|/g}/o#x/Gy/Ox/Gy/O>=))k# w#`` ~ò!!  #B!N#F!N#F!N#F!!N#F!N#F}|  ډ!~#foA  !o~OG! MD!~#fo~OGyw!~w#~wç!~#foMD!9!!}|!!N#F!~w#~w~ ʖ!~%ʙ~ß!~#fo0 !~*#~##~#®~®+++~#fo!9N#F#^#V!xxGyO)MD!9q#po! !~OG!~S!!N#F!~w#~w~ OG!ï!~#fo#~!-!~!~#fo!~#fo~#fo>o>g}|  9~o3||g}o'/<3)"MD!9q#poG! 9~#fo!9~o/< !9~o3|g}oa'!9N#F#q#p!usOh)odi! !N#F!~w#~wN#FSS!!N#F!~w#~wN#FS!!N#F!~w#~wN#FS!N#F!  ation Guide", and it must store the address of this table at location 1 in memory. A "skeletal" BIOS module led at this address. The flagged argument (-string) is copied to 80H and left there for examination by the new To install the Disk Jockey as drives L and M in a 44K CP/M (with at least 48K of memory), type INSTALL rs. INSTALL first loads "newbios" at the given address (usually the top of CP/M), then patches it into the exist the top of CP/M. If you only have 48K of memory in .pa your system, you will first have to move your CP/M downward begins with the same jump table, but may leave some of the required functions unimplemented. The corresponding jumly installed "Newbios", or a NULL if no flagged argument is present. The BIOS modules provided here use thisdj.prl B000 djram.prl E400 Here, "dj.prl" contains the Disk Jockey 2D drivers, B000 is the top of the 44K ing BIOS by exchanging the addresses of the 17 jump vectors that begin each BIOS. If additional .PRL files ar to make room. At this writing, the 14 inch hard disk drivers required approximately 3.5K bytes, (see FILES below), NAME INSTALL - integrate new device drivers into CP/M, Revision 1.3. SYNOPSIS INSTALL - string p vectors are left as jump-to-selfs. EXAMPLES To install the 14 inch hard disk (M26) as drives C, D, and E in a  as an initial drive specification, i.e., -c specifies that the newly installed BIOS should respond to drive CP/M (the drivers require 3.25K), "djram.prl" is updated controller firmware to be loaded into the controller e given, they are loaded at the requested addresses with no patching. Finally, INSTALL prints (top ofso you should construct a 44K CP/M, and type INSTALL -C M26.prl B000 (B000 is 44K in hex.) If you don't newbios address [ prlfile2 address2 ... ] DESCRIPTION INSTALL integrates new device drivers into an existing CP/M  48K CP/M (assuming that you have memory above 48K), execute INSTALL -C M26.prl C000 Here, M26.prl is C. The CP/M system must be standard: its BIOS must begin with the jump table as defined in the "CP/M 2.0 AlterRAM, and E400 is the address of the controller RAM. (If you have a non-standard controller, use the control- ler addr newbios) + (newbios buffer size, if any) + 1 as the "new load address". Additional drivers can now be instalknow how to move your CP/M downward, see your system manual. The required program is usually called "MOVCPM".  2.x system. "Newbios" is a skeletal CP/M BIOS module in .PRL format (see the PRL.DOC file) containing the new drives the "skeletal BIOS" (provided with INSTALL) containing the 14 inch hard disk drivers, and C000 (hex for 48K) is ess +400 hex.) To install both the 14 inch hard disk and the Disk Jockey drives, you could first install one, th ren $1.hx0=$1.hex mac $1 $$+rpzsz ren $1.hx1=$1.hex makeprl $1 : Where "filename" is the name of your source IBIOS. : Thus to follow the example given in IBIOS.DOC you : type "SUBMIT MAKEPRtion Thi are i * * 'reserved' (and not used) by CP/M. * * * * Anothe note Th IBIOS' col boo jum i n accept octal and X- notation. When the Disk Jockey drivers are first accessed, they locate the controller  * * INSTAL environment Generall thi mean tha al th consol * * drivers lis drivers an th war boo cod i then the other on top of it (at the printed "new load address"). This would require 6.75K of memory above CP/M. As L CUSTOM". : : Thi SUBMI fil assume tha th followin file ar : o driv A: : : 1) The MAKEPRL.SUB file. : : 2)o pointe t th * HDDM comman channel Thi pointe wa formerl a 40 t 42h * * * * This IBIOS can be coby searching memory for a certain pattern in the controller ROM. The search is done carefully, but never- theless,  dis driver * * ha bee removed Also syste dependan cod ha bee modified * * (syste dependan cod i cod tha usa better alternative, there is a combined driver package that requires only 5K of memory. To use it, configure a 43 Th sourc IBIO fil provide b Morro : Designs and edited by you. : : 3) Th MA assemble fro Digita Research nfigured to run with the following devices. * * The disks may be configured to run with any or all of the disk * * systems. might clobber someone's memory-mapped I/O. e memor location belo * * th IBIOS o cod tha directl affect th placemen o variou * * cod module i memory) K CP/M (assuming 48K of memory, or use available memory minus 5K), and type INSTALL M26+dj.prl AC00 djram.prl************************************************************************* * * * Morrow Designs IBIOS for CP/M Version  : (provide b you). : : 4) Th MAKEPRL.CO progra provide b Morro : Designs. : era $1.hx? mac $1 $$pzsz The logical order of the disks can be set to any order. * * * * Disk systems: * * HDC3 10, 20 and 26 megabyte : : SUBMIT procedure used to create custom .PRL files. : : To use this SUBMIT file type: : : A>SUBMIT MAKEPRL filename :  * * * * Note On importan execption Th DJDM driver us addresse * * 50 t 5B fo comman channe informa E400 BUGS Addresses must be specified in 4-digit hex (with no leading 0 and no trailing H). INSTALL should also2.2. * * Copyright (c) 1982, Morrow Designs * * * * Thi CBIO ha bee reconfigure s tha i ca ru i th hard disks. * * HDDMA 5, 10, 16, megabyte hard disk systems. * * DJDMA floppy disk controller with 8 and 5 1/4 inch disksarc Removed clock switching code from HDCA driver * * 8 18 82 Marc Added handshake configuration code * * 8 18 82 Marc Ahe hdca DPB's * * 9 22 82 Marc Added sector size parameter to DPBGEN * * 9 9 82 Marc Fixed system length checks for 64K ptimized MWissue * * 7 14 82 Marc Clean up login message for HD a bit * * 6 30 82 Marc Fixed MF multi density problemsw points to the HDDMA command channel * * 9 28 82 Marc MW's now have 1024 directory entries * * 9 28 82 Marc Deleted the xed 8250 UART initialization sequence * * 8 6 82 Marc Strip parity on conout to clear up glitches * * 8 6 82 Marc Fixed. * * DJ 2D/B floppy disk controller with 8 inch disks. * * * * Written by Les Kent and Marc Kupper 3/4/82 * *dded handshake configuration bytes * * 8 18 82 Marc Removed 'equ'ed handshaking from LST: * * 8 12 82 Marc Added configusystems * * 9 9 82 Marc SETHIGH was botching 2 sided DPB pointers * * 8 31 82 Marc Changed TRACKS in HD driver to HDTRAK  * * 6 29 82 Marc Added Olivetti HD561/1 HD561/2 drives * * 6 28 82 Marc Added a MW error reporter * * 6 18 82 MarcCentronics drivers * * 9 27 82 Marc Changed login message to look like a label * * 9 27 82 Marc Changed the login messag the 8 inch dpb256ss DPB's EXM * * 8 6 82 Marc Increased the HD capacities slightly * * 8 6 82 Marc Deleted all non-su * * Date Programmer Description * * * * 12 30 82 Marc Fixed bad map error return in GETBAD * **11ration entries for a0 & d0 * * 8 11 82 Marc Added the autostart command structure * * 8 11 82 Marc Redefined the configu * * 8 27 82 Marc Added code/system length checker * * 8 27 82 Marc mwreset save/restores the track number * * 8 26 82 Added nonstandard system mode flag * * 6 17 82 Marc Added a buffer error flag * * 6 17 82 Marc Added save/restore of es to say M5, M10, ... * * 9 27 82 Marc Redefined the dparam table structure * * 9 22 82 Marc Added a serial console for pported MW drives * * 8 6 82 Marc Deleted call to flush in conout * * 8 6 82 Marc Moved printer back to port 3 * * 10 82 Marc Public release of revision E.31 * * 11 9 82 Marc Reduced bad map size to 1 for non MW systems * * 10 18 82 Maration table * * 8 11 82 Marc Added DJDMA drive parameter table * * 8 9 82 Marc Added clock switching to HDCA code *  Marc mwreset now sets *step and *dir for CMI * * 8 20 82 Marc Added 'equ'ed handshaking to the serial LST: * * 8 19 82 M50-52 to MW driver * * 6 17 82 Marc Fixed Centronics drivers * * 6 7 82 Marc Fixed allocation map sizes * * 6 7 82the Switchboard * * 9 22 82 Marc Added initialization code for serial group 2 * * 9 22 82 Marc Added sector size byte to t 7 28 82 Marc Moved conin flush call to conout * * 7 27 82 Marc Fixed double sided head settle time * * 7 14 82 Marc Orc Fixed SETHIGH for 2 sided DJDMA 8 inch disks * **10 1 82 Marc Public release of revision E.3 * * 9 29 82 Marc 40H no* 8 9 82 Marc Added seek complete clearing in HDCA * * 8 6 82 Marc Added buffer disable on home * * 8 6 82 Marc Fi  Marc Fixed MW partitioning * * 6 7 82 Marc Fixed HD partitioning (again) * * 5 13 82 Marc Fixed illegal MAC labels************************************************************ * * * The following equates set up the disk systems to be6 head settle is 0 ms. * * 3 15 82 Marc Added MiniScribe 1006 and 1012 drives * * *3 1 82 Marc Public release of revisio * * Since most hard disk drives hold more than 8 megabytes we * * partition the drive. We partition our drives using two dic Fixed MCR Initialization for LST: * * 4 15 82 Marc Added Seagate ST412 drive * * 4 6 82 Marc Moved serial LST: devider equ 0 ;Set the order of logical drives ELSE 0 if mworder equ 1 ; not included. fdorder equ 0 dmorder equ 0 mforder equ * * 5 11 82 Marc Fixed North Star drive configurations * * 4 30 82 Marc Fixed Quantum Q2040 tracks to 512 * * 4 29  included * * along with the types of drives and the logical order of the * * drives. * * * ***************n E.2 * * 2 -- 82 Marc Pre-release testing and debugging * * 2 1 82 Les + Marc Initial coding of revision E * * fferent * * formulas. * * * * One is the so called 'standard partitioning' where we try to * * create as mance to port 2 * * 4 1 82 Marc Added common group select routines * * 4 1 82 Marc Fixed Diablo HyType II initialization  0 ;HDC3 controller disk drives. Set only one m10f equ 0 ;Fujitsu M2301B m20 equ 0 ;Fujitsu M2302B m26 equ 0 ;Shugart82 Marc Fixed ST412 step constant to 0 * * 4 26 82 Marc Added unallocated writing * * 4 22 82 Marc Fixed HD partition********************************************************** numprd equ 5 ;Number of disks products supported maxhd equ 0  * ************************************************************************* title 'IBIOS Revision E for CP/M Version 2.y 8 megabyte partitions as possible plus a small * * partition to take up the slack on the end of the drive. * * *  * * 4 1 82 Marc Fixed LISTST for PROM driver * * 3 16 82 Marc Added Tandon TM602 and TM603 drives * * 3 16 82 Marc  SA4000 m10m equ 0 ;Memorex ;HDDMA controller disk drives. Set only one st506 equ 1 ;Seagate ST-506 st412 equ 0 ;Se overlap * * 4 20 82 Marc Started testing and debugging of E.3 * * 4 19 82 Marc Added 1 sector to HD warm boot loader ;Set to number of HDC3 hard disk drives maxmw equ 1 ;Set to number of HDDMA hard disks maxfd equ 0 ;Set to number of 2D/B fl2 - March 4, 1982' revnum equ 53 ;IBIOS revision number 5.x = E.x cpmrev equ 22 ;CP/M revision number 2.2 ************** Another way the drives are partitioned is the so called 'even * * partition' formula. This means that the drive is split in Use 'part number' equates for MW drives * * 3 15 82 Marc Dropped hdrev and mwrev equates * * 3 15 82 Marc Seagate ST50agate ST-412 cm5619 equ 0 ;CMI CM-5619 ************************************************************************* * * * 4 19 82 Marc Added mod. number to IBIOS rev. number * * 4 19 82 Marc Clean up login message 'if's * * 4 15 82 Maroppies maxdm equ 0 ;Set to number of DJ DMA floppies 8 inch maxmf equ 0 ;Set to number of DJ DMA floppies 5 1/4 inch hdor  to * * equale sized partitions with the only restriction being that no * * partition be over 8 megabytes in length. * * u 4 ;Address of last logged disk bdos equ 5 ;BDOS entry point buff equ 80h ;Default buffer address cpmout equ 2 ;BDOS'sd partitions mwlog equ mwpart else mwlog set st506+st412*2++cm5619*2 ;Logical disks per drive for HDDMA endif hdc3 equ and * * allocation tables. * * * ************************************************************************* ******************************* * * * The following equates are internal to the IBIOS. * * * *************pace aht equ 'I'-64 ;Horizontal tab alf equ 'J'-64 ;Line feed avt equ 'K'-64 ;Vertical tab aff equ 'L'-64 ;Form Feed ac * * All hard disk drives shipped from Morrow Designs are partitioned * * using the standard partition formula. If the  console output routine ************************************************************************* * * * The followim26 or m20 or m10 ;HDC3 controller fujitsu equ m20 or m10f hdspt equ 32*m26+21*m20+21*m10 ;Sectors per track hdma set stdpbgen macro nam,log,dspt,dbsh,dblm,dexm,ddsm,ddrm,dal0,dal1,dcks,doff,ssiz dpb&nam&log equ $ dw dspt db dbsh db dblm d************************************************************ if maxmw ne 0 badsiz equ 32 ;Number of badmap entries else r equ 'M'-64 ;Carriage return xon equ 'Q'-64 ;Xon character xoff equ 'S'-64 ;Xoff character aesc equ 1bh ;Escape characteuser wishes to * * implement even partitioning then he/she must set HDPART or MWPART * * to the number of partitions desired.ng are internal IBIOS equates. Most are misc. constants. * * * *******************************************************506 or st412 or cm5619 ;HD DMA controller mwspt equ 9 ;Sectors per track maxlog equ (maxhd*hdlog)+(maxmw*mwlog)+maxfd+maxb dexm dw ddsm dw ddrm db dal0 db dal1 dw dcks dw doff db ssiz endm dphgen macro nam,log,dpb1,dpb2 dph&nam&l badsiz equ 1 ;No badmap if no MW drives endif m10 equ m10f or m10m if hdpart ne 0 ;Use non standard partitions hdlr ars equ 1eh ;RS character aus equ 1fh ;US character asp equ ' ' ;Space adel equ 7fh ;Delete *********************** * * * ************************************************************************* hdpart equ 0 ;Set to number o****************** retries equ 10 ;Max retries on disk i/o before error clear equ 'Z'-64 ;Clear screen on an ADM 3 anuldm+maxmf if maxlog gt 16 ;Test for too many drives 'Fatal error, more that 16 drives specified.' end endif cdisk eqog equ $ dw 0 dw 0,0,0 dw dirbuf dw &dpb1&dpb2 dw csv&nam&log dw alv&nam&log endm alloc macro nam,log,al,cs csog equ hdpart else hdlog equ m10*2+m20*3+m26*3 ;Logical disks per drive for HDC3 endif if mwpart ne 0 ;Use non standar************************************************** * * * The following are the macros used in generating the DPH, DPB f non standard partitions mwpart equ 0 ;Set to number of non standard partitions ****************************************** equ 0 ;Null aetx equ 'C'-64 ;ETX character aack equ 'F'-64 ;ACK character abel equ 'G'-64 ;Bell abs equ 'H'-64 ;Back S  v&nam&log: ds cs alv&nam&log: ds al endm ************************************************************************* * le output jmp $ ;List device output jmp $ ;Punch device output jmp $ ;Reader device input ohome: jmp home ;Home drivetor info ************************************************************************* * * * The jump table below must  dn set dn+1 endm ************************************************************************* * * * The following t The folloing are offset numbers of Device Specification Tables. * * * ****************************************************************************************** drconf: db 0 ;Revision 0 structure db 32 ;32 bytes long now ************** * * The following marco is used in generating the logical order of the * * CP/M drives. * * * *********** osetdrv:jmp setdrv ;Select disk osettrk:jmp settrk ;Set track osetsec:jmp setsec ;Set sector osetdma:jmp setdma ;Set DMremain in the same order, the routines * * may be changed, but the function executed must be the same. * * * *******able are drive parameters for drives connected to * * the DJDMA floppy disk controller. There is one entry for each of * * th************************** d$wboot equ 0 ;Warm boot d$stran equ 1 ;Sector translation d$sel1 equ 2 ;Drive select, Return DP*********************************************************** * * * The following is the table of pointers to the Device************************************************************** order macro num if num eq hdorder dw hddst endif if A address oread: jmp read ;Read the disk owrite: jmp write ;Write the disk jmp $ ;List device status osect: jmp sectran ****************************************************************** bios equ $ ;Starting location jmp $ ;Cold boot entrye the eight drive that the controller can address. The first * * four entries are for the 8 inch drives and the last four are H d$sel2 equ 3 ;Drive select d$home equ 4 ;Home drive d$strk equ 5 ;Set track d$ssec equ 6 ;Set sector d$sdma equ 7 ;Set DM * * Specification Tables. The order of this table defines the * * logical order of the CP/M drives. * * * *num eq mworder dw mwdst endif if num eq fdorder dw fddst endif if num eq dmorder dw dmdst endif if num e ;Sector translation jmp $ ;Hookup for SINGLE.COM program nop ;End of table **************************************** point owboot: jmp wboot ;Warm boot entry point jmp $ ;Console status routine jmp $ ;Console input ocout: jmp $ ;Consofor * * the 5 1/4 inch drives. Users with fast stepping 8 inch drives * * (SA850/1) or slow 5 1/4 inch drives (SA400) should A address d$read equ 8 ;Read a physical sector d$write equ 9 ;Write a physical sector d$bad equ 10 ;Return pointer to bad sec************************************************************************ dsttab: equ $ dn set 1 rept numprd order %dn q mforder dw mfdst endif endm ************************************************************************* * * ********************************** * * * Drive configuration table. * * * ******************************  adjust this * * table for optimal device performace. * * * * Each table entry contains four fixed length fields. tep rate in milliseconds, and the head * * settle time in milliseconds. For example: * * * * ;Shugart SA 850 d is similar to the previously defined * * step word. This specifies the head settle timing * * ine 8 inch drive parameters * * Use SA800 parameters: 77 tracks, 8 ms step, 8 ms settle * * * ****************** * * The DJDMA's delay routines tick 34.1 times per * * millisecond. Thus the step constant woulf (maxdm ne 0) or (maxmf ne 0) ;DJDMA present? dconf macro tracks, step, settle db tracks ;Number of tracks db 0 ;Res The fields * * are defined as follows: * * * * tracks This byte contains the number of tracks on the * *  * * dconf 77, 3, 15 ;77 tracks, 3 ms step, 15 ms settle * * * * ;Shugart SA 400 * * dconf 35, 40, 10 ;35 trafter the heads have been stepped. Example, * * Shugart's SA 850 head settle time is 15 * * mi******************************************************* dconf 77, 8, 8 ;Drive 0 dconf 77, 8, 8 ;Drive 1 dconf 77, 8, 8d be the * * drive manufactors recomended stepping delay times * * 34.1. Example. Shugart SA 850et the calibrated flag dw step*341/10 ;Step time dw 0 ;Reserved for future use, must be zero dw 0 ;Reserved for futur drive. Most 8 inch drives have 77 tracks and * * most 5 1/4 inch drives have 35 or 40 tracks. * * acks, 40 ms step, 10 ms settle * * * * Note: Caution should be used when defining the drive parameters. * * Incorreclliseconds. The settle constant would be 15 * * * 34.1 or 512. * * * * An assembler macro (DCONF) ;Drive 2 dconf 77, 8, 8 ;Drive 3 ************************************************************************* * * 's step at 3 * * milliseond intervals. The step constant would be * * 3 * 43.1 or 102. * * e use, must be zero dw settle*341/10 ;Head settle time endm dmarap: db 0, 10*8 ;Revision 0, length 80 bytes dparam: * * config This a a flag byte that indicates as to whether * * or not this drive has been configured. St definations may damage the floppy disk drive. Morrow * * Designs takes no responsibility for damage that occures through *  has been provided to assist in * * generating the DPARAM table. This macros parameters are the * * number of tracks, the s * Define 5 1/4 inch drive parameters * * Use Tandon parameters: 40 tracks, 5 ms step, 15 ms settle * * * ****** * * rfu The next two words are reserved for future use. * * They must be zero. * * * * settle This wor equ $ ;Drive parameter table ************************************************************************* * * * Defet to * * 0 to force reconfiguration. * * * * step This word contains the stepping rate constant. * the misuse of this macro. * * * ************************************************************************* i  ******************************************************************* dconf 40, 5, 15 ;Drive 0 dconf 40, 5, 15 ;Drive 1 ste doe no kno tha w ar here shhh an th hos driv * * selec routin i called. * * * **************Clear one time flag jmp insetu ;Do install package setup routines *******************************************************ret ;'jump' to the host call ************************************************************************* * * * Insm ************************************************************************* * * * Instal packag war boot Thi ta inserv ret ;Return to IBIOS's setdrv ***************************************************************** * * dconf 40, 5, 15 ;Drive 2 dconf 40, 5, 15 ;Drive 3 endif ************************************************************************************************************************ drvsel: mov a,c ;Get the external drive name lxi h,dlocal ;T****************** * * * Instal package driv selec routine Thi routin check th * * externa driv nam t dtall package variables. * * * ************************************************************************* dlocalroutin inspect th comman * * buffe fo driv specification I presen the th loca * * drive ar 'relocated t  * Determine if the installed drivers are currently giving * * service to CP/M. If so then return else pop off return * * add************ * * * DPH save area. Each entry is 4 bytes long: * * 0 - LSB of DPH address * * 1 - MSB of DPHest against the first local drive sub m jc drvsl1 ;Skip if the host drive is below us cpi maxlog ;See if this drive isetermin i th driv belong t th hos * * syste o t th instal driver (loca drives) Th fla INSER * * (i servic: db 16-maxlog ;First external drive used locally inserv: db 0 ;Local drive in service flag *****************************th use specifie loaction 'map * * of the drive configuration is printed. * * * ***************************ress and jump to (hl). * * * ***************************************************************** serv: lda inserv  address * * 2 - Sector size code (1 = 128, 2 = 256, 3 = 512... * * 3 - Bad map has been initilized (0 = Uninitilized)  within our range jnc drvsl0 mov c,a ;Load the local drive name mvi a,0ffh ;Set the in service flag jmp drvsl2 dre i se accordingly I th driv belong t th * * hos syste the th driv nam i adjuste (s tha th hos * * sy******************************************** * * * At the first page boundry following the IBIOS we have a series of *********************************************** wboot: mvi a,0ffh ;One time code flag inr a jnz owboot sta wboot+1 ; ;Test the in service flag ora a rnz ;Return if we are servicing this one xthl ;Clear out the call to SERV donop: * * * ************************************************************************* dphtab: rept maxlog dw 0, 0 endvsl0: mov a,c ;Adjust the host drives above us sui maxlog mov c,a drvsl1: xra a ;Clear the in service flag drvsl2: s   * pointers that point to various internal tables. At the start of * * each of these tables we have a revision byte and a leng;IBIOS page number db revnum ;IBIOS revision number dw drconf ;Drive configuration table pointer dw 0 ;I/O configuratioull (0). * * * * 4) This points to the autostart command structures. Used to * * automatically invoke a comman to track zero. * * * ***************************************************************** home: lda bufwrtn ;Test br of the IBIOS. Low byte is * * the IBIOS revision number. Used to determine pointer * * structure. * * * Enter with sector number in (bc) mov l,c shld cpmsec jmp osetsec ******************************************************th byte. * * The revision byte is the current revision number for that * * particular structure and the length byte is the n pointer (DELETED BY INSTALL) if (maxdm ne 0) or (maxmf ne 0) ;DJDMA present? dw dmarap ;Drive parameter table pointer ed on cold or warm boot * * * * 5) This will be a null (0) pointer. It marks the end of the * * table. uffer dirty flag ora a jnz dohome ;Skip buffer disable if buffer dirty xra a ;Invalidate buffer on home call sta bufse* 1) This points to the drive configuration table. * * * * 2) This points to the I/O configuration bytes for the ser*********** * * * Setdma saves the DMA address for the data transfer. * * * *********************************length of that * * structure. This length does not include the revision byte nor * * the length byte itself. * * lse dw 0 endif dw 0 ;Auto command structure pointer (DELETED) dw 0 ;End of table marker **************************** * * ************************************************************************* if $ gt bios+256 ;Test for code ovc dohome: lxi b,0 ;Track to seek to ***************************************************************** * * * Settrkial * * drivers. Eg, the console, printer, reader, and punch * * devices. * * * * 3) This points******************************** setdma: mov h,b ;Enter with DMA address in (bc) mov l,c shld cpmdma ;CP/M dma address  * * Revision Description * * E.0 1 and 2 defined * * E.3 This table is moved to a page boundry * * E.3 0, 3 an************************************** * * * Setsec just saves the desired sector to seek to until an * * actual read erlap 'Fatal error, pointer table placement.' else ds bios+256-$ ;Pad spaces till the next page endif db high ($-1)  saves the track # to seek to. Nothing is done at this * * point, everything is deffered until a read or write. * * *  to the drive parameter table for DJDMA floppy * * disk drives. If no DJDMA is present then this pointer is * * n jmp osetdma ***************************************************************** * * * Home is translated into a seekd 4 defined * * * * The pointers defined so far are as follows: * * * * 0) High byte is the page numbeor write is attempted. * * * ***************************************************************** setsec: mov h,b ;  ***************************************************************** settrk: mov h,b ;Enter with track number in (bc) mov l,can error jz zret ;Yes, an error so report to CP/M push h ;Save DPH address call gdph ;Get entry if DPH save table petdrv: call drvsel ;Do INSTALL checking lxi h,osetdrv ;Vector to the host drive select call serv mov a,c ;Save the logiffset ret ;(hl) = DPH save area for current drive zret: lxi h,0 ;Seldrv error exit lda lastdrv ;Get last selected dri******** * * * Setdrv selects the next drive to be used in read/write * * operations. If the drive has never been sela cpmdrv ;Save current drive as old drive sta lastdrv ; in case of select errors ret setd3: push d ;Save DPH address  shld cpmtrk jmp osettrk ***************************************************************** * * * Sectran translaop d ;DPH -> (de) mov m,e ;Put address of DPH in table inx h mov m,d inx h mov m,c ;Put sector size in table inx cal drive number sta cpmdrv cpi maxlog ;Check for a valid drive number jnc zret ;Illegal drive mov a,e ;Check if bive mov c,a lda cdisk ;Pick up user/drive ani 0f0h ;Save user number ora c ;Put together with old drive sta cdisk ected it calls * * a low level drive select routine that should perform some * * sort of check if the device is working. If n mov h,c ;Drive in (h) mvi l,d$sel2 ;Select drive call jumper call gdph ;Quick select pop d mov e,m ;DPH -> (de) tes a logical sector number into a physical * * sector number. * * * ******************************************h mov a,m ;Check if bad map has ever been read for this ora a ; drive cz getbad ;Never been read so read in bad map xt 0 of (e) = 1 ani 1 jnz setd3 ;Drive has allready been accessed mov h,c ;Move logical drive into (h) mvi l,d$sel1 ret ***************************************************************** * * * Getbad - Check if a device has a bad mapot working then * * it should report an error. If the logical drive has been * * selected before then setdrv just returns theinx h mov d,m inx h mov c,m ;Sector size -> (c) xchg ;DPH -> (hl) jmp setd0 gdph: lda cpmdrv ;Return pointer to*********************** sectran:lxi h,osect call serv lda cpmdrv ;Get the Drive Number mov h,a ;Drive in (h) mvi l,chg ;DPH -> (hl) setd0: mov a,c ;Move sector size code into (a) sta secsiz ;Save sector size xra a setd1: dcr c ;Cr call jumper ;Call low level drive select mov a,h ;Check if the low level drive select returned ora l ; zero to indicate . If the device has * * a bad sector map then append bad entries to end of badmap * * table. * * * *********** DPH without * * checking the drive. * * * ***************************************************************** s DPH save area rlc ;Each entry is 4 bytes long rlc mov e,a mvi d,0 lxi h,dphtab ;DPH save area table dad d ;Add od$stran jmp jumper ;See device level sector translation routines *********************************************************eate number of (128 bytes/physical sector)-1 jz setd2 rlc ori 1 jmp setd1 setd2: sta secpsec ;Save for deblocking ld ****************************************************** getbad: mvi m,1 ;Set drive initilized push b push d lda cpmdrv er been * * written into, then a read is performed into the buffer to get * * the desired sector. Once the correct sector is i overflo:lxi h,omes call message jmp badret omes: db 0dh, 0ah, 'BAD MAP OVERFLOW!', 0dh, 0ah, 0 nobad: lxi h,0 ;Used e ***************************************************************** * * * Redwrt calculates the physical sector on tadret ;Ingore the bad map if it can't be read lhld badptr ;Pick up bad map pointer lxi d,buffer ;Start at beginning of bn the buffer, then the data is simply * * transferred from the buffer to the desired dma address. If * * the buffer does not c ;Pick up current drive mov h,a ;Call drive routine to return a pointer to mvi l,d$bad ;the track and sector of the bad man memory, the * * buffer written indicator is set, so the buffer will be * * flushed, then the data is transferred into the buby device drives to indicate no bad ret ; sector map badptr: dw badmap ;Pointer to next available bad map entry *****he disk that * * contains the desired CP/M sector, then checks if it is the * * sector currently in the buffer. If no match isuffer badl: ldax d ;Pick up an entry from the buffer ora a jz bade ;All done mov a,m ;Pick up entry from bad map tableontain the desired sector, the buffer is * * flushed to the disk if it has ever been written into, then * * filled with the sep call jumper mov a,h ;If routine returns 0 then the device has ora l ; no bad sector map jz badret mov e,m ;Piffer. * * * ***************************************************************** write: lxi h,owrite call serv mov ************************************************************ * * * Write routine moves data from memory into the buffer made, the * * buffer is flushed if necessary and the correct sector read * * from the disk. * * * ************* inr a jz overflo ;Bad map overflow lda cpmdrv ;Put drive in table mov m,a inx h lxi b,8 call movbyt ;Move the ctor from the disk that contains the * * desired CP/M sector. * * * *********************************************ck up track number of bad sector map -> (de) inx h mov d,m inx h xchg shld cpmtrk xchg mov a,m ;Pick up sector nua,c ;Save write command type sta writtyp mvi a,1 ;Set write command jmp rwent ***************************************. If the * * desired CP/M sector is not contained in the disk buffer, the * * buffer is first flushed to the disk if it has ev**************************************************** redwrt: mvi b,0 ;The 0 is modified to contain the log2 secsiz equ $-1 rest of information into the table jmp badl bade: shld badptr ;Restore new bad map pointer badret: pop d pop b ret ******************** read: lxi h,oread call serv xra a ;Set the command type to read rwent: sta rdwr ;Save command typmber of of bad sector map inx h mov h,m mov l,a shld truesec call fill ;Read in bad sector map into the buffer jc b************************** * * * Read routine to buffer data from the disk. If the sector * * requested from CP/M is i  ; of the physical sector size/128 ; on the currently selected disk lhld cpmsec ;Get the desired CP/M sector # mov a,hin buffer ani 0 ;Strip off high ordered bits secpsec equ $-1 ;The 0 is modified to represent the # of ; CP/M sectors p ***************************************************************** call fill ;Fill the buffer with correct physical sector  * it has ever been written into. * * * ***************************************************************** flush: d sector lxi d,bufdrv ;Pointer to buffer drive,track, and sector mvi b,6 ;Count loop dtslop: dcr b ;Test if done with comnto ;Transfer data into the buffer outof: call mov128 lda error ;Get the buffer error flag ret into: xchg ; call m ani 80h ;Save only the side bit mov c,a ;Remember the side mov a,h ani 7fh ;Forget the side bit mov h,a dcx h ;er physical sectors mov l,a ;Put into HL mvi h,0 dad h ;Form offset into buffer dad h dad h dad h dad h dad h  rc ;No good, return with error indication ***************************************************************** * * mvi a,0 ;The 0 is modified to reflect if ; the buffer has been written into bufwrtn equ $-1 ora a ;Test if written intpare jz move ;Yes, match. Go move the data ldax d ;Get a byte to compare cmp m ;Test for match inx h ;Bump pointers ov128 ;Move the data, HL = destination ; DE = source mvi a,1 sta bufwrtn ;Set buffer written into flag mvi a,0 ;ChTemporary adjustment divloop:dcr b ;Update repeat count jz divdone ora a mov a,h rar mov h,a mov a,l rar ;Divi dad h lxi d,buffer ;Beginning address of buffer dad d ;Form beginning address of sectgr to transfer xchg ;DE = addres* Move has been modified to cause either a transfer into or out * * the buffer. * * * **************************o rz ;Not written, all done mvi a,d$write sta rwop+1 call prep ;Do the physical write sta error ;Set up the error to next data item inx d jz dtslop ;Match, continue testing *************************************************************eck for directory write writtyp equ $-1 dcr a ;Test for a directory write mvi a,0 rnz ;No error exit **************de the CP/M sector # by the size ; of the physical sectors mov l,a jmp divloop ; divdone:inx h mov a,h ora c ;Res in buffer lxi h,0 ;Get DMA address, the 0 is modified t/ ; contain the DMA address cpmdma equ $-2 mvi a,0 ;The zer*************************************** move: lda cpmsec ;Get the CP/M sector to transfer dcr a ;Adjust to proper sector flag ret ***************************************************************** * * * Prep prepares to read/write the d**** * * * Drive, track, and sector don't match, flush the buffer if * * necessary and then refill. * * * *************************************************** * * * Flush writes the contents of the buffer out to the disk if * store the side bit mov h,a shld truesec ;Save the physical sector number lxi h,cpmdrv ;Pointer to desired drive,track, ano gets modified to contain ; a zero if a read, or a 1 if write rdwr equ $-1 ana a ;Test which kind of operation jnz i isk. Retries are attempted. * * Upon entry, H&L must contain the read or write operation * * address. * * * *** ;Copy the data lda rdwr ;Test read write flag ora a jz fread ;Skip write type check if reading lda writtyp ;0 = alry count mvi l,d$home ;Home drive after (retries/2) errors call jumpbuf pop b jmp retrylp ;Try again ***************v h,a ;Get a DST pointer in (hl) inx d mov a,c ;Logical in (a) sub m ;Subtract from first entry in DST jnc jumpl ;Kecall jumpbuf lhld altsec ;Sector -> (hl) mov b,h mov c,l mvi l,d$ssec call jumpbuf lxi b,buffer ;Set the DMA ber (see description above) in (l). It passes * * along the (bc) and (de) registers unaltered. Jumpbuf is * * a call to jump************************************************************** prep: call alt ;Check for alternate sectors di ;Reset intloc, 1 = dir, 2 = unalloc sui 2 ;Test for an unallocated write rz fwritin:lda secsiz ;Check for 128 byte sectors dc************************************************** * * * Fill fills the buffer with a new sector from the disk. * * ep scanning table till correct driver found inx h ;Bump (hl) to point to start of dispatch table pop d ;Real (hl) -> (deaddress mvi l,d$sdma call jumpbuf rwop: mvi l,0 ;Get operation address call jumpbuf pop b ;Restore the retry couner with the drive number from bufdrv. * * * ***************************************************************** jumpberrupts xra a ;Reset buffer written flag sta bufwrtn mvi b,retries ;Maximum number of retries to attempt retrylp:push r a rz ;No deblocking needed fread: mvi a,d$read sta rwop+1 call prep ;Read the physical sector the buffer sta err * ***************************************************************** fill: call flush ;Flush buffer first rc ;Check) mov a,e ;Move offset number into (a) rlc ;Each entry is 2 bytes mov e,a ;Make an offset mvi d,0 dad d ;(hl) = *ter mvi a,0 ;No error exit status rnc ;Return no error dcr b ;Update the retry counter stc ;Assume retry count expuf:lda bufdrv ;Dispatch with bufdrv for drive mov h,a jumper: push d push b push h mov a,h ;Logical drive into (a) b ;Save the retry count mvi l,d$sel2 ;Select drive call jumpbuf lhld alttrk ;Track number -> (hl) mov a,h ;Testor ;Set the error status ret ***************************************************************** * * * Jumpbuf, jum for error lxi d,cpmdrv ;Update the drive, track, and sector lxi h,bufdrv lxi b,5 ;Number of bytes to move call movbyt *Routine mov a,m ;Pick up address of handler for selected inx h ; function mov h,m mov l,a ;(hl) = *routine mov a,cired mvi a,0ffh ;Error return rz ;Return sad news mov a,b cpi retries/2 jnz retrylp ;Try again push b ;Save ret lxi d,dsttab ;Drive specification pointer table jumpl: mov c,a ;Save logical in (c) ldax d mov l,a inx d ldax d mo for track zero ora l push h ;Save track number mvi l,d$home cz jumpbuf pop b ;Restore track # mvi l,d$strk per are used to dispatch to a low level device * * subroutine. Jumper is called with the drive in (h) and the * * routine num  ;Logical in (a) pop b ;Restore saved registers pop d pchl ********************************************************** place pop b pop h ret altmis: pop h ;Current alternate did not match lxi d,9 ;Bump pointer by the length of an entB alternate track lda buftrk+1 ;Pick up MSB of buffer track cmp m jnz altmis inx h ;Point to LSB of alternate sector ogical drive into (l) mvi h,0 dad h ;Multiply by 16 (size of DPH) dad h dad h dad h dad d ;(hl) = pointer to DPH eck if at end of bad map table cmp h jnz alt2 ;Still more mov a,e cmp l jnz alt2 ;Still more lhld buftrk ;No alteters inx h dcx b ;Update counter mov a,b ;Test for end ora c jnz m8080 ret z80mov: xchg ;Source in (hl), Dest******* * * * Check for alternate sectors in bad sector table. If an * * alternate sector is found replace alttrk andry dad d jmp all ;Loop for more ***************************************************************** * * * Mover mlda bufsec ;Pick up LSB of buffer sector cmp m jnz altmis inx h ;Point to MSB of alternate sector lda bufsec+1 ;Pick u ret ***************************************************************** * * * Utility routine to output the message prnate sector so use selected sector shld alttrk lhld bufsec shld altsec ret alt2: push h ;Save current bad map entryination in (de) dw 0b0edh ;ldir xchg ret ***************************************************************** * * altsec with * * new sector number else pass along unaltered. * * * ************************************************oves 128 bytes of data. Source pointer in DE, Dest * * pointer in HL. * * * *************************************p MSB of buffer sector cmp m jnz altmis ;Found an alternate sector inx h ;Point to real info on the alternate sector lointed at by (hl) * * terminated with a null. * * * ************************************************************** address mov a,c ;Move drive into (a) cmp m ;Check if drive in table matches jnz altmis ;Does not match skip this entry * Return DPH pointer. Enter with (de) with DPH base address * * and (a) with logical drive number. Returns with DPH address***************** alt: lxi h,badmap ;Address of bad map -> (hl) lda bufdrv ;Pick up drive number currently working on mo**************************** mov128: lxi b,128 ;Length of transfer movbyt: xra a ;Check if host processor is a Z80 adi 3xi d,alttrk xchg ;MOVLOP (de) = source, (hl) = dest push b lxi b,4 call movbyt ;Move alternate sector info in correct*** message:mov a,m ;Get a character of the message inx h ;Bump text pointer ora a ;Test for end rz ;Return if don inx h ;Point to LSB of alternate track lda buftrk ;Pick up LSB of buffer track cmp m jnz altmis inx h ;Point to MS * * in (hl). * * * ***************************************************************** retdph mov l,a ;Move lv c,a ;Move drive into (c) for speed in search all: xchg lhld badptr ;Get bad map pointer xchg ; -> (de) mov a,d ;Ch jpo z80mov ;Yes, Its a Z80 so use block move m8080: ldax d ;Get a byte of source mov m,a ;Move it inx d ;Bump poin e push h ;Save pointer to text mov c,a ;Output character in C call ocout ;Output the character pop h ;Restore the po data length ***************************************************************** * * * Device Specification Table for ource control bit, high = disk hdwprt equ 08h ;Write protect a drive ; Result port (51) retry equ 02h ;Retry flag  minutes for disk ready lxi h,0 hdtdel: dcx h mov a,h ora l cz dcrc jz zret ;Drive not ready error in hdstat ;Tdskomp equ hdorg+2 ;Seek complete clear port (on HDC4) hdfunc equ hdorg+2 ;Function port hddata equ hdorg+3 ;Data port sector map hdtran: mov h,b ;Sector translation is handled via mov l,c ; physical sector header skewwing inx h retinter jmp message ;Continue until null reached ***************************************************************** * HDCA controller driver * * * ***************************************************************** hddst: db maxhd*hdlo; Command port (51) idbuff equ 0 ;Initialize data buffer pointer rsect equ 1 ;Read sector wsect equ 5 ;Write sector est if ready yet ani drvrdy jnz hdtdel if not fujitsu lxi h,0 ;Time one revolution of the drive mvi c,index in h ; Status port (50) tkzero equ 01h ;Track zero opdone equ 02h ;Operation done complt equ 04h ;Seek complete tmout e hdldrv: sta hdcur ;Save logical disk call divlog ;Divide by logical disks per drive mov a,c sta hddisk ;Save new * * The following code is for the Diskus Hard disk * * * ***********************************************************g ;Number of logical drives dw donop ;No warm boot for INSTALL dw hdtran ;Sector translation dw hdldrv ;First time isbuff equ 8 ;Initialize header buffer pointer ; Function port (52) pstep equ 04h ;Step bit nstep equ 0ffh-pstep ;Stdstat ana c mov b,a ;Save current index level in B hdinxd1:in hdstat ana c cmp b ;Loop untill index level changes qu 08h ;Time out wfault equ 10h ;Write fault drvrdy equ 20h ;Drive ready index equ 40h ;Delta index ; Control port physical drive call hdptr ;Get track pointers mov a,m ;Get current track inr a ;Check if -1 jnz hdl2 ;Nope, all****** if hdc3 ne 0 ;Want HDC3 or 4 controller included ? hdorg equ 50h ;Hard Disk Controller origin hdstat equ hdoselect dw hddrv ;General select dw hdhome ;Home current selected drive dw hdseek ;Seek to selected track dw hdsec ep bit mask null equ 0fch ;Null command ; Misc constants hdrlen equ 4 ;Sector header length seclen equ 512 ;Sector jz hdinxd1 hdindx2:inx h in hdstat ;Start counting untill index returns to ana c ; previous state cmp b jnz hdindx (50) hdfren equ 01h ;Enable external drivers hdrun equ 02h ;Enable controllers state machine hdclok equ 04h ;Clock sready accessed ori null ;Select drive out hdfunc mvi a,hdfren+hdclok ;Enable drivers out hdcntl mvi c,239 ;Wait 2rg ;Disk Status hdcntl equ hdorg ;Disk Control hdreslt equ hdorg+1 ;Disk Results hdcmnd equ hdorg+1 ;Disk Commands h ;Select sector dw hddma ;Set DMA address dw hdread ;Read a sector dw hdwrite ;Write a sector dw nobad ;No bad  2 if m10 ;Memorex M10's have 40 ms head settle dad h ;HL*2 endif if m26 ;Shugart M26's have 30 ms head settle  out hdfunc ;Output low step line ori pstep ;Set step line high out hdfunc ;Output high step line dcr b ;Update ry:lhld settle ;Get hddelay deloop: dcx h ;Wait 20ms mov a,h ora l inx h dcx h jnz deloop ret endif hdseek:seclen/4 lhld hdadd in hddata in hddata rtloop: in hddata ;Move four bytes mov m,a inx h in hddata mov m,a indd2: mov a,c sta hddisk ;Select the drive ori null out hdfunc mvi a,hdfren+hdrun+hdclok+hdwprt ;Write protect out hdi a,0e0h ;Get the head number ana c rlc rlc rlc sta head ;Save the head number getspt: mvi a,hdspt ret else xra a ;HL/2 + HL (same as HL*1.5) mov a,h rar mov d,a mov a,l rar mov e,a dad d endif shld settle ;Savepeat count jnz sloop ;Keep going the required # of tracks jmp wsdone hddma: mov h,b ;Save the DMA address mov l,c  call hdptr ;Get pointer to current track mov e,m ;Get current track mov m,c ;Update the track mov a,e ;Need to sex h in hddata mov m,a inx h in hddata mov m,a inx h dcr b jnz rtloop ret hdwrite:call hdprep ;Prepare heacntl ret hdhome: call hdptr ;Get track pointer mvi m,0 ;Set track to zero in hdstat ;Test status ani tkzero ; hdsec: mov a,c call divspt adi hdspt ana a cz getspt sta hdsect mov a,c sta head getspt: mvi a,hdspt dcr c e the count for timeout delay endif call hdhome hdl2: lda hdcur ;Load logical drive lxi d,dphhd0 ;Start of hard di shld hdadd ret wsdone: in hdstat ;Wait for seek complete to finish ani complt jz wsdone in hdskomp ;Clear sdoneek at all ? sub c rz cmc ;Get carry into direction jc hdtrk2 cma inr a if fujitsu hdtrk2: jmp accok else hdder rc xra a out hdcmnd lhld hdadd mvi b,seclen/4 wtloop: mov a,m ;Move 4 bytes out hddata inx h mov a,m ouAt track zero ? rz ;Yes if not fujitsu hdstepo:in hdstat ;Test status ani tkzero ;At track zero ? jz hddelay  ret divspt: mvi c,0 divsx: sui hdspt rc inr c jmp divsx endif hdread: call hdprep rc xra a out hdcmnd csk DPH's mvi c,3 ;Hard disk sector size equals 512 bytes jmp retdph dcrc: dcr c ;Conditional decrement C routine re bit on an HDCA4 ret if m26 hdsec: mvi a,01fh ;For compatibility with IBIOS revs. ; 2.3 and 2.4 ana c ;Mask trk2: call accok jmp hddelay endif accok: mov b,a ;Prep for build call build sloop: ani nstep ;Get step pulse low t hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h dcr b jnz wtloop mvi a,wsect ;Issue write mvi a,1 stc call accok ;Take one step out jmp hdstepo else xra a jmp accok endif if not fujitsu hddelama out hddata out hddata mvi a,rsect ;Read sector command out hdcmnd call process rc xra a out hdcmnd mvi b,t divlog: mvi c,0 divlx: sui hdlog rc inr c jmp divlx hddrv: sta hdcur call divlog ;Get the physical drive # hin sector number (0-31) cz getspt ;Translate sector 0 to sector 32 sta hdsect ;Save translated sector number (1-32) mv  sector command out hdcmnd call process rc mvi a,wfault ana b stc rz xra a ret process:in hdstat ;Wait fo * * controller. If the controller is non standard (0F800H) * * only the FDORIG equate need be changed. * * * ***** disk hdadd: dw 0 ;DMA address hddisk: db 0 ;Current physical disk number head: db 0 ;Current physical head number hds equ fdorig+400h ;Disk Jockey 2D RAM address dblsid equ 20h ;Side bit from controller io equ fdorig+3f8h ;Start of I/O regb,80h jz zkey mvi b,0 zkey: lda hdsect ;Form sector byte out hddata mov a,b out hddata mvi a,hdfren+hdrun+hdclok u fdorig+12h ;Disk Jockey 2D set DMA address fdread equ fdorig+15h ;Disk Jockey 2D read routine fdwrite equ fdorig+18h ;Disr command to finish mov b,a ani opdone jz process mvi a,hdfren+hdrun+hdclok ;Write protect out hdcntl in hdstat an************************************************************ if maxfd ne 0 ;Include Discus 2D ? fdorig equ 0f800H ;Origiect: db 0 ;Current physical sector number hdtrak: db 0ffh ;Track pointer for each drive db 0ffh ;All drive default toisters dreg equ io+1 cmdreg equ io+4 clrcmd equ 0d0h ***************************************************************** * ;Write protect out hdcntl mvi a,hdfren+hdrun+hdclok+hdwprt ;Write protect out hdcntl xra a ret hdptr: lhld hddisk k Jockey 2D write routine fdsel equ fdorig+1bh ;Disk Jockey 2D select drive routine fdtstat equ fdorig+21h ;Disk Jockey 2D ti tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ret hdprep: in hdstat ann of Disk Jockey PROM fdboot equ fdorig+00h ;Disk Jockey 2D initialization fdcin equ fdorig+03h ;Disk Jockey 2D character in an uncalibrated db 0ffh ; state (ff) db 0ffh settle: dw 0 ;Time delay constant for head settle endif ****** * * Device Specification Table for the Disk Jockey 2D/B * * * ************************************************ ;Get a pointer to the current drives mvi h,0 ; track position xchg lxi h,hdtrak dad d ret build: lda head ;Berminal status routine fdstat equ fdorig+27h ;Disk Jockey 2D status routine fderr equ fdorig+2ah ;Disk Jockey 2D error, flasi drvrdy stc rnz mvi a,isbuff ;Initialize pointer out hdcmnd call build ori 0ch out hdfunc lda head out hddatput routine fdcout equ fdorig+06h ;Disk Jockey 2D character out routine fdhome equ fdorig+09h ;Disk Jockey 2D track zero see*********************************************************** * * * The following equates relate the Morrow Designs 2D/B ***************** fddst: db maxfd ;Number of logical drives dw donop ;No warm boot for INSTALL dw fdtran ;Sector truild a controller command byte ral ral ral ral lxi h,hddisk ora m xri 0f0h ret hdcur: db 0 ;Current logicalh led fdden equ fdorig+2dh ;Disk Jockey 2D set density routine fdside equ fdorig+30h ;Disk Jockey 2D set side routine fdrama ;Form head byte call hdptr ;Get pointer to current drives track mov a,m ;Form track byte out hddata ana a mvi k fdseek equ fdorig+0ch ;Disk Jockey 2D track seek routine fdsec equ fdorig+0fh ;Disk Jockey 2D set sector routine fddma eq anslation dw fdldrv ;Select drive 1 dw fdsel2 ;Select drive 2 dw fdlhome ;Home drive dw fdseek ;Seek to specifie mvi a,(jmp) clopp: cmp m ;Must have 17 jumps jnz zret inx h inx h inx h dcr b jnz clopp lxi d,fdinit ;Initialidea ;Single sided pop psw ;Retrieve adjusted sector pop b cma ;Make sector request positive inr a mov c,a ;M;HL <- &DPH.DPB push h call fdgsid ;Get pointer to side flag table entry lda fdldst ;Get drive status ani dblsid ;ov a,m inx h mov h,m mov l,a mov a,m ;Get # of CP/M sectors/track ora a ;Clear carry rar ;Divide by two subread sta rdwr call fill ;Fill in buffer with sector jc zret ;Test for error return call fdstat ;Get status on currd track dw fdssec ;Set sector dw fddma ;Set DMA address dw fdread ;Read a sector dw fdwrite ;Write a sector dwization sequence lxi h,fdorig+7e2h ;Load address lxi b,30 ;Byte count call movbyt ;Load controller RAM mvi a,0ffh ake new sector the requested sector pop d call sideone mvi a,80h ;Side two bit ora h ; and sector mov h,a ret Check double sided bit mov m,a ;Save sides flag lxi d,dpb128s ;Base for single sided DPB's jz sideok lxi d,dpb128d ; c ;Subtract sector number push psw ;Save adjusted sector jm sidetwo sidea: pop psw ;Discard adjusted sector pop b ent drive sta fdldst ;Save drive status ani 0ch ;Mask in sector size bits push psw ;Used to select a DPB rar lxi nobad ;No bad sector map ***************************************************************** * * * Floppy disk warm ;Start 1791 sta dreg mvi a,clrcmd ;1791 reset sta cmdreg mvi a,1 ;Set 2D initialized flag sta flopflg flopok: c fdldrv: sta fdlog ;Save logical drive mov c,a ;Save drive # mvi a,0 ;Have the floppies been accessed yet ? flopflg eBase of double sided DPB's sideok: xchg pop d ;(HL) -> DPB base, (DE) -> &DPH.DPB pop psw ;Offset to correct DPB ral  ;Restore sector requested pop d ;Restore address of xlt table sideone:xchg ;hl <- &(translation table) dad b ;bc = h,xlts ;Table of XLT addresses mov e,a mvi d,0 dad d push h ;Save pointer to proper XLT call fdget ;Get pointer boot loader * * * ***************************************************************** fdtran: inx b push d ;Sall flush ;Flush buffer since we are using it lda fdlog ;Select new drive mov c,a call fdsel call fdlhome ;Recalibqu $-1 ana a jnz flopok mvi b,17 ;Floppies havn't been accessed lxi h,fdboot ;Check if 2D controller is installed  ral ;Make 0, 10, 20, 30 mov c,a mvi b,0 ;Make offset dad b ;(hl) is now a DPB pointer xchg ;Put proper DPB a offset into table mov l,m ;hl <- physical sector mvi h,0 ret sidetwo:call fdgsid ;Check out number of sides jz s to proper DPH pop d lxi b,2 ;Copy XLT pointer into DPH call movbyt lxi d,8 ;Offset to DPB pointer in DPH dad d ave table address push b ;Save sector # call fdget ;Get DPH for current drive lxi d,10 ;Load DPH pointer dad d mrate the drive lxi h,1 ;Select sector 1 of track 2 shld truesec inx h shld cpmtrk xra a ;Make sure we are doing a  ddress in DPH.DPB mov m,e inx h mov m,d lxi h,15 ;Offset to DPB.SIZ dad d mov c,m ;Fetch sector size code fdget***** * * * Xlts is a table of address that point to each of the xlt * * tables for each sector size. * * ack address db 9 ;Drive 3 parameters db 0ffh ;Drive 3 track address db 9 ;Current parameters db 0 ;Side desired ,20 db 33,34,35,36,49,50,51,52 db 5,6,7,8,21,22,23,24 db 37,38,39,40,53,54,55,56 db 9,10,11,12,25,26,27,28 db 41,42,43r entry pop d mov a,m ;Set up flags ora a ret fdinit: dw 0 ;Initialization bytes loaded onto 2D/B dw 1800h ;Hon ske tabl * * fo eac o th possibl secto sizes. * * * **************************************************: lda fdlog ;Return proper DPH lxi d,dphfd0 jmp retdph fdsel2: sta fdlog mov c,a jmp fdsel fdlhome:mvi c,0 ;Se* ***************************************************************** xlts: dw xlt128 ;Xlt for 128 byte sectors dw xlt256  db 1 ;Sector desired db 0 ;Track desired db 0 ;Header image, track db 0 ;Sector db 0 ;Side db 0 ;Secto,44,57,58,59,60 db 13,14,15,16,29,30,31,32 db 45,46,47,48 xlt124: db 0 db 1,2,3,4,5,6,7,8 db 25,26,27,28,29,30,31,32 ead loaded timeout dw 0 ;DMA address db 0 ;Double sided flag db 0 ;Read header flag db 07eh ;Drive select consta*********************** xlt128: db 0 db 1,7,13,19,25 db 5,11,17,23 db 3,9,15,21 db 2,8,14,20,26 db 6,12,18,24 db lect side 0 call fdside jmp fdhome ;Do actual home fdssec: push b ;Save sector number mov a,b ;Check side select  ;Xlt for 256 byte sectors dw xlt512 ;Xlt for 512 byte sectors dw xlt124 ;Xlt for 1024 byte sectors ****************r dw 0 ;CRC fdlog: db 0 fdldst: db 0 ;Floppy drive status byte fdlsid: rept maxfd db 0ffh ;Number of sides on e db 49,50,51,52,53,54,55,56 db 9,10,11,12,13,14,15,16 db 33,34,35,36,37,38,39,40 db 57,58,59,60,61,62,63,64 db 17,18,19nt db 0 ;Drive number db 8 ;Current disk db 0 ;Head loaded flag db 9 ;Drive 0 parameters db 0ffh ;Drive 0 tr4,10,16,22 xlt256: db 0 db 1,2,19,20,37,38 db 3,4,21,22,39,40 db 5,6,23,24,41,42 db 7,8,25,26,43,44 db 9,10,27,28,4bit rlc ;Move high bit to bit zero ani 1 mov c,a call fdside ;Call select side 0/1 pop b jmp fdsec fdgsid: l********************************************************* * * * Xl table (secto ske tables fo CP/ 2.2 Thes tach drive 0/1 endm endif if (maxfd ne 0) or (maxdm ne 0) ************************************************************,20,21,22,23,24 db 41,42,43,44,45,46,47,48 ************************************************************************* * ack address db 9 ;Drive 1 parameters db 0ffh ;Drive 1 track address db 9 ;Drive 2 parameters db 0ffh ;Drive 2 tr5,46 db 11,12,29,30,47,48 db 13,14,31,32,49,50 db 15,16,33,34,51,52 db 17,18,35,36 xlt512: db 0 db 1,2,3,4,17,18,19xi h,fdlsid ;Side flag table lda fdlog ;Drive number push d mov e,a ;Make offset mvi d,0 dad d ;Offset to propeable * * defin th secto translatio tha occur whe mappin CP/ * * sector t physica sector o th disk Ther i   * * Each of the following tables describes a diskette with the * * specified characteristics. * * * ************************************************************************* * * * The following DPB defines a diskette as 102;256 byte sectors ************************************************************************* * * * The following DPBided. * * * ************************************************************************* dpb256d:dw 104 ;CP/M seS dw 2 ;OFF db 1 ;128 byte sectors ************************************************************************* * ngle density, and double sided. * * * ************************************************************************* ******************************************************************** ********************************************************4 byte sectors, * * double density, and single sided. * * * **************************************************** defines a diskette as 512 byte sectors, * * double density, and single sided. * * * ***************************ctors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 486 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64  * * The following DPB defines a diskette for 256 byte sectors, * * double density, and single sided. * * * * dpb128d:dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0***************** * * * Th followin DP define diskett fo 12 byt sectors * * singl density an singl s********************* dp1024s:dw 64 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 299 ;DSM dw 127********************************************** dpb512s:dw 60 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM;CKS dw 2 ;OFF db 2 ;256 byte sectors ************************************************************************* * ************************************************************************ dpb256s:dw 52 ;CP/M sectors/track db 4 ;BSH  db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 1 ;128 byte sectors ******************************************************ided. * * * ************************************************************************* dpb128s:dw 26 ;CP/M sec ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 4 ;1024 byte sectors ***************************** dw 280 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 3 ;512 byte sectors ***** * * The following DPB defines a diskette as 512 byte sectors, * * double density, and double sided. * * * db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 2 ******************* * * * The following DPB defines a diskette as 256 byte sectors, * * double density, and double stors/track db 3 ;BSH db 7 ;BLM db 0 ;EXM dw 242 ;DSM dw 63 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 16 ;CK******************************************** * * * The following DPB defines a diskette for 128 byte sectors, * * si  ************************************************************************* dpb512d:dw 120 ;CP/M sectors/track db 4 ;BSH of tracks setlog equ 2eh ;Set logical drives readm equ 0a0h ;Read from controller memory writem equ 0a1h ;Write to conu 20h ;Read sector command wrsect equ 21h ;Write a sector command gstat equ 22h ;Get drive status dmsdma equ 23h ;Set ;Save sector # call dmget lxi d,10 dad d mov a,m inx h mov h,m mov l,a mov a,m ;Get # of CP/M sectors/track  ;EXM dw 599 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 4 ;1024 byte sectors Number of logical drives dw donop ;No warm boot for INSTALL dw dmtran ;Sector translation dw dmldrv ;Select drive 1  db 15 ;BLM db 0 ;EXM dw 561 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 3troller memory dmfstp equ 3*341/10 ;Fast stepping rate = 3 ms * 34.1 dmfset equ 15*341/10 ;Fast settling rate = 15 ms * 34 DMA address intrqc equ 24h ;Set Interrupt request dmhaltc equ 25h ;Halt command bracha equ 26h ;Channel branch setcha ora a ;Clear cary rar ;Divide by two sub c push psw ;Save adjusted sector jm dmside2 dmsidea:pop psw ;Discard endif ***************************************************************** * * * The following equates relate the Mor dw dmselr ;Select drive 2 dw dmhome ;Home drive dw dmseek ;Seek to specified track dw dmssec ;Set sector dw dm ;512 byte sectors ************************************************************************* * * * The following .1 n$dubl equ 80h ;Double density n$2side equ 40h ;2 sided drive serin equ 03eh ;Address of serial input data ** equ 27h ;Set channel address setcrc equ 28h ;Set CRC retry count rdtrck equ 29h ;Read track command wrtrck equ 2ah ; adjusted sector pop b ;Restore sector requested pop d ;Restor address of xlt table dmside1:xchg ;hl <- &(translatiorow Designs DJDMA * * controller. * * * ***************************************************************** idma ;Set DMA address dw dmread ;Read a sector dw dmwrite ;Write a sector dw nobad ;No bad sector map dmselr: stDPB defines a diskette as 1024 byte sectors, * * double density, and double sided. * * * ************************************************************************************** * * * Device Specification Table for the Disk Jockey DMWrite track command serout equ 2bh ;Serial console ouput senabl equ 2ch ;Enable serial input trksiz equ 2dh ;Set numbern table) dad b ;bc = offset into table mov l,m ;hl <- physical sector mvi h,0 ret dmside2:call dmstat ani 20h f (maxdm ne 0) or (maxmf ne 0) dmchan equ 50h ;Default channel address dmkick equ 0efh ;Kick I/O port address rdsect eqa dmlog mvi b,0 ;8 inch logical drives start at zero jmp dmsel2 dmtran: inx b push d ;Save table address push b ************************************************** dp1024d:dw 128 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 A floppy * * * ***************************************************************** if maxdm ne 0 dmdst: db maxdm ;  jz dmsidea pop psw ;Retrieve adjusted sector pop b cma ;Make sector request positive inr a mov c,a ;Make new se,l dad h dad h dad d lxi d,dparam+1 ;Parameter table address dad d ;Skip the track size byte mvi m,0 ;Force re<- &DPH.DPB pop d ;Restore DE (pointer into DPH) pop psw ;Offset to correct DPB ral ral mov c,a mvi b,0 dad b tors start at zero lda dblflg ;Get double sided flags ora a jz dmssec ;Nope, single sided mvi b,80h ;Set high bit  lxi h,xlts ;Table of XLT addresses mov e,a mvi d,0 dad d push h ;Save pointer to proper XLT call dmget pop d ***************************************************************** if maxmf ne 0 mfdst: db maxmf ;Number of logical drivesector the requested sector pop d call dmside1 mvi a,80h ;Side two bit ora h ; and sector mov h,a ret dmldrv: paramitization of this drive inx h ;Offset to the Stepping rate constant mvi m,(low dmfstp) ;Fast stepping rate constant  xchg ;Put DPB address in DPH mov m,e inx h mov m,d lxi h,15 dad d mov c,m dmget: lda dmlog lxi d,dphdm0 jmfor double sided select jmp dmssec dblflg: db 0 mfseek: xra a ;Clear double sided select sta dblflg lda mfpcon alxi b,2 ;Number of bytes to move call movbyt ;Move the address of XLT lxi d,8 ;Offset to DPB pointer dad d ;HL <-  dw donop ;No warm boot for INSTALL dw mftran ;Sector translation dw mfldrv ;Select drive 1 dw mfsel2 ;Select drsta dmlog call dminit ;Test for a drive jc zret lxi h,1 ;Select sector 1 of track 2 shld truesec inx h shld cpmt inx h mvi m,(high dmfstp) lxi d,5 ;Skip over the reserved fields dad d mvi m,(low dmfset) ;Fast settling rate constp retdph ; ; The current drive is double sided. Thus is it safe to set the ; stepping rate to 3 ms with 15 ms settling. ;ni n$2side jz dmseek ;Only single sided mov a,c ;Move selected track in (a) sbi 35 ;Subtract by track by number of&DPH.DPB push h call dmstat ani 20h ;Check double sided bit lxi d,dpb128s ;Base for single sided DPB's jz dmsok cive 2 dw dmhome ;Home drive dw mfseek ;Seek to specified track dw mfssec ;Set sector dw dmdma ;Set DMA address rk xra a ;Make sure we are doing a read sta rdwr call fill ;Flush buffer and refill jc zret ;Test for error returnant inx h mvi m,(high dmfset) call dmparm ;Set drive parameters for the SA850 ret endif *********************** sethigh:lhld dmlog ;Get the current drive number mvi h,0 dad h ;Ten bytes per parameter table entry mov d,h mov  tracks jc dmseek ;Less than track 35 mov d,a ;Save adjusted track number mvi a,34 sub d ;Adjust to count tracksall sethigh ;Set controller for fast steping lxi d,dpb128d ;Base of double sided DPB's dmsok: xchg ;HL <- DBP base, DE  dw dmread ;Read a sector dw dmwrite ;Write a sector dw nobad ;No bad sector map mfssec: dcr c ;Minnie floppy sec call dmstat ;Get status on current drive ani 0ch ;Mask in sector size bits push psw ;Used to select a DPB rar ****************************************** * * * Drive specification table for DJDMA 5 1/4 inch drives * * *   back out mov c,a ;Resave new track number mvi a,0ffh ;Set double sided flag sta dblflg jmp dmseek mfsel2: sta ) mfl2: mov a,m ;Get an entry ora a ;Check for end of the table jz zret ;Yes, select error cmp c ;Check if entry n byte lxi h,1 shld cpmtrk ;Load track 1 sector 1 call fill ;DJDMA firmware returns single density jc zret ; stab 90h ;North Star CP/M 1.4 db n$dubl ;Double density, 35 tracks, two sided dw dpbmf1 ;1K groups db 0b0h ;North Sr equal 0 ret mfldrv: sta mflog call dminit ;Test for a controller jc zret lda mflog ;Get proper physical confi pop d mov m,e ;Store DPB address in DPH inx h mov m,d call mfgdph push h call dmstat ;Get status pop h anmflog mov c,a ;Get proper physical configuration byte mvi b,0 lxi h,mfscon dad b mov a,m sta mfpcon mov a,c matches selected drive jz mfl3 inx h ;Skip onfiguration byte inx h ;Skip drive type inx h ;Skip DPB address inx tus on track 0 pop psw ora a jnz mfl9 ;Non zero mvi a,90h ;Double density default configuration call dmstat tar CP/M 2.x db n$dubl ;Double density, 35 tracks, one sided dw dpbmf2 ;2K groups db 0f0h ;North Star CP/M 2.x dguration byte mov c,a mvi b,0 lxi h,mfscon dad b mvi a,n$dubl mov m,a sta mfpcon lxi h,1 ;Select sector 1 ofi 80h ;Check density bit mvi c,3 ;512 byte sectors rnz mvi c,2 ;256 byte sectors ret mfgdph lda mflog lxi d,d;Shhh, pretend that nothing happened mvi b,4 ;5 1/4 inch drives start at drive 4 jmp dmsel2 mftran: lda mfpcon ani h jmp mfl2 mfl3: inx h mov a,m ;Pick up drive type sta mfpcon mov e,a push h lda mflog ;Get proper physical;If zero then determine sector size ani 80h ;Check density bit jnz mfl9 ;Its double density mvi a,10h ;Single densitb n$dubl+n$2side ;Double density, 35 tracks, two sided dw dpbmf3 ;2K groups db 0e5h ;North Star CP/M 1.4 db n$dubl  track 0 shld truesec dcx h shld cpmtrk xra a ;Make sure we are doing a read sta rdwr call fill ;Flush buffer anphmf0 jmp retdph mfpcon: db 0 ;Physical configuration byte mflog: db 0 mfscon: db 0, 0, 0, 0 ;Saved physical configun$dubl lxi h,mfxltd ;Point to double sided sectran table jnz mftdubl ;Single density sector translation lxi h,mfxlts m configuration byte mov c,a mvi b,0 lxi h,mfscon dad b mov m,e pop h inx h mov a,m inx h mov h,m mov l,ay configuration byte mfl9: mov c,a ;Move configuration byte into (c) lxi h,mfs ;Address of configuration table -> (hl ;Double density, 35 tracks, one sided dw dpbmf1 ;1K groups db 0a0h ;North Star CP/M 2.x (fake 40 track) db n$dubld refill jc zret ;Test for error return lda buffer+5ch ;Get diskette configuration byte push psw ;Save configuratioration bytes mfs: db 10h ;North Star CP/M 1.4 db 0 ;Single density, 35 tracks, one sided dw dpbmf0 ;1K groups dftdubl:dad b ;Add offset sector number to table mov l,m ;Pick up sector number from table mvi h,0 ;MSB of sector numbe ;DPB address -> (hl) push h ;Save DPB address call mfgdph ;Get DPH lxi d,10 ;Offset to DPB address in DPH dad d  ;Double density, 35 tracks, one sided dw dpbmf2 ;2K groups db 0d0h ;North Star CP/M 2.x (fake 40 track) db n$duble parameters call dmparm pop h dcx h ;Back to start of command mvi m,setcrc ;Disable monitor inx h mvi m,1 xra yte first inx h mov m,b ;High byte next docmd xra a inx h mov m,a docmd2 inx h mvi m,dmhaltc inx h mov m,a  ;Halt status offset call dmdoit pop d ;Retrieve the table pointers pop h dmstr1: lxi b,10 ;Bump parameter table nes for the DJDMA with 8 and 5 1/4 inch drives * * * ***************************************************************** t fiddle around push h ;Save the parameter table pointer push d ;Save the controllers table pointer dcr m ;Set to ca+n$2side ;Double density, 35 tracks, two sided dw dpbmf3 ;2K groups db 0 ;End of configuration table mfxltd db 1,a jmp docmd2 ;Do command ; ; Set floppy drive parameters ; ; This routine reads the dparam table and if the a drive ha out dmkick tests ora m jz tests ret dminit: lxi h,dmchan ;See if controller will halt mvi m,dmhaltc inx h mvi m,pointer dad b xchg lxi b,16 ;Bump controller tables pointer dad b xchg pop psw ;Retrieve drive count dcr a  dmsel2: mov c,a ;Move drive into (c) lxi h,dmchan mvi m,setlog ;Set logical drives inx h mov m,b ;Drive in (b) librated mode (0ffh) dcx h ;Back up to the track size byte shld dmntrk ;Set the number of tracks pointer inx h inx h 2, 3, 4 db 21,22,23,24 db 5, 6, 7, 8 db 25,26,27,28 db 9,10,11,12 db 29,30,31,32 db 13,14,15,16 db 33,34,35,36 s not ; previously been calibrated then that drives track count, ; stepping rate, and head settling time are loaded. ; dmp0 out dmkick ;Start controller lxi d,0 ;Set up timeout counter dminwt mov a,m ora a jnz dmiok ;Controller has res ;Bump count jnz dmstr0 ;Set up next drive ret dmhome xra a mov c,a ;Put a zero into (c) for track zero dmseek push b call docmd pop b jmp dmsel dmssec: push b ;Save sector number mov a,b rlc ani 1 mov c,a call dmside shld dmspar ;Set the stepping constants pointer xchg ;Set the local parameter table pointer shld dmloc0 inx h ;O db 17,18,19,20 db 37,38,39,40 mfxlts db 1, 2 db 3, 4 db 5, 6 db 7, 8 db 9,10 db 11,12 db 13,14 db 15,1arm: mvi a,8 ;Eight drives lxi d,1340h ;Start with drive 0's table lxi h,dparam+1 ;Drive parameter table dmstr0: pusponded dcx d ;Bump timeout counter mov a,d ora e jnz dminwt stc ;Set error flag ret dmiok push h ;Set driv mov a,c ;Enter with track in (c) sta lltrk ;Save for use later ret dmsec lda llss ;Load sector ani 80h ;Save s pop b jmp dmsec dmdma lxi h,dmchan ;Default channel address mvi m,dmsdma ;Set DMA address inx h mov m,c ;Low bffset to the stepping parameters inx h inx h inx h shld dmloc1 lxi h,dmwcon ;Write the drive constants out lxi d,176 db 17,18 db 19,20 endif ***************************************************************** * * * Common routih psw ;Save the drive count mov a,m ;Load flags ora a ;Does the drive need to be calibrated? jnz dmstr1 ;No, do no ide select bit stores ora c sta llss ret dmside: mov a,c ;Move side bit into (a) ani 1 rrc ;Move around to bit 0 ora c ret dmwrite mvi a,wrsect db 01 ;Ugh... dmread mvi a,rdsect lxi h,dmchan lxi d,lltrk-1 mvi b,4 cload mto drive mov a,m ;Load drive ora c ani 4 ;Mask upper drive select bit for 5 1/4 rlc rlc ;Move to bit 4 ora m b 0 llss db 1 lldrv db 0 dmlog db 0 endif ***************************************************************** * ---------------+ | | | ; Sector size LSB ---------------------+ | | ; Drive select MSB -----------------------+ | ; Dristatus indicator out dmkick ;Start the controller dmwait: ora m ;Wait for the operation complete status jz dmwait 7 mov c,a ;Resave in (c) lda llss ani 7fh ;Mask out old side select bit jmp stores dmsel: mov a,c ;Move drive iov m,a inx h inx d ldax d dcr b jnz cload dcx h call docmd lda dmchan+4 cpi 80h cmc ret ; ; Execute a  ;Put together with lower drive bits ora c mov c,a inx h mvi a,10h ;Double density bit ana m rlc ;20h rlc * * The follwing equates are for the HDDMA hard disk controller * * * ************************************************ve select LSB --------------------------+ ; dmstat lxi h,dmchan mvi m,gstat ;Set up read status inx h lda lldrv ;G ret dmwcon: db writem ;Write track size dmntrk: dw 0 ;Number of tracks + desync db 0 ;X-address dw 2 ;Two bytnto (a) sta lldrv dmden: ret ;Double density only ; ; Return status in the (a) register in the form: ; ; 7 6 5 DJDMA command, no command status is returned ; ; Entry: ; DE = offset to the halt status ; HL = pointer to the start of th ;40h rlc ;80h for density bit ora c mov c,a inx h mvi a,3 ;Sector length mask ana m ;And in rlc ;Move t***************** if maxmw ne 0 ;HDDMA controller present ? if st506 ;Specifications for a Seagate Technology 506 cyl eqet last selected drive mov m,a ;Store drive in command inx h ;Skip over returned status inx h inx h call docmd ;es dmloc0: dw 0 ;Local controller address db writem ;Write stepping rate data dmspar: dw 0 ;Pointer to the stepping 5 3 2 1 0 ; ^ ^ ^ ^ ^ ^ ^ ^ ; Density --------------+ | | | | | | | ; Side select -------------+ | | |e command ; ; Returns: ; nothing ; dmdoit: mvi a,bracha ;Branch channel command sta dmchan shld dmchan+1 ;Load como bits 2 & 3 rlc ora c mov c,a inx h mvi a,4 ;Mask for double sided bit ana m rlc ;8 rlc ;10 rlc ;2u 153 ;Number of cylinders heads equ 4 ;Number of heads per cylinder precomp equ 64 ;Cylinder to start write precomensationIssue command lda llss ;Get side bit of last operation ani 80h rrc ;Move to bit 7 mov c,a lxi h,dmchan+1 ;Point parameters db 0 dw 8 dmloc1: dw 0 db dmhaltc ;Controller halt db 0 ;Status ; ; Driver variables ; lltrk d | | | ; Double sided ---------------+ | | | | | ; 5 1/4 -------------------------+ | | | | ; Sector size MSB ---mand vector xra a ;Clear extended address sta dmchan+3 dad d ;Offset to the halt status mov m,a ;Clear the halt   lowcurr equ 128 ;Cylinder to start low current stepdly equ 30 ;Step delay (0-12.7 milliseconds) steprcl equ 30 ;Recalibra********************************************* mwdst: db maxmw*mwlog ;Number of logical drives dw donop ;No warm boot for Il address stepout equ 10h ;Step direction out stepin equ 0 ;Step direction in band1 equ 40h ;No precomp, high current ban;Home drive lxi d,dphmw0 ;Start of hard disk DPH's lda mwcurl mov l,a mvi h,0 dad h dad h dad h dad h dad d sectors ; 3 = 512 byte sectors ; 7 = 1024 byte sectors (default) ; f = 2048 byte sectors ;Define controll**************************** * * * The following are the lowest level drivers for the Morrow * * Designs Hard Disk DMAte step delay headdly equ 0 ;Settle delay (0-25.5 milliseconds) endif if st412 ;Specifications for a Seagate ST412 cylNSTALL dw mwtran ;Sector translation dw mwldrv ;Select logical drive 1 (First time select) dw mwdrv ;Select logical drid2 equ 0c0h ;Precomp, high current band3 equ 80h ;precomp, low current track0 equ 1 ;Track zero status wflt equ 2 ;Write  ;(hl) = pointer to DPH mvi c,4 ;Return sector size of 1024 ret mwdrv sta mwcurl call mwdlog mov a,c sta mwdrive er commands dmaread equ 0 ;Read sector dmawrit equ 1 ;Write sector dmarhed equ 2 ;Find a sector dmawhed equ 3 ;Write hea controller. * * * ***************************************************************** mwldrv sta mwcurl ;Save cur equ 306 heads equ 4 precomp equ 128 lowcurr equ 128 stepdly equ 0 steprcl equ 30 headdly equ 0 endif if cm5619 ;Spve 2 (General select) dw mwhome ;Home current selected drive dw mwseek ;Seek to selected track dw mwsec ;Select sector fault from drive dready equ 4 ;Drive ready sekcmp equ 8 ;Seek complete **************************************************;Save new selected drive mwsel mvi a,dmanoop jmp mwprep ;Execute disk command mwdlog: mvi c,0 mwllx: sui mwlog rc inders (format a track) dmalcon equ 4 ;Load disk parameters dmassta equ 5 ;Sense disk drive status dmanoop equ 6 ;Null contrrent logical drive call mwreset ;Reset controller card jc zret ;Controller failure lda mwcurl call mwdrv ;Select drecifications for an CMI 5619 cyl equ 306 heads equ 6 precomp equ 128 lowcurr equ 128 stepdly equ 2 steprcl equ 30 headdly dw mwdma ;Set DMA address dw mwread ;Read a sector dw mwwrite ;Write a sector if heads > 2 ;Test if drive is big enou*************** * * * Drive Specification Table for the HD DMA hard disk controller * * * ********************r c jmp mwllx mwstat mvi a,dmassta ;Sense status operation code jmp mwprep ;Execute disk command mwhome call mwreset oller operation reset equ 54h ;Reset controller attn equ 55h ;Send a controller attention chan equ 50h ;Default channeive jc zret ;Select error call mwstat ;Get drive status ani dready ;Check if drive ready jnz zret call mwhome  equ 0 endif sectsiz equ 7 ;Sector size code (must be 7 for this IBIOS) ; 0 = 128 byte sectors ; 1 = 256 byte gh for a bad spot map dw mwbad ;Return bad sector map info else dw nobad endif *************************************  ;Reset controller, do a load constants lxi h,dmarg1 ;Load arguments mvi m,steprcl ;Load step delay (slow rate) inx h mv;Subtract a tracks worth of sectors rc ;Return if all done inr c ;Bump to next head jmp mwdsptx mwreset lhld chan ; mwdrive ora c sta dmasel0 mvi a,dmanoop ;No-operation command for the channel call mwprep ;Step to proper track lxmvi a,dmawrit ;Load disk write command mwprep: sta dmaop ;Save command channel op code mvi c,band1 lhld dmarg0 lxi drack number inx h mov d,m dcx h mov m,c ;Store new track number inx h mov m,b mov l,c ;Build cylinder word movlect register lxi d,5 ;Offset to dmarg1 dad d mvi m,stepdly ;Load step delay inx h mvi m,headdly ;Head settle delay i m,headdly ;Head settle delay call mwissue ;Do load constants again call mwptr ;Get pointer to current cylinder number Save the command channel for a while shld tempb lda chan+2 sta tempb+2 out reset ;Send reset pulse to controller lxi i h,0 ;Clear step counter shld dmastep ret mwdma mov h,b ;Set DMA address mov l,c shld dmadma ret mwsec mov a,,precomp call mwhlcde jc mwpreps mvi c,band2 lxi d,lowcurr call mwhlcde jc mwpreps mvi c,band3 ;cylinder > lo h,b shld dmarg0 ;Set command channel cylinder number mov a,d inr a lxi h,0ffffh jnz mwskip0 mvi c,stepout jmp mw inx h mvi m,sectsiz ;Sector size code inx h mvi m,dmalcon ;Load constants command call mwissue ;Do load constants pomvi m,0ffh ;Fake at cylinder 65535 for max head travel inx h mvi m,0ffh lxi b,0 ;Seek to cylinder 0 call mwseek ;Recah,dmachan ;Address of command channel shld chan ;Default channel address xra a sta chan+2 ;Clear extended address byte c ;Load sector number dcr a ;Range is actaully 0-16 call mwdspt ;Figure out head number -> (c) adi mwspt ;Make sector w_current mwpreps lda mwhead ;Load head address sta dmarg2 cma ;Negative logic for the controller ani 7 ;3 bits of heskip mwskip0:mov h,b ;(hl) = new track, (de) = old track mov l,c call mwhlmde mvi c,stepout mov a,h ani 80h ;Checp h ;Restore the track number shld dmarg0 push psw ;Save status lhld tempb ;Restore memory used for the channel pointerl slowly jmp mwreset ;Back to fast stepping mode mwbad: lxi h,mwbtab ;Return pointer to bad sector location ret mwbta shld bios ;Set up a pointer to the command channel sta bios+2 lhld dmarg0 ;Save the track number push h lxi h,dmasel1number sta mwsectr mov a,c sta mwhead ;Save head number ret mwdspt mvi c,0 ;Clear head counter mwdsptx sui mwspt ad select rlc ;Shove over to bits 2 - 4 rlc ora c ;Add on low current and precomp bits mov c,a lda mwdrive ;Load dk hit bit for negitive direction jnz mwsout ;Step in mvi c,0 jmp mwskip mwsout: call mwneghl mwskip: shld dmastep lda shld chan lda tempb+2 sta chan+2 pop psw ret mwread mvi a,dmaread ;Load disk read command jmp mwprep mwwrite b: dw 0 ;Track 0 dw 19 ;Head 2, sector 0 = (2 * SPT + 0) + 1 mwseek call mwptr ;Get track pointer mov e,m ;Get old t ;Load arguments lda mwdrive ;Get the currently selected drive ori 03ch ;Raise *step and *dir mov m,a ;Save in drive se  rive address ora c ;Slap in drive bits sta dmasel1 ;Save in command channel head select lda mwsectr ;Load sector addresmov a,h cma mov h,a mov a,l cma mov l,a inx h ret mwhlmde:xchg call mwneghl xchg dad d ret mwhlcde:munter (65536 retries) mwiloop mov a,m ;Get status ora a ;Set up CPU flags rm ;Return no error (carry reset) stc rnz******************** cpmsec: dw 0 ;CP/M sector # cpmdrv: db 0 ;CP/M drive # cpmtrk: dw 0 ;CP/M track # truesec:dw 0  pop psw ;Restore error status ret dspout: call spout ;Print two spaces spout: mvi c,' ' ;Print a space jmp pout ress db 0 ;Extended address dmarg0 db 0 ;First argument dmarg1 db 0 ;Second argument dmarg2 db 0 ;Third argument dmargs sta dmarg3 if 0 ;Set to 1 for MW error reporter mwissue call mwdoit ;Do desired operation rnc ;Do nothing if no eov a,h cmp d rnz mov a,l cmp e ret mwtab equ $ ;Collection of track addresses rept maxmw db 0ffh ;Initialize  ;Return error status xthl ;Waste some time xthl xthl xthl dcx d ;Bump timeout counter mov a,d ora e jnz mw;Physical sector that contains CP/M sector error: db 0 ;Buffer's error status flag bufdrv: db 0 ;Drive that buffer belongshexout: push psw ;Poor persons number printer rrc rrc rrc rrc call nibout pop psw nibout: ani 0fh adi '0' cpi 3 db 0 ;Fourth argument dmaop db 0 ;Operation code dmastat db 0 ;Controller status byte dmalnk dw dmachan ;Link address trror push psw ;Save error info call hexout ;Print status call dspout ; and a space lxi h,dmachan mvi c,16 ;16 byto (way out on the end of the disk) db 0ffh endm db 0ffh mwcurl db 0 ;Current logical drive mwdrive db 0ffh ;Currentiloop ;Loop if still busy stc ;Set error flag ret mwptr lda mwdrive ;Get currently select drives track address rlc  to buftrk: dw 0 ;Track that buffer belongs to bufsec: dw 0 ;Sector that buffer belongs to alttrk: dw 0 ;Alternate track'9'+1 jc nibok adi 27h nibok: mov c,a jmp pout mwdoit equ $ else mwissue equ $ ;Do a disk command, handle timeo next command channel db 0 ;extended address endif ***************************************************************** tes of status mwerr: push b push h mov a,m call hexout ;Print a byte of the status line call spout pop h pop b ily selected drive mwhead db 0 ;Currently selected head mwsectr db 0 ;Currently selected sector dmachan equ $ ;Command ch mov e,a mvi d,0 lxi h,mwtab dad d ;Offset into track table ret mwtran: mov h,b mov l,c inx h ret mwneghl: altsec: dw 0 ;Alterante sector lastdrv:db 0 ;Last selected drive *******************************************************outs + errors endif lxi h,dmastat ;Clear status byte mvi m,0 out attn ;Start the controller lxi d,0 ;Time out co * * * IBIOS ram locations that don't need initialization. * * * *********************************************nx h ;Bump command channel pointer dcr c jnz mwerr mvi c,0ah ;Terminate with a CRLF call pout mvi c,0dh call pout annel area dmasel0 db 0 ;Drive select dmastep dw 0 ;Relative step counter dmasel1 db 0 ;Head select dmadma dw 0 ;DMA add! ********** * * * DPB and DPH area. * * * **************************************************************** dw 1 ;OFF db 3 ;SECSIZ dpbhd1 dw 1024 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw1 endif ldsk set 0 ;Use non-standard partitioning tracks set hdtrks/hdlog ;Number of tracks per partition dsm set hdsectw 98 ;OFF db 3 ;SECSIZ dpbhd2 dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1028 ;DSM dw 51he number of * * cylinders that are used for the system. If the number of * * 'system tracks' is not one then the initial valck db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1280 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 122 * if maxhd ne 0 dphdsk set 0 ;Generate DPH's for the hdc3 hard disks rept maxhd ldsk set 0 rept hdlog dphgen hd,% 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 64 ;OFF db 3 ;SECSIZ dpbhd2 dw 1024 ;CP/M sectors/track dp/8*tracks/4-1 ;Number of groups per partition off set 1 rept hdlog dpbgen hd,%ldsk,%hdsectp,5,31,1,%dsm,511,0ffh,0ffh,0,1 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 195 ;OFF db 3 ;SECSIZ endif endif endif ;End of HD DPH's aue of * * 'off' should be adjusted accordingly. * * * * hdtrks = tracks - 1 * * * ****************** ;OFF db 3 ;SECSIZ endif if m20 ne 0 dpbhd0 dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2dphdsk,dpbhd,%ldsk ldsk set ldsk+1 dphdsk set dphdsk+1 endm endm if hdpart ne 0 ;Use non-standard partitioning ****b 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2047 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 127 ;OFF %off,3 off set off+tracks ldsk set ldsk+1 endm else ;Else use standard DPB's if m26 ne 0 dpbhd0 dw 1024 ;CP/M send DPB's if maxmf ne 0 dpbgen mf, 0, 20, 3, 7, 0, 04fh, 63, 0c0h, 0, 16, 3, 2 dpbgen mf, 1, 40, 3, 7, 0, 0a4h, 63,*********************************************** if m10 ne 0 hdsectp equ 336 ;Sectors per track hdtrks equ 243 ;Total d036 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 3 ;SECSIZ dpbhd1 dw 672 ;CP/M secto************************************************************* * * * hdsectp is the number of 128 byte sectors per cylin db 3 ;SECSIZ endif if m10 ne 0 dpbhd0 dw 336 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1269 ;ctors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS  0c0h, 0, 16, 2, 3 dpbgen mf, 2, 40, 4, 15, 1, 051h, 63, 80h, 0, 16, 2, 3 dpbgen mf, 3, 40, 4, 15, 1, 0a9h, 63, 80h, 0, ata tracks endif if m20 ne 0 hdsectp equ 672 hdtrks equ 243 endif if m26 ne 0 hdsectp equ 1024 hdtrks equ 20rs/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2036 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dder. * * * * hdtrks is the total number of data cylinders. Eg. it is * * the number of cyliders on the drive minus tDSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 3 ;SECSIZ dpbhd1 dw 336 ;CP/M sectors/tra" 16, 2, 3 dn set 0 rept maxmf dphgen mf,%dn,dpbmf,%dn dn set dn+1 endm endif if maxfd ne 0 dn set 0 rept maxfdtition ldsk set 0 rept blocks/8192 ;Generate some 8 megabyte DPB's dpbgen mw,%ldsk,%mwsecpt,5,31,1,2047,1023,0ffh,0ffh,0,trks/mwlog ;Number of tracks per partition dsm set mwsectp/8*tracks/4-1 ;Number of groups per partition off set 1 rept mwllags jz inse0 ;Drive names default to O:, P: sui 'A' ;Convert to binary drive value cpi 16 ;Test for legal values 506 ne 0 mwsecpt equ 288 ;Sectors per track mwtrks equ 152 ;Total data tracks endif if st412 ne 0 mwsecpt set 288  * i saf t plac on tim initializatio cod here * * * ****************************************************** dphgen fd,%dn,0,0 dn set dn+1 endm endif if maxdm ne 0 dn set 0 rept maxdm dphgen dm,%dn,0,0 dn set dn+1 end%off,4 off set off+trkoff blocks set blocks-psize ldsk set ldsk+1 endm blocks set blocks/4 if blocks gt 256 ;If there isog dpbgen mw,%ldsk,%mwsecpt,5,31,1,%dsm,1023,0ffh,0ffh,0,%off,4 off set off+tracks ldsk set ldsk+1 endm else ;Use stjnc inse0 ;Use default configuration if not legal sta dlocal ;Bottom of the local drive list inx h ;Bump to the next c mwtrks set 305 endif if cm5619 ne 0 mwsecpt set 432 mwtrks set 305 endif dphdsk set 0 ;Generate DPH's for the ******************* ************************************************************************* * * * Set up the INSTm endif if maxmw ne 0 ***************************************************************** * * * mwsectp is the n any stuff left, then use it blocks set blocks-1 dpbgen mw,%ldsk,%mwsecpt,5,31,1,%blocks,1023,0ffh,0ffh,0,%off,4 endif enandard partitioning off set 1 ;Initial system track offset trkoff set 8192/(mwsecpt/8)+1 ;The number of tracks in a partitharacter inse0: mov a,m ;Test the message flag cpi 'X' cnz prhead ;Print the header if no x flag lxi d,badmap ;CHDDMA hard disks rept maxmw ldsk set 0 rept mwlog dphgen mw,%dphdsk,dpbmw,%ldsk dphdsk set dphdsk+1 ldsk set ldsk+1 eALL package variables, set up the IBIOS * * * ***********************************************************************umber of 128 byte sectors per cylinder. * * mwsectp = 72 * heads * * * * mwtrks is the total number of data cylindif endif buffer equ $ ************************************************************************* * * * Al codion blocks set mwsecpt/8*mwtrks ;The number of blocks on the drive psize set trkoff*(mwsecpt/8) ;The number of blocks in a parlear out bad map stax d lxi h,badmap+1 lxi b,9*badsiz ;32 map entries call movbyt mvi m,0ffh ;End marker xra a ndm endm if mwpart ne 0 ;Generate DPB's for a HDDMA hard disk ldsk set 0 ;Use non-standard partitioning tracks set mw** insetu: lxi sp,100h ;Set up a nice stack lxi h,buff mov a,m ;Get the text buffer contents ora a ;Test for no fders. * * mwtrks = tracks - 1 * * * ***************************************************************** if st place her (th dis deblockin buffer wil dissapea * * th firs tim dis read/writ cal i executed However i *#  ;Select disk A sta cpmdrv lxi h,buff ;Set up initial DMA address call setdma xra a ;A <- 0 sta bufsec ;Set b ;Figure the number of drives sub d jc prhd2 ;Skip if our drives went past drive P: mov e,a call prhost prhd2: ret i '~' ;Drive name marker jnz prhd0 ;Check out the next character mov m,d ;Load a name inr d ;Bump the name mov a;;Print name and drive # if npart gt 1 ;;Print partition #'s only if > 1 parts db ', partition ', mspart endif db acr, i h,prmpt0 ;Print a login message call prmesg lda dlocal ;Print host drives before local drives mo e, ;Numbe o drt ; ; Print a NULL terminated string via CP/M's conout routine ; prmesg: mov a,m ;Test for the end of the string orauffer to unknown state sta bufwrtn ;Set buffer not dirty flag sta error ;Clear buffer error flag jmp owboot ;Do host ; ; Print a the assignment lines, C = starting host drive, ; D = Starting external drive, E = number of drives ; prhost,d ;Test for drive overflow cpi 'A'+17 ;16 drives max jnc prhd1 ;Skip on overflow jmp prhd0 ;Press on to the next alf ;;End of the configuration line mspart set mspart+1 ;;Bump the partition counter endm msdrv set msdrv+1 ;;Bump the dives mvi d,0 ;External drive 0 mvi c,0 ;Start at host drive 0 ('A:') call prhost ;Print the host lines lxi h,prm a rz ;Return if done push h ;Save the character pointer mov e,a ;Print a character via CP/M mvi c,cpmout call  warm boot ; ; Print the disk configuration message. ; ; A: Host system drive B: ; B: DJDMA 8" drive 0 ; C: DJDMA 8" dri: mov a,e ;Test the count ora a rz ;Return if done mov a,d ;Load the External drive name adi 'A' sta prmpt2 mcharacter prhd1: mvi m,0 ;Terminate the message lxi h,prmpt1 ;Print the local configuration call prmesg lxi h,dlocrive counter endm endm prmpt0: db acr, alf, 'Morrow Designs installable IBIOS, revision ' db revnum/10+'@', '.', (revnupt1-1 ;Replace all the '~'s with names lda dlocal ;Starting drive adi 'A' mov d,a prhd0: inx h ;Bump to the next cbdos pop h inx h ;Bump the character pointer jmp prmesg msprnt macro dname, ndrive, npart ;Print a drive name msdrv ve 1 ; D: DJDMA 8" drive 2 ; E: DJDMA 8" drive 3 ; F: DJDMA 5 1/4" drive 0 ; G: DJDMA 5 1/4" drive 1 ; H: DJDMA 5 1/4" drivov a,c ;Load the host drive name adi 'A' sta prmpt3 push b ;Print a line push d lxi h,prmpt2 call prmesg pop dal mov c,m ;Load the starting host drive mov a,c ;Figure the starting external drive adi maxlog mov d,a mvi a,16 m mod 10) + '0' db '.', acr, alf, alf, 0 prmpt1: equ $ ;Local drive configuration prompt dn set 1 ;Generate the drivharacter mov a,m ;Get a character from the message ora a ;Test for the end of the message jz prhd1 ;Skip at end cpset '0' ;;Drive counter rept ndrive mspart set 'A' ;;Partition counter rept npart db '~: ', &dname, ' drive ', msdrv e 2 ; I: DJDMA 5 1/4" drive 3 ; J: HDDMA M10 drive 0, partition A ; L: HDDMA M10 drive 0, partition B ; ... ; prhead: lx pop b inr c ;Bump the host drive name inr d ;Bump the external drive name dcr e ;Bump the drive count jmp prhos$ e messages rept numprd ;Cover all of our products if dn eq hdorder ;Generate the HDCA's message if m10 ne 0 if m12 bytes) * * Track number of alternate sector (2 bytes) * * Sector number of alternate sector (2 bytes) * * * ***db 0 ;End of message prmpt2: db ' : Host system drive ' prmpt3: db ' :', acr, alf, 0 db 0,0ffh,0 ds 512-($-buffer)n,255,0 dn set dn+1 alloc hd,%dn,255,0 dn set dn+1 alloc hd,%dn,129,0 dn set dn+1 endif endm endif endif ifeq fdorder ;Generate the 2D/B message if fdorig eq 0e000h msprnt 'DJ2D/B @ E000', maxfd, 1 else if fdorig eq 0f000h mf tracks per partition dsm set hdsectp/8*tracks/4-1 ;Number of groups per partition alv set (dsm/8)+1 dn set 0 rept maxhd0m ne 0 msprnt 'HDCA + Memorex M10', maxhd, hdlog else msprnt 'HDCA + Fujitsu M10', maxhd, hdlog endif endif if m20 ************************************************************** badmap: ds badsiz*9+1 ;32 entries + end marker dirbuf: ds  ;Buffer for 512 byte sectors if (maxfd ne 0) or (maxdm ne 0) or (maxmw ne 0) ds 512 ;Additional space for 1k sector de maxfd ne 0 dn set 0 rept maxfd alloc fd,%dn,75,64 dn set dn+1 endm endif if maxdm ne 0 dn set 0 rept maxdmsprnt 'DJ2D/B @ F000', maxfd, 1 else if fdorig eq 0f800h msprnt 'DJ2D/B @ F800', maxfd, 1 else msprnt 'DJ2D/B @ ????',*hdlog ;Generate CKS and ALV tables alloc hd,%dn,%alv,0 dn set dn+1 endm else ;Standard partitioning dn set 0 ne 0 msprnt 'HDCA + Fujitsu M20', maxhd, hdlog endif if m26 ne 0 msprnt 'HDCA + Shugart M26', maxhd, hdlog endif end128 ;Directory buffer tempb: ds 16 ;A little temporary buffer ********************************************************vices endif ***************************************************************** * * * Each bad map entry consists of alloc dm,%dn,75,64 dn set dn+1 endm endif if maxmf ne 0 dn set 0 rept maxmf alloc mf,%dn,22,16 dn set dn+1 e maxfd, 1 endif endif endif endif if dn eq dmorder ;Generate the DJDMA 8 message msprnt 'DJDMA 8"', maxdm, 1 enrept maxhd if m26 ne 0 alloc hd,%dn,252,0 dn set dn+1 alloc hd,%dn,252,0 dn set dn+1 alloc hd,%dn,256,0 dn set dn+1 if if dn eq mworder ;Generate the HDDMA's message if st506 ne 0 msprnt 'HDDMA + M5', maxmw, mwlog endif if st412 ne********* * * * Allocation and checked directory table area * * * ****************************************** 9 bytes: * * Logical drive number (1 byte) * * Track number of bad sector (2 bytes) * * Sector number of bad sector (ndm endif if maxmw ne 0 if mwpart ne 0 ;Use non-standard partitioning tracks set mwtrks/mwlog ;Number of tracks perdif if dn eq mforder ;Generate the DJDMA 5 1/4 message msprnt 'DJDMA 5 1/4"', maxmf, 1 endif d se dn+1 endm  endif if m10 ne 0 alloc hd,%dn,159,0 dn set dn+1 alloc hd,%dn,161,0 dn set dn+1 endif if m20 ne 0 alloc hd,%d 0 msprnt 'HDDMA + M10', maxmw, mwlog endif if cm5619 ne 0 msprnt 'HDDMA + M16', maxmw, mwlog endif endif if dn *********************** if maxhd ne 0 if hdpart ne 0 ;Use non-standard partitioning tracks set hdtrks/hdlog ;Number o%  partition dsm set mwsectp/8*tracks/4-1 ;Number of groups per partition alv set (dsm/8)+1 dn set 0 rept maxmw*mwlog ;GenO0!8:6_~~ D_     %&'()*+, -.  endif db 0 ;Force a complete hex file end >7>x.G͸!:;::K=>22:g|9OogyR#{_~#foy! :O*/z‘{erate CKS and ALV tables alloc mw,%dn,%alv,0 dn set dn+1 endm else ;Use standard partitioning dn set 0 trkoff se57`i"!`i"$:'2`i"!0s:g.KW!sy2ү{Ža.K|ʯ͢s#r#q#~y2K ʄ /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>‘*"*"y#:#:#:#:# uw# xo&))))~#O yt 8192/(mwsecpt/8)+1 psize set trkoff*(mwsecpt/8) rept maxmw blocks set mwsecpt/8*mwtrks rept blocks/8192 ;Generatez2:2a.K͢^#V#Nu:_!;!:O:26:g. K| ^#V#"~#fo" */~< :w#?@)*+,-./0?4 < @+ 4 h@x1@G + ~#fo~3 n& */g26O>~!>þ¯###X!>2>2>2L͸ some 8 megabyte ALV's alloc mw,%dn,256,0 blocks set blocks-psize dn set dn+1 endm blocks set blocks/4 if blocks gt"/!  BAD MAP OVERFLOW! ! !*sy2>G!'s2*|O|g+f|g}oX#|g"!ʄ#uK A* @1-23 ><2Ly!znjO>oyO2{:{ W@ ~ I  _ 1!~A2z#~X&:6O!"#"2گ'27 !<_ :7 wRO s#r!N:626O0 x 256 ;Use the remainder blocks set blocks-1 alv set (blocks/8)+1 alloc mw,%dn,%alv,0 dn set dn+1 endif endm endif :=o&)))))))!>©:>2>=>>> 22n2 .G*|.G.G*DM.G.G.G&  !  62!222!͐:z_q!:zAW#~V~@rzRV@6!͐!zNyW>p_q{zA2=yA2R/0  12!"34#$!"#$1234$I$I$ "@D"I D H H@@I$! $H!$B "I!=͐ q~_#Ð Morrow Designs installable IBIOS, revision E.3. ~: DJ2D/B @ F800 drive 0 ~: DJ2D/B @ F800 d/0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>!=͐ q~_#Ð Morrow Designs installable IBIOS, revision E.3. ~: DJ2D/B @ F800 drive 0 ~: DJ2D/B @ F800 d@! $! $@@I"""" U@@@@$  $@IPrive 1 ~: DJ2D/B @ F800 drive 2 ~: DJ2D/B @ F800 drive 3 : Host system drive : ###X!>2>2>2L͸?@)*+,-./0?4 < @+ 4 h@x1@rive 1 ~: DJ2D/B @ F800 drive 2 ~: DJ2D/B @ F800 drive 3 : Host system drive : ###X!>2>2>2L͸PPPP" $H $$A :6O!"#"2گ'27 !<_ :7 wRO s#r!N:626O0 x***************************************************************** * * * Disk format program for Disk Jockey 2D controllW@ ~ I  _ 1!~A2z#~X&:6O!"#"2گ'27 !<_ :7 wRO s#r!N:626O0 xO0!8:6_~~ D_     %&'()*+, -. er. * * 11/16/79 * * * ***************************************************************** title '*** Format  !  62!222!͐:z_q!:zAW#~V~@rzRV@6!͐!zNyW>p_q{zA2=yA2RO0!8:6_~~ D_     %&'()*+, -. ' Program for CP/M Ver. 2.0 ***' org 100h revnum equ 52 ;Revision # times 10 bdos equ 5 ;CP/M entry point wboot equ 0 PI 'N' ;test for new JZ CROK ; parameter request PROCED lxi d,acralf call pbuff LDA DRVNO ;get the drive no MOut message JMP CROK ; and wait for input NOTLOW CPI 4 ;test for drive JP INPUTB ; select too large STA DRVNO ;sa newsize add a jz findix mov l,a mvi h,0 DAD D MOV C,M INX H MOV B,M LXI H,SLIST CALL OVLAY LXI B,DDLIST  LXI D,4 ; for MOV M,A ; different XRI 3 ; versions DAD D ; of the MOV M,A ; disk DAD D ; jockey b JNZ dorest DCX D MOV A,D ORA E JNZ IXLOOP NOTRDY LXI d,RMESSG ;not ready message notrdyx xchg LXI d,AMESSG ;driv origin equ 0F800H DISKIO EQU ORIGIN+3f8h DATREG EQU DISKIO+7 DRVSEL EQU DISKIO+1 CSTALL EQU DISKIO+3 CMDREG EQU DISKIO+4 V C,A MVI A,177Q ;drive select bits QLOOP RLC ;rotate select bits DCR C ; to proper drive JP QLOOP ; position ave drive no. fmtsiz lxi d,denmsg ;Select the sector size call pbuff call rbuff cpi 'N' jz CROK sui '1' ;Strip off LXI H,DLIST CALL OVLAY call model lxi b,lhddena jz loadd lxi b,lhddenb loadd mov a,b call stbits mov a,c callMOV M,A ; controller LXI d,SMESSG ;print the CALL pbuff ; sign on message CROK LXI d,DMESSG ;echo the CR and CALL pe message CALL SENDMP ;send error message call unload JMP SENDI ;back for more input dorest MVI M,RESTOR wrstrs mov  DSIDE EQU 10Q UNLOADB EQU 17Q WTCMD EQU 364Q SICMD EQU 131Q IMMIRQ EQU 320Q UNLOADA EQU 30Q RESTOR EQU 11Q INDEX EQU 20Q ani 3fh STA SELECT ;save for TRACK routine call stdvsl call model lxi b,lhsdena jz prep lxi b,lhsdenb prep mov a ASCII bias jp sizchk sizerr lxi d,bmessg call pbuff jmp fmtsiz sizchk cpi 4 jnc sizerr sta newsize SENDI LXI d stbits FINDIX CALL INDEXP MVI H,1 TKSTEP mvi a,'*' call pchar LXI D,CMDREG MVI A,SICMD STAX D WSICMS LDAX D RAR buff ; print drive select CALL rbuff ;wait for response CPI 'N' ; new parameter JZ CROK ; request STA LETTER a,m rar jnc wrstrs wrstrd MOV A,M rar jc wrstrd MOV A,M ANI TRKZRO JZ NOTRDY LXI B,SDLIST LXI H,DLIST CAL TRKZRO EQU 4 intrqa equ 1 intrqb equ 4 lhsdenb equ 90dh lhddenb equ 80ch lhsdena equ 111h lhddena equ 10h acr equ 0dh ,b call stbits mov a,c call stbits lxi h,cmdreg mvi m,immirq mvi a,40h wirqd dcr a jnz wirqd mov a,m rar jc,IMESSG ;send out the LXI h,JMESSG ; diskette insert CALL SENDMP ; message GETIN2 CALL rbuff ;wait for response C JNC WSICMS WSICMD LDAX D RAR JC WSICMD CALL TRACK MOV H,D INR H MVI A,77 CMP H JNZ TKSTEP call unload lxi;save for exit SUI 'A' ;test for good JP NOTLOW ; drive select INPUTB LXI d,BMESSG ;print the bad CALL pbuff ; inpL OVLAY LXI B,L128 LXI H,SLIST CALL OVLAY mvi a,'*' call pchar CALL INDEXP MVI H,0 CALL TRACK LXI D,TABLE ldalf equ 0ah START lxi sp,stack LHLD ORIGIN+7 ;adjust INX H ; the MOV A,M ; calling LXI H,STDVSL+1 ; routines  notrdy ral ral jc notrdy lxi d,wmessg ral jc notrdyx LXI D,0 call gtindx IXLOOP call gtstat ani index xra (  d,fmessg call pbuff call rbuff cpi 'F' jz crok jmp wboot SENDMP PUSH h ;save second half CALL pbuff ;send firsM,0F6H ; and data mark WTL3 MVI M,0FCH ;index mark LXI B,4E32H ;data & count OVLD4 EQU $-2 WTL4 MOV M,B ;sector mark DCSELECT ANI 357Q call stdvsl WIL call indxw XCHG WTRACK LXI D,DATREG ;1791 data reg MVI L,1 ;initialize sector reg JNZ WTL11 ; sector data MVI C,40H ;count OVLS4 EQU $-1 WTL12 MOV M,B ;write third DCR C ; quarter of JNZ WTL12 ; smodel lda diskio-4 cpi (ret) ret unload call model mvi a,unloada jz stbits mvi a,unloadb jmp stbits gtindx cal7 MOV M,B ;sector mark DCR C ; postamble JNZ WTL7 ; field LXI B,0CH ;data & count OVLD8 EQU $-2 WTL8 MOV M,B ;data mt half LDA LETTER ;print the CALL pchar ; letter POP d ;send the second pbuff mvi c,9 jmp bdos rbuff lxi d,inR C ; preamble JNZ WTL4 ; field SLOOP LXI B,0CH ;data & count OVLD5 EQU $-2 WTL5 MOV M,B ;sector mark DCR C ; zero  LXI B,4e50H ;data & count OVLD1 EQU $-2 MVI A,WTCMD ;issue a write STA CMDREG ; track command XCHG ;adjust the regisector data MVI C,40H ;count OVLS5 EQU $-1 WTL13 MOV M,B ;write fourth DCR C ; quarter of JNZ WTL13 ; sector data Ml model mvi b,0 rz mvi b,index ret INDEXP call gtindx windxh call gtstat ANI INDEX xra b JZ windxh windxl calark DCR C ; zero leader JNZ WTL8 ; field OVLD9 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ;bufx mvi c,10 call bdos lda inbufx+1 ana a mvi a,acr rz lda inbuf cpi 'a' rc cpi 'z'+1 rnc sui 40q retleader JNZ WTL5 ; field OVLD6 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ; and data mark WTLters WTL1 MOV M,B ;index mark DCR C ; preamble JNZ WTL1 ; field LXI B,0CH ;data & count OVLD2 EQU $-2 WTL2 MOV M,B VI M,0F7H ;crc data bytes MVI A,27 ;last sector + 1 OVLS6 EQU $-1 LXI B,4E36H ;count & data OVLS7 EQU $-2 WTL14 MOV M,B ;l gtstat ani index xra b jnz windxl ret indxw call gtindx jmp windxl TABLE DW L128 DW L256 DW L512 DW L1024  and data mark WTL9 MVI M,0FBH ;data mark LXI B,0e540H ;data & count OVLS2 EQU $-2 WTL10 MOV M,B ;write first DCR C ;  pchar push h push b push d push psw mov e,a mvi c,2 call bdos pop psw pop d pop b pop h ret inbufx 6 MVI M,0FEH ;sector mark MOV M,D ;track number MVI M,0 ;side number SIDENO EQU $-1 MOV M,E ;sector number MVI M,1 ;sec;index mark DCR C ; zero leader JNZ WTL2 ; field OVLD3 MVI M,0F6H ;special double MVI M,0F6H ; density clock MVI data DCR C ; postamble JNZ WTL14 ; field CMP E ;last sector test JNZ SLOOP WTL15 MOV M,B ;fill data DCR C ; to  TRACK lda select call stdvsl XRA A STA SIDENO CALL WTRACK call gtstat ANI DSIDE RNZ INR A STA SIDENO LDA  quarter of JNZ WTL10 ; sector data MVI C,40H ;count OVLS3 EQU $-1 WTL11 MOV M,B ;write second DCR C ; quarter of db 10,0 inbuf db 0,0,0,0,0,0,0,0,0,0 STDVSL STA DISKIO+1 RET STBITS STA DISKIO+2 RET GTSTAT LDA DISKIO+2 RET tor length OVLS1 EQU $-1 MVI M,0F7H ;crc data bytes INR E ;increment sector LXI B,4E16H ;data & count OVLD7 EQU $-2 WTL) index hole JNZ WTL15 WTL16 MOV M,B ;fill data DCR C ; to index hole JNZ WTL16 WTL17 MOV M,B ;fill data DCR C ; to le density * 26 sectors/track 128 byte sectors L128 DB 0 DW 0e520H DB 20H DB 20H DB 20H DB 27 DW 0FF1BH * OveDB OVLS1-WTRACK DB OVLS2-OVLS1 DB 1 DB OVLS3-OVLS2-1 DB OVLS4-OVLS3 DB OVLS5-OVLS4 DB OVLS6-OVLS5 DB OVLS7-OVLS6 TURN to return to CP/M, or F to Format another: $' denmsg db acr,alf db 'Select a sector size:' db acr,alf db ' 1) below represents the distances * between successive locations of the WTRACK * routine that are to be overlaid in order * thatotected.$' BMESSG db acr,alf db 'Improper Response.$' DMESSG db acr,alf db 'Select Drive (A,B,C,or D): $' SMESSG dbindex hole JNZ WTL17 RET OVLAY MOV A,M ;length of list PUSH H ;save list ptr LXI H,WTRACK ;overlay area XTHL ; recorlay data for double density * 26 sectors/track 256 byte sectors L256 DB 1 DW 0e540H DB 40H DB 40H DB 40H DB 27  DB 1 * Overlay data for single density * formatted diskettes SDLIST DW 0FF28H DB 6 JMP WTL3 DW 0FF1AH DB 6 JMP128 Byte Single density.' db acr,alf db ' 2) 256 Byte Double density.' db acr,alf db ' 3) 512 Byte Double Densit the same routine will serve to format * different sized and density diskette * sector formats DLIST DB 18 ;length of list  'Disk Jockey 2D Disk Format program' db ' Revision ' db '0'+revnum/10,'.','0'+(revnum mod 10) db acr,alf db 'Type "^C" ver pointer MVI D,0 OVLAY1 INX H ;increment pointer MOV E,M ;get offset XTHL ;exchange pointers DAD D ;add the offset DW 4E36H * Overlay data for double density * 15 sectors/track 512 byte sectors L512 DB 2 DW 0e580H DB 80H DB 80H  WTL6 DW 0FF0BH DB 6 JMP WTL9 * Overlay data for double density * formatted diskettes DDLIST DW 4E50H DB 0CH MVy.' db acr,alf db ' 4) 1024 Byte Double Density.' db acr,alf db 'Sector Size: $' acralf db acr,alf,'$' letter  DB OVLD1-WTRACK DB 1 DB OVLD2-OVLD1-1 DB OVLD3-OVLD2 DB 1 DB 1 DB OVLD4-OVLD3-2 DB 1 DB OVLD5-OVLD4-1 DB OVLto return to CP/M, "N" to restart.$' IMESSG db acr,alf db 'Insert a Write Enabled Diskette in Drive $' JMESSG db acr,alf PUSH PSW ;save length count LDAX B ;get replacement data MOV M,A ;do the replacement INX B ;next replacement data POP DB 80H DB 16 DW 4E6AH * Overlay data for double density * 8 sectors/track 1024 byte sectors L1024 DB 3 DW 0e500H I M,0F6H DB 36H DW 4E32H DB 0CH MVI M,0F5H DB 36H DW 4E16H DB 0CH MVI M,0F5H DB 36H * Overlay data for singdb 0 drvno db 0 select db 0 newsize db 0 ds 50 stack equ $ end D6-OVLD5 DB 1 DB 1 DB OVLD7-OVLD6-2 DB 1 DB OVLD8-OVLD7-1 DB OVLD9-OVLD8 DB 1 DB 1 SLIST DB 9 ;list length  db 'Close the Drive Door and then Press RETURN: $' FMESSG db acr,alf db 'Function Complete.' db acr,alf db 'Type REPSW ;recover length count DCR A ;decrement XTHL ;exchange pointers JNZ OVLAY1 POP H ;adjust stack RET * The lists DB 0 DB 0 DB 0 DB 9 DW 4E74H AMESSG db acr,alf db 'Drive $' RMESSG db ' Is Not Ready.$' WMESSG db ' Is Write Pr* 1*#~!www͎͎͓N2hA:{͎12i͎͓N1^{͎BU2k !8͓̓Ne͎:ie RETURN to return to CP/M, or F to Format another: $ Select a sector size: 1) 128 Byte Single density. 2) 256 Byte#foN#F 3!!!4!~#fo##N#F !~A#~ʄ!!~#fo~#fo~!~#fo~!~#fo~.!~#fo6  p ‡6666@p —@p ž@p ¥@p ¬6>6Np ¸cp p p ~!8#^ w=  @prlMAKEPRL Version %i.%i gV!9!>w#w!>w#w!>w#w! >w#w!>w#w!>w#w!>w#w!~w#~w!O> ?2jʜ xy!6>@=«~fzWN̓f6 ~~~! Double density. 3) 512 Byte Double Density. 4) 1024 Byte Double Density. Sector Size: $ $\!"!Dywx#w! !4ywx#w!!!!$$ywx#w+~#~!$!; !!$!~#foN#F (Yq ÒPN 662N 66N 66 @@@@6N倀jN tN Drive $ Is Not Ready.$ Is Write Protected.$ Imp~w#~w!N#F!N#F!!~#±@ !~#fo~#fo~-!!~#fo~#~!~w#~w+~#fo~OG!2[U!~#~*!>*ͮ& :kJo&N#F!!B xy&>*ͮ>YZ_b$>MOg͎͓F Ä!~w#~w\!D!!"N#FD !4!! N#FD !>w#w!~#~ !!~#fo 6!~w#~wProper Response.$ Select Drive (A,B,C,or D): $Disk Jockey 2D Disk Format program Revision 5.2 Type "^C" to return to CP/M, "N" ʽ!~#~ʽ@ ý!!!!~w#~w+~#foN#F(!~w#~w!~w#~w!~w#~wñ!!$!~͎:hͮ  :> :a{ _ 22::>>*0F!9N#F#^#V#~#fo"Xkb"Xi`"XOGposLoad size is %h hex bytes longOutput file is %p Addresses don't !!!N#FzEy x«!; !!!!"N#F]yx!T!!! N#F]yx!to restart.$ Insert a Write Enabled Diskette in Drive $ Close the Drive Door and then Press RETURN: $ Function Complete. Typw#~w+~#foN#F !>w#wF!~#fo~OG!; F!!!D!~#foN#F !~#~!!!4!~*3<E:j2u8<2u:j.PN>2p F p N66662Np ^ p f6666r6s66NpmatchSizes don't matchUnexpected last line in %pCan't make room for headerCan't create '%p'prlhx1hx1hx0Bad option -%ac+ 4!; ! ~w#~w!~w#~w!#X##N#F+++N#F!N#Fr! N#F!!N#F!N#F!N#F!N#Fͣ! 9!"~#fo#~0³ !~#fo##~0³ nV!~w#~w nVCan't rewind '%p'file '%p' not at correct start addressUnexpected lasfo 6nVnV!~#fo ~ < !~w#~w< Error: gV! ! N#F!N#F!N#F!N#F!!F~#fo!yOx#G! ||} !!+X##N#F+++N#F!N#F̈́)xT!; !!!N#FzEytx!~; !~#fo!~#fo  !!~#fo!~#fo }|!X##N#F+++N#F!N#F!~#fo)! N#F!~#fo!~#fo !!!!!N#F͐ywx#w+~.#~E!N#F!; nV!~#foMDnVCan't write out bitmapSeek error in wrheadCaN#F=! N#F=!N#F=!$!]!~#fo!yOx#G!>!!FnV!!  #!; !t line in hex file '%p'File '%p' not in hex formatCan't read '%p'gV!9!!N#F9 yg x{ !N#F!4 ; !nVUsage: makeprl [-s hex-no] [-o output] hex-file1 [hex-file2]gV! !!FnVgV!~#fo~:y nV!~#f!##N#F+++N#F!N#F̈́)x!i; !N#F! N#F!N#FzEyx!R; nVCan't read in seg %iCan 9!~w#~w3gV!~#fo~ʃ !~#fo~. ! ~@ #~ !~#fo~ !N#F!~w#~w!N#F!~w#~w~n't write headerCan't rewind filegV!9!>w#w!~#~!!~#fo 6!~w#~wö!!}|!N#F!~#fo!yOx#Gyx(!p; !>w#w!!  #!!~#fo!~#fo }o|g}|!>w>#w!N#F!!!!^ ywx#w+~¬ #~ !N#F! ; !~ #~ !N#F! ; !!  # !N#Fo ~0 !~#fo ~0ʣ nV!!N#F!!~#fo#(y x nV!!N#F!!~#fo###(y x't write out seg %igV!9!\~#_!>w#w!~#~!/X!~#fo 6!~w#~w0!!~#fo}o|g!QP}C !N#F!~w#~w6.!~#fo~, !N#F!~w#~w!N#F!~w#~w~Û !N#F!~w#~w!N#F!~~w#~w6!N#F!~w#~w!~#fo!yOx#GyOxGyw!N#F!~w#~w!~#fo!yOx#G!8Q}o|!~w#~wᗕ>!!~#fo||g}o}|x!!~#fo!~#fo !8Q}|!~#fo)!T ~#fo!~#fo)!! ; !!'X##N#F+++N#F!N#F̈́)xB!N#F! ; nVBad line in hex filegV!9!!N#F9 y€x nV!>w#w!!~#fo  #~ !!~#fo)! ~#fo !!~#fo) !~#fo (yu xʣ nV!|!!~#fo}o|g}|!!/\ ° #=*/\! ##N#F+++N#F!N#FZyxr*/\!; r!>w#w!w#~w~ !~#fo6! ~& #~ʃ nV!~#fo6nVgV!!N#F!~w#~w!N#F80yʎ !~#fo ~ ” !~#g}!N#F!~w#~w6!N#F!~w#~w! ~#fo}o|g}!N#F!~w#~w! N#F!8Q}o|g}!! yOx#Gyx3!!~#fo ! V!!~#fo !~#fo}/o|/g ! !  #y! !~#~!!‰nV!! N#F!N#F!N#F!^ ywx#w+~#~!H; !~#~nVnVCan't open '%p'gV, ~ր#~0!~#fo)1\ >w#w!~w#~w>2\2\_!/X!~#fo !~!:\:\#!!~#fo"\!!~#fo)1\ ~``> ,*``~,!>w#w!v/ywx#w!"b`!t:b`:c`#*b`~<!=!!*b` ͐y~!!!*b` `2``:a`2a`!``>#*d`~0C*d`>9C!*d`~OG! }|X*b`!~#!N#F>O>G!N#Fywx#w!``>##w*b`~.)! !*b` ;i`"b`*b`~aM*b`~hM*b`~oM*b`~ux!*b`*b`#"b`~!~h>2``2a`õ!6a/\!͖Qx2P`2Q`x2S`y2R`!P`!Q~#~#~#~*\#"\!!##N#F+++N#F!N#F̈́)x!a; *\}o|g!/X"d`*d`~#8*d`N#FL)*d`N#F!N#FzE*d`##"d`PO!~#fo"d`!~#fo"``!~#fo"b`*d`~nq*d`~N¢*d`#"d`*``*b`N#!N#F! ##N#F+++N#F!N#F'y¶x!N#F!; !~#fo"/\*/\)1\ >w#w=!>w#w!~#~!#!! 9!F~!>#CÔ!~w#~w*``#"``r!>#*``> *``~!tN#F!t~w#~w*``~A*d`~A%*d`>Z%*d`~OG! MD-*d`~OGyl6x*d`#"d`*d`~a*d`>zÝ!!N#F! N#F͖Q!~#fo }!~o˜>2``2a`õ!~u¯> 2``2a`õ!"``*b`~x!>w#wU*b`~b¡!! N#F! ~w#~w~#~!! !N#FzEyx"!J; nVO!~#fo"d`!~#fo"``!~#fo"b`!>w#w!:d`w:e`#w!>w#w!``>#ґ*#F*b`~w#~w~#fo}|*d`MDP*``>w#w*d`~0*d`>9*``*d`~OG*``~#foMD)) )  }|*d`#"d`ìO!9!~#fo"d!/X!~#fo 6!~w#~wnVgV!!##N#F+++N#F! N#F!N#F͍! 9nVgV!!##N#F+++N#F! N#F!N#*``>Z*``~OG! MDä*``~OGyw!~w#~w*``#"``C!tN#F!t~w#~w6e!v!N#FP*b`#"b`ò*b`~>V|:``2``:a`2a`*d`#"d`Ñ*d`~A*d`>Z!*d`~A*d`>Z*d`~OG! MD*d`~OG! }|!!   #X*N#F! ~w#~w~#fo}|!~#U!!!  #H!N#FO!N#Fywx#w!~#ʟ#!!  ##!!!Nd`> *d`~!``>#*d`~-n!>w#w*d`#"d`:``2``:a`2a`:``2``:a`2a`*d`#"d`s! ~#~‘:``:a``*d`"b`*b`~/*b`~%/*b`#"b`*b` "d`!b`:d`:e`#h*b`!d`yOx#G*d`!N#F!~#fomV*b`*b`#"b`~|P!F͍! 9nVgV!9!!N#F!͖Qx2P`2Q`x2S`y2R`!P`!Q~#~#~#~!!##N#F+++N#F!N#F̈́)x!=!!*b` $y(x~!!*b` !!! 9!F~!N#F!~w#~w)!v :b`w:c`#w*bd`!yOx#GP can't write can't read O!9!t!}|!"``!*``*``#"``~!>#!>#*#F!~#fomV!~w#~w_*b`~p# !! ~#fo~#~!! N#F! ~w#~wN#FL)ywx#w!~#U!!!ڑ*d`~0‘*d` ~A;*d` >Z;*d` ~OG! MDG*d` ~OGyxPx‘*d`##"d`:``2``:a`2a`Ñ*d`~+*d`#"d`:`>w#w!6 *b`~-½!>w#w!*b`#"b`*b`~*b`#"b`*b`~+!*b`#"b`*b`~*b`#"b`! !*b`;i`"b`!>wnV! >w#w+~#1!!/X!N#FzEnV!!/X!N#F80nVCan't write out memoryFlush can't seekgV!9!*`~*b`#"b`~gV!N#F!~#ʫî!N#F͛9nVgV!N#F!\c,nVgV!!N#F!\!#.nVO!-   # !N#F !N#Fywx#wU*b`~l› !~a!!! ~#fo~#~#~#~!>w#w!~w#~w+#~n!!!~#fod`#"d`!N#F! QP0 }*d`*d`#"d`!N#F! ͘P0 }*d`!yOx#GPO!9!~#fo"d`!~#fo"b`!!F`;KNO*d`*d`#"d`6-!!~#fo!~#fo }|!>>#$!>w#w!!~#fo#! >+F+N=$!94! 9ywx~#~#~#~*``*``#"``6-! ~#4+! > w#wY+! #~Y+! ! ~#fo>o>g}|!! #~~+~ !#~+!w#wq#!:b`w:c`#w!>w#wU!! N#F! ~w#~w~#~*b`~c@#!``>#@#!~w#~w@#!!~#fo~#~!xGyx )*``*``#"``~OG#)0yw:d`2d`:e`2e`(*b`!yOx#GPO!~#fo"d`*d`"``*``~r)*``#"```)*``!d`yOx# !##~!!$T] *b`~f¢!!!}|!!N#F!!yOx#G! ~#fo >+F+N= !&!9ywx#w! 8'*b`*b`#"b`6-!!P`~#~$'!P`NO!"``!!! >+F+N=R'*``94! 9ywx#w!!~#fo*d`#w!!N#F!~#fo#!<~w#~w>2``2a`!:``:a`#%!:``:a`#҈%*d`*d`#"d`!*`` ~*``#"``!~w!R+! N#F!P`~#~#~#~!P`!ͨS##N#F+++N#F*``ͮ**`` "``*``!P`~#~#~#~!P`!S>02Z`!N#F!8Q}!!~!!}|!>w#wq#!!}|!*``!N#F!3ywx#w*b`~cU*b`~sGPO!N#FʹFi`"b`!b`~#ʮ)*b` ~)P*b` ~#fo"``! ~#)*``$ !~#~#~#~á*! ~)#~**``$! ~#fo }|U!!}|!*``! ~#fo##N#F+++N#F!ͮ*ywx#w! ! ~#fo####}|U!!}|! }|!>>#'!>w#w!!N#F!!<~w#~w!!  #(!~#fo!yOx#G*`` "``!!~##~w6%!>#&*d`*d`#"d`6.>2b`2c`!:b`:c`#E&*``*b` !yx#E&*d`*d`#"d`!*`` ~*``#"``*b`#"b`í2[`2Y`2X`!X`Q##~*``>9',*``~'w*``!d`yOx#GPwrite error write error bad putc call O!~#fo"d`!~#fo"``!d`~U*b`~iU:b`2b`:c`2c`U!>##!N#F!N#F!N#F!~#fomV!~#"!!  #"!!!N#F !Qá*>2d`2e`!*d`*b`fJxT*!*`` ~*d`}ƀo|g"d`**``$ *d`!~#fo MDx2P`2Q`x2S`y2R`!P>w#w! ! ~#fo####}|U*b`~d#"!!}|!!>>#!!!N#F!! ~#fo >+F+N=!!>$!~!>#;(*b`*b`#"b`60!d`>#(*b`*b`#"b`6.×(!>#(*b`*b`#"b`*``!yOxGyxҁ(*``*``#"``~OGÄ%*d`*d`#"d`6e!#~m&*d`*d`#"d`6-!!~#fo>o>g}|{&!:b`:c`#&*d`*d`#"d`60*b`#"b`E&*d`*d`#"d`6+*d`*#Ÿ,!!T,!zE!F:a`,*d` ~#~,*d` N#F*d` ~w#~w*d` :``wg-*d` >#-*``MDP*d`!~#fomV!~w#~w#gV!N#F!!N#F͛9nVO!9!~#fo"d`!!F`;K$!!P`~#~s$!P``!S!Q~#~#~#~!~#foMDPO!~#fo"d`*d`"``!#~+! >#+!!P`~#~#~#~!P`͕T9ywx#w! ! ~#fo }|U*b`~cG"*b`~sG"*b`~iG"!~ʉ"!~a¤"!! N#F! ~w#~w}|*b`~c"!>(0yw!~w#~w;(!#~(!d`>#(*b`*b`#"b`60!~w#~w:d`2d`:e`2e`×(!d`>#9)*b`*b`#"b`*``!yO.  N#F*d` *d`N#FzE*d` y.-x#N-! !G,!zE!Fg-*d` >w#w*d` :``w:`` t-:a`‹-*d` ~g"``!~#ž3!> w#w3!#~3!!~#fo>o>g}|!:``:a`#3!N#F*``!N#FP*b`3*b` "b`*b`*GyOxGy1*``#"``!~w#~wt0*``!! yw{1P*``~ t0*``~t0*``~ʟ0*``~ 1*``!yOx#GP*``#"`*`` 7!~#fo##~OGPO!~#fo"d`!~#fo"``>2b`2c`*``~.ʮ8*``~ʮ8:b`:c`8*b`*b`#"b`*d` *``~a8*E!F/!b`>#n.!*d` *d`N#FzEy½/x/! !.!zE!Fn.*d` >w#wn.!~#foMDP*d`O*``#"``5:b`2b`:c`2c`à4!P`~#~/6!P`!`ͦM!`;K5*N` "b`!b`>#5!*b`)))` P`~#~ˆ-#~,*``MDP*d` N#F*d` *d`N#FzE*d` y-x#-! !:,!zE!FP*d` >w#w*``MDPwrite ``!N#FP0 }*b`>9&4*b`~'w*b`!d`yOx#GPO!9!~#fo"d`>2``2a`!#~4!!P`~#~s4!P```!~w#~wt0P*``!yOx#GP!>#t0*d`! ~t0*``*d`" ~#fo~*b`~OGyOxGy¾2*``#"``!~w#~w*``>z8*``~OG! MDá8*``~OGyw*``#"``@8:b`:c`8*b`*b`#"b`*d` 6 î8*``~.8*``#"``8*``~8P>2b`2 >w#w/10122+222 223O!N#FʹFi`"b`!b`~#[0P*b` ~#fo"d`!~#fo"``!>#|6!P`!ͦMO!`;K6!!O!*b` Q:``2``:a`2a`:b`2b`:c`2c`W6!:b`:c`#7*d`*d`#"d`60*b`#"error write error bad putl call O!~#fo"d`!~#fo"``!d`~#c.!!.!zE!FP!~#fo"b`!b`>#/!*NO!!`;K5*N` "b`!b`>#5!*b`)))` ;K6!!P`~#~4!P`*b`)))` @LO*``!*b`d`! 5*d`" ~w#~w*d`$ >2P`2Q`>2S`>2R`!P`Q+2*``~OG!$0[U*``!yOx#GP222*b` ~OGy2x3c`*``~g9:b`:c`g9*b`*b`#"b`*d` *``~aR9*``>zR9*``~OG! MDZ9*``~OGyw*``#"``9:b`:c`9*b`*b`#"b`0*b` ~0*b` ~OG! 0[U*``!yOx#GP!*b`VG!0[U!d`~#0P*d`! ~P1*d`* 6}*d`* ! ! !b`6*``MDPPONMLKJIHGFEDCBACONRDRPUNLSTO>2d`2e`!"_:d`:e`#k7*d`=*d`#"d`J7:^OG! *^Md` *d` ~#fo }|!b`>#/*d` ~#~/!N#F!~w#~w*``*``#"``~:b`2b`:c`2c`*d` ~w#~wÛ Q "``6>2b`2c`!:b`:c`#6!~#6!!P`~#~H5!P`!`ͦMO!!ͭO!!P`~!F*``#"``!~w#~w2O!~#fo"d`*d`"b`!#~s3!>#s3!!~#fo>o>g}|*b`*b`#"b`6-!~#fo}o|*d` 6 g9*``~OGPO!9!~#fo"d`:^9!! y2^!>w#w!!"_  #9!~#fo))_ ~:!!"_ *d`! *d`+ ~OGyw*d`" *d`, }|*d`" ~#fo*d`+ ~OG 6 *``*d`" N#F*d`" ~w#~w~*d`! 5*b`~ODPO!~#fo"d`!^ywx#w!~#fo~#7*d`"b`!~#fo~#fo"``*b`*`` 7*``~7*b`#"b`*``#"``7P!~w#~wß7*b.*d` ~/#~/*d` ~#/*d` ~#fo*d` ~ /*d` N#F*d` *d`N#FzE*d` yo/x#/! !-!z#~5!P`!X`!N#F UNO*d`*d`#"d`!~#fo0 }*b`#"b`5!!`;K!6!!P`~#~5!P`!`@L/   #:P!~w#~w9!!~#fo))_ }|!~#fo6!!~#X:!~#fo~w!~#fo##>w#w!:d`w:e`#w>2``2a`2_:_2_@*b` "``@*``*d`*b`͞>ywx#w*b` !~#~*b` MDP!>w#w!d`:_:_#$A!!:_w:_#w+N#FAywx#w*d`6!~#foMDPO!~#fo"d`!~#fo"``*d`*`` "b`*b`*d`~#fo!``yOx#Gywx#w*b` *d` ~#~*d`*``~*``$ >2P`2Q`>2S`>2R`!P`Q!~w#~w*``! 5þD*d`~OGyOxGymE*``! ~mE*``" ~#fo6*d`~wÿC O!~Œ<#~¨B*d` >w#w*`` :d`w:e`#w*``?>BgV!:_w:_#w*_!~#fo "_!:_:_xC!f`:_:_҉C!~#fo*d`~::*d`~::``:a`;*``*``#"``! *d`~a:*d`>z:*d`~OG! MD:*d`~OGyw;!*`` 6*d`~:;!~#5Cywx#w+~#$A:_2_:_2_@!~#OA!!:d`w:e`#w+N#F5Cywx#w!~#_AP!~#fo!~#fo }|!_~# }|*b`MDPO!~#fo"d`*d` ~#fo"``*d`*d`~#fo ####!``yK?x#{?*d`*``~#fo####  *d` *`` ~#~PouN#FʹFi`"b`!b`~#EP*b`~OGyOxGyE!N#F!N#F*b`ͦCP!~#fo"d`!>#F*d`"``!>#-F*d`~ ~#fo"d`!#~=!!  #=*d`!~#fo ~5=!~#fo "``:a`=*d`*`` ~9=*d`*`` 60:``2``:a`2a`J="_nV!~#foMDnVDD^DDO!~#fo"d`!~#fo"b`!>#D! yOxGyD! yCxD!FDfo"d`!~#fo#:^wT;*d`#"d`À:!~#fo#!̈́7yw~M;!N#F=P*d`#"d`!~#fo#~;!~#fo#~OGyy;x;!ŽA!~#fo"_!~#fo!~#fo :_:_A!~#fo!~#fo "_!!~#fo##A@bad free call O!~#fo "d`!t of heap space O!N#F!N#F?i`"d`!d`~#ʿ?*d`MDP!!~?!zE!FPO!~#fo"d`:d`:e`?@*-F*d`#"d`!~w#~wE*d`!yOx#GP*d`!``yOx#G*``*b`ͦC*d`!``yOx#G}cF|lFP!>#E!!wEP:a`=*d`61!~#fo"``!``>#=*d`*`` 60:``2``:a`2a`Ý=*d`*`` 4Æ=PO!N#FʹFi`"d`!d`~#=P**b`!yOx#GP*d` ~1D*d` ~OG!C[U*d` ~#fo"``!*d`VGyUDx¾DP*b`~OG! !~w#~w*b`~Š;#~;!!͑?i`"b`!~#fo##:b`w:c`#w!*b`|K*b`( >w>#w!~#fo#~;!~#foMDP!~#foMDP*d`*b`8~#>B!_:d`:e`#$B!_:d`:e`#KB!!A!zE!F!~#foMDP!_~#kB*d` >w#w*d`"_>B!_:d`:e`#қB*d`d`MDi`#}o|g##"d`!_"``*``~#fo"b`!b`~#k@*b`~#fo####!d`yx#ڍ@*b`!d`  #Қ@*``*b` ~#~ñ@:_x@:_@:_*b`ͦCy”FxʝFP*d`#"d`!~w#~wEO!~#fo"d`:e`F!"_:d`:e`#F*d`))_ ~FP*d`))_ MDPgV!_d` ~#ʌ>*d`~OGyOxGyŒ>!*d`RI*d`~OGy OxGyj>*d` ~#fo ~w*d` N#F! *d` !*d` N#F#"b`ÿC*b`~OG! pD*b`~OG! pD!~#foMDP!>#?E*``! ~?E*``" N#F*``" ~w#~w*b`*b`#"b`yB*_"``*`` ~#fo"b`!b`~#B!d`:b`:c`#B*b`"``áB!b`~# C*d` :b`w:c`#w*`` :d`w:e`#w*d`?0 ~#%G!.G:_G:_%G*_mVi`"_F* _mV%GO*_"d`!~#fo"_*d`MDP8I2IIIO!~#fo"d`*d` ~#fo"``!*``$ ʈM~w! N#F !#~—MW!9!9! N#F!6 Mƀ4 !]WyN!q#p!N#F!]Wy N! N#F~#fo"d`!~#fo"``:``2``:a`2a`:a`K*d`6*d`#"d`ÕKP! 9~#foN#FxKO>G!9~#fo^#VzK_>WxƀGzƀWyoxL #W!9N#F!9~#fo ## # +++ #W!9MD!9~#~#~#~ !9~w#~w#~w#~w#~w#~w#~w#~w!9MDʮI!*``( N#F*d`fJy¥IxIP!~#`J*d`~OGyOxGy`J*d` ~OG! *``! *d`~w`J*d``!"``"b`"d`!9~w#~w#~w#~w+MD!9 _ #P{ !94P! 9~iP+w>#w! 9N#Fx}PO>GPP`~#~#~#~!P`!$T##~#~*``$ ##N#Fi`}o|g"b`*``! !!b`yOx#Gyw*``" *``* *b` }|!~#H &%NN!~O#~Gyր+wx#w! #w )N>8!w! ~#+~w ?N!~hN!MD!  #^N!#~w oN!56N! L>5L>5L! 9N#F!9~#fo# ##:L +:L LчWLL!9!9!6!N#F!]WyŠL! N#F > ! 9  # # #UR!9MD! 9  # # #!94UR!9!9W#~#~+++~#~#~R#>#>+++># ~OG! *``* ! *``! i`"b`!! !b`~#OJP*d`~w*d`~wîIPO!~#fo"d`*d` ~#fo"ҍPO>G! 9q#pW! 9~P+w>#w! 9N#FxPO>GPPO>G! 9q#pW! 9N#FP! 9q#pW! 9!*``( H #HP!*d`RIxPH!N#F!N#F*d`fJxVHP*`` ~OG*`` ~OGyOxG}|HN#F!rV!~ʨN!~#ʨN~w! N#F !#~·NW!9~#fo~#N~ƀw!9!9!N#F ! #wNàM!~L!>#w›L!4!q#p! N#F L!4 !]WyʠMy!Ox#Gyƀ+wx#w !#w L!69!~#~#~ #~{S>#># >#͹R!9MD!9~#foR! 9MD!9~#foR2R!9N#F!9SR͹R!9MD!9~#fob`!N#F!8Q"``*b` ~OG:``¬J:a`J*d`~OGy OxGy[K*d` ~OG! *d`~OGyOxGyK*b`! xN#FP! 9q#pW!9~$Q/#w‹VæV+¦VšV[W! ~V# +~w³V!9~w#~wæV! ~Vi`+ #~wV!9~w#~wV Wi`7#~+~w###~w+~w {TW!9~#fo##w>#w>+++w>#wMD!9!9!N#F!>w#w#w##w#w!!rV! N#F !#~ $_ wVæV!9~"Wi`+#wW[W5Wi`>#w+W>w! !9z~w+~ w++~ wOW!!9N#F!9^#V! #~#TWͶTq#px#w#wTͶTq#p#w#wTͶT w #w #w #wTͶT w #w #w #wT~#gU#~#foy#{Ux#|U+++~#fo##[U@ BCG@M [u+p~ yW! ~#~WҚW+©W WW>w+~w}Wi`>#w¼WJ!9N#F###q#p+++q!9N#F#q#pcopyright (c) !9!9!N#F!]WyaV!q#p! N#F!]WyU!N#FKV!yOx#GUyV+~w#~w!UO>G! ~#+1979 by Whitesmiths, Ltd.975717-7+7)7'7%7#7!77777 7 7 ~wU Vw yVU!MD!  #w)V!N#F!rV!MD ! ~#fo+ #wXVW!9!9N#F! 2  NAME MAKEPRL - mak .PRL fil fro absolut he files SYNOPSIS MAKEPRL [- he number [- outpu file hex hwit '.hx1 extension No yo ar read t us th MAKEPR program Thi i a exampl o typica wa T creat .PR fil o th har dis I/ drivers begi wit th assembl languag source Assembl i a i specified th nam fro hex i take wit .PR typ extensio added I th outpu fil doe no hav  makeprl hd+dj hd+dj Thi for doe th sam a th firs bu i quicke t type. Th specificatio fo th - ex2 DESCRIPTION MAKEPR̠ i use t creat .PR̠ file suitabl fo loadin b th INSTAL progra (se t d th procedur describe above Th exampl assume tha th sourc i configure correctly.  ori gi an renam th he outpu (wit .'hx0 extension. The assembl i agai wit a origi o 10 typ extension th defaul .PR i added Th nex tw argument mus b specified Th firs a optio mus b fou digi he number. FILES MAKEPRL.COM MAKEPRL program MAKEPRL.DOC This doc INSTALL.DOC) Th for ma fo .PR file ca b foun i PRL.DOC Th - optio i use fo enterin th re mac hd+dj ren hd+dj.hx0=hd+dj.hex mac hd+dj $+r ren hd+dj.hx hex (Con sul you assemble manua o ho t d this Wit som as semblers yo mus re-edi th sourc rgumen i th he fil inpu wit a origi a 0 Th secon i th secon he fil inpu wit a origi a 10ument. makeprl.doc 3/17/81 ldk serve buffe space (Th reserve buffe spac i entere a 16-bi numbe i addresse an1=hd+dj.hex makeprl -o hd+dj.prl hd+dj.hx0 hd+dj.hx1 In the MAKEPRL line it is not required that you speciffil an chang th 'org statement) Afte yo hav assemble th sourc wit a origi o 10 hex renam i  hex I th he file d no hav typ extension '.hx0 an '.hx1 ar adde respectively. EXAMPLES  o th header se PRL.DOC) Th - optio i th outpu fil specifier I n outpu fily the output or add type extensions because the program uses defaults. The MAKEPRL line could be written: 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L