TDiP'i53XOR CPM 2.2 Disk 2 of 2 8" SSDDd@@"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#:A#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# #  w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»Gy==»*Ww#*"͸*:G#š"͸:!w4!iw:Z!E~=262*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C63:ʑw:2E**E}DQ>2'lsý4ýs}ÀÅÊ&)íÑ"GsT1f > {TA1 :10002000D3F *f8:ʢ2:>22ʢ:2E:J/:E2*h:O8:/2åy*j81| !> ͚>22!"!"!":O:::J/1!<:O "9*V#^#~2!"x2y2&" P:_P*CCCɥ| ʡʣn&#>>! ~͵!:2O2O@i&))))N ^#V !+s# y~O #HA:3! _^#V,S< x< 6< .< &< < <X < < A–x/:3! _^#V,S:2_:3W, >yxo>ȯ!#%'o>/JT\dlt|&i~͵Z!:O:25_!wY!~y2:_:26G>24>ʳ!~ʰx?26Ұ>_~{/:6G> 27Oxx:7:7=!W! 9ú> 28>!<:8=28!!z!PAz!^z!cz!n!!s v :22/2>{‰!s ʆ:522̈́Wz>G͑xͺz> 28>!3?:9!"́͆> >!!9! *"!".*>"*:"*<*:O!2#~~#wq#p s#r~ȹ5@zBready id not found crc lost data busy protect flt _ Track Error boot error Read Write Seek Home No disk in drive... Hit space bar to retry, to reboot, any other key to continue >2L:![R72>2K>2M2L:![Rdy2M…:2:2E*"F*"H:=2:!E*F[R*H[RSH:!"H*F#"F2K2<2K:G[:O!:2B{_y!SC!~6g:!5*[R^*[CR^Ç:g:2E:J/:E2O>2Eyg:/2!"*"*C":K ·,:2J2:B!ʣ=ž[:L·>2:M>22/::>222:2E:J/:E2O>2Ey*"*"*":L,/*}+}y@5+}*^ :10F0ww==w}}w           V0FCF000F104F108F14AF054F05CF074 :10F1260064F06CF096F074F07CF084F08CF00000E3 :10F136 0011F9F726006939 :10F1460 [0197EB7C2EBEFCDDFEFCDB5F3B7C25AF1FB :10F15600CDEEEFC9210000C93AD3F74F3AD5F732C1 :10F1660035F1B9C85F160021F5F719DBF977592192 :10F17600F5F7197ED3F97932D5F7C93AD3F75F3A5D :10F18600E9F73236F147B73E003234F13E02CAB3F0 :10F19600F121F9F71600197EE604CAB0F178CB3FE3 :10F1A6003236F1D2B0F13E04B35F7EE603D3FD7B87 :10F1B6002FD3FCC93A36F147E5D5C5F53E0A3237B5 :10F1C600F1DBF94FB878CA06F2D33_ ,333 ,33@ ,@ @/ ,@ ? , (} !f"!:!i :!!!:hh>>}x>,2223! |>2D X O R CP/M Vers 61 of 12.20.82 0 48 961441922402883363840A Standard 1.4 & 2.2 compatible directory 128 bytes/sector256 bytes/sector512 bytes/sector1024 bytes/sector double sided 5" 8" Hard disk (k MDISK f )R?LISTER3 and LISTER0, you will have the printer in physical location 3 (meaning port 1 of SIO U12 on the serial board) assigned to logical location 0. You must then exchange STAT3 with STAT0 (in the STATTBL) so that the correct list status routine will be called when the corresponding printer is accessed. At this point, you are ready to build a new operating system with the new printer routine, CXLST. To add CXLST to your operating system, change the XXXSYS60.SUB f6CXLST.ASM for application in your system: NOTE: The present setup of CXLST.ASM will be explained below. To edit the program CXLST.ASM, you may use ED.COM or Wordstar, but Polyview is recommended. There are several things that need to be checked for in customizing the program. First, the BAUD rate necessary to interface to the printers being used. At the top of CXLST.ASM, you will see tables starting with "B110" and ending with "B19200". These are the BCXLST DOC< M COM 5MSAFMT COMPRINTER COMBLKEQU61ASMCBOOT ASM4 BLKSYS61SUBDATA ASM&MQeBLK ASMA/DIO ASM#TV^SURVEY COMHELP COMHELP HLP5 !MAC HLP="#ALGOLM HLPb$%&'ASM HLP(AUD rates and their nibble values for the programming of the 8116's (the BAUD rate generator chips located on the CPU and the serial I/O board) Just below that are the labels "BAUDA, BAUDB, BAUDC, BAUDD". These are also for the programming of the 8116's. BAUDA is channel 0 of the CPU 8116 and BAUDB is channel 1 of the CPU 8116. It is recommended that BAUDB be left at B9600 for terminal I/O and that BAUDA be set to accommodate the first printer (if you presently or in the futunBLKSYS61HEXNEDI DAT)PIP COM: CBASIC HLPk0134CBASIC2 HLP/56789: XORNEWFE$$$ BACKUP COM*1CPM HLP#UWXYZ[\]abCXLST ASM6tFORTRAN HLP7fgFLOP ASMGdPRM185 ASMP.ILPRINTER ASMKBK DAT MBASIC HLP&jklmnoPASCAL HLPMpqrpre wish to use the serial network, leave BAUDA at B9600). Next, check the list routines. They are labeled as follows: LISTER0, LISTER1, LISTER2, LISTER3, LISTER4, LISTER5. In CXLST.ASM, LISTER0 is reserved for the serial network. LISTER1 is set up for a DIABLO 1620 printer at 1200 BAUD. LISTER2 & LISTER4 are set up for a COMET 8300R printer at 9600 BAUD. LISTER3 is set up for a TI810 printer at 9600 BAUD. LISTER5 is set for a NEC interface parallel printer.fEEXAMPLE HLPsDIAGNOSECOMDSYSGEN COMKiuwzPASSCHK COMHC HLP;?@AZ80 LIB/BCDFOCO COMPv{|DDUMP COM"chNEW-INFODOC8+,-2FJSTDLST ASMND COM BLKSYS61HEXO0 NOTE: If any of your printers are not compatible to the present routines, use LISTER3 as an example to successfully write the routine for your printer and to put it in the desired LISTER location. .pa It is also necessary to have a status routine for each different type of printer used in the system. The status routines are labeled as follows: STAT0, STAT1, STAT2, STAT3, STAT4, STAT5. There is a status routine for every lister routine (i.e. LISTER0 & STAT0,   *** **  ** **  CP/M MULTIPLE LIST ROUTINE ** **  **  ***  w 11/20/82 The program CXLST.ASM will allow you to run more than one printer attached to the system.   3LISTER1 & STAT1). The status routine tests the status of the list device which will return an FF in the A register, if the printer is ready to receive a character, or a 00 in the A register if the printer is not ready to receive a character. The position look-up tables at the end of the listing show the STATTBL and TABLE for the various printers. You can put any list device first, second, etc. The STATTBL MUST match the TABLE. For instance, if you switch the position of  ^ You cannot run them simultaneously, but by using the "PRINTER" utility, software switching of the printers can be achieved. CXLST.ASM will allow a max of 6 printers (5 serial and one parallel). One serial and one parallel printer can be accessed from the CPU board. The other 4 serial printers can be accessed from a serial I/O board par numbe B-5000-44) Th seria I/ boar ca als b utilize unde MP/ withou an modifications Customizing the   @EF1FE2024 :10F1D500C8E1C921D9F3CD21F03AACEF32040032B0 :10F1E5002AF7AF323DF7C300002117F4CD21F0CD4A :10F1F5007AEEFE20CA96F23A92F0322AF7320400ED :10F20500CDDAF0C30000DBFCB7F0DBFB1213E957E6 :10F21500E610C21DF27AB7C93EC4D3F8DBFCDBFBAE :10F2250047DBFCB7F231F2DBFBC326F2DBF8B7CAEA :10F235003DF2CDF4F2C340F278D3F9CD10F17AB7AF :10F24500C93E0A3295F03EA82185F2CD8EF2E6FD43 :10F25500210000C8CD14F23A95F03D3295F0C24B2D :10F26500F221FEF3CD21F07AE64021CBF3C421F063 :10F275007AE62021D4F3C421F02146F2E5C392F1C8 :10F28 22#~2> 2!**W>,> 2!*DW*D*~,#D*DW*m,wW!,w#,w:ù>)>O+>->((î͠Ɛ'@'_͗ ,>2!*@W!~͔#7!s#  >:05*0 ?))) O !}5> >:a{*:j.1"_*++"g*#"o*JJ   4444 44--,, %%  storage location for baud rate LSTNUM EQU 3DH ; ram storage location for list number ; LIST: ; LDA PTSTFLG ; pstflg is a flag to indicate if the INR A ; printers have been init. yet or not. JZ PRNTLP ; only init. printers once!!! ; MVI A,0FFH ; set ptstflg to already done state STA PTSTFLG ; store it ; PUSH B ; save PUSH D ; LDA 3DH ; see if printer.com has been run CPI 1DH ; code from boot routine JNZ SKIPIT ; if so, user has already set baud ; IN 0BH 500DBFCB7F01AD3FB13E9F33296F0E5CDB406 :10F29500F03ED0D3F8DBF807D2B3F2110000CD99D8 :10F2A500F3CD99F33ED0D3F8DBF807DAEEF1CDD7FD :10F2B500F0CD10F13A2BF74F3A2AF7B9322BF72A4E :10F2C50044F73A42F7D3FAE5E1DBF8E620C2E5F286 :10F2D5003A93F0D3FB3E1DD3F8E5E1DBFCCD96F385 :10F2E5003A96F0D3F8EBE101F1F2C5E9DBF8C92173 :10F2F50000002240F7CDD7F03E0DD3F8E5E1DBFC69 :10F30500E5E1DBF8E604C0210FF4CD21F021F4F2AC :10F31500E5C392F1C5E52150F7060009E52A40F756 :10F325002299F02100002240F7CDF4F22A42F7227B :10F3350097F02101002242  - Hard Disk Error $ - SA1004 Hard Disk $ Enter CP/M drive reference (A to P) - >$ SA1400 Format Program. 08/25/81$ Only disk types 0 to 5 valid$ Valid drive references are A to P$ Ready ? (Y or N ) $ ** * WARNING! ***B; get baud from cpu switch MVI C,BAUDA ; put channel a baud in c ANI 0F0H ; mask channel b baud ORA C ; ora nibbles together and OUT 0BH ; set baud for cpu channels a,b ; MVI A,BAUDD ; baud for channel a of serial io board MVI C,BAUDC ; baud for channel b of serial io board RLC!RLC!RLC!RLC ; rotate the nibble to the upper position ORA C ; ora nibbles together and OUT 0BAH ; set baud for the serial io board. STA 3CH ; store byte in ram for future use. XRA A ;   :@!""> 2}LLLi1V!"1q*++++"@1Ҏ*J"J@:Rq>GoU{{>U>>R2Zq2 ""B==.>g &+B&":G{*"*"*"*" O ^ O@:@2: PPx=WP=:=@:2C1@:@2> 2:2~HTPUP_O  B-**** This program affects cpu clock and other users Type CTRL C to abort or CR to continue :$ The lun address is : $ Invalid lun address - Bad drive reference or wrong ver bios (xios) or bad bios lun map Re-try or use manual lun entry mode - type LLUN$ Enter SA1403 Locical Unit Number(lun = 0 to 3) :$ Function complete$W disk types 0 to 5 valid$ Valid drive references are A to P$ Ready ? (Y or N ) $ ** * WARNING! ***STA 3DH ; select printer 1 (on cpu) ; SKIPIT: MVI A,0ACH ; init 8255 OUT 7 ; cmd port ; MVI A,0FFH ; set b port high OUT 5 ; port b ; MVI E,4 ; no. of ports MVI C,LSTSTS1-2 ; first io port less 2 INIZLOOP: LXI H,INIZLST ; table MVI B,LCOUNT ; table length INR C ; point at next cmd port INR C ; OUTIR ; block move DCR E ; last sio ? JRZ EXIT ; find printer # and exicute routine JR INIZLOOP ; for that printer ; INIZLST: DB 18H ; channel reset pI***"*B~eI; *z{ za>a0:jO x2 /w"#* zŸ{:G/w"Iں)DMÑ *_**:P)P 2 7O 0(  (ͼgͼo_a{_0Q1 GiEia :2:…:2*#":@2**JR*"" pB#ú**" ~eBʗ#*}/Gog"1pF:10F06500D3073EFFD3053290F0DB06E6B0FE90C233 :10F075006EF079D304AFD30500+2FD305C986 :10F08500DB06E6B0FE903E01C8AFC900 F7 :10F095 001150F7260069197EED :10F0A500B7C2F3EFCDE7EFCD19F3CDF6EFFBC93AD4 :10F0B5002AF74F3A2CF73292F0B9C85F1600214C67 :10F0C500F719DBF97759214CF7197ED3F979322CE9 :10F0D500F7C93A2AF75F3A40F73293F047B73E004F :10F0E5003291F03E02CA09F12150F71600197EE669 :10F0F5000a4CA06F178CB3F3293F0D206F13E04B351 :10F105005F7EE603D3FD7B2FD3FCC93A93F047FE20 :10F115004DD2D8F18 DB 4 ; select wr4 DB 44H ; x 16 and 1 stop bit DB 5 ; select wr5 DB 0EAH ; dtr/, 8 bits, tx en, rts/ DB 3 ; select wr3 DB 0C1H ; 8 bits, rx en ; LCOUNT EQU $-INIZLST ; generate table length ; PTSTFLG: DB 00H ; zero for do init ff for already done ; EXIT: POP D ; restore POP B ; ; ; list status routine ; LISTST: LDA LSTNUM ; find current list number ANI 07H ; RAL ; double it LXI H,STATTBL ; point at status routine table MVI D,0 ; MOV E,A2 MEMORY TEST 11/12/80 LOCATION SHOULD BE WAS "CR" TO CONTINUE TEST "SP" TO STOP STARTING ADDRESS (HEX OR RET) ENDING ADDRESS (HEX OR RET) INPUT ERROR RETYPE- BIT STUCK TEST SHORTED BIT TEST ADDRESS LINE TEST 1 ADDRESS LINE TEST 2 RANDOM NUMBER TEST PAUSE - TYPE RET TO CONTINUE RETRY - DATA OK RANDOM NUMBER TEST IN PROGRESS DATE : TECHNICIAN : COMMENTS : RANDOM NUMBER PASSES (HEX OR RET) TEST COMPLETE 1>@2:222 2E5D5C5F53E0A3294F0DBF94F6D :10F12500B878CA5FF1D3FBDBF80FDA2CF178D3FBA3 :10F135003A34EEF61CD3F8DBFCDBF8E691CA5FF156 :10F145003A94F03DC21FF12107F4CD21F0DBF8E63A :10F1550091572164F1E5CD92F1E1F1C1D1E1C9F118 :10F16500C1D1E1C310F13E0A3295F03E88210BF280 :10F17500CD8EF2E69DC8CD14F23A95F03D3295F06C :10F18500C270F121F6F3CD21F0216BF1E57AE6802D :10F1950021A0F3C421F07AE61021A7F3C421F07A67 :10F1A500E60821B5F3C421F07AE60421BAF3C421B7 :10F1B500F07AE60121C5F3C421F021EEF3CD21F06B :10F1C500212CF4CD21F0CD7AEEFE0DCAD !WͲ |2!Ͳ8̀Ͷڳ!:_~2}!":!r_~2##~2##N#F#~2#ڳ!V#^:o&!r#s xe Yڳ!"!">2,ڳ!6Ͳ>2:2!W>2!W!,Ͳ82x?G ## 7!'*LUNn!=@lunn:A2!ܲԲO:O ~w!Ͳ2!_Ͳ:Ý͏Ɛ'@'_͆2O:2>42!Ͳ8Y³>-->,>(*>(,>-,D!:_~  ; status port serial io channel 2 LSTSTS4 EQU 0A7H ; status port serial io channel 3 LSTSTS5 EQU 06H ; status port cpu 8255 ; ; These are the data port address for the respective printers ; LSTDAT0 EQU 00H ; data port cpu 8251 LSTDAT1 EQU 0A0H ; data port serial io channel 0 LSTDAT2 EQU 0A2H ; data port serial io channel 1 LSTDAT3 EQU 0A4H ; data port serial io channel 2 LSTDAT4 EQU 0A6H ; data port serial io channel 3 LSTDAT5 EQU 04H ; data port cpu 8255 ; BAUD EQU 3CH ; ramdmME DATA!! ANI 7FH ;MASK PARITY CPI 06H ;ACK? JRZ RSTCNT ;RESET COUNT THIER BUFFER EMPTY CPI 20H ;NEW LISTING JRZ NEWLIST ;CLEAR COUNTER CHKBUF: LDA STOR ;CHAR SENT CPI 4EH ;1 LESS THAN MAX JRZ ETXOUT ;SEND FIRST ETX FOR FIRST OF 2 79 BYTE SETS CPI 0CEH ;TOP OF BUFFER JRZ ETXOUT1 ;ANOTHER ETX CPI 0CFH ;TOP OF BUFFER JRZ LISTER1 ;OVER LIMIT WAIT FOR ACK OUTDAT: MVI A,10H ; OUT LSTSTS1 ; IN LSTSTS1 ;CHECK STAT ANI 2CH ; CPI 2CH ; JR q; ;$** ;** ;** 'CP/M multi lister routine 11/20/82 ;** . (Port initialization is in CBOOT.ASM) ;** ;$** ; UPPER EQU TRUE ; true if second ser io card installed DIABLO EQU FALSE ; true if diablo driver for list 1 ; ; these are the status port address for the respective printers ; LSTSTS0 EQU 01H ; status port cpu LSTSTS1 EQU LI HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* |NZ OUTDAT ;STAT OK? MOV A,C OUTDAT1: OUT LSTDAT1 ; LDA STOR ; INR A ;INCREMENT BUFFER COUNT STA STOR ; RET ; ETXOUT: MVI A,80H ;FIRST CLR OF BUFFER COUNTER USED ONCE STA STOR ;AT START ONLY OR NEWLST ETXOUT1: MVI A,10H ; this is only for sio's OUT LSTSTS1 ; IN LSTSTS1 ;CHECK STAT ANI 2CH ; CPI 2CH ; JRNZ ETXOUT1 ; MVI A,03H ;SET A FOR ETX OUTPUT CALL OUTDAT1 ; JR LISTER1 ;JMP LST TO WAIT FOR ACK NEWLIST: XRA A ;CLEAR STBASE+1 ; status port base address (21h) LSTSTS2 EQU LSTSTS1+2 ; status port serial io channel 1 LSTSTS3 EQU LSTSTS1+4 ; status port serial io channel 2 LSTSTS4 EQU LSTSTS1+6 ; status port serial io channel 3 LSTSTS5 EQU 06H ; status port cpu 8255 ; LSTSTS6 EQU LISTBASE+81H ; status port upper board address (0A1h) LSTSTS7 EQU LSTSTS6+2 ; status port serial io channel 1 LSTSTS8 EQU LSTSTS6+4 ; status port serial io channel 2 LSTSTS9 EQU LSTSTS6+6 ; status port serial io channel 3 ;  r!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * A TO 00H FOR NEW COUNT STA STOR ; JR OUTDAT ; RSTCNT: MVI A,80H ;CLR BUFFER COUNT FOR COUNT OF 80H TO CFH STA STOR ; JR LISTER1 ; STOR: DB 00 ELSE ; if diablo ; LISTER1: CALL STAT1 ; INR A ; JRNZ LISTER1 ; JR LSTOUT ; ENDIF ; if diablo ; LISTER2: CALL STAT2 ; INR A ; JRNZ LISTER2 ; JR LSTOUT ; ; LISTER3: CALL STAT3 ; INR A ; JRNZ LISTER3 ; JR LSTOUT ; ; LISTER4: CALL STAT4 ; INR A ; JR; These are the data port address for the respective printers ; LSTDAT0 EQU 00H ; data port cpu LSTDAT1 EQU LISTBASE ; data port base address (20h) LSTDAT2 EQU LSTDAT1+2 ; data port serial io channel 1 LSTDAT3 EQU LSTDAT1+4 ; data port serial io channel 2 LSTDAT4 EQU LSTDAT1+6 ; data port serial io channel 3 LSTDAT5 EQU 04H ; data port cpu 8255 (parrallel centronics) ; LSTDAT6 EQU LISTBASE+80H ; data port upper board address (0A0h) LSTDAT7 EQU LSTDAT6+2 ; data port serial io channel 1 Ll "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  @(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$YSTDAT8 EQU LSTDAT6+4 ; data port serial io channel 2 LSTDAT9 EQU LSTDAT6+6 ; data port serial io channel 3 ; ANIBYTE DB 85H ; CPIBYTE DB 85H ; ; LIST: MOV B,C ; save output byte LDA PRINTER ; find curent list number ANI 07H ; RAL ; double it LXI H,TABLE ; point at list rountine table MVI D,0 ; MOV E,A ; move list number into e DAD D ; MOV E,M ; INX H ; MOV D,M ; we now have the address of the data XCHG ; out rountine of the current list de` :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 vice MVI E,2CH ; MOV D,E ; PCHL ; do it to it ; ; this printer port is channel 'A' on the cpu ; LISTER0: CALL STAT0 ; INR A ; JRNZ LISTER0 ; MOV A,B ; OUT LSTDAT0 ; RET ; ; IF DIABLO ; ; this routine is to be used for the DIABLO 1620 printer. ; buad rate for the DIABLO is normally set to 1200 baud. ; LISTER1: MVI A,10H ; OUT LSTSTS1 ; IN LSTSTS1 ;CHECK STAT ANI 01H ;RECIEVE BIT ON? JRZ CHKBUF ;NO DATA READY IN LSTDAT1 ;SO/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ 221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>F to BAH (upper and first ser bd)l) EBAUD EQU B9600 ; left " " " " " " FBAUD EQU B1200 ; right " " " " " " ; ;*** ; IF NOT XMLDR  ORG BASE ; ; LXI SP,100H LXI H,BRLOOP ; MUST NOT BE DISTURBED MVI C,2 ; C IS SECTOR COUNTER LDED LOADADR ; WHERE TO BEGIN LOADING THIS SYSTEM EXX ; ALTERNATE PAIR LHLD SECTTK0 ; GET SECT TRK 0 IN L, SECT TRK 1 IN H LDED BSECTS ; TOTAL ; new drive outside table ? CMP C MVI A,0FFH RC LXI H,DRIVMAP MVI B,0 DAD B MOV A,M ; get lun address RET ;*** ; SELECT DISK ;PARAMETERS ; NEW DISK IN 'C' ; IF LOGGED IN BEFORE, ROUTINE WILL ; ONLY UPDATE 'NEWDISK'. DBLOCKING ; WILL MAKE THE CALL TO SELD1. ; SELD1 RESETS DENSITY IF NOT DONE ; ALREADY. ;**+ ; SELDSK: IF MLDR OR XMLDR PUSH B ne S0121: PRINT <'PRINTER # '> ; LDA S003D ; get printer # STA S0349 ; stor in local JMP S016F ; put on screen DEC$CONV: DECOUT ; RET ; S016F: LHLD S0349 ; get local printer CALL DEC$CONV ; PRINT ; RET ; ; S0186: LXI D,BAUMSG ; MVI C,09H ; CALL S0005 ; S02A1: LXI D,SELMSG ; MVI C,09H ; CALL S0005 ; CHARIN ; get choice CPI '1' ; less than 1 ? JC S02A1 ; abort CPI '9'+1 ; greater thW SECTS TO READ IN E, CODE IN D LXI B,0080H ; B = TRACK C IS A MASK EXX RBLK: MOV A,C ; C SERVES TO SET SINGLE DENSITY  iOUT BDDENS ; SELECT SINGLE DENSITY XRA A ; SELECT TRACK 0 OUT BDDATA ; TRACK TO SEEK BSEEK:  %MVI A,SEEKCMD + HEADLOAD + SEEKRATE  OUT BDCOM ; SEND COMMAND  IN WAIT ; BREAD: MOV A,C ; NOW C IS SECTOR # OUT BSECT ; MVI A,READCMD ; OUT BDCOM ; ; ; HL MAINTAINS LOOP, DE = DMA, B = SECT BRLOOP: IN WAIT ; TH ~u8;EQU TITLE 'XOR STANDARD BIOS VS 2.22 11/20/82' ; ; *** SYSTEM SIZE  *** ; ; ; MSIZE IS THE EFFECTIVE SIZE OF YOUR SYSTEM AFTER ACCOUNTING ; FOR CBIOS AND THE HOST BUFFERS. THE VALUE COMPUTED IS USED ; AS THE NUMERIC VALUE 'NN' IN YOUR MOVCPM SEQUENCE: ; ; E.G. MOVCPM NN * ; MSIZE EQU 61 ; ;*** ;**&* ; SYSTEM GENERATION EQUATES ; ;  an 9 ? JNC S02A1 ; abort ANI 0FH ; mask ascii DCR A ; rel to 0 LXI H,BAUDTABLE ; ready to convert MVI D,0 ; MOV E,A ; S02B7: DAD D ; MOV A,M ; correct binary pattern for generator STA S034A ; local storage S02EE: LXI D,PRTMSG ; now to find out which channel MVI C,09H ; CALL S0005 ; CHARIN ; S02FD: CPI 03H ; RZ ; CPI '0' ; JZ S0310 ; CPI '1' ; JZ S0326 ; CPI '2' ; JZ S0314 ; JMP S02EE  IS SPECIAL PORT WILL HANG CPU ORA A ; UNTIL DATA IS AVAILABLE JP BRDONE ; HARDWARE SET MSB WHEN INT. IS VALID ; IN BDDATA STAX D ; D IS DMA ADDRESS INX D ; POINT TO NEW PCHL ; HL POINTS TO RLOOP ; BRDONE: IN BDSTAT ORA A ; IMPORTANT WE CLEAR FLAGS JNZ ERROR ; ; EXX ; ALTERNATE DATA DCR E ; TOTAL SECTORS WERE IN E JZ ENTERSYS ; ALL SECTORS READ, GO TO O.S. DCR L ; L = SECT TRK 0, H = SECT TRK 1 JZ NXTTRK ; FIRST TRK DONE EXX ; INR C ; POI  TRUE EQU 0FFFFH ;DEFINE VALUE OF TRUE. FALSE EQU NOT TRUE ;DEFINE VALUE OF FALSE. ; DPROM EQU TRUE ;TRUE IF I.O. IS TO PROM ; MMPM EQU FALSE ;IF MP/M SET TRUE ; MLDR EQU FALSE ;IF M/PM LOADER SET TRUE XMLDR EQU FALSE ;IF M/PM LOADER W/O BOOT ; DBLOCK EQU TRUE ;TRUE FOR MULTISECTOR OPERATION F256 EQU FALSE ;TRUE FOR 256 SECTOR FLOP F512 EQU TRUE ;TRUE FOR 512 SECTOR FLOP MAXHST EQU 512D ;SIZE OF BLOCKING BUFFER ; SKEW EQU TRUE ;TRUE IF HI SPEED FLOPPY ; MAXI8 EQU TRUE  ( ; S0310: IN 0BH ; cpu baud rate switch ANI 0F0H ; mask lower MOV C,A ; LDA S034A ; get new baud ORA C ; OUT 0BH ; baud rate port RET ; S0314: LDA S003C ; get baud rate ANI 0F0H ; mask off lower nibble MOV C,A ; LDA S034A ; ANI 0FH ; ORA C ; S0320: OUT 0BAH ; port ba is baud rate gen on serial i.o. bd STA S003C ; RET ; S0326: LDA S003C ; ANI 0FH ; MOV C,A ; LDA S034A ; ANI 0F0H ; ORA C^NT TO NEXT SECTOR JMP BREAD ; GET NEXT SECTOR ; NXTTRK: ; NOTE: ALTERNATE REGS ARE IN! MOV A,D ; SUI 0DDH ; JZ SSDD ; MOV A,C ; 80H ANA D ; D HAS CODE BYTE AND MSB SET = DBL SIDED RLC ; ROTATE TO TEST BIT 8 JNC SSDD ; MSB OF 'D' NOT SET DCR B ; ONLY GO THROUGH HERE ONCE RLC!RLC ; ROTATE WITHOUT HOLDING BIT SSDD: CMA ; INVERTING BUFFERS SO CMD MUST UPSIDEDOWN OUT BSELECT ; TRACK NO. IS LOW ENUF THAT STILL ON DRIVE 0 MOV D,L ; CLEAR D INR B  ;TRUE IF STANDARD 8" FLOPPY ; MINI48 EQU TRUE ;TRUE IF MINI DISK DRIVE 48TPI MINI96 EQU TRUE ;TRUE IF MINI DISK DRIVE 96TPI ; PRIAM EQU FALSE ;TRUE IF PRIAM HARD DISK ; SHUGART EQU FALSE ;TRUE IF SHUGART 1000 SERIES HD ; QUANTUM EQU FALSE ;TRUE IF QUANTUM SERIES 2000 HD SMS10 EQU FALSE ;TRUE IF SMS 10 MEG SMS20 EQU FALSE ;TRUE IF SMS 20 MEG SMS30 EQU FALSE ;TRUE IF SMS 30 MEG SMS40 EQU FALSE ;TRUE IF SMS 40 MEG OLDQ EQU FALSE ;TRUE IF OLD SKEW ; SEKRATE EQU 00 ;00C ; JMP S0320 ; ; SELMSG: DB cr,lf,lf,'Select baud rate -> $' PRTMSG: DB cr,lf,lf,lf,'0 = CPU chan "A", 1 = left serial i.o., 2 = right serial i.o.' DB cr,lf,'Which Baud Generator ? -> $' BAUMSG: DB cr,lf DB '1 = 300 baud',cr,lf DB '2 = 600 baud',cr,lf DB '3 = 1200 baud',cr,lf DB '4 = 1800 baud',cr,lf DB '5 = 2400 baud',cr,lf DB '6 = 3600 baud',cr,lf DB '7 = 4800 baud',cr,lf DB '8 = 9600 baud',cr,lf DB '9 = 19200 baud',cr,lf DB '$' ; BAUDTABLE: DB 0000$0101B!9"1Zͯ *** SYSTEM SURVEY *** !GͯDrive>A_ͯ:\o` }~*.<~2##n&" ð>?2##~2###~#fo"#|g}o›E:ʰ~Ҽ ·#´͂ͯK bytes in!ƀ_#y͂ͯ files with*|/g}/o#͂ͯK bytes remaining $-3ͯ MEMORY MAP: 0 8 16 24 32 40 48 56 64 | x| !6#6#6–!?22~G/wp!4¿#42>:2!4#4#¬::%ͯQC = 3MS,|01 = 6MS,|02 = 10MS,|03 = 15MS ; QUME,850 |801 | | ; MINIS |  | | ; SLIMLINE EQU TRUE ;TRUE FOR SLIMLINE ; MDISK EQU FALSE ;TRUE IF MDISK ; DUAL EQU FALSE ;TRUE IF DUAL SPINDLE DRIVE (PERSCI) ; SIDE2BIT EQU FALSE ;SIDE TWO COMPARE BIT (NORMALLY OFF) ;*** ; ; ; 300 DB 0000$0110B ; 600 DB 0000$0111B ; 1200 DB 0000$1000B ; 1800 DB 0000$1010B ; 2400 DB 0000$1011B ; 3600 DB 0000$1100B ; 4800 DB 0000$1110B ; 9600 DB 0000$1111B ; 19200 ; S0338 DW 0 S0349 DW 0 S034A DW 0 ; END  = 600 baud',cr,lf DB '3 = 1200 baud',cr,lf DB '4 = 1800 baud',cr,lf DB '5 = 2400 baud',cr,lf DB '6 = 3600 baud',cr,lf DB '7 = 4800 baud',cr,lf DB '8 = 9600 baud',cr,lf DB '9 = 19200 baud',cr,lf DB '$' ; BAUDTABLE: DB 0000$0101B/ >ͯ/ͯ/:+ͯ/ͯ ¢ͯ T=TPA C=CPM M=Unassigned Memory R=ROM or Bad Memory *͂ͯ Bytes RAM *͂ͯ Bytes ROM *͂ͯ Bytes in TPA |/g}/o͂ͯ Bytes Empty ͂ͯ Total Active Bytes ACTIVE I/O PORTS !+|! z*2$_zG9Ɛ'@'_0#[ ͯ _ͯͯ ͂ͯ Ports active *ë ڎ |ą{0__ͅ~W_#>:k&{oG)???????????v^#V"; *;  ͪ  *; q#pÝn* " ! p+q* )*= ^#V"; ! 6> ! i* &*; >OK : <2 E:/ *; ^#V*% DMf KK : *; Nf E*; ~ڻWK þE *; ~SK E = ! 6:! '= :/ = : = !: = : <2 * " !" >! .  * *&͵ "( * *&͵ > j*( #"( *DM*( V"( !" (   K!" }2 : <2 O:* * * "    >! = * DM** +" *( * " Ø* #" *&0F7850074 :01F795000073 :02FC160016FCDA :10F76B00CA79F71163EE2169EE010600EDB021278E :10F77B00F8CD1FF03A26F83CCA90F73E03323D0015 :10F78B003EFF3226F83A7F0021DBF8E620FE20CC44 :10F79B001FF03A7F002155F8FEDDCA20F8FE10CA93 :10F7AB00CFF72164F8CD1FF02180F83A7F00E603F4 :10F7BB00B7CACFF73C214BF8110200193DC2C6F76F :10F7CB005E2356EBCD1FF021C5F8CD1FF021D3F8EA :10F7DB003A7F00E640C2E6F721D7F8CD1FF021E6CD :10F7EB00F83A7F00E620C2FCF73A7F00E608C41F18 :10F7FB00F03A0400212B00BD3A0400Cy1)2Q3(4P O:L  CO:L :R 1I2IӺ:S <:CO:L 1 _PʐBʼSoTA`â Printer ? $ *0w`>2S ͬ2S ` $ ` __ $   !>*< $>:9&0,9.0e"< ! ~# Qj!"P __?Ñ PARALLEL Status Bits $r ü1 X 0 1 X# = Good Status $ W B O  $ A U N $ *( * " 3*1 #" " " *5 " > # R : B * +" ! +s#r( ! 6: " * ~2 * #" * +" > ʶ : 2 Ғ * +" : <2 O>ҳ ! 6* #" * ~2 p K* DMf = * *% DMf = * *% DMf = *( #"( K*# DMf = * *% DMf = : AOK :K . g S -A >>!  ~?l W >#^ : /!:' —  ʑ #‹  W ʢ #™ i`N#FogDM!>))덑o|g =¼ DM!>)) = ^#V) ^#V|g}o s20AF8AF0610 :10F80B000F21B4EFBECA18F82B05C20FF87832A43B :10F81B00EF320400C9CD1FF0C3FCF7000D0A5820CE :10F82B004F205220202043502F4D205665727320BD :10F83B003631206F662030332E33312E3832200094 :10F84B0055F864F891F8A2F8B3F8205374616E641C :10F85B0061726420312E34202620322E3220636FC9 :10F86B006D70617469626C65206469726563746F35 :10F87B0072790D0A003132382062797465732F73F7 :10F88B006563746F72003235362062797465732F3D :10F89B00736563746F7200353132206279746573EE :10F8AB002F736563746F7200313032342062797458 :10FI S L  $ 1T Y N . $ O8251 Status Bits $< z1 X] 1 X 1 = Good Status $Z ×D S F O P T R T $ ôS Y E E E x x x $ R E R R $ SIO Status Bits $ X X 1 X 1 1 X X = Good Status $ 7B T C S D T I R $% TR x T y T x n x $B rK U S n R R t R $_ é  pStatus Byte for printer $} *0~0_ $ !** }o0  a _{ozgO{ozgi`N#Fogo&og_{_z#W OK = Y -S {-_ ! s+p+q*  ͼ 2 <2 : ! ڗ  K ! 4Á ! 6: =! ڻ * & NK ! 4œ >3  03} Z; { ) #   k   Hit SPACEName Ext Bytes UN At | File(s), occupying K of K total capacity directory entries and K bytes remain on 1 !9" ! J> # ->! . *ͪe> # < * v K  K  K !B r+s+p+qA ?  p*A *? :]$Ž l]Q !]6 !E 6!C 6 :C *C &l ~2D U¼:E 2 :D S:E 2:D F:E 2:D V:E 2:D P:E 2 :D N2E ! $  >ʱ`!"P !2***P +}"P _W Printer not Ready $C  j>& Select baud rate -> $ 0 = CPU chan "A" 1 = left brg, 2 = right brg on serial board addressed 3AH 3 = left brg, 4 = right brg on serial board addressed BAH Which Baud Rate Generator ? -> $ 1 = 300 baud 2 = 600 baud 3 = 1200 baud 4 = 1800 baud 5 = 2400 baud 6 = 3600 baud 7 = 4800 baud 8 = 9600 baud 9 = 19200 baud $ "P" = Select new Printer "B" = Select new Baud Rate   ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0  k C 4Ø:!4:!5(  ! I3= : [= t:\a:\=_: :] t ?]\ : ҃! 6?Î : 2   ]Q  ?\\ : DM, Q ! "= *3 ##)*= "; */ &# "! *3 #"#  !! "% >!1 . 2' \: 2 : ʩ: ƀo&"* ~ʛ*# +"# ** DMY қ** DM  *; q#p* " . ** #DM*; -e**  *; w* #" )*= *; s#r*; "; : 2 !S 6!"V * "n >!S d*S &T ) ^#V"K O!l ^#V"M :S =2S M K  a*K "G *  "T" = Manual output mode (Characters sent from keyboard, ESC terminates) "A" = Auto output mode (String sent until space bar hit) "S" = Display printer status byte "P","B","T","A" or "S" ? $ 0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrIstuvwxyz !@#$%^&*()_-+=~`|\:;"<,>?/ PRINT TEST PASS NUMBER 00  DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.{T switc al outpu t th paralle por o temporar basi yo ca se byt i memor a EE33 t 01H Thi ca b don wit DD o BASI wit "POKE instruction Thi memor cel i th firs byt afte th en o th bio jum tabl an ca b calculate fo differen syste size b pickin u th war boo entr addres a memor locatio an 2 an addin 30H to that address. (30H = 48 decimal) secon method whic i permanan fo th dis tha th chang waM "I *K  )*= ^#V"O I G  *G )*= N#F*O ? J*G #"G (*I )*= ^#V*O DM? m*I +"I JI G  *G )*= ^#V"Q *I )*= *G )*= N#Fq#p*I )*= *Q s#r*G #"G *I +"I K I  G M   !M G  :S <2S O!T *G s#r*S &l ) *M s#r*I "M ^I K  X:S <2S O!T *K s#r*S &l ) *I s#r*G "K û!" "    #* #" )*= * #" )*= N#Fq#p   * )*= * ) *= ^#VN#F? H * #" )*= ^#V";  *; ^#V" * )*= XA10060C020BAD :10F6D500DD013300040F00EE005F00C000200002D2 :10F6E500002C19333300010000800N0900554 :10F6F5003300040F00E2017F00C000200002002C4F :10F705001933330001000080001A01400099 :10F71500051F0397007F008000200002002C194080 :10F725001000200302000280ABF69A054000051F79 :10F735000132017F008000200002002C19401000DA :10F74500200302000280ABF6E5021A00030700F26F :10F75500003F00C000100002002C191A1A00010019 :10F7650000800 014 :10F7750084 :1#1 : X O R Printer control utility Vers. 1.1 11/20/82$ ~ Command forms; PRINTER , PRINTER {p}, PRINTER {b}$E Û, PRINTER {p},{b}$  Where p = desired printer $ and b = re-set baud rate -OR- $  "T" to test print $ *0"N !]~##F I_BʬT`x_T`B̬XPRINTER # $M 2J ÕÑ t |k{0__k*J hã $ 4 p  C1ڴ:Ҵ=!? _~2L  2R *N 0÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\/---  PIN 1  CHANNEL B U12  PIN 2  CHANNEL A U12  PIN 3  CHANNEL B U11  PIN 4  CHANNEL A U11  --  1 HEADER PIN NUMBER | 8116- CHANNEL AND LOCATION  --  PIN 12 CHANNEL 1 U18  PIN 13 CHANNile that matches your hardware configuration (where XXX = the operating system acronym. STD=floppy system without blocking/deblocking, BLK=floppy system with blocking/deblocking, DTC=10 MByte Shugart hard disk with DTC controller, 1MS/2MS/4MS=10/20/40 MByte Quantum hard disk, respectively, with SMS controller, PRI=Priam hard disk system). Edit the XXXSYS60.SUB file, replacing the STDLST.ASM with CXLST.ASM. Now run "SUBMIT XXXSYS60.SUB" to build the new operating w-:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6`EL 2 U18 The 8116 can be programmed to a variety of BAUD rates (from 50 BAUD to 19200 BAUD). There should be no problem in meeting the necessary BAUD rate required by your printer. When changing the the BAUD rates you will be asked which channel you wish to change BAUD rate on. Channel 0 is pin 3 of the 8116 which is connected to pin 12 of the BAUD rate select header, channel 1 is pin 17 of the 8116 which is connected to the pin 13 of the BAUD rate select header. system. When it is complete, run the DSYSGEN program to put the new operating system onto the system tracks of your disk. Reset the system and boot up your disk with the new operating system. How to change from one printer to another: There is a utility called PRINTER.COM. This program will perform several functions: 1) Report the printer you are presently logged onto. 2) Change logged printer from one printer to another. 3) Change the BAUD rate on the2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:H'MSG2S: DB 'PROM MONITOR',0AH,0DH IF SIO DB 'VERS 186' ENDIF IF I8251 DB 'VERS 185' ENDIF DB 0AH,0DH,'$' ; CONIN: IN CONPORT ANI RxMASK JZ CONIN IN DATA ANI 7FH RET CONOUT: IN CONPORT ANI TxMASK JZ CONOUT MOV A,C OUT DATA RET ; CONSTAT: IN CONPORT ANI RxMASK MVI A,0 RZ CMA RET ; LIST: IF SIO MVI A,10H ; RESET EXT/STATUS INTERRUPTS OUT LSTSTAT NOP ; DELAY FOR STATUS TO BE UPDATED NOP ; MORE DELAY ENDIF IN LSTSTAT ANI LISTMASK  SERIAL I/O BOARD. 4) Allow manual or automatic testing of printer. 5 Examin an displa por statu byt o scree t b sur handshaking is working correctly. .PA B typin "PRINTER" th progra wil displa t th scree th printe numbe yo ar presentl logge onto B typin "PRINTE X ( bein th printe number) th syste wil b logge ont printe X B typin "PRINTE B" men wil b displaye o th screen Thi men display va:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈* *M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O> riou BAU rate an thei correspondin numbe codes Th progra ask yo t inpu th numbe cod fo th BAU rat yo wis t select Whe thi numbe ha bee entered yo wil b aske o whic channe o th 811 yo wis th BAU rat t b change ( channe o th CPU channe o th 811 o th optiona seria I.O card channe o th sam board. Whe yo hav type i th channe number yo wil b se t ru you pri DM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨'' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈* *M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ  ,nter Yo ma als chang bot th BAUĠ rat an th selecte printe b typin "PRINTE X,B**#* ; ; END OF FLOPPY DRIVERS ; ;!*** ; PAGE MSG: DB 0DH,0AH,'boot ' ERRMSG: DB 'error' CRLFMS: DB 0DH,0AH,0 RDMSG: DB 0DH,0AH,'Read ',0 WTMSG: DB 0DH,0AH,'Write ',0 SKMSG: DB 0DH,0AH,'Seek ',0 HEMSG: DB 0DH,0AH,'Home ',0 NNMSG: DB 0DH,0AH,'No disk in drive...' READYMSG: DB 0DZH,0AH,'Hit space bar to retry, to reboot, ' DB 'any other key to continue ',0 ;**H,MDSIZE ; MOV E,A ; MVI D,0 ; DAD D ; LXI D,BANKS ; LXI B,3 ; LDIR ; LXI H,SXMSG ; CALL PMSG ; ENDIF ; if mdisk FINIS4: LDA CDISK ; LXI H,BRLOOP ; boot read loop adr CMP L ; lower byte occupies 4 LDA CDISK ; JNZ FIN5 ; no match, is a hd XRA A ; always flop a FIN5: ; if not flop, hd will be at cdisk MVI B,15 ; LXI H,DRIVMAP+15 ; UNMAP: CMP M ; JZ UNMAPPED ; DCX H ; DCR B ; JNZ UNMAP ; UNMAPPEDL PMSG ; mophadyte orphan JMP FINIS4 ; BOOT3: CPI 10H ; JZ PDDMSG ; LXI H,DD128N ; 2.2 msg CALL PMSG ; LXI H,DD128 ; LDA 7FH ; re-get code byte ANI 03H ;MASK UPPER ORA A ; 0? JZ PDDMSG ; INR A ; LXI H,DENMSG ; LXI D,2 ; LOOP: ; DAD D ; DCR A ; JNZ LOOP ; MOV E,M ; INX H ; MOV D,M ;PTR IN D&E XCHG ;NOW IN H&L PDDMSG: ; CALL PMSG ;PRINT THE DENSITY LXI H,DSMSG ; point at ds msg. PSSDS: ; ^PDFOCO ^2 Please put a BLANK disk in drive "B", then press RETURN ^^1 B: DFORMAT B: SIZE 512 DCOPY A: TO B: SIZE 512 ^2 Replace disk in drive "A" with another SOURCE disk. (ctrl 'C' to exit) ^^1 $  CALL PMSG ; print single or double sided LXI H,MINIMSG ; LDA 07FH ; ANI 0100$0000B ; is it a mini JNZ PMINI ; LXI H,STDMSG ; PMINI: ; CALL PMSG ; IF MDISK LXI H,2 ; test location LXI D,MMSG ; MVI C,8 ; MVI A,1 ; start with bank 1 OUT 8 ; CHKMDISK: DCR C ; JRZ FILLBN0 ; LDAX D ; CMP M ; JRNZ FILLBN2 ; INX H ; INX D ; JR CHKMDISK ; FILLBN0: LDA 1 ; banks STA BANKS ; JMP BNKEND0 ; FILLBN2:  ;DENSITY FLAG POINTER MOV M,A ;UPDATE DFLAGS WITH DENSITY POP H ;GET DISK HEADER VECTOR PUSH H ;SAVE IT FOR RETURN MOV M,C INX H MOV M,B ;SET UP TRANSLATE TABLE ADDRESS LXI B,9 ;POINT TO PARM BLOCK DAD B MOV M,E ;SET UP ADDRESS INX H MOV M,D POP H ;RETURN SEL. DISK. HDR. VECTOR POP B RET ; ; find a match for the density flag , leave pointer pointing at flag. ; default at single sided single density. therefore single sided single density ; must be the last bl XRA A ; FILLBN4: OUT 8 ; set the address MVI M,055H ; bits INR A ; next bank CPI 9 ; wrote to all ? JC FILLBN4 ; XRA A ; bank 0 again TESTBN: STA BANKS ; higest bank address in system OUT 8 ; set the address MVI M,0AAH ; other bits INR A ; next bank OUT 8 ; set address MOV A,M ; if bank is there this is a 55h CPI 055H ; JNZ BANKEND ; CMA ; make an 0aah MOV M,A ; MOV A,M ; make sure its real memory CPI 0AAH ; by testing forock in the list of tables. ; GETBLOCK: LXI D,TBLEND-TBLSTART ; length of one block + flag and GETBLOCK1: ; internal code MOV A,M ; get test match CPI SD128 ; end of table ? RZ CMP C ; match RZ DAD D ; point to next table JMP GETBLOCK1 ; look again ; ; software delay routine HDELAY: LXI D,8000 ;5555=25 MS DELAY AT 4MZ SDELAY: DCX D MOV A,D ORA E JNZ SDELAY RET ; CBIOS MESSAGES ; NRMSG: DB 'ready ',0 RNMSG: DB 'id not found ',0 CRCMSG: DB 'crc ',0 LDMi cma of 55h JNZ BANKEND ; LDA BANKS ; try next bank INR A ; JMP TESTBN ; BANKEND: LDA BANKS ; ORA A ; JZ BNKEND0 ; no banks MVI A,1 ; OUT 8 ; LXI H,0 ; LXI B,32 ; MVI E,0 ; JR FILLOOP2 ; FILLOOP: SBCD FILLOOP4 ; creates no-ops MVI E,0E5H ; LXI B,2048-32 ; FILLOOP2: MOV M,E ; INX H ; DCX B ; MOV A,C ; ORA B ; JRNZ FILLOOP2 ; FILLOOP4: JR FILLOOP ; LXI H,0 ; MVI M,0FH ; user 15 I ř; ;**J ; ; COLD BOOT LOADER (IN SAME AREA AS FREE STORAGE) ; 12/20/82 ;** ; VERSNUM:DW 0 DIRBF: DS 128 IF DBLOCK HSTBUF: DS MAXHST ENDIF ; IF NOT MDISK ENDSYS: EQU $ ;TO MAKE ASSEMBLER HAPPY ENDSYS1: DW ENDSYS ENDIF ; ORG DIRBF ; OLDPROM: DW PROM+18H ; DW PROM+6 ; DW PROM+9 ; ; BOOT1;: ; CPI 1 ; JRZ BOOT4 ; early "net" proms MOV SG: DB 'lost data ',0 BSYMSG: DB 'busy ',0 WPMSG: DB 'protect ',0 WFMSG: DB 'flt ',0 DFMSG: DB 0DH,0AH,'Track Error',0 BTMSG: DB 0DH,0AH,'boot ' ERRMSG: DB 'error' CRLFMS: DB 0DH,0AH,0 RDMSG: DB 0DH,0AH,'Read ',0 WTMSG: DB 0DH,0AH,'Write ',0 SKMSG: DB 0DH,0AH,'Seek ',0 HEMSG: DB 0DH,0AH,'Home ',0 NNMSG: DB 0DH,0AH,'No disk in drive...' READYMSG: DB 0DH,0AH,'Hit space bar to retry, to reboot, ' DB 'any other key to continue ',0 ;** NX H ; LDA BANKS ; MOV M,A ; INX H ; LXI D,MMSG ; XCHG ; LXI B,7 ; LDIR ; MVI A,20H ; STAX D ; INX D ; STAX D ; INX D ; STAX D ; BNKEND0: LDA BANKS ; INR A ; MOV C,A ; MOV B,A ; XRA A ; OUT 8 ; BNKEND1: DCR C ; JRZ BNKEND2 ; ADI 24 ; JR BNKEND1 ; BNKEND2: DCR A ; STA DSKSIZ ; XRA A ; BNKEND3: DCR B ; JRZ BNKEND4 ; ADI 3 ; JR BNKEND3 ; BNKEND4: LXI  1e8 XOR DATA SCIENCE DSYSGEN VERS. 2.25 12/20/82 $ 2e2e2er SYSTEM SOURCE FILE ON DISK? (Y/N) $M _YʂNʘ ʘJõ CONSTRUCT FILE? (Y/N) $ _YN ØCOMHEX DRIVE and NAME OF CPMXX.COM$ ͗!e~Z! $ [eg]W DRIVE and NAME OF BOOT + BIOS.HEX$3 ͗!e'[v $s 0>2e͗~Z[eg]0!\  s# ž!hs# « DRIVE...$ _ AP2e >_×  FI  DB 4 ; select wr4 DB 44H ; x 16 and 1 stop bit DB 5 ; select wr5 DB 0EAH ; dtr/, 8 bits, tx en, rts/ DB 3 ; select wr3 DB 0C1H ; 8 bits, rx en ; LCOUNT EQU $-INIZLST ; generate table length ; ; signon messages ; SMSG: DB 0DH,0AH,'XOR DATA SCIENCE CP/M Vers ' DB MSIZE/10+'0',MSIZE MOD 10 + '0' DB ' of 12.20.82 ',0 ; MDSIZE: DB ' 0' DB ' 48' DB ' 96' DB '144' DB '192' DB '240' DB '288' DB '336' DB '384' DENMSG: DW DD128O DW DD128N DW DD256 DW   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  LE NAME...$ e>];~9a2{2 w# 7!eÒ6# > w# N aW .vw# a7yʁ# | w# ƒe!\F:e2\ø Reading file...$ !`"ee!c]>2e\ Q\2dA2eOvP]!c ]\ >[]2e[Y!d ] !a"ee####N:e ڷ} SYSTEM TOO LARGE FOR SYSTEM TRACKS - (CR), REBOOT$I Þ SPACE, TRY ANYWAY $  ~2eʷ+++*eV+^*z R SYSTEM SIZE $ |\}\ LOAD ADDRE oDD512 DW DD1024 DD128O: DB ' Standard 1.4 &' DD128N: DB ' 2.2 compatible directory',0DH,0AH,0 DD128: DB '128 bytes/sector',0 DD256: DB '256 bytes/sector',0 DD512: DB '512 bytes/sector',0 DD1024: DB '1024 bytes/sector',0 DSMSG: DB ' double sided',0 MINIMSG:DB ' 5"',0 STDMSG: DB ' 8"',0 PRIAMSG:DB ' Hard disk',0 SXMSG: DB ' (' BANKS: DB 0,0,0 MMSG: DB 'k MDISK)',0 IF MDISK ENDSYS: EQU $ ENDIF DW ENDSYS ; do not remove, used by dsysgen ;    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   SS $ [z z\{\/ LAST ADDRESS $ *eV+^|\}\\ BIOS JMP TBL $K *x |\}\w $t ø PROGRAM CHECK SHOWS LAST ADDRESS ABOVE FFFFH$  SPACE TO GO ON, (CR) TO REBOOT$  }}|O:e2e>2e+~_2 ##~2| :e2~ 2e#~2} {ʤ{ ʤ ʏ{%r:~ Aj<Ͷ2~ ä>2~ ä:~ 4ڇͶ2~ ä>42~ ä{ʤO:eͶG:| 2~ ]>2e[Y!YNx!d]\ AH9!Xd]*eR} SE, INACTVATE BUFFER JZ NOWRITE XRA A STA HSTWRT ;BUFF WILL NOT CONTAIN WRITE DATA STA UNACNT LDA NEWDISK STA UNADSK LDA BUFDSK CALL SELOK CALL AWRITE LDA UNADSK ;WANT UNADSK TO KNOW WE'VE CHANGED DRIVES STA NEWDISK MOV C,A MVI A,0FFH STA UNADSK MOV A,C CALL SELOK NOWRITE: LHLD TRK ;SET UP FOR 128 BYTE DISK I.O. SHLD HSTTRK LHLD SECT SHLD HSTSEC LHLD DMAADD SHLD HSTDMA LDA READOP ORA A JNZ AREAD JMP AWRITE ; IF SKEW BLKTRANS: ; de has sector t : MOV A,B ; STA BOOTDISK ; STA CDISK ; in case of flop, set cdisk to 0 ; ; Following routines initialize printer ports ; DOINIT: LDA CPUBAUD ; is 0 ? MOV C,A ; save ORA A ; test IN 0BH ; get switch setting JZ DI10 ; ANI 0F0H ; mask switch setting for baud rate ORA C ; DI10: OUT 0BH ; set baud for cpu channels a,b ; LDA SBAUDL ; serial board baud setting (lower) OUT 03AH ; set baud LDA SBAUDU ; serial board baud setting (upper) OUT 0BAH ; $l&-  |{0__!vd ]AF\A2dAOvP!d]\ >[]!]]*e ] 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  o translate LHLD TRK ; MOV A,L ; ORA H ; RZ ; no trk 0's are skewed DCX H ; MOV A,L ; ORA H ; RZ ; or trk 1's MOV A,C ; ANI MINIBIT ; 0100$0000b JZ SKIP2 ; DCX H ; MOV A,L ; minis use 0,1,2 for system ORA H ; so no skew on them neither RZ ; SKIP2: ; LHLD TRANSTBL ; some other trk DAD D ; MOV E,M ; DCX D ; make rel 0 RET ; ENDIF ; ;** ;* * ;  set baud ; CALL CONST ; get vers MVI A,4 ; CMP H ; s-100-8 ? JZ LINIT4 ; skip 8255 init if true, s100-8 uses par port CMP L ; for keyboard input. early proms put vers in JZ LINIT4 ; backwards ie 84.4 for 4.84 ; MVI A,0ACH ; init 8255 OUT 7 ; cmd port ; MVI A,0FFH ; set b port high OUT 5 ; port b ; LINIT4: MOV A,L ; lower version ANI 0F0H ; mask code type CPI 90H ; new "C" cpu ? JNZ LINIT6 ; MVI A,2CH ; STA ANIBYTE ; STA CPIBYTE   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  R8* LOCAL DATA STORAGE FOR BLK - DEBLOCK * ;* * ;** ; ; TEMP1: DS 2 ;TEMP TEMP2: DS 2 ;TEMP TEMP3: DS 2 ;TEMP ; SECVEC: DB 00 SEKHST: DW 0000 ;SEEK SHR SECSHF ; UNADSK: DB 00 ;LAST UNALLOC DISK UNATRK: DW 0000 ;LAST UNALLOC TRACK UNASEC: DW 0000 ;LAST UNALLOC SECTOR BUFDSK: DB 00 ; qRSFLAG: DB 00 ;READ SECTOR FLAG READOP: DB 00 ;1 IF READ OPERATION WRTYPE: DB 00 ;WRITE OPERATION TYPE ; ;** ; LINIT6: MVI E,4 ; no. of ports MVI C,LISTBASE-1 ; first io status port less 2 INIZLOOP: LXI H,INIZLST ; table MVI B,LCOUNT ; table length INR C ; point at next cmd port INR C ; OUTIR ; block move DCR E ; last sio ? JNZ INIZLOOP ; go back for more INLINE: MVI E,4 ; MVI C,(LISTBASE-1)+80H ; upper serial io port MVI A,0C9H ; Z-80 "ret" instruction STA INLINE ; don't come back here JR INIZLOOP ; do it one more time ; INIZLST: DB 18H ; channel reset   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   NI AND SKEW MASK, MINI 10H, SKEW 04H TRANSTBL: DW 0000 ;ADDRESS OF TRANSLATE TABLE ; HSTACT: DB 00 ;HOST ACTIVE UNACNT: DB 00 ;UNALLOCATED COUNT HSTWRT: DB 00 ;HOST WRITTEN HSTTRK: DW 0000 ;DBLOCK TRACK HSTSEC: DW 0000 ;DBLOCK SECTOR HSTDMA: DW 0000 ;DBLOCK DMA ; TRK: DB 00,00 ;CURRENTLY SELECTED TRACK. SECT: DB 00,00 ;CURRENTLY SELECTED SECTOR. DMAADD: DB 00,00 ;CURRENT READ/WRITE ADDRESS. TRTAB: DB 00,00,00,00 ;TRACK TABLE FOR FLOP DFLAGS: DB 00,00,00,00 ;DENSITY AND LO W CHK05,ALL05 ; DISK PARAMETER HEADER FOR lun 6 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK DW CHK06,ALL06 ENDIF IF SHUGART ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDSHUGARTBK DW CHK04,ALL04 ENDIF IF QUANTUM ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   DW DIRBF,HDQUANTUMBK DW CHK04,ALL04 ; DISK PARAMETER HEADER FOR lun 5 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK05,ALL05 ; DISK PARAMETER HEADER FOR lun 6 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK06,ALL06 ; DISK PARAMETER HEADER FOR lun 7 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK07,ALL07 ENDIF ; SINGLE DENSITY SECTOR TRANSLATE VECTOR   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  a TRANS: DB 1,7,13,19 ;SECTORS 1,2,3,4 DB 25,5,11,17 ;SECTORS 5,6,7,8 DB 23,3,9,15 ;SECTORS 9,10,11,12 DB 21,2,8,14 ;SECTORS 13,14,15,16 DB 20,26,6,12 ;SECTORS 17,18,19,20 DB 18,24,4,10 ;SECTORS 21,22,23,24 DB 16,22 ;SECTORS 25,26 IF SKEW ; skew TRANS5: DB 1,4,7,10,13,16,3,6,9,12,15,2,5,8,11,14 TRANS5M: DB 1,6,2,7,3,8,4,9,5,10 IF OLDQ TRANSQ: DB 1,7,13,3,8,14,4,9,15,5,10,16,6,12,2,11 ELSE TRANSQ: DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ENDIF ; if oldq   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  [ ENDIF ; if skew ; ;*** ;* MINISKEW is used by deblocking to determine whether disk ;* is skewed or not and how many tracks to consider unskewed ;* for the operating system. (8" = 2, Mini = 3) ;* 0100$0000 = MINI 0000$1000 = SKEWED DISK ;* 1000$0000 = SKEW AFTER DBLOCK (SAVES TABLE SPACE) ;** * ; ; ; ** ; ; COM hPIP A:BLKSYS61.ASM=A:BLKEQU61.ASM,IO.ASM,CXLST.ASM,FLOP.ASM,BLK.ASM,DATA.ASM,XBOOT.ASM MACRO BLKSYS61  CBOOT ASM*GBLK ASMB  BLKSYS61$$$ BLKSYS61HEXHuvDATA ASM,/Dw|DSYSGEN COMKIQT^SURVEY COMHELP COMHELP HLP5 !MAC HLP="#ALGOLM HLPb$%&'ASM HLP(   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  MON DATA AREA ; ; ** ; ; SCRATCH RAM AREA FOR BDOS USE ; ; COMDATA: ; CURDISK: DB 00 NEWDISK: DB 00 OLDISK: DB 00 LASTFLOP: DB 00 SECTK0: DB 00 SECTK1: DB 00 SECCOUNT: DB 00 WBSPT: DW 0000 ; CPMSPT: DB 00 DSKSPT: DW 0000 ;CPM SECTORS/BLOCK HSTBLS: DB 00 ;CPM SECTORS/TRACK SECMSK: DB 00 ;SECTOR MAPPING MASK SECSHF: DB 00 ;SECTOR SELECTION MASK BYTSEC: DW 0000 ;SECTOR SIZE IN BYTES MINISKEW DB 00 ;MI EADER FOR DISK 02 DW TRANS,0000H DW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK02,ALL02 ; DISK PARAMETER HEADER FOR DISK 03 DW TRANS,0000H DW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK03,ALL03 ; IF PRIAM ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK DW CHK04,ALL04 ; DISK PARAMETER HEADER FOR lun 5 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK D   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  " ; test LASTFLOP & newdisk UPDATETRK: ; skip if LASTFLOP = newdisk LDA NEWDISK ; purpose of routine is to update track MOV C,A ; register only, head will be done by LDA LASTFLOP ; select STA NRDISK ; for not ready CMP C RZ ; SAME RETURN ; ; GO SELECT AND UPDATE LASTFLOP IF DUAL ;IF DUAL DRIVE, ANI 0FEH ;CLEAR OUT BIT 0. ENDIF ; MOV E,A ; put current disk in D & E MVI D,0 LXI H,TRTAB ;GET ADDRESS OF TRACK TABLE. DAD D ;ADD DISK NO. TO ADDRESS. IN T   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  "RACK ;READ 1791 TRACK REGISTER. MOV M,A ;PUT INTO TABLE. ; IF DUAL ;IF A DUAL DRIVE, ANI 0FEH ;CLEAR BIT 0. ENDIF ; MOV E,C ;PUT NEW DISK NO. IN D&E. LXI H,TRTAB ;GET ADDRESS OF TRACK TABLE. DAD D ;ADD DISK NO. TO ADDRESS. MOV A,M ;GET NEW TRACK NUMBER. OUT TRACK ;PUT INTO 1791 TRACK REG. ; MOV A,C ;GET NEW DISK NUMBER. STA LASTFLOP ;UPDATE RET ; SELECT: LDA NEWDISK ; SELECT1: MOV E,A ; ADI 41H ; STA DRIVE ; ; IF DBLOCK ; ;   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $    $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   LDA HSTTRK ;SAVE DESTINATION TRACK. ELSE ; LDA TRK ; ENDIF ; ; STA SEKTRK ; in case not ds MOV B,A ; ORA A ; MVI A,0 ; in case we do not select side 1 STA SIDE1 ; MVI A,2 ;SET UP FOR SINGLE DENS JZ SINGLD ;IF TK 0 THEN SINGLE LXI H,DFLAGS ;FIND DENSITY MVI D,0 ; DAD D ;NOW POINTING TO DENS MOV A,M ; ANI DSBIT ; get double sided bit and clear carry JZ NOT$DS ; if single sided skip MOV A,B ; get track # SRLR A ; put lsb ;flop ;**5 ; ; BEGINNING OF FLOPPY DRIVERS ; 12/20/82 ;** ; ; DISK IO PORTS ; FLOPPY EQU 3 ;MAX NO. OF FLOPPY DISK EQU 0F8H ;DISK BASE ADDRESS. DCOM EQU DISK ;DISK COMMAND PORT. DSTAT EQU DISK ;DISK STATUS PORT. TRACK EQU DISK+1 ;DISK TRACK PORT. SECTP EQU DISK+2 ;DISK SECTOR PORT. DDATA EHQU DISK+3 ;DISK DATA PORT. WAIT EQU DISK+4 ;DISK WAIT PORT. DSEL E   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  in carry, also devide trk by 2, msb = 0 STA SEKTRK ; now seek will not seek if dbl sided JNC NOTDS ; MVI A,DSBIT ; tack head 1 bit onto drive number ORA E ; MOV E,A ; ; ; IF SIDE2BIT ; MVI A,02H ; for 1795 side 2 test STA SIDE1 ; in case anyone else needs to know we MOV C,A ; are on back side LDA CMDBKT ; ORA C ; set side bit onto r/w command STA CMDBKT ; ENDIF ; NOT$DS: ; MOV A,M ; get density ANI 3 ; strip dsbit SINGLD: ; QU WAIT+1 ;DENSITY SELECT DCONT EQU DISK+4 ;DISK CONTROL PORT. ; SD128 EQU 0E5H DSBIT EQU 0000$0100B RTCNT EQU 10 ; SIDE1 DB 00 NRDISK DB 00 SEKTRK DB 00 SERCNT DB 00 ERCNT DB 00 CMDBKT DB 00 TEMPSEC DW 0000H TEMPTRK DW 0000H TEMPDMA DW 0000H ; ; SUBSTITUTE JUMP TABLES FOR HARD OR FLOPPY DISKS ; IF PRIAM or SHUGART or QUANTUM FDJT: JMP READ JMP WRITE ENDIF ; ;!**1 FSELECT: ; has floppy density been logged in   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  h OUT DSEL ;SELECT DENSITY MOV A,E ; CMA ; OUT DCONT ; set head bit RET ; SEEK ROUTINE ; ; PARAMETERS ; TRACK IN 'SEKTRK' DONE IN SELECT RTN ; SEEK: LDA SEKTRK ; MOV B,A ; PUSH H ;SAVE H&L. PUSH D ;SAVE D&E. PUSH B ;SAVE B&C. PUSH PSW ; MVI A,RTCNT ;GET RETRY COUNT. SRETRY: STA SERCNT ;STORE IN ERROR COUNTER. IN TRACK ;READ PRESENT TRACK NO. MOV C,A ;SAVE IN C. CMP B ;SAME AS NEW TRACK NO.? MOV A,B ;RESTORE A FROM B. JZ THER  ? LXI D,DFLAGS ;USE FLAG NOT CLEARED AS LOGGED MVI H,0 MOV L,C DAD D ;POINT TO THIS DRIVE MOV A,M ORA A ;IF ZERO, NOT LOGGED JNZ MOVPARMS ;IF LOGGED, JUST SELECT IT CALL BLDPTR ;POINT TO HEADER CALL DENSITY ;FIND DENSITY ORA A ;MAY BE DISK ERROR JNZ FSELERR ;DRIVE SELECT ERROR CALL SETBPM ;ALL DONE, SO RET THRU SETBPM RET FSELERR: LXI H,0 ; RET ; ; ; delayed select for floppy drives only ; note: LASTFLOP is updated here instead of in SELDSK ; ;   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $   $ ҿ2e\ *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$#  e 2e 2ë́\ڸ\!w]nG~2eʹ å& 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $  , [ ENDIF ; if skew ; ;*** ;* MINISKEW is used by deblocking to determine whether disk ;* is skewed or not and how many tracks to consider unskewed ;* for the operating system. (8" = 2, Mini = 3) ;* 0100$0000 = MINI 0000$1000 = SKEWED DISK ;* 1000$0000 = SKEW AFTER DBLOCK (SAVES TABLE SPACE) ;** * ; ; ; ** ; ; COM ;DATA ;**; ; ; COMMON TABLES AND DATA AREAS ; 12/20/82 ;** ; ; FIXED DATA TABLES FOR FOUR-DRIVE SYSTEM ; ; floppy disk parameter headers ; DISK PARAMETER HEADER FOR DISK 00 DPBASE: DW TRANS,0000H DW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK00,ALL00 ; DISK PARAMETER HEADER FOR DISK 01 DW TRANS,0000H DFW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK01,ALL01 ; DISK PARAMETER H ** ; COMMONBASE: ; JMP COLDSTART ; SWTUSER: ; JMP $-$ ; SWTSYS: ; JMP $-$ ; PDISP: ; JMP $-$ ; XDOS: ; JMP $-$ ; SYSDAT: ; DW $-$ ; ; COLDSTART: ; WARMSTART: ; MVI C,0 ; JMP XDOS ; ; ENDIF ; ; **,* ;* ;* DISK DRIVE PARAMETER TABLES ;* ; **.* ; ; cp/m 1.4 double density 128 byte/secto MON DATA AREA ; ; ** ; ; SCRATCH RAM AREA FOR BDOS USE ; ; COMDATA: ; CURDISK: DB 00 NEWDISK: DB 00 OLDISK: DB 00 LASTFLOP: DB 00 SECTK0: DB 00 SECTK1: DB 00 SECCOUNT: DB 00 WBSPT: DW 0000 ; CPMSPT: DB 00 DSKSPT: DW 0000 ;CPM SECTORS/BLOCK HSTBLS: DB 00 ;CPM SECTORS/TRACK SECMSK: DB 00 ;SECTOR MAPPING MASK SECSHF: DB 00 ;SECTOR SELECTION MASK BYTSEC: DW 0000 ;SECTOR SIZE IN BYTES MINISKEW DB 00 ;MI EADER FOR DISK 02 DW TRANS,0000H DW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK02,ALL02 ; DISK PARAMETER HEADER FOR DISK 03 DW TRANS,0000H DW 0000H,0000H DW DIRBF,DPSD1XBK DW CHK03,ALL03 ; IF PRIAM ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK DW CHK04,ALL04 ; DISK PARAMETER HEADER FOR lun 5 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK D r single sided disk prameters ; PARAMTBL: ; IF MAXI8 IF MDISK DB 0FDH ; flag DB 0000$0001B ; internal code DW 64 ;SECTORS PER TRACK - SPT DB 4 ;BLOCK SHIFT FACTOR - BSH DB 15 ;BLOCK MASK - BLM DB 1 ;EXTENT MASK DSKSIZ: DW 23 ;DISK SIZE IN BLOCKS - DSM DW 63 ;DIRECTORY MAX ENTRIES - DLM DB 128 ;DIR. ALLOC. MASK - AL0 DB 0 ;DIR. ALLOC. MASK - AL1 DW 0 ;DIR. CHECK SIZE - CKS DW 0 ;TRACK OFFSET - OFF DB NSECTS ; ccp + bdos length in sectors DB 64 ; nu NI AND SKEW MASK, MINI 10H, SKEW 04H TRANSTBL: DW 0000 ;ADDRESS OF TRANSLATE TABLE ; HSTACT: DB 00 ;HOST ACTIVE UNACNT: DB 00 ;UNALLOCATED COUNT HSTWRT: DB 00 ;HOST WRITTEN HSTTRK: DW 0000 ;DBLOCK TRACK HSTSEC: DW 0000 ;DBLOCK SECTOR HSTDMA: DW 0000 ;DBLOCK DMA ; TRK: DB 00,00 ;CURRENTLY SELECTED TRACK. SECT: DB 00,00 ;CURRENTLY SELECTED SECTOR. DMAADD: DB 00,00 ;CURRENT READ/WRITE ADDRESS. TRTAB: DB 00,00,00,00 ;TRACK TABLE FOR FLOP DFLAGS: DB 00,00,00,00 ;DENSITY AND LO W CHK05,ALL05 ; DISK PARAMETER HEADER FOR lun 6 DW 0001H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDPRIAMBK DW CHK06,ALL06 ENDIF IF SHUGART ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDSHUGARTBK DW CHK04,ALL04 ENDIF IF QUANTUM ; ; hard disk disk parameter headers ; disk parameter header for lun 4 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H  mber of sectors on track 0 +1 DB 64 ; number of sectors on track 1 +1 DW 64 DB 2048/128 ; cpm block size/cpm sector size DB 128/128-1 ; disk sector size/cpm sector size DB 0 ; logical to phisical sector map (1 = 2 phys sec.) DW 128 ; bytes per sector DB 00,00,00 ; ENDIF DB 0DDH ; flag DB 0000$0001B ; internal code DPDD1NBK: ;2D/128 1.4 CP/M DISK PARAMETER BLOCK DW 51 ;SECTORS PER TRACK - SPT DB 4 ;BLOCK SHIFT FACTOR - BSH DB 15 ;BLOCK MASK - BLM DB 0 ;E ]GIN TABLE ; IF MINI48 OR MINI96 OR MAXI8 ALL00: DS 64 ;ALLOCATION VECTOR 0 ALL01: DS 64 ;ALLOCATION VECTOR 1 IF PRIAM OR SHUGART OR QUANTUM ALL02: DS 0 ;ALLOCATION VECTOR 2 IF MDISK ALL03: DS 64 ELSE ALL03: DS 0 ;ALLOCATION VECTOR 3 ENDIF ELSE ALL02: DS 64 ALL03: DS 64 ENDIF CHK00: DS 64 ;CHECK VECTOR 0 CHK01: DS 64 ;CHECK VECTOR 1 IF PRIAM OR SHUGART OR QUANTUM CHK02: DS 0 ;CHECK VECTOR 2 CHK03: DS 0 ;CHECK VECTOR 3 ELSE CHK02: DS 64 CHK03: DS 64  DW DIRBF,HDQUANTUMBK DW CHK04,ALL04 ; DISK PARAMETER HEADER FOR lun 5 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK05,ALL05 ; DISK PARAMETER HEADER FOR lun 6 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK06,ALL06 ; DISK PARAMETER HEADER FOR lun 7 DW 0000H,0000H ; sectran = 0001 = use skew DW 0000H,0000H DW DIRBF,HDQUANTUMBK DW CHK07,ALL07 ENDIF ; SINGLE DENSITY SECTOR TRANSLATE VECTOR 6XTENT MASK DW 238 ;DISK SIZE IN BLOCKS - DSM DW 95 ;DIRECTORY MAX ENTRIES - DLM DB 0C0H ;DIR. ALLOC. MASK - AL0 DB 0 ;DIR. ALLOC. MASK - AL1 DW 32 ;DIR. CHECK SIZE - CKS DW 2 ;TRACK OFFSET - OFF DB NSECTS ; ccp + bdos length in sectors DB 25 ; number of sectors on track 0 +1 DB 51 ; number of sectors on track 1 +1 DW 51 DB 1024/128 ; cpm block size/cpm sector size DB 128/128-1 ; disk sector size/cpm sector size DB 0 ; logical to phisical sector map (1 = 2 phy Y ENDIF ENDIF IF PRIAM OR QUANTUM OR SHUGART ALL04: DS 256 ; hard disk allocation vector ENDIF IF SMS10 OR SHUGART ALL05: DS 0 ALL06: DS 0 ALL07: DS 0 ENDIF IF SMS20 ALL05: DS 256 ALL06: DS 0 ALL07: DS 0 ENDIF IF SMS30 OR PRIAM ALL05: DS 256 ALL06: DS 256 ALL07: DS 0 ENDIF IF SMS40 ALL05: DS 256 ; hard disk allocation vector ALL06: DS 256 ; hard disk allocation vector ALL07: DS 256 ENDIF IF PRIAM OR SHUGART OR QUANTUM CHK04: DS 0 ; no check vecto a TRANS: DB 1,7,13,19 ;SECTORS 1,2,3,4 DB 25,5,11,17 ;SECTORS 5,6,7,8 DB 23,3,9,15 ;SECTORS 9,10,11,12 DB 21,2,8,14 ;SECTORS 13,14,15,16 DB 20,26,6,12 ;SECTORS 17,18,19,20 DB 18,24,4,10 ;SECTORS 21,22,23,24 DB 16,22 ;SECTORS 25,26 IF SKEW ; skew TRANS5: DB 1,4,7,10,13,16,3,6,9,12,15,2,5,8,11,14 TRANS5M: DB 1,6,2,7,3,8,4,9,5,10 IF OLDQ TRANSQ: DB 1,7,13,3,8,14,4,9,15,5,10,16,6,12,2,11 ELSE TRANSQ: DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 ENDIF ; if oldq s sec.) DW 128 ; bytes per sector DB 00,00,00 ; ; cp/m 2.2 double density 128 byte/sector double sided disk prameters ; IF DBLOCK IF F256 ; cp/m 2.2 256 byte per sector double density ; DB 11H ; flag DB 0000$0001B ; internal code DPDS2XBK: DW 52 ;26 - 256 BYTE SECTORS/TRACK - SPT DB 4 ;BLOCK SHIFT FACTOR - BSH DB 15 ;BLOCK MASK - BLM DB 1 ;EXTENT MASK DW 245 ;DISK SIZE IN BLOCKS - DSM DW 127 ;DIRECTORY MAX ENTRIES - DRM DB 0C0H ;DIR. ALLOC. MASK - A +Grs for hard disk CHK05: DS 0 CHK06: DS 0 CHK07: DS 0 ENDIF ;**0* ;* ;* COMMON SRATCH AREA FOR BIOS USE ;* ;**p* ; ; SCRATCH RAM AREA FOR BDOS USE ; ENDCOMDATA EQU $ COMLENGTH EQU ENDCOMDATA-COMDATA ; IF MMPM ; ;$**+ ;* ;* COMMON BASE M / P M 2 . 1 ;* ;**  512 DB QSKEWBIT ; miniskew mask DW TRANS5 ; translate table ; ; cp/m 2.2 512 byte sector double density, double sided SKEW ; DB 9AH ; code byte DB 0000$0101B ; internal code DPDD5XBKSK: DW 64 ;16 - 512 BYTE SECTORS/TRACK DB 5 ; DB 31 ; DB 1 ;EXTENT MASK DW 303 ; DW 127 ; DB 80H ; DB 0 ; DW 32 ; DW 2 ; DB NSECTS ; nsects to read on a re-boot DB 25 ; 128 type sects tk 0 DB 64 ; 512 type sects tk 1 DW 16 ; physical sect NSURE CARRY=0 RAR ;SHIFT RIGHT DCR B ;SEE IF DONE JNZ RWSTST ;YES, SAVE IT RWSKST: MOV E,A ;HOST SECTOR TO SEEK ; IF SKEW MOV A,C ; ANI QSKEWBIT ; CNZ BLKTRANS ; ENDIF ; INX D ; SDED SEKHST ; ; ; ACTIVE HOST SECTOR? ; LXI H,HSTACT ;HOST ACTIVE FLAG MOV A,M MVI M,1 ;ALWAYS BECOMES 1 ORA A ;WAS IT ALREADY? JZ FILHST ;FILL HOST IF NOT ; ; SAME DISK? LDA NEWDISK LXI H,OLDISK CMP M JNZ NOMATCH ;NOT THE SAME ; SAME TRACK? LHLD HS  devide cpm sector by this ammount. ; BLREAD: ;READ THE SELECTED CP/M SECTOR MVI A,01H STA READOP LDA BYTSEC CPI 128 JZ NOBLK XRA A ; needed by dsbc LXI H,0 LDED TRK DSBC DE JNZ BL1 ; not on trk 0 IF PRIAM or SHUGART or QUANTUM LDA MINISKEW ; is this a hard disk ANI HDBIT ; hards are 0,1,2,3,4 JNZ BL1 ; only have this problem on warmboot ENDIF JMP NOBLK ; is flop on tk 0 so treat as 128 BL1: XRA A ;FORCE A PRE-READ STA UNACNT ; MVI A,1 STA RSFLAG /s trk 1 DB 4096/128 ; cpm block size/cpm sector size DB 512/128-1 ; disk sector size/cpm sector size DB 2 ; logical to physical sector map (1 = 2 phys sec.) DW 512 ; bytes per sect DB QSKEWBIT ; miniskew mask DW TRANS5 ; translate table ENDIF ; f512 ENDIF ; skew ENDIF ; dblock ENDIF ; maxi8 IF MINI48 ; cp/m double density 128 byte/sector single sided mini drive 48 TPI ; DB 050H ; flag DB 0000$0001B ; internal code DPSD1MBK: ;1D/128 DISK PARAMETER B 4L0 DB 0 ;DIR. ALLOC. MASK - AL1 DW 32 ;DIR. CHECK SIZE - CKS DW 2 ;TRACK OFFSET - OFF DB NSECTS ;CPM SYSTEM SIZE (FOR WMBOOT) DB 25 ;number of sectors on trk 0 DB 52 ;number of sectors on trk 1 DW 26 ; physical sects trk 1 DB 2048/128 ; cpm block size/cpm sector size DB 256/128-1 ; disk sector size/cpm sector size DB 1 ; logical to phisical sector map (1 = 2 phys sec.) DW 256 ; bytes per sector DB 0000$0000B ; miniskew mask DW 0000 ; address of transl D ;MUST READ DATA MVI A,WRUAL STA WRTYPE ;TREAT AS UNALLOC JMP RWOPER ;TO PERFORM THE READ ; BLWRT: ;WRITE THE SELECTED CP/M SECTOR XRA A STA READOP ; LDA BYTSEC CPI 128 JZ NOBLK XRA A LXI H,0 LDED TRK DSBC DE JNZ BLW1 ;TRK 0 SPCL CASE IF PRIAM or SHUGART or QUANTUM LDA MINISKEW ANI HDBIT JNZ BLW1 ENDIF JMP NOBLK BLW1: MOV A,C ;WRITE TYPE IN C STA WRTYPE CPI WRUAL ;WRITE UNALLOCATED? JNZ CHKUNA ;CHECK FOR UNALLOC ; ; WRITE TO UNALLOCATED, S mLOCK - MINI DW 30 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 137 ;DISK SIZE-1 DW 63 ;DIRECTORY MAX DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 3 ;TRACK OFFSET DB NSECTS ; ccp + bdos length in sectors DB 17 ; number of sectors on track 0 DB 30 ; number of sectors on track 1 DW 30 DB 1024/128 ; cpm block size/cpm sector size DB 128/128-1 ; disk sector size/cpm sector size DB 0 ; logical to phisical sect 5ate table ; cp/m 2.2 256 byte per sector double density DOUBLE SIDED ; DB 91H ; flag DB 0000$0101B ; internal code DPDDDS2XBK: DW 52 ;26 - 256 BYTE SECTORS/TRACK - SPT DB 4 ;BLOCK SHIFT FACTOR - BSH DB 15 ;BLOCK MASK - BLM DB 0 ;EXTENT MASK DW 495 ;DISK SIZE IN BLOCKS - DSM DW 127 ;DIRECTORY MAX ENTRIES - DRM DB 0C0H ;DIR. ALLOC. MASK - AL0 DB 0 ;DIR. ALLOC. MASK - AL1 DW 32 ;DIR. CHECK SIZE - CKS DW 2 ;TRACK OFFSET - OFF DB NSECTS ;CPM SYST bET PARAMETERS LDA HSTBLS ;SECTORS/ALLOCATED BLOCK STA UNACNT LDA NEWDISK ;DISK TO SEEK STA UNADSK LHLD TRK SHLD UNATRK ;UNATRK = SECTRK LHLD SECT SHLD UNASEC ;UNASEC = SECT ; CHKUNA: ; ; ANY RECORDS LEFT IN THIS BLOCK? LDA UNACNT ORA A JZ ALLOC ;NOT 0, MUST BE SOME MORE DCR A STA UNACNT ; ; CHECK TO SEE IF SAME DRIVE, TRACK, SECTOR LDA NEWDISK ;SAME DISK? LXI H,UNADSK CMP M JNZ ALLOC ;NO ; ; DRIVE IS THE SAME LHLD UNATRK LDED TRK DSBC DE JNZ ALLOC ;S or map (1 = 2 phys sec.) DW 128 ; bytes per sector DB 00,00,00 ; ; cp/m double density 128 byte/sector double sided mini drive 48 TPI ; DB 0D0H ; flag DB 0000$0101B ; internal code DPDD1MBK: ;1D/128 DISK PARAMETER BLOCK - MINI DW 30 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK DB 1 ;NULL MASK DW 143 ;DISK SIZE-1 DW 63 ;DIRECTORY MAX DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 3 ;TRACK OFFSET DB NSECTS ; ccp + bdos length EM SIZE (FOR WMBOOT) DB 25 ;number of sectors on trk 0 DB 52 ;number of sectors on trk 1 DW 26 ; physical sects trk 1 DB 2048/128 ; cpm block size/cpm sector size DB 256/128-1 ; disk sector size/cpm sector size DB 1 ; logical to phisical sector map (1 = 2 phys sec.) DW 256 ; bytes per sector DB 0000$0000B ; miniskew mask DW 0000 ; address of translate table ENDIF ; f256 IF SKEW IF F512 ; ; cp/m 2.2 512 byte sector double density ; DB 1AH ; code byte KKIP IF NOT ; ; TRACKS ARE THE SAME LHLD UNASEC ;SAME SECTOR? LDED SECT DSBC DE ;SECT = UNASEC? JNZ ALLOC ;SKIP IF NOT ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF INX D ;UNASEC = UNASEC+1 SDED UNASEC LDA CPMSPT CMP E JNZ NOOVF LXI H,1 SHLD UNASEC LHLD UNATRK INX H SHLD UNATRK ; NOOVF: XRA A ;0 TO ACCUMULATOR STA RSFLAG ;RSFLAG = 0 JMP RWOPER ;TO PERFORM THE WRITE ; ALLOC: ;NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ XRA A ;0 TO ACCUM STA UNACNT ; 4;BLK ; **J* ; * * ; * BLOCKING - DEBLOCKING DRIVERS * ; * 11/20/82 * ; *** ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ; MINIBIT EQU 0100$0000B SKEWBIT EQU 0000$1000B QSKEWBIT EQU 1000$0000B HDBIT EQU 0010$0000B ; ;MEANING OF LABELS: ; ; RSFLAG = commoOn R/W routine will READ if rsflag is 1, write if 0. ; UNACNT = if cpm block si N DB 0000$0001B ; internal code DPDS5XBKSK: DW 64 ;16 - 512 BYTE SECTORS/TRACK DB 5 ; DB 31 ; DB 3 ;EXTENT MASK DW 149 ; DW 127 ; DB 128 ; DB 0 ; DW 32 ; DW 2 ; DB NSECTS ;CP/M BLK SIZE DB 25 ; 128 type sects on tk 0 DB 64 ; 128 type sects on tk 1 DW 16 ; physical sect trk 1 DB 4096/128 ; cpm block size/cpm sector size DB 512/128-1 ; disk sector size/cpm sector size DB 2 ; logical to physical sector map (1 = 2 phys sec.) DW UNACNT = 0 INR A ;1 TO ACCUM STA RSFLAG ;RSFLAG = 1 ; ;* ;* COMMON CODE FOR READ AND WRITE FOLLOWS ;* RWOPER: ;ENTER HERE TO PERFORM THE READ/WRITE LDA SECSHF ;SHIFT FACTOR MOV B,A ; LDED SECT ; DCX D ; make relative 0 ; IF SKEW ; LDA MINISKEW ; if disk is skewed and a mini MOV C,A ; trks 1,2 are not skewed ANI SKEWBIT ; 0000$1000B CNZ BLKTRANS ; ENDIF ; ; LDA SECMSK ; ANA E ; STA SECVEC ; MOV A,E ; RWSTST: ORA A ;I ze (i.e. 2048) has not been written to (there- ; fore "unallocated") unacnt has remaining sectors in block. ; UNADSK = drive that current hstbuf contents belong to. ; UNATRK = track that current hstbuf contents belong to. ; UNASEC = current (or) next sector in block. ; HSTACT = if set, there is R/W data in hstbuf. ; HSTWRT = if set, data in hstbuf is to be sent to drive ; SEKMSK = mask for lower 1,2, or 3 bits of cpm sector. points to cor- ; rect cell in hstbuf for this sector ; SECSHF = must> O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB AN>.>+.INX DAD LDAXDCX :=_!"!" "!\" ͶO^}# \~$y!>" Ͷ1(2( Pʿ@OͶ^(O+!" (O(! !\" *~#">2!"\**D.DAT $TYPE  !í 1 8CA0CF2D3EE :10F1D600FBDBF80FDAD7F178D3FB3A37EEF61CD320 :10F1E600F8DBFCE3E3DBF8E691CA0CF23A38F13DD2 :10F1F600C2CAF121B5F4CD1AF0DBF8E69157211118 :10F20600F2E5CD3FF2E1F1C1D1E1C9F1C1D1E1C3EE :10F21600C0F13E0A3239F13E8821BFF2CD42F3E613 :10F226009DC8CDC8F23A39F13D3239F1C21DF221FD :10F23600A4F4CD1AF02118F2E57AE6102155F4C4AB :10F246001AF07AE6082163F4C41AF07AE604216813 :10F25600F4C41AF07AE6012173F4C41AF0219CF47E :10F26600CD1AF021D6F4CD1AF0CDA5EEFE0DCA7C4E :10F27600F2FE20C8E1C93AA5EF32040032D4F7AF56 :10F b00E7E700F32247EEED7354EED4 :10EE40003166EEAFD309CD0000F53E01D309F1EDF7 :06EE50007B54EEC9000036 :10EE660006F809F80CF82A66EECD38EEC93AE7F747 :10EE7600B7CAA2EEAF32E7F73AE9F7B73E0032E992 :10EE8600F732E8F7CAA2EE3AD4F73246F73A4BF72A :10EE9600CDD8EFCD30F03A46F732D4F7AFD3FC2ACF :10EEA60068EE3ABCEE4FCD38EEFEFFC03ABCEE2F10 :10EEB60032BCEEC3A5EE00792A6AEECD38EEC93132 :10EEC6007C00AFD3FCAFD3092100003CCD18F8F588 :10EED6003E01D309F1CD6DFBCD08F03EC3320000F3 :10EEE6003205002103EE2201002106E02206002160 :10EEF600 ͓ !" >- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.2860032E7F7C300001100003ED0D3F8E3E3E312 :10F29600E3DBF8E680C81B7BB2C28FF221C5F4CD52 :10F2A6001AF0CDA5EEFE20CA8CF23A36F132D4F72A :10F2B600320400CD85F1C30000DBFCB7F0DBFB12A6 :10F2C60013E957E610C2D1F27AB7C93EC4D3F8DBC8 :10F2D600FCDBFB47DBFCB7F2E5F2DBFBC3DAF2DB78 :10F2E600F8B7CAF1F2CD97F3C3F4F278D3F9CDC0EB :10F2F600F17AB7C93E0A3239F13EA82139F3CD4237 :10F30600F3E6FD210000C8CDC8F23A39F13D3239A5 :10F31600F1C2FFF221ACF4CD1AF07AE6402179F47D :10F32600C41AF07AE6202182F4C41AF021FAF2E532 :10F33600C33FF2DBFCB7800022EEF73A04004FC300D83AE7F7B78E :10EF0600CA19EF3AE9F7B7CA19EF3A4BF7CDD8EF76 :10EF1600CD30F0318000213DF7110000011200CD07 :10EF260011F0CD08F03AA5EF4FCDC4EF110A001944 :10EF3600223AEF2A0000110F001956235E237E3273 :10EF4600D8F70102002100D822F4F77832F0F779D9 :10EF560032F2F7E5D5C5CD27F0C1D1E115CAE1EE0C :10EF6600D51180001922F4F7D10C1DC251EF3AD801 :10EF7600F75F0E0104C351EF010000ED43F0F7C93E :10EF8600ED43F2F7C9ED43F4F7C9A6EFEB7CB509FB :10EF9600CAA2EFFE01CAA4EF6E2600C923C9C900A2 :10EFA60000010203FFFFFFFFF 2|2\$ !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O {a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g.!!DI"]!]~ (w#x2=G!~$ww#x2=4l No data file present error $J Û Utility progam aid of 10/14/81$z  Program load address --- $ !|Ɛ'@'_} $ !"" *"*1 !""D!6" >2 !M" !"!`">2 *~O#" !" !"!l"*}y q#"}s1#!C:= _!6!C*6!CRl!C!Rl{>2  Data file over-runs top of RAM, re:FFF61 :10EFB6003E0FB93EFFD821A6EF0600097EC9F3CD64 :10EFC600B6EF210000FEFFC2D8EF3AA5EF320400EB :10EFD600FBC94F32D4F74FC341F1692600292929CD :10EFE60029114FF719C9CDE0EFC5E5110A00195EE1 :10EFF6002356EB1111001911DCF7010B00EDB0E1FE :10F00600C1C921D3F7110000012B0273230B79B07C :10F01600C8C311F07EB7C84FE5CD0CEEE123C31A85 :10F02600F0C31BF5C349F5C318F2C3FAF28585414F :10F036003A33EEE607172121F116005F195E2356D3 :10F04600EB1E2C53E9CDC3F03C20FA78D300C9CD92 :10F05600E1F03C20FA1836CDE5F03C20FA182ECD2AEF1FE2034 :10F1D500C8E1C921C9F3CD21F03AACEF32040032C0 :10F1E5001AF7AF322DF7C300002107F4CD21F0CD7A :10F1F5007AEEFE20CA96F23A92F0321AF7320400FD :10F20500CDDAF0C30000DBFCB7F0DBFB1213E957E6 :10F21500E610C21DF27AB7C93EC4D3F8DBFCDBFBAE :10F2250047DBFCB7F231F2DBFBC326F2DBF8B7CAEA :10F235003DF2CDE4F2C340F278D3F9CD10F17AB7BF :10F24500C93E0A3295F03EA82185F2CD8EF2E6FD43 :10F25500210000C8CD14F23A95F03D3295F0C24B2D :10F26500F221EEF3CD21F07AE64021BBF3C421F083 :10F275007AE62021C4F3C421F02146F2E5C392F1D8 :10F28booting...$ [*D:<*3!1 |P}P~O+#Ch\Ɛ'@'O+SÒ x |o{0O+o Cmd buffer --- End buffer --- Cmd length --- Max ---  ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# E :10F06600E9F03C20FA1826CDEDF03C20FA181ECD2A :10F07600FDF03C20FA1816CD01F13C20FA180ECD11 :10F0860005F13C20FA1806CD09F13C20FA0DED41B8 :10F09600C9DB06E6B0FE90C297F078D304AFD3057D :10F0A600000000002FD305C93A33EEE60717210DFD :10F0B600F116005F195E2356EB1E2C53E93A33F026 :10F0C6005F3A34F057FE2CDB0120080E013E10EDAE :10F0D60079ED786FA3BA3EFFC8AFC90E2118EE0EC0 :10F0E6002318EA0E2518E60E2718E2DB066FE6B0AF :10F0F600FE903EFFC82FC90EA118D20EA318CE0E41 :10F10600A518CA0EA718C6C3F0E1F0E5F0E9F0EDC0 :10F11600F0F1F0500DBFCB7F01AD3FB13E9F33296F0E5CDB406 :10F29500F03ED0D3F8DBF807DAEEF1CDD7F0CD109C :10F2A500F13A1BF74F3A1AF7B9321BF7C486F32A1E :10F2B50034F73A32F7D3FAE5E1DBF8E620C2D5F2C6 :10F2C5003A93F0D3FB3E1DD3F8E5E1DBFCCD86F3A5 :10F2D5003A96F0D3F8EBE101E1F2C5E9DBF8C92193 :10F2E50000002230F7CDD7F03E0DD3F8E5E1DBFC89 :10F2F500E5E1DBF8E604C021FFF3CD21F021E4F2DE :10F30500E5C392F1C5E52140F7060009E52A30F786 :10F315002299F02100002230F7CDE4F22A32F722BB :10F3250097F02101002232F72A34F7229BF021CAF7 :10F33500FA2234F7CD6BF1^z8O!B N#N ¾SP.* |} !9":q!"2F!e~ =F)\a:n!"4g1!~:‚*͛1}*͊@Gʨұ Ҩ*~#Â~#  #~:ʹÂ*~͕#~n͊_ ~#)\*)"~ a b#O##͊:=2An}͕͊> > >2!͕>A2}l~:} :}<2}>.> Oî"~͕O~: :Gc JpMESSAGE. LXI H,READ ; return from common error messages ; to the read routine for retry PUSH H ; ** COMMON ERROR PRINT SUBOUTINE  ** ; ERMSG1: MOV A,D ;GET ERROR BITS. ANI 10H ;IF BIT 4 IS HIGH, LXI H,RNMSG ;PRINT "RECORD NOT FOUND" CNZ PMSG ; MOV A,D ;GET ERROR BITS. ANI 8H ;IF BIT 3 IS HIGH, LXI H,CRCMSG ;PRINT "CRC ERROR". CNZ PMSG ; MOV A,D ;OGET ERROR BITS. ANI 4H ;IF BIT 2 IS HIGH, LXI H,LDMSG ;PRINT "LOST DATA  Z͊:=2-}͕HELP V1.1 $ ++ EOI ++ Type CTRL-C to return to CP/M, to continue -$ HELP File Selections are -- $HELP HLP Type "A"=Abort, CTRL-C=CP/M, =Cont -$ HELP FATAL ERROR -- File not Found$ HELP ERROR -- Invalid Response $ HELP ERROR -- EOF on HELP File $ Type CTRL-C to return to CP/M, "*" to select all, or enter selection - $ections are -- $HELP HLP Type "A"=Abort, CTRL-C=CP/M, =Cont -$ HELP FATAL ERR:The HELP Subsystem for Online Documentati ;". CNZ PMSG ; MOV A,D ;GET ERROR BITS. ANI 1 ;IF BIT 1 IS HIGH, LXI H,BSYMSG ;PRINT "BUSY" CNZ PMSG ; LXI H,ERRMSG ;PRINT "ERROR." CALL PMSG ; LXI H,READYMSG ; CALL PMSG ; CALL CONIN2 ; wait for keyboard response CPI 0DH ; abort JZ ABORT ; CPI ' ' ; is it a space ? RZ ; go retry POP H ; throw away return retry address RET ; ABORT: LDA BOOTDISK ; STA CDISK ; STA NEWDISK ; XRA A ; STA HSTACT ; JMP 0 ; ; CHKRDY:  on This is HELP, the Online Documentation Subsystem. The purpose of HELP is to allow the user to interactively query the *.HLP files of the system in order to receive information summaries on various aspects of the user's working environment, such as the language systems he is using and certain subsystems available to him. When the user types 'HELP', a search is done for the file 'HELP.HLP'. If found, the contents of this HELP File is displayed to the user; if not found, the HELP Infor LXI D,0 ; CHKRDY1: MVI A,0D0H ; 1791 Reset command to check ready OUT DCOM ; XTHL ; XTHL ; XTHL ; XTHL ; IN DSTAT ; ANI 80H ; RZ ; DCX D ; MOV A,E ; ORA D ; JNZ CHKRDY1 ; IF MMPM ; if mpm sys, cannot ; hang system POP H ; call to iocom POP H ; return pointer RET ; a = ff ELSE LXI H,NNMSG ; CALL PMSG ; CALL CONIN2 ; CPI ' ' ; retry JZ CHKRDY ; LDA NRDISK ; STA NEWU   2Gf 2Hfm\ڡ\!`]nG~2MfQ ʸ=&È 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $Z á $ W2Nf *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$   2Gf 2Hfm\ڡ\!`]nG~2MfQ ʸ=&È 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $Z á $ W2Nf *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$   rocessor CP/͠ provide genera environmen fo progra construction storage an editing alon wit assembl an progra debu facilities A importan featur o CP/ i tha i ca b easil altere t execut wit an compute configuratio whic use a Inte 808 o Zilo Z8 Microprocesso an ha a leas 16 byte o mai memor wit u t fou IBM-compatabl diskett drives. Th CP/ monito provide acces t program throug comprehensiv fil man k file named FILENAME.HLP  *(3) by typing 'HELP FILENAME.EXT', where  /FILENAME.EXT is the name of a file created in  the format of a help file I th use type jus 'HELP' h wil receiv th HELP.HL hel fil (no bein displaye t you) Fo al othe form o th HEL command th use wil se th specifie hel fil information Generall speakingg th nam o th hel fil shoul b indicativ o it subject lik CPM.HL shoul contai he  2Gf 2Hfm\ڡ\!`]nG~2MfQ ʸ=&È 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $Z á $ W2Nf *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$   2Gf 2Hfm\ڡ\!`]nG~2MfQ ʸ=&È 10 MEG = 1 20MEG = 2 40MEG = 4 SIZE ? $Z á $ W2Nf *** CODE DOES NOT EXIST, HIT (SPACE) TO TRY AGAIN...$ agemen system Th fil subsyste support name fil structure allowin dynami allocatio o fil spac a wel a sequentia an rando fil access Usin thi fil system u t 6 distinc program ca b store i bot sourc an machine-executabl form. Digita Research th designe o CP/M ha provide se o si manual whic describ th us an operatio o CP/ i detail.  These manuals are:  1 A Introductio t CP/ Fl informatio o CP/M. :HELP: How to write .HLP files File use b th HEL progra ar eithe simpl CP/M-standar file o栠 ASCIɠ tex o ASCIɠ file generate b th Wor䠠 Sta tex editor/formatter Thes files a mentione above ar o tw basi types indexe an non-indexed an eac typ i