IMD 1.15: 16/05/2007 8:39:32 DOUBLE SIDED RELEASE DISK 6 OF 7 10/14/84 DAB SETUP SOURCE & GENERATION DISK V1.3 DSDD SETUP HEXo SETUP COMUSETUP BA !"#$%&SETUP BA'()YZ[\]^_`abcdeSETUP ASM*+,-./0123456789SETUP ASM:;<=>?@ABCDEFGHIACT COMtJKLMNOPQLOAD COMRSETGEN DOCSSETUP BAfghijklmnopqrstuROMDUMP MACUSETUP BAvwxyz{|}~SETUP BA<SETUP ASMTVWXSETUP ASMSETUP ASM<SETUP BAKSETUP BAK*+,-./0123456789:10010000C3A2011B73371A2020201B67131B472033 :1001100031393833204F73626F726E6520436F6DD3 :10012000707574657220436F72706F726174696F5D :100130006E2C2032363533382044616E746920438A :100140006F7572742C204861797761726420434125 :100150002039343534350D0A20202020202020205D :10016000201B67131B4720313938342046757475BE :1001700072652053797374656D732C203832382082 :100180004E6F622048696C6C204176656E75652CF7 :100190002050696E6F6C652C204341203934353610 :1001A00034002A06002BF93A4200FE02202D3A02C2 :1001B0000032202B32222B2A44FD227213CDC80399 :1001C0003A802D326A2BCDEA0121CF2ACD34142179 :1001D0009517CD3414215914C34B0221C928CDEEF3 :1001E00013219B03CD3414C30000DB003257FD3EC6 :1001F000803256FD219520114E2F014000CD6A130B :10020000214E2F0140003E1BEDB12803214F2F2B23 :10021000226D2B7E326B2B3E8F77214E2F014000BB :100220003E0DEDB1280321542F2B226F2B7E326C13 :100230002B3E8E77DB003256FD3E803257FD214E3D :100240002F119520014000CD6A13C9CD390EE5CD9F :100250002114E1114E02D5FE8ACA7A02FE8CCA929E :1002600002FE8BCAAD02FE8DCABE02FE0DCACA02D4 :10027000E65FFE1BCAFC02C308147EE60F280FAF20 :1002800032712BCDA10E35CD610ECD880EC9CD08B2 :1002900014C97EE60F23BE2B300FAF32712BCDA1D8 :1002A0000E34CD610ECD880EC9CD0814C9E5CD53ED :1002B0000E7EE620E12803C3CA02CD0814C97EE6FB :1002C000202803C3FC02CD0814C9E5CD530ED12369 :1002D0007E2BFEFF28187EE6F077E6802004CD39DD :1002E0000EC9E5218625CD3414E1CD880EC9D5CDC2 :1002F000530E11F702D5E9E1CD880EC9E5AF327191 :100300002BCDA10E110B00CD1E0F237E2BFEFF283F :1003100025D17EE640280CE5211425CD3414E1CD0D :10032000880EC9CD390E7EE680C8E5218625CD34FC :1003300014E1CD880EC9CD530E113E03D5E9E1CDB0 :10034000880EC9219B03CD34143A6A2B32252B2108 :10035000232BCD3414DB003257FD3E803256FD2175 :100360009520114E2F014000CD6A132A6D2B3A6B58 :100370002B77216F2B3A6C2B77DB003256FD3E80BA :100380003257FD214E2F119520014000CD6A133ABE :10039000442BB72803CDB112C300001B651B73307B :1003A0001A00CDC8032A602BCD9F12380ECD08123B :1003B0003A6A2B32802D0600C3F004219A29CDEE33 :1003C0001321CA2ACD3414C92A400022602BAF322F :1003D000672BCDCB1211831006B0007F2BEB010402EDB0F132802D3A632BB7B2 :1006C000280606000E04180406020E05CD8213202B :1006D000243A8914E60FC640323427210C27CD3442 :1006E00014F6FF32432BC9215628CDEE13180621EC :1006F000DE27CDEE13217126C334143A432BB7C243 :10070000430321002ACD3414CD2114E65FFE59CADB :100710004303C921DE147EE60F3CFE0A2001AF32FE :10072000562BC63032F12121C921CD341421E722C4 :1007300022582B3E4A0603CD34083A562B214E0F41 :10074000CDE212CD34143A562B06460EFFCD6A0F79 :1007500021FB25CD3414C93E0ACD1610EB217F2C88 :10076000B7ED52010800ED42381821CA07EDB0CDAF :10077000410F21DB1CCD3414CD9B0CCD3414CD277F :1007800010C9214F2ACDEE1321FB25CD3414C93ECB :100790000ACD1610EB217F2CB7ED52010800ED4277 :1007A000381B21D207010800EDB0CD410F21DB1C21 :1007B000CD3414CD9B0CCD3414CD2710C9214F2A34 :1007C000CDEE1321FB25CD3414C9010B010C010A18 :1007D00001080105010401180113215822CD341428 :1007E00021FF147EE60FC60832562BD60A212C08AC :1007F000CDE212CD431421F02222582B3E440603B1 :10080000CD34083A562B214E0FCDE212CD34143A96 :10081000562B06420EFFCD6A0F21DB1CCD2D018000EDB0CDD9124A :1003E000E511032EAF3256FDDB003257FD01400010 :1003F000CD6A13E1114A0019114D2E010101CD6A98 :1004000013AF324B2B06050E2221432EC5E5114AB0 :100410002B79324A2B0E31CD0500EBE17323722389 :10042000C10C0C10E7DB003257FD3E803256FD1147 :100430007F2B215521010402CD6A13CD5012C93AF8 :100440005914E60F32672BD6013250FDAF06000E6D :1004500001CD7913C2E9043A522FFE02C2E304CD62 :1004600003143A51FDCB4F2006AF32632B18053EE3 :10047000FF32632B3A632BB7280606000E011804DF :1004800006010E05CD791320602A4E2F22602BCD58 :100490009F123847214E2F1122001911832D01CBB5 :1004A00001EDB03A632BB7280606000E04180406C7 :1004B000020E05CD79132031214E2F114D01191156 :1004C0007F2B010402EDB03A802DFE3520053E3130 :1004D00032802DCD08120600C3F004219A29CDEEFA :1004E00013180621DE27CDEE1321CA2ACD3414C9F4 :1004F0003A6E14E6F0B0326E14E1E1216E14CD399B :100500000EC9213627CD34142A400022602BCD9FFE :1005100012DAD905CDCB12EB21832D018000EDB08D :10052000CDD912E5EBDB003256FDAF3257FD21038A :100530002E0605C523231313010200CD6A13C11033 :10054000F2E3414CDC2 :100820009B0CCD341421FB25CD3414C9A71BB41B5C :10083000C11BCE1B32742B7832752B210000227223 :100840002B2A5A2B114E2F010001EDB0CD48092A59 :10085000582B110600193E20772377CD27102A58F0 :100860002BCD3414212B2BCD3414CD2114F521277D :100870002BCD3414F1FE8D2819FE8E2835FE8F28DD :1008800025FE80301C473A662BB7281578CDC20864 :1008900018C93A562BCD16107EB72805CDF4081886 :1008A000BACD081428B5214E2FED5B5A2B0100015B :1008B000EDB0CD2710210123CD3414212B2BCD34C5 :1008C00014C9F53A562B3CCD1610E5CD61092A5CCA :1008D0002BE5D12BEDB8E1F177F53A562BCD16107B :1008E0003421662B35F1F5CD6C09CD7E09F1060575 :1008F000CDC80FC93A562B3CCD16102B7EF5CD61D5 :1009000009E5D123EDB03A562BCD16103521662BD3 :1009100034F1CD6C09D5B7210000ED52EBCD7E0945 :10092000D1281921752BD620BE38112A582BCD433A :10093000143A562B06FF0E00CD6A0FC943C5213B62 :100940002BCD3414C110F6C93A562BCD16107EB7F4 :10095000C83600E55F160019CD610923D113EDB04B :10096000C9EB2A5C2BB7ED52E5C1EBC91600FE209E :100970001E01D01E05FE1BC8FE0DC81E02C92A722C :100980002B1922722B3A7421114A0019EB214D2E010101CD6A1390 :10055000F6FF32442B3EFE324B2B06050E22214382 :100560002EC5E5114A2B79324A2B7E324C2B237E45 :10057000324D2B0E31CD0500E12323C10C0C10E1CF :100580003A812D32EA05FE343A802D2006FE3120D4 :10059000023E35326A2B3A822D32EC0521E505CD3B :1005A0003414DB003256FD217F2B3E803257FD1183 :1005B0005521010102CD6A133A7F2DFE32F3DB0390 :1005C00020050608B0180306F7A0D303FB21E12697 :1005D000CD3414F6FF32432BC9219A29CDEE1321D5 :1005E0007126C334141B73301B78001B00002136A6 :1005F00027CD34143A8914E60FD6013250FDAF06E8 :10060000000E01CD7913C2F5063A522FFE02C2EF59 :1006100006CD03143A51FDCB4F2006AF32632B18A1 :10062000053EFF32632B3A632BB7280606000E0106 :10063000180406010E05CD7913C2F5062A4E2FCDFA :100640009F12DAE70611702F21832D018000EDB093 :100650000605C523231313010200EDB0C110F311E9 :10066000303021432E010B01EDB03A632BB7280641 :1006700006000E01180406010E05CD821320763AFD :10068000632BB7280606000E04180406020E05CDDB :10069000791320613A802DF5FE31200C3A812DFE30 :1006A0003420053E3532802D214E2F114D01191178 :B5F16000EFF0CB7ED59 :100990005230FA197D2A582B1106001923C62077E8 :1009A0002B79C620BE77C9212F157EE60FC63032BF :1009B000802DCD7911C93E16CD2D143A812DFE34EE :1009C00028073E34210B2318053E30211E23328197 :1009D0002DCD3414C93E16CD2D143A822DFE3C3E49 :1009E0003E21301E28053E3C213A1E32822DCD3458 :1009F00014C93E16CD2D143A7F2DFE322147233ED9 :100A00003C28052131233E32327F2DCD3414C921BB :100A10003F21CD341421DE2222582BCD4F113256E6 :100A20002B3E4C0601CD340821FB25CD34143A561B :100A30002B21450ACDE212CD34143A562B06230E53 :100A4000FFCD6A0FC91621352120212B213521CD5B :100A50004F115F3A7315E60F217C0A4F06000946D5 :100A60000E00CB38C50600300206FF7BD5CD8710BF :100A7000D1C10C79FE0520EACDA811C910030C00E4 :100A8000CD39113A0516E60F7E2005E6EF771817E7 :100A9000F61077CD44113A0516E60FFE027E2804C3 :100AA000E67F1802F68077CD9811C9CD2E113A183D :100AB00016E60F3C77CD8E11C93A692BEEFF3269ED :100AC0002B21B515280334180135CDC30D218625FA :100AD000CD3414C921D923CD34140E39CD5113FE90 :100AE0008D28F7FE0D2847D63032162EFE030E391C :100AF000380411ECD77 :100DD00034143A692BB72173272803218427CD3493 :100DE00014217B1ECD3414CDC01121991ECD341495 :100DF000CD161121352122582B3A692BB7200A3EF6 :100E00000106230EFFCD6A0FC93E0406230EFFCD57 :100E10006A0F21DA1ECD3414110D243A162ECDF6A8 :100E200012210824CD3414C9217724CD3414CD2BBC :100E300012C921452BCD3414C9E5CD16147EE680A8 :100E40002806110B00CD1E0FCD720ECD610EE1CD27 :100E5000880EC97EE60F871E0D835F1600CD1E0F1C :100E6000C9E5CD530E110500CD1E0F11700ED5E949 :100E7000E1C9E5CD090F110300197E23666F1183C7 :100E80000ED5E9E1CD880EC9E521272BCD3414E13B :100E9000F6FF32712BCDA10EE5212B2BCD3414E1C1 :100EA000C9E5CDE40ECDD50E7E23E5CD2D14E17E32 :100EB00023E5CD2D143A712BB721322B2803212F96 :100EC0002BCD3414E1CD431421322BCD34143E0DFF :100ED000CD2D14E1C97EE60F110900195E23666B62 :100EE000CDE212C9E5CD090FCD2C0F477EE60F05E7 :100EF00028044F8110FD47CD240F80280A47C53EA6 :100F000016CD2D14C110F7E1C9E5110200197ECDEF :100F1000140FE1C932412B213F2BCD3414C9197E66 :100F200023666FC9E5110700197EE1C9E5110800C4 :100F3000197EE1C9214E0F060E302023CD5113FE0D281CFE8D200E :100B000008213B2BCD341418D1D6305F3A162E066F :100B1000094F8110FD8332162E3A162E110D24CD69 :100B2000F61221B415CD880E210824CD341421FBF2 :100B300025CD3414C9211124CD341421792B060379 :100B4000E5C50E39CD5113C1E1FE0D281BFE8D20E8 :100B50001378FE0328EA2B04E5C5213B2BCD341482 :100B6000C1E128DC772310D878FE03283A21792BBD :100B70003E03903DCD38138757FEC67E200CFE36CF :100B80003808CD081423060018C7FE33380614FEB3 :100B9000383801147A324D2F21C915CD880E219F86 :100BA00024CD3414CD2B12210123CD341421FB2567 :100BB000CD3414C921D817CD341421A524CD341433 :100BC000210301C33414214418CD3414211425CD3C :100BD0003414C92189147EE6F077210C19CD341420 :100BE000217126C3341421511ACD3414CD340FCDC4 :100BF000271021FB25CD3414C921F91ACD3414CD89 :100C0000410F21DB1CCD3414CD9B0CCD3414CD27EA :100C10001021FB25CD3414C9218D1DCD3414CD797F :100C20001121FB25CD3414C921661FCD3414CD8E7E :100C30001121FB25CD3414C921041FCD3414CD98C6 :100C40001121FB25CD3414C9214620CD3414CDA863 :100C50001121FB25CD3414C9219019CD3414CDFEBA :10A0E003E46CD511022 :100F4000C921620F06040E0A3E42CD5110C9451C4C :100F5000FD1B051C0D1C151C1D1C251C2D1C351CEA :100F60003D1C4D1C551C5D1C651CF57932782B7899 :100F700032772BF1C5CD1610C17EB7281B57237EC3 :100F800023D5E5CDC80FE1D13A772BFEFF280378B2 :100F9000B7C8471520E9180F3A782B21BA0FB728A0 :100FA0000321BD0FCD341421BA0FCD3414C93C52E6 :100FB00045543E3C4553433E5E411B54001B293C77 :100FC0004E4F4E453E1B28004F78B7C879FE20385B :100FD00007C5CD2D14C105C921AE0FFE0D2807216F :100FE000B30FFE1B200EC5E521352BCD3414E1C116 :100FF0000E05180A21B80F0E02C64032B90FC5E51A :101000007ECD2D14E1C1230528030D20F1C5213823 :101010002BCD3414C1C9C52A5A2BB7280806004E57 :101020000C093D20FAC1C93A572BCD16102BEB2ADB :101030005C2BB7ED527D32662B2A5E2BCD34143AF1 :10104000662B11792BCDF612AF1221792BCD3414EA :10105000C932762B5E235623E5C5EBCD3414C1C5CA :101060003A762B47790EFFCD6A0FC1E10C10E5C926 :10107000CB21060021432E09D608300323C6084E93 :101080003CCB013D20FBC9C5CB21060021432E09E5 :10109000D608300323C608E521B0105F1600197E7C :1010A000E1C1400C60001021751CCD341421C40C060A0E003E1E42 :100C7000CD511021E11CCD3414CD9B0C2004CD347A :100C800014C9211D1ACD341421751CCD341421D85A :100C90000C06040E0A3E19CD5110C93E0ACD16109D :100CA000E511CA070608CDA612E1281311D20706DE :100CB00008CDA61221F61C280921071DF6FFC9211F :100CC000E91CAFC9B81C791C801C871C8E1C951CA4 :100CD0009C1CA31CAA1CB11CBF1CC61CCD1CD41C74 :100CE00021171DCD34143A802DD63021EC12CDE2DF :100CF00012CD431421341DCD3414210B233A812D00 :100D0000FE342803211E23CD341421571DCD341465 :100D10003A822DFE3C213A1E280321301ECD341488 :100D2000216E1DCD34143A7F2DFE3221312328034C :100D3000214723CD341421991ECD3414CD16113EF4 :100D40000006230EFFCD6A0FC9218A152223162221 :100D50001016227E1522C61621451ECD3414CDB2A2 :100D60001121601ECD3414CDEB11217B1ECD341426 :100D7000CDC01121991ECD3414CD16113E0206238B :100D80000EFFCD6A0FC9219F1522231622101622AD :100D90007E1522C61621451ECD3414CDB211216018 :100DA0001ECD3414CDEB11217B1ECD3414CDC011DA :100DB00021991ECD3414CD16113E0306230EFFCD0E :100DC0006A0FC921B415227E1522C61621CF78B7792005EEFFA61801B677C9E0 :1010B0008040201008040201D810801F8A1F941F4E :1010C0009F1FAC1FB71FC21FCD1FD91FE51FF11FE8 :1010D000FD1F0920152021202020204E4F4E4520A5 :1010E000FF0006074F8110FD4F060021832D09C91F :1010F00006034F8110FD4F060021032E09C93E0E45 :1011000032572B217F2B225A2B217E2C225C2B2124 :101110006D1C225E2BC93E1032572B214D2E225AB8 :101120002B214C2F225C2B21F922225E2BC9CD4F83 :1011300011CDE21001070009C9CD4F11CDE2100118 :10114000060009C9CD4F11CDF01001020009C93ABE :101150006E14E60FFE022813FE032812FE013E0065 :10116000C83A692BB73E01C83E04C93E02C83E03D7 :10117000C91B73331B3D212000217111CD34143A5A :10118000802DD63021EC12CDE212CD4314C921F4CA :101190001ECD3414CDB211C921F91ECD3414CDEBBE :1011A0001121382BCD3414C921FE1ECD3414CDC0ED :1011B00011C9CD2E117E21B810CDE212CD4314C934 :1011C000CD4F110E0047C578CD7010C138060C798F :1011D000FE0520F27921DF11CDE212CD3414C97C55 :1011E000237C239B239B235D23BA23CD39117EE6E9 :1011F00010214027280ECD44117EE680215127285A :1012000003216227CD3414C90E000604C578CD70C1 :10D147016703B :1014EE0016701670167016701670167016701670BE :1014FE0016200531F90B581403012F17CD148E1633 :10150E009D167F167F167F167F16A00433C60BE03E :10151E000C00033B176E142F15461555156415BB9D :10152E0016200432180C5814020145171815AC1663 :10153E00AC16AC16AC16AC1620FF320000581401D7 :10154E000100001815B60920FF32000058140E01D4 :10155E0000001815D50920FF32000058140E0100A6 :10156E00001815F209200332480C581403018D1788 :10157E008A15E816E816E816E816E816A00333C62C :10158E000B490D00034F176E14181605167315BB75 :10159E0016A00333C60B860D000357176E141816CC :1015AE0005167315BB16A00233C60BC30D00035FE1 :1015BE00176E1443167315BB165216A00033C60BC6 :1015CE00280E000367176E14611600FF31000058D5 :1015DE0014000100000000020500FF310000581445 :1015EE00000100000000EE0500FF3100005814005D :1015FE000100000000FB06200232380C58140201D4 :10160E0069178A15CA16CA16CA16200E32280C5821 :10161E001402016F178A15D916D916D916D916D9EB :10162E0016D916D916D916D916D916D916D916D934 :10163E0016D916D91620FF320000581402010000E8 :10164E000000B90A20FF12100010C1380B0C79FE0520F2AF06021804F657 :10122000FF060332692B7832B515C93A4D2FCB3FF3 :10123000F511792BCDF612F120053E201B12133E3D :101240003030023E351213AF1221792BCD3414C940 :10125000AF21802DED6F4F0600217F12097E328075 :101260002DAF21812DED6F4F0600218F12097E32A7 :10127000812D21822D7EB73E3C28023E3E77C9302B :101280003134333231343332313231323132313040 :10129000303030303030303434343434343434114D :1012A0007431B7ED52C978B7C81ABEC0132310F90C :1012B000C93E15324E2B0605C5480DED43502B0E89 :1012C00032114E2BCD0500C110EEC93E14324E2B0B :1012D0000E32114E2BCD0500C9CDCB122B7E2B6EBD :1012E00067C9874F0600097E23666FC9A91DBA1D0D :1012F000D01DE41DFE1D47AF32682B780E64CD2E45 :1013000013C630FE302007F6FF32682B3E20121342 :10131000790E0ACD2E13C630FE30200A3A682BB75C :101320003E3028023E20121379C6301213C906FF40 :10133000049130FC814F78C9B7C847AFCD48134FEF :101340007ED630812310F5C9C506094F8110FDC135 :10135000C90CC5CD2114C1FE0DC8FE8DC8FE3038A4 :10136000F1B930EEF5CD2D14F1C9ED73642B31DCFC :10137000FDCD0000ED7B642BC9F5AF32622B3100005814030100000009 :10165E0000D40A20FF3100005814030100000000DE :10166E00350B20FF3100005814000100000000135C :10167E000720FF3100005814000300000000DA07B5 :10168E0020FF310000581400010000000057072011 :10169E00FF31000058140001000000008F0700FF0A :1016AE003100005814000100000000A70920FF318E :1016BE00000058140301000018150F0A00FF310036 :1016CE00005814000100000000800A00FF310000E5 :1016DE005814000100000000AB0A00FF3100005852 :1016EE00140001000000004F0AFD170E18201832DA :1016FE00186B1880189818A818BA18CD18DA18365A :10170E00194519551965197E199419071A9E1AA7A4 :10171E001AB01AB91AC21ACB1AD41ADD1AE61AEF6F :10172E001A7D1B901BA71BB41BC11BCE1B1B1D368A :10173E001D591D701D9B1EA91DBA1DD01DE41DFE39 :10174E001D491E661E7D1E9B1E491E661E7D1E9B0E :10175E001EC51E7D1E9B1EDC1E7B241D1F301F40C2 :10176E001F801F8A1F941F9F1FAC1FB71FC21FCD44 :10177E001FD91FE51FF11FFD1F09201520212089EC :10178E00209F20C020E5201B73301A2020202A2AFB :10179E002A204F73626F726E65204578656375748B :1017AE0069766520436F6E66696775726174696FDD :1017BE006F1C3CC :101380008C13F53EFF32622BF1C38C1332ED13C583 :10139000CD0314C1C2D4133A51FD0F38473AED13AF :1013A000B73A51FD2804CBCF1802CB8F3251FD79CB :1013B000324DFD78324EFDDB00324AFD214E2F22A8 :1013C0004BFD06013A622BB72806CDFE13200DC94E :1013D000CDF913C8219527CDEE13180E21B927CDCD :0D13E000EE13180621DE27CDEE13F6FFC92F :1013EE00CD3414CD2114FE1B20F9C91E5AC352143C :1013FE001E5DC352141E60C35214E53E07CD2D145C :10140E00E1C93E1ACD2D14C9E53E31CD140FCD10D4 :10141E0014E1C91EFF0E06CD0500FE0028F5C95FBA :10142E000E02CD0500C97EB7C823FEFF28F8E5CD14 :10143E002D14E118F17EFEFFC823B728F8E5CD2D57 :10144E0014E118F1DD2A212BDDE9C9000336B40BB6 :10145E0058140401F716A014AF14BE14BE14A01431 :10146E00400632C60B58140201FF168914CD14180B :10147E00158A159F15B415C9158914000436D30B9A :10148E00320E04010D17F615D815E715E7156E1473 :10149E00A01400FF310000581400010000000043AA :1014AE000300FF3100005814000100000000A203E9 :1014BE0000FF31000058140001000000003F04A09E :1014CE000133C60B580C000C17176E14DE14FF14E4 :1014DE00200931E60B581402011B17CE2050726F6772616D202A2A2A202020B7 :1017CE00202020202056312E33001B3D2220536531 :1017DE006C65637420736F7572636520666F72201B :1017EE00636F6E66696775726174696F6E1F0A202A :1017FE00202046524F4D204D454D4F525920FF1F30 :10180E0020202046524F4D2044524956452041201B :10181E00FF1F20202046524F4D204452495645204E :10182E004220FF1F2020204558495420544F20436A :10183E00502F4D20FF001A53656C65637420746839 :10184E0065206974656D7320796F752077616E748C :10185E0020746F206368616E67653A1F0A2020202E :10186E004B455920444546494E4954494F4E532005 :10187E00FF1F202020434F4E534F4C4520504152C6 :10188E00414D455445525320FF1F2020204D4F44BB :10189E00454D20504F525420FF1F202020505249BA :1018AE004E54455220504F525420FF1F202020509E :1018BE004152414C4C454C20504F525420FF1F205A :1018CE00202047454E4552414C20FF1F20202045E9 :1018DE0058495420544F2053415645204D454E559E :1018EE0020FF1B73311B3D214D1B6C4375727265BE :1018FE006E742053657474696E67731B6D001B3DA7 :10190E00222053656C6563742064657374696E611F :10191E0074696F6E20666F7220636F6E666967758D 01B73311B3D2328001B14 :101C0E0073311B3D2428001B73311B3D2528001BFF :101C1E0073311B3D2628001B73311B3D2728001BEB :101C2E0073311B3D2828001B73311B3D2928001BD7 :101C3E0073311B3D2A28001B73311B3D2B28001BC3 :101C4E0073311B3D252C001B73311B3D262C001BB5 :101C5E0073311B3D272C001B73311B3D282C001BA1 :101C6E0073311B3D2D30001B7335001B3D21201B96 :101C7E0054001B3D22201B54001B3D23201B5400EF :101C8E001B3D24201B54001B3D25201B54001B3DD7 :101C9E0026201B54001B3D27201B54001B3D2820D3 :101CAE001B54001B3D29201B54001B3D2A201B5496 :101CBE00001B3D2D251B54001B3D2E251B54001BC8 :101CCE003D2F251B54001B3D30251B54001B733329 :101CDE000A0A001B73331B3D2D20002020202020DC :101CEE0043502F4D1B54FF002020202020576F7291 :101CFE0064537461721B54FF002020202020537007 :101D0E00656369616C1B54FF001B73331A20201B23 :101D1E002920437572736F7220747970653A201B97 :101D2E0028FF1F2020001F0A20201B29204261634C :101D3E006B67726F756E642061747472696275740C :101D4E0065733A201B28FF1F001F0A20201B292025 :101D5E004B657920436C69636B3A201B28FF1F008B :101D6E001F :10192E00726174696F6E1F0A202020544F204D453E :10193E004D4F525920FF1F202020544F2044524912 :10194E005645204120FF1F202020544F204452494D :10195E005645204220FF1F20202052455455524EFE :10196E0020544F2045444954204D454E5520FF1FCD :10197E002020204558495420544F2043502F4D20AD :10198E00FF001B73331A20201B292046756E6374CB :10199E00696F6E204B6579733A201B28FF1F20203C :1019AE0020202031202D1F202020202032202D1FEE :1019BE00202020202033202D1F20202020203420E6 :1019CE002D1F202020202035202D1F2020202020DC :1019DE0036202D1F202020202037202D1F202020B4 :1019EE00202038202D1F202020202039202D1F20A0 :1019FE002020202030202D1F1F20201B2920417247 :101A0E00726F77206B6579733A201B28FF1F0020B9 :101A1E00202020205550202020202D1F2020202047 :101A2E00205249474854202D1F2020202020444F6B :101A3E00574E20202D1F20202020204C454654207C :101A4E00202D001A1B3D2D3463686172616374652D :101A5E007220706C616365732072656D61696E6969 :101A6E006E671E53656C65637420746865206675B9 :101A7E006E6374696F6E206B65797320796F752054 :101A8E0077616E7420746F206368616E0A20201B29204D6F6E69746F7220464A :101D7E0072657175656E63793A201B28FF1F001B13 :101D8E0073310A53656C65637420637572736F7279 :101D9E0020747970653A1B73321F0A202020496E19 :101DAE0076697369626C65201B54FF1F20202042E8 :101DBE006C696E6B696E6720426C6F636B201B548F :101DCE00FF1F20202053746561647920426C6F637D :101DDE006B201B54FF1F202020426C696E6B696EB6 :101DEE006720556E6465726C696E65201B54FF1F0B :101DFE0020202053746561647920556E6465726C81 :101E0E00696E65201B54FF1B73331B6C4375727216 :101E1E00656E7420437572736F7220547970651BF2 :101E2E006D0020202020204F6E1B540020202020EB :101E3E00204F66661B54001B73331A20201B29206B :101E4E004261756420526174653A201B28FF1F2081 :101E5E0020001B73331F0A0A20201B292050726F8B :101E6E00746F636F6C3A201B28FF1F20001F0A201F :101E7E00201B29204465766963652053656C656374 :101E8E0074696F6E3A201B28FF1F001F0A20201B4B :101E9E002920496E697469616C697A6174696F6E23 :101EAE0020537472696E673A201B28FF1F20202072 :101EBE002020001B73331A20201B292050726F74B0 :101ECE006F636F6C3A201B28FF1F20001F0A202013 67651F0ADC :101A9E0020202031202D20FF1F20202032202D201D :101AAE00FF1F20202033202D20FF1F202020342038 :101ABE002D20FF1F20202035202D20FF1F2020202D :101ACE0036202D20FF1F20202037202D20FF1F2005 :101ADE00202038202D20FF1F20202039202D20FFF0 :101AEE001F20202030202D20FF1F001B3D2D346392 :101AFE00686172616374657220706C6163657320D6 :101B0E0072656D61696E696E671E53656C6563748F :101B1E002061207374616E64617264206172726FF1 :101B2E0077206B657920646566696E6974696F6E7E :101B3E001F6F722073656C65637420696E646976BD :101B4E00696475616C206172726F77206B65797351 :101B5E0020746F20646566696E6520616E792077EA :101B6E00617920796F75206C696B651B281F0A20BF :101B7E00202043502F4D207374616E646172642077 :101B8E00FF1F202020576F7264537461722073748C :101B9E00616E6461726420FF1F202020555020204A :101BAE0020202D20FF1F2020205249474854202D51 :101BBE0020FF1F202020444F574E20202D20FF1F96 :101BCE002020204C45465420202D20FF1B73330A25 :101BDE001B6C43757272656E74204172726F772042 :101BEE004B65792053657474696E67731B6D001BAA :101BFE0073311B3D22280:101EDE001B29204945454520616464726573733A38 :101EEE00201B28FF0D001B73331F001B73331F00B5 :101EFE001B73331F0A001B73310A53656C656374C1 :101F0E002050726F746F636F6C3A1B73321F0A200E :101F1E0020204E6F2050726F746F636F6C201B54B5 :101F2E00FF1F202020584F4E2F584F4646201B543F :101F3E00FF1F2020204554582F41434B201B54FF98 :101F4E001B73331B6C43757272656E742050726F07 :101F5E00746F636F6C1B6D001B73310A53656C6578 :101F6E006374204261756420526174653A1B73324A :101F7E001F0A2020203530201B54FF1F2020203721 :101F8E0035201B54FF1F202020313130201B54FFE1 :101F9E001F2020203133342E35201B54FF1F2020CC :101FAE0020313530201B54FF1F20202033303020AD :101FBE001B54FF1F202020363030201B54FF1F20C3 :101FCE00202031323030201B54FF1F20202031388A :101FDE003030201B54FF1F20202032343030201B85 :101FEE0054FF1F20202033363030201B54FF1F207B :101FFE00202034383030201B54FF1F202020373251 :10200E003030201B54FF1F20202039363030201B4B :10201E0054FF1F2020203139323030201B54FF1B3B :10202E0073331B6C43757272656E742042617564F6 :10203E0020526174651B6D001B73310A502020204E6F726D616C202020202006 :10232E002020002020202020353020487A202845EB :10233E0075726F7065616E29002020202020363066 :10234E0020487A2028416D65726963616E290020EC :10235E00202020205072696E74657220284C5354D0 :10236E003A2920202020202020202020200020205C :10237E002020205465726D696E616C2028434F4E8B :10238E00494E3A2F434F4E4F55543A2900202020A4 :10239E0020204F746865722028415558494E3A2FB7 :1023AE004155584F55543A292020200020202020F6 :1023BE00204E6F2044657669636520202020202002 :1023CE0020202020202020202020001B73371A1BC5 :1023DE003D2030456E746572204945454520616447 :1023EE00647265737320286265747765656E20303C :0F23FE0020616E642033302920001F2020202012 :10241000001B73371A1B73341B3D2F30456E7465D8 :1024200072206465766963652074696D656F757483 :1024300020696E207365636F6E64732028302D39B8 :102440003935291B3D30302856616C756520776918 :102450006C6C20626520726F756E64656420746FA9 :102460002061206D756C7469706C65206F66203515 :10247000292020202020001B73331A20201B292014 :102480004465766963652054696D656F75743A209B :103656C650C :10204E006374207468652074797065206F662064EF :10205E00657669636520796F7520706C616E20748A :10206E006F2061747461636820746F207468697383 :10207E0020706F72741B73321F0A0A202020505278 :10208E00494E54455220284C53543A29201B54FF94 :10209E001F2020205445524D494E414C2028434F7D :1020AE004E494E3A2F434F4E4F55543A29201B540A :1020BE00FF1F2020204F5448455220444556494387 :1020CE00452028415558494E3A2F4155584F5554A1 :1020DE003A29201B54FF1F2020204E4F20444556E6 :1020EE00494345201B54FF1B73331F1B6C437572F2 :1020FE0072656E74204465766963652053656C6500 :10210E006374696F6E1B6D001B73331B3D2D251B96 :10211E0054001B73331B3D2A251B542C301B733369 :10212E001B3D2A251B54001B73331B3D27251B54B7 :10213E00001B73341B3D2F22456E74657220696E31 :10214E00697469616C697A6174696F6E20737472F7 :10215E00696E673A20201B73371A1B3D2033636864 :10216E006172616374657220706C61636573207255 :10217E00656D61696E696E671B73371B3D222F504B :10218E0072657373205E52455455524E20746F2003 :10219E007361766520737472696E672C205E455389 :1021AE004320746F2065782490001B28FF1B3D21297365636F6E64730B1F3F :1024A00020202020001B73311B3D2C3055736520EC :1024B0006172726F77206B65797320746F20706F13 :1024C000736974696F6E20637572736F721F1B3D41 :1024D0002D3050726573732052455455524E2074FE :1024E0006F206D616B6520612073656C6563746935 :1024F0006F6E1F1B3D2E3050726573732045534322 :1025000020746F20657869742066726F6D20536542 :10251000747570001B73371A1B3D2030557365208E :102520006172726F77206B65797320746F20706FA2 :10253000736974696F6E20637572736F721F1B3DD0 :10254000213050726573732052455455524E207499 :102550006F206D616B6520612073656C65637469C4 :102560006F6E1F1B3D2230507265737320455343BD :1025700020746F206578697420746F2053617665CC :10258000204D656E75001B73371A1B3D2030557347 :1025900065206172726F77206B65797320746F208C :1025A000706F736974696F6E20637572736F721FD9 :1025B0001B3D213050726573732052455455524E65 :1025C00020746F206D616B6520612073656C65639D :1025D00074696F6E1F1B3D22305072657373204506 :1025E000534320746F206578697420746F206D6583 :1025F0006E75206F6E206C656674001B7337697420776974686F7541 :1021BE0074206368616E67696E67001B73341B3D24 :1021CE002E22456E7465722066756E6374696F6E2D :1021DE00206B657920646566696E6974696F6E3A05 :1021EE001F2020303A20201B73371A1B3D21305000 :1021FE0072657373205E52455455524E20746F2093 :10220E0073617665206B657920646566696E6974A5 :10221E00696F6E1B3D22305072657373205E45539D :10222E004320746F206578697420776974686F75C0 :10223E0074206368616E67696E67206F6C642064DA :10224E006566696E6974696F6E001B73371A1B3D84 :10225E0021305072657373205E52455455524E2094 :10226E00746F2073617665206B657920646566698D :10227E006E6974696F6E1B3D2230507265737320E8 :10228E005E45534320746F206578697420776974B6 :10229E00686F7574206368616E67696E67206F6C16 :1022AE006420646566696E6974696F6E1B73341B96 :1022BE003D2E22456E746572206172726F77206BAF :1022CE00657920646566696E6974696F6E3A1F0080 :1022DE001B7338FF1B3D2020001B7339FF1B3D2055 :1022EE0020001B733AFF1B3D2020001B73371B3D44 :1022FE00202F001B73341B3D2D201B590020202046 :10230E0020205265766572736520566964656F008C :10231E002021A1B36 :102600003D2030557365206172726F77206B65795C :102610007320746F20706F736974696F6E206375B7 :1026200072736F721F1B3D2130507265737320529D :10263000455455524E20746F206D616B65206120AA :1026400073656C656374696F6E1F1B3D2230507239 :102650006573732045534320746F20657869742037 :10266000746F2070726576696F7573206D656E7515 :10267000001B73371A1B3D20305573652061727241 :102680006F77206B65797320746F20706F73697436 :10269000696F6E20637572736F721F1B3D2130501E :1026A000726573732052455455524E20746F206DDD :1026B000616B6520612073656C656374696F6E1F63 :1026C0001B3D223050726573732045534320746F55 :1026D00020657869742066726F6D2053657475701B :1026E000001B73311B3D2B341B29436F6E666967DA :1026F00075726174696F6E20736176656420746FA2 :10270000201B284D454D4F52592020001B73311B73 :102710003D2B341B29436F6E66696775726174695E :102720006F6E20736176656420746F201B2844529D :102730004956452041001B73311B3D2A201B540084 :10274000202020204E6F2050726F746F636F6C20BA :102750000020202020584F4E2F584F464620202042 :1027600020002020202045545A400020717569743F2028592F4E292020001BC2 :102A500073371A1B3D20304E4F5420454E4F55477B :102A6000482043484152414354455220504C414331 :102A700045532052454D41494E494E471B3D21305B :102A8000546F206D616B65206D6F726520726F6F82 :102A90006D2C2073686F7274656E20796F7572206B :102AA00066756E6374696F6E206B65792064656608 :102AB000696E6974696F6E731B3D22305072657365 :102AC0007320455343206B6579001B73371A001B35 :102AD000661B2E321B7A312220376F1B7A3223205D :102AE00033471B7A332448346F1B7A342320346FE6 :102AF0001B7A352451346F1B7A362330336F1B7A9F :102B0000373520376F1B7A383324346F1B7A3932CC :102B100026356F1B7A3A322C356F1B73301A000042 :012B21005A59 :102B23001B2E32001B2E30001B2E32001B6A001B93 :102B33006B001B29001B2800082008001B733000B2 :072B430000001B73331A00B0 :00010010  disk buffer LDK HL,DEVFLGS ;Location in setup area LDK BC,ITBLLEN+REDIRLEN+1 LDIR ;Move to disk buffer ;Write n82F41434B2020207A :102770002020002020202043454E54524F4E4943F4 :10278000532020002020202049454545202020209E :1027900020202020001B73371A1B3D20305245415A :1027A00044204552524F521B3D2130507265737385 :1027B00020455343206B6579001B73371A1B3D205E :1027C000305752495445204552524F521B3D2130FB :1027D000507265737320455343206B6579001B73FA :1027E000371A1B3D20304E4F5420414E204558454E :1027F0004355544956452053595354454D20444957 :10280000534B455454451B3D2130596F752063612E :102810006E206F6E6C7920736574757020646973B7 :102820006B65747465732077697468204578656397 :1028300075746976652073797374656D207472613F :10284000636B732E1B3D22305072657373204553AA :1028500043206B6579001B73371A1B3D2030494EAE :1028600056414C49442056455253494F4E204E55EF :102870004D4245521B3D213044657374696E61744D :10288000696F6E2076657273696F6E206973206E52 :102890006F7420757020746F206461746520666F9A :1028A0007220746869732076657273696F6E206F29 :1028B000662073657475701B3D22305072657373AA :1028C00020455343206B6579001B73311A1B3D2A49 :1028D000254552âs7 gG 1983 Osborne Computer Corporation, 26538 Danti Court, Hayward CA 94545 gG 1984 Future Systems, 828 Nob Hill Avenue, Pinole, CA 94564*+:B -:2 +2"+*D"r:-2j+!*4!4!YK!(!42W>2V! N/@j!N/@>(!O/+"m+~2k+>w!N/@> (!T/+"o+~2l+>w2V>2W!N/ @j9!Nzʒʭʾ _~(2q+͡5a͈~#+02q+͡4a͈S~ (~ (S#~+(~w 9!%4͈S͈2q+͡ #~+(%~@( !%4͈9~!%4͈S>͈!4:j+2%+!#+42W>2V! N/@j*m+:k+w!o+:l+w2V>2W!N/ @j:D+(ͱes0*`+͟8:j+2-!)!*4*@"`+2g+-.2V2W@jJM.j2K+"!C.J+y2J+1s#r# 2W>2V+!U!jP:Y2g+2Py:R/:QO 2c+>2c+:c+(y `*N/"`+͟8G!N/"-:c+(y 1!N/M+:-5 >12-!)!'!*4:n2n!n9524F523A202045584543555449B8 :1028E00056452053455455501B3D2B25546869735C :1028F0002073657475702070726F6772616D2069E6 :10290000732064657369676E656420666F722074F6 :102910006865204F73626F726E65204578656375D8 :10292000746976651B3D2C25596F7572206D616346 :1029300068696E65206973206E6F7420612076610E :102940006C6964204578656375746976652E1B3DF6 :102950002D25506C656173652075736520746865FD :102960002073657475702070726F6772616D20647A :10297000657369676E656420666F7220796F757222 :10298000206D616368696E651B3D2F25507265730C :102990007320455343206B6579001B73371A1B3D29 :1029A0002030494E56414C49442056455253494FD8 :1029B0004E204E554D4245521B3D2130536F75728E :1029C0006365206973206E6F7420757020746F20AA :1029D0006461746520666F7220746869732076651F :1029E0007273696F6E206F662073657475701B3D1E :1029F0002230507265737320455343206B65790014 :102A00001B73371A1B3D2030536574757020686145 :102A100073206E6F74206265656E207361766564E5 :102A2000207965741B3D213041726520796F7520D6 :102A30007375726520796F752077616E7420746F7D :102!6'4*@"`+͟!-2V2W!.##jJ!M.j2D+>2K+"!C.J+y2J+~2L+#~2M+1## :-24:- 1 >52j+:-2!42V!+>2WU!j:-2 !&42C+!)!q&4s0x!6'4:2Py:R/:QO 2c+>2c+:c+(y*N/͟p/!-##00!C. :c+(͂ v:c+(y a:-1 :-4 >52-!N/M+2-:c+(͂ $:@24'! '42C+!V(!'!q&4:C+C!*4!_YC!~< 2V+02!!!4!""X+>J4:V+!N4:V+Fj!%4> !,RB8!A!4͛ 4'!O*!%4> !,RB8!A!4͛ 4'!O*!%4   !X"4!~2V+ !,C!""X+>D4:V+!N4:V+Bj!4͛ 4!%4ɧ2t+x2u+!"r+*Z+N/H *X+> w#w'*X+4!++4!!'+4((5(%0G:f+(x:V+~((!N/[Z+'!#4!++4:V+<a *\++w:V+4!f+5l ~ :V+<+~a2W+!+"Z+!~,"\+!m"^+>2W+!M."Z+!L/"\+!""^+O O O :n((>:i+>>>>s3=! !q4:-0!C!4Ͳ!4!8+4!4.~!COGxp8 y y!4|#|###]##9~!@'(D~!Q'(!b'4xp8 y 2i+x2:M/?y+ > >00>5!y+4ɯ!-oO! ~2-!-oO! ~2-!-~><(>>w01432143212121210000000044444444t1Rx#>2N+H CP+2N+>2N+2N++~+ngɇO ~#foɩG2h+xd.00 2h+> y .00 :h+>0(> y00OxɷGHO~0# O ! 080-sd+1{d+2b+Ì>2b+Ì2:Q8G::Q(ˏ2Qy2Mx2N2J!N/"K:b+( !'!'!'4! ZR]R`R>->->1(_~#(-~#(-*!+6 X@2 X6 2 n1XC1X1X?3 X n 1 Xpppppppppp  #:V+5!f+4l շ!R~ (!u+ 8*X+C:V+jC!;+4:V+~6_a #*\+R  *r+"r+:t+_ R0}*X+# w+y w!/~02-y>-:-4(>4! #>0!#2-4>-:-<>>!0(>-:-2!G#><(!1#>22-4!?!4!""X+O2V+>L4!%4:V+!E 4:V+#j!5! !+!5!O_:s!| O F80{͇ y ͨ 9:~ wwD:~(w͘.:=8W~ 68#3888z2M/!͈!$4+!#4!%4!4!$4!4!D4!%4!~w! 4!q&4!Q44'!%4!4A!4͛ 4'!%4!4y!%4!f4͎!%4!4͘!%4!F 4ͨ!%4!4!u4!  >Q!4͛ 4!4!u4!  >Q> ͦ(ͦ!( !!ɸy!4:-0!C!44! #:-1 X/3 ;n/FUd 2 XE 2X 2X 2X 2H X3 I Ons3 Wns3 _nCsR3 (gna1X1X1X 28 Xi 2( Xo 2X 1X 1X5 1X 1X 1XW 1X1X 1X 1X 1X 1XO  2k6EUe~}6YpIf}If}}{$0@  ! s0 *** Osborne Executive Configuration Program *** V1.3=" Select source for configuration FROM MEMORY  FROM DRIVE A  FROM DRIVE B  EXIT TO CP/M Select the items you want to change: KEY DEFINITIONS  CONSOLE PARAMETERS  MODEM PORT  PRINTER PORT  PARALLEL PORT  GENERAL  EXIT TO SAVE MENU s1=!MlCurrent4(!#4!W4:-#j!"#""~"!E4Ͳ!`4!{4!4>#j!"#""~"!E4Ͳ!`4!{4!4>#j!"~"!4:i+!s'(!'4!{4!4!5!"X+:i+ >#j>#j!4 $:.!$4!w$4+!E+4~( ra͈~ _Sp ~#fo͈!'+42q+͡!++4~#-~#-:q+!2+(!/+4C!2+4> -~ ^#fk ,G~(OG$( G>-~2A+!?+4~#fo~~!N >FQ!b >BQE %-5=MU]ey2x+x2w+~(W#~#:w+(xG :x+!(!4!4^AT)(Oxy 8-! (! !5+4 !@2~-#( !8+4*Z+(N = :W++*\+R}2f+*^+4:f+y+!y+42v+^#V#4:v+Gyj !!C. 0#N<= !!C. 0#!_~Oxy wɀ@   ! NONE OO!- OO!. > Settingsm=" Select destination for configuration TO MEMORY  TO DRIVE A  TO DRIVE B  RETURN TO EDIT MENU  EXIT TO CP/M s3 ) Function Keys: ( 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 0 - ) Arrow keys: ( UP - RIGHT - DOWN - LEFT -=-4character places remainingSelect the function keys you want to change 1 -  2 -  3 -  4 -  5 -  6 -  7 -  8 -  9 -  0 - =-4character places remainingSelect a standard arrow key definitionor select individual arrow keys to define any way you like( CP/M standard  WordStar standard  UP -  RIGHT -  DOWN -  LEFT - s3 lCurrent Arrow Key Settingsms1="(s1=#(s1=$(s1=%(s1=&(s1='(s1=((s1=)(s1=*(s1=+(s1=%,s1=&,s1=',s1=(,s1=-0s5=! T=" T=# T=$ T=% T=& T=' T=( T=) T=* T=-%T=.%T=/%T=0%Ts3 s3=- CP/MT WordS to exit from Setups7= 0Use arrow keys to position cursor=!0Press RETURN to make a selection="0Press ESC to exit to Save Menus7= 0Use arrow keys to position cursor=!0Press RETURN to make a selection="0Press ESC to exit to menu on lefts7= 0Use arrow keys to position cursor=!0Press RETURN to make a selection="0Press ESC to exit to previous menus7= 0Use arrow keys to position cursor=!0Press RETURN to make a selection="0Press ESC to exit from Setups1=+4)Configuration saved to (MEMORY s1=+4)Configuration saved to (DRIVE As1=* T No Protocol XON/XOFF ETX/ACK CENTRONICS IEEE s7= 0READ ERROR=!0Press ESC keys7= 0WRITE ERROR=!0Press ESC keys7= 0NOT AN EXECUTIVE SYSTEM DISKETTE=!0You can only setup diskettes with Executive system tracks.="0Press ESC keys7= 0INVALID VERSION NUMBER=!0Destination version is not up to date for this version of setup="0Press ESC keys1=*%ERROR: EXECUTIVE SETUP=+%This setup program itarT SpecialTs3 ) Cursor type: (  ) Background attributes: ( ) Key Click: ( ) Monitor Frequency: (s1 Select cursor type:s2 Invisible T Blinking Block T Steady Block T Blinking Underline T Steady Underline Ts3lCurrent Cursor Typem OnT OffTs3 ) Baud Rate: ( s3 ) Protocol: (  ) Device Selection: ( ) Initialization String: ( s3 ) Protocol: (  ) IEEE address: ( s3s3s3 s1 Select Protocol:s2 No Protocol T XON/XOFF T ETX/ACK Ts3lCurrent Protocolms1 Select Baud Rate:s2 50 T 75 T 110 T 134.5 T 150 T 300 T 600 T 1200 T 1800 T 2400 T 3600 T 4800 T 7200 T 9600 T 19200 Ts3lCurrent Baud Ratems1 Select the type of device you plan to attach to this ports2 PRINTER (LST:) T TERMINAL (CONIN:/CONOUT:) T OTHER DEVICE (AUXIN:/AUXOUT:) T NO DEVICE Ts3lCurres designed for the Osborne Executive=,%Your machine is not a valid Executive.=-%Please use the setup program designed for your machine=/%Press ESC keys7= 0INVALID VERSION NUMBER=!0Source is not up to date for this version of setup="0Press ESC keys7= 0Setup has not been saved yet=!0Are you sure you want to quit? (Y/N) s7= 0NOT ENOUGH CHARACTER PLACES REMAINING=!0To make more room, shorten your function key definitions="0Press ESC keys7f.2z1" 7oz2# 3Gz3$H4oz4# 4oz5$Q4oz6#03oz75 7oz83$4oz92&5oz:2,5os0 Ze.2.0.2jk)( s0s3S IEEE s7= 0READ ERROR=!0Press ESC keys7= 0WRITE ERROR=!0Press ESC keys7= 0NOT AN EXECUTIVE SYSTEM DISKETTE=!0You can only setup diskettes with Executive system tracks.="0Press ESC keys7= 0INVALID VERSION NUMBER=!0Destination version is not up to date for this version of setup="0Press ESC keys1=*%ERROR: EXECUTIVE SETUP=+%This setup program int Device Selectionms3=-%Ts3=*%T,0s3=*%Ts3='%Ts4=/"Enter initialization string: s7= 3character places remainings7="/Press ^RETURN to save string, ^ESC to exit without changings4=."Enter function key definition: 0: s7=!0Press ^RETURN to save key definition="0Press ^ESC to exit without changing old definitions7=!0Press ^RETURN to save key definition="0Press ^ESC to exit without changing old definitions4=."Enter arrow key definition:s8= s9= s:= s7= /s4=- Y Reverse Video Normal 50 Hz (European) 60 Hz (American) Printer (LST:) Terminal (CONIN:/CONOUT:) Other (AUXIN:/AUXOUT:) No Device s7= 0Enter IEEE address (between 0 and 30)  s7s4=/0Enter device timeout in seconds (0-995)=00(Value will be rounded to a multiple of 5) s3 ) Device Timeout: (=!)seconds  s1=,0Use arrow keys to position cursor=-0Press RETURN to make a selection=.0Press ESC;DE = Position of character to be deleted INC HL ;HL = Next position in table LDIR ;Move table up and erase character ;Update counters LD A,KEYNUM CALL SET_HL DEC [HL] ;One less character in this key definition LK HL,NUM_BLANKS INC [HL] ;1 MORE AVAILABLE SPACE ;Delete character from screen POP AF ;Get deleted character CALL EXPANLEN ;Get length of character expansion PUSH DE ;DE = Length of expansion string ORA A ;Clear carry LDK HL,0 SBC HL,DE ;Get -(length) EX HL,DE CALL POSCUR ;Calculate new cursor position ;Returns A = row number + offset, Z flag set if same row as last time POP DE ;Restore JRZ :1 ;If same row, then no need to re-display key definition LDK HL,ROWMAX SUB OFFSET ;Get row number CMP [HL] ;Check if on last row JRC :1 ;If not on last row, then no need to re-display ;Re-display key to show line which used to be scrolled off screen LD HL,CUR_POINTER CALL PRLINE ;NDOFF = 2 ;Offset to window number PREPOFF = 3 ;Offset to message address DISOFF = 5 ;Offset to display current settings routine SROWOFF = 7 ;Offset to start of menu row number STEPOFF = 8 ;Offset to step size between menu selections LINEOFF = 9 ;Offset to address of table of print string addresses for menu lines EXITOFF = 11 ;Temp SUBOFF = 13 ;Offset to submenu pointers ;MENU ROW ASSIGNMENTS ETXROW: = 2 ;ETX/ACK selection row CONROW: = 1 ;Console row MODROW: = 2 ;Modem port row PRNTROW: = 3 ;Printer port row NUMIEEE: = 3 ;Maximum selection number for IEEE menu NUMCEN: = 2 ;Maximum selection number for Centronics menu ;PHYSICAL DEVICE NUMBERS CRTNUM: = 0 ;CRT device number CENNUM: = 1 ;CEN device number MODNUM: = 2 ;MODEM device number PRNTNUM: = 3 ;PRNTR device number IEEENUM: = 4 ;IEEE device number NUMSDEV: = 5 ;Number of physical devices changable in setup PAGE ;I/O equates DNAMELEN: = 6 ;Device name length ;.Date 9/29/84 ;.Author Wendy James and Chris Mayer ;.Last modified: DAB ;.Title Setup V1.3 ; ;******************************************************** ;* * ;* OSBORNE EXECUTIVE CONFIGURATION PROGRAM * ;* * ;******************************************************** ;Changes since Gamma release (3/28/83) ;3/31/83 Changed INIT_PPROT to also initialize the number of parallel port selections ; (Since IEEE is different than Centronics) ;Changes since V1.1 release ;6/21/83 Added menu selection to select device timeout value ; (to aid BIOS printer timeout bug fix) ;6/22/83 Changed GETDRV and SAVEDRV routines to test for Executive product code ; If code is not there, an error message is given to indicate diskette is not ; initialized with Executive system tracks ;6/23/83 Moved verification of memory version from main routine to GET and SAVE to ; memory routines ;6/23/83 Changed GETMEM, GETDRV routines to clear window 7 (error message area) ; and not re-display  SHADLEN: = 4 ;Length of one entry in the shadow table STBLLEN: = SHADLEN * 16 ;Length of shadow table ITBLLEN: = 256 ;Length of device initialization string table SFLAG_OFF: = 2 ;Offset from beginning of shadow table entry to flag byte DNTRYLEN: = 8 DTBL_LEN: = DNTRYLEN * 16 ;Length of device table ; = Length of each entry * max number of entries NUM_LDEV: = 5 ;Number of logical devices REDIR_LEN: = NUM_LDEV * 2 ;Length of logical device redirection table ITBL_OFF: = STBLLEN+REDIR_LEN ;Offset from start of bank 0 tables to Initialization string buffer area LDEVOFF: = 22H ;Logical device offset in SCB ;I/O PORT EQUATES BANK_PORT: = 00 ;Bank I/O port ROMBANK: = 80H ;Mask for ROM bank SYS_CNB: = 03 ;System control port B HZ_MASK: = 08H ;Hertz mask (bit set = 50Hz, clear = 60Hz) ;SETUP DISK AREA EQUATES IOTRK: = 1 ;Track which holds I/O information IOSEC: = 5 ;Sector which holds I/O information ;Always on side 1 for a dsdd disk: 840928 GET instructions (they're already there) ;7/5/83 Changed Device timeout routine to use maximum value of 995 ;Changes since V1.2 release: ; ;9/28/84 DAB Installed code in GETDRV, SAVEDRV, READSEC, WRITESEC and ; RWSEC to support Vixen format dsdd disks as well as OCC ssdd. PAGE ;CONSOLE EQUATES BDOS = 0005h ESC = 01Bh CR = 0Dh LF = 0Ah CRLF = 1FH UP = 8Ah DOWN = 8Ch RIGHT = 8Bh LEFT = 8Dh ENTER = 0Dh EXIT = ESC BKS = 'H'-040h MCDOWN = 16h KCOFF = '<' KCON = '>' REVBACK = '4' ;Reverse video mode NORMBACK = '0' ;Normal background HOME: = 1EH ;Home cursor OFFSET: = 32 ;Offset used for cursor positioning values EDDONE: = 8EH ;Done editing EDQUIT: = 8FH ;Quit editing without changing ;DRIVER MENU PARAMETER TABLE EQUATES LEFT_ON: = 1000_0000B ;Indicates Left menu is on the same screen RHT_ON: = 0100_0000B ;Indicates OK to move down from menu LEFT_OK: = 0010_0000B ;Indicates OK to move left from menu ROW = 0000_1111B ;Row mask WI DSIOTRK: = 0 ;Track which holds I/O 840928 ;information on a dsdd 840928 ;disk 840928 DSIOSEC: = 1 ;Sector which holds I/O 840928 ;information on a dsdd 840928 ;disk 840928 DTBL_OFF: = 16 * 2 + 2 ;Offset to device table entry on disk sector REDIR_OFF: = DTBL_OFF+DTBL_LEN +STBLLEN ;Offset to redirection vector table on disk sector STUPTRK: = 02 ;Track which holds setup information (except I/O) STUPSEC: = 05 ;Sector which holds setup information (except I/O) ;Always on side 1 for a dsdd disk: 840928 DSSTPTRK: = 00 ;Track which holds setup840928 ;information (except 840928 ;I/O) on dsdd disk 840928 DSSTPSEC: = 04 ;Sector which holds 840928 ;setup information 840928 ;(except I/O) on dsdd 840928 ;disk 840928 SETOFF: = 320 + 11 + 2 ;Offset to setup tables ;BDOS FUNCTION NUMBERS GS_SCB: = 49 ;BDOS function number for get/set SCB DIRBIOS: = 50 ;BDOS function number for direct BIOS calls 00 ;Boot track holds product code for diskette BOOTSEC: = 01 ;Boot sector BOOTSIDE: = 00 ;Boot side 840928 FUNENT: = 14 ;Number of entries in function key table INITENT: = 16 ;Number of entries in device initialization string table ;MISCELLANEOUS EQUATES MAXTIM: = 3 ;Maximum number of digits in device timeout entry ORG 0100h PAGE JMP START ;Jump to start of program COPYRIGHT: DB ESC,'s7' ;Copyright message -- DB ESC,'=',32+1,32+15,'Copyright ',ESC,'g','S'-40H,ESC,'G' ;Copyright (c) DB ' 1983 Osborne Computer Corporation' ;1983 Osborne Computer Corporation ;26538 Danti Court DB ESC,'=',32+2,32+15,'26538 Danti Court, Hayward, CA 94545' ;Hayward, CA 94545 DB 0 PAGE START: PROC LD HL,BDOS+1 ;Get top of user area DEC HL ;HL = Top of user area MOV SP,HL ;Put stack at top of user area LD A,PRODUCT ;Verify that machine is an Executive CMP EXECUTIVE JRNZ :PERR LD A,2 ;Get high byte of BIOS jump tabl ;BIOS FUNCTION NUMBERS CHRTBL: = 20 ;BIOS function number for getting address of character I/O table DEVINI: = 21 ;BIOS function number for initializing a physical device ;DEVICE TABLE EQUATES ;DEVICE TABLE FLAG MASKS XON_MASK: = 0001_0000B ;XON/XOFF flag mask ;SHADOW TABLE FLAG MASKS ETX_MASK: = 1000_0000B ;ETX/ACK protocol bit PAGE ;ROM'S RAM EQUATES ROM_TABLE: = 02155H ;Location of ROM's RAM setup area LEN_FKEY: = 512 ;Length of Function key buffer LEN_RTBL: = LEN_FKEY + 4 ;Length of ROM's RAM setup area KEYLEN: = 64 ;Length of each key translation table KEYROM: = 02015H + 2 * KEYLEN ;Key translation table for control keys ESCOFF: = 0 ;Offset to ESC key in table RETOFF: = 5 ;Offset to RET key in table ;HIGH MEMORY EQUATES BNKMOV_ADDR: = 0FD44H ;Location which holds hiogh memory bank move address DMABANK: = 0FD4AH ;Address to hold DMA bank for disk transfer DMADR: = 0FD4BH ;Address to hold DMA address for disk transfer SAVe STO A,BIOS_ADDR+1 ;Save start address of BIOS jump table STO A,RJ_ADDR+1 ;Save address of ROM jump LD HL,BNKMOV_ADDR ;Initialize BANKMOVE address STO HL,BMOVE+1 ;Store bank move address into BANKMOVE routine ;Set cursor type for returning to CP/M CALL FROMMEM ;Get current cursor type LD A,CURSOR_ATTRIB STO A,MEMCUR ;Save cursor type CALL SETEDKEYS ;Set up special editing keys (^ESC and ^RET) ;Initialize window definitions and header message LK HL,INIT_STRING CALL PRINT ;Initialize window definitions LDK HL,HEADER CALL PRINT ;Display header LDK HL,GETPARM ;Point HL to main menu parameter table JMP SELECT ;Go to driver program :PERR: LDK HL,NOTEXEC ;If machine is not an Executive CALL ERROR ;Display error message :ERR: LDK HL,GOODBYE CALL PRINT JMP 0000H ;Return to CP/M PAGE SETEDKEYS: ;Set up special editing keys (^ESC and ^RET) ;ENTRY ;NONE ;EXIT ;NONE PROC IN BANK_PORT STO A,DESTBANSEC: = 0FD4DH ;Address to hold disk sector SAVTRK: = 0FD4EH ;Address to hold disk track SDISK: = 0FD50H ;Address to hold selected disk (0 for A, 1 for B) SAVTYP: = 0FD51H ;Address to hold disk type ; Bit 0 = Single density ; Bit 1 = Single sided ; Bits 2-3 = Sector size where: ; 00 = 128 bytes ; 01 = 256 bytes ; 10 = 512 bytes ; 11 = 1024 bytes SRCBANK: = 0FD56H ;Source bank for block move DESTBANK: = 0FD57H ;Destination bank for block move BIOSTK: = 0FDDCH ;High memory stack ;ROM JUMP TABLE OFFSETS ROMREAD: = 05AH ;ROM read sector routine ROMWRITE: = 05DH ;ROM write sector routine ROMSENDEN: = 060H ;ROM sense density routine ;VERSION CHECKING EQUATES VERSION: = 40H ;Location of version number (2 bytes) PRODUCT: = 42H ;Location of product byte in memory EXECUTIVE: = 2 ;Executive product code VALVER: = 3174H ;First valid BIOS version for this setup program BOOTTRK: = K ;Read ROM's key translation tables to this bank LDK A,ROM_BANK STO A,SRCBANK LDK HL,KEYROM ;ROM Key tables LDK DE,DISKBUFF ;Temporary buffer LDK BC,KEYLEN ;Length to move CALL BANKMOVE ;Read in control table LDK HL,DISKBUFF ;Search for ESC Character LDK BC,KEYLEN LDK A,ESC CPIR JRZ :1 ;If match found LDK HL,DISKBUFF+ESCOFF+1 ;If no match, default to normal position for ESC :1: DEC HL ;Go back to matching location STO HL,ESCLOC ;Save location of ESC key LD A,[HL] STO A,MEMESC ;Save ^ESC character LDK A,EDQUIT STO A,[HL] ;Set new ^ESC character LDK HL,DISKBUFF ;Search for RET Character LDK BC,KEYLEN LDK A,CR CPIR JRZ :2 ;If match found LDK HL,DISKBUFF+RETOFF+1 ;If no match found, default to normal position for RET :2: DEC HL ;Go back to matching location STO HL,RETLOC ;Save location of RET key LD A,[HL] STO A,MEMRET ;Save ^RET character LDK A,EDDONE STO A,[HL] ;Set new ^RET character counter CALL PRDIS ;Print current settings for this selection CALL SETCUR ;Put cursor on new lineI RET :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_RIGHT: ;Move cursor right to next submenu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table ;Cursor moved over to next submenu PROC PUSH HL CALL SELTBL ;Check if can move left from next menu LD A,[HL] ANI LEFT_OK ;Set Z flag if can't move left from next menu POP HL JRZ :ERR ;If can't move right JMP GOSEL ;OK, go to selected menu :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_LEFT: ;Move cursor left to previous menu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table PROC LD A,[HL] ANI LEFT_OK JRZ :ERR ;If can't move left JMP EXITPREV :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE GOSEL: ;Go to selected parameter table. If it i IN BANK_PORT ;Move new table back into ROM STO A,SRCBANK LDK A,ROM_BANK STO A,DESTBANK LDK HL,DISKBUFF LDK DE,KEYROM LDK BC,KEYLEN CALL BANKMOVE RET PAGE SELECT: ;Select items from the menu and call routines to execute them ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;NONE PROC CALL DISP_SCR ;Display current screen :LOOP: PUSH HL ;Save menu parameter table pointer CALL GETCHAR ;Get a key POP HL ;Restore menu parameter LDK DE,:LOOP PUSH DE ;Set up return address CMP UP JZ MOVE_UP ;"Call" MOVE_UP CMP DOWN JZ MOVE_DOWN ;"Call" MOVE_DOWN CMP RIGHT JZ MOVE_RIGHT ;"Call" MOVE_RIGHT CMP LEFT JZ MOVE_LEFT ;"Call" MOVE_LEFT CMP ENTER JZ GOSEL ;Display next menu or perform selection ;and set HL to point to appropriate parameter table ANI 5FH ;Make upper case CMP EXIT JZ EXITPREV ;If exit to previous menu JMP BEEP ;"Call" BEEP to indicate invalide key pressed s a menu, display and set HL to ;the new parameter table. If it is a selection, call routine ;to handle selection and return with HL pointing to same old ;parameter table. ;ENTRY ;HL ==> Current parameter table ;EXIT ;HL ==> Next parameter table PROC ;CHECK IF MENU OR SELECTION PUSH HL ;Save current parameter table address CALL SELTBL ;Get HL = address of next parameter table POP DE ;DE = Current parmeter table header INC HL ;HL ==> Maximum row number LD A,[HL] DEC HL ;Restore HL to beginning of table CMP 0FFH JRZ :SEL ;If this is a selection ;IF MENU, DISPLAY IT ;START AT FIRST ROW LD A,[HL] ANI NOT ROW STO A,[HL] ;Start at first row ANI LEFT_ON ;Check if menu already on screen JRNZ :SAME ;If same screen CALL DISP_SCR ;If new screen RET :SAME: PUSH HL LDK HL,RHT_INSTR CALL PRINT POP HL CALL SETCUR ;Position cursor RET ;IF SELECTION, CALL ROUTINE :SEL: PUSH DE ;Save current parameter tabl PAGE MOVE_UP: ;Move up one line in menu ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;HL ==> Menu parameter table ;Cursor moved up a line PROC LD A,[HL] ANI ROW ;Get current row JRZ :ERR ;If at top row XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting for current line DEC [HL] ;Update row counter CALL PRDIS ;Print current settings for new selection CALL SETCUR ;Put cursor on new line RET :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_DOWN: ;Move cursor down one line in menu ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;HL ==> Menu parameter table ;Cursor moved down a line PROC LD A,[HL] ANI ROW ;Get A = row number INC HL ;HL ==> Maximum row number CMP [HL] ;Set Z flag if on last line DEC HL ;Restore HL JRNC :ERR ;If already on last line XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting on current line INC [HL] ;Update row e address CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITPREV: ;Exit to previous menu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table PROC PUSH HL ;Save current parameter address XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting on previous selection ;GET PREVIOUS MENU'S PARAMETER TABLE LDK DE,EXITOFF CALL GETVAL INC HL ;HL ==> Maximum row number LD A,[HL] DEC HL ;Restore HL to beginning of table CMP 0FFH JRZ :SEL ;If this is a selection POP DE ;Restore stack ;DISPLAY NEW SCREEN LD A,[HL] ANI RHT_ON ;Check if new display JRZ :NEW ;If new display PUSH HL LDK HL,SET_INSTR CALL PRINT POP HL CALL SETCUR ;Position cursor RET :NEW: CALL DISP_SCR ;If new display LD A,[HL] ANIrmally in memory ; not the cursor type set specifically for setup LDK B,0 ;Go to Row 1 of main menu display JMP FAKERET ;"Fake out" GOSEL and "return" with main menu display instead ;RET :ERR: LDK HL,BADVER CALL ERROR ;Display invalid version number message LDK HL,CLRERR CALL PRINT ;Clear error message RET PAGE FROMMEM: ;Get configuration from memory ;ENTRY ;NONE ;EXIT ;Z bit set if no error PROC ;Save source version number LD HL,VERSION ;Get memory BIOS version STO HL,BIOSVER ;Save source BIOS version number ;Save configuration source flag XRA A STO A,SOURCE ;GET I/O VALUES ;Get Physical Devices CALL GETDTBL ;Get HL = address of BIOS device table LDK DE,DEVTBL ;DE = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table (in bank 0) PUSH HL ;Save start address of bank 0 tables LDK DE,SHAD_TBL ;DE = Setu LEFT_ON RZ ;Done if not a right hand screen PUSH HL LDK HL,RHT_INSTR CALL PRINT POP HL CALL SETCUR RET ;IF SELECTION, CALL ROUTINE :SEL: CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITCPM: ;Exit to CP/M ;ENTRY ;NONE ;EXIT ;NONE PROC LK HL,GOOD_BYE ;Restore window to full screen and clear screen CALL PRINT LD A,MEMCUR ;Get selected cursor type STO A,CUR LDK HL,SET_CTYPE CALL PRINT IN BANK_PORT STO A,DESTBANK ;Read ROM's key translation tables to this bank LDK A,ROM_BANK STO A,SRCBANK LDK HL,KEYROM ;ROM Key tables LDK DE,DISKBUFF ;Temporary buffer LDK BC,KEYLEN ;Length to move CALL BANKMOVE LD HL,ESCLOC ;Location of ^ESC Character LD A,MEMESC STO A,[HL] ;Restore ^ESC character LDK HL,RETLOC ;Location of ^RET Charap shadow table XRA A STO A,SRCBANK ;From bank 0 IN BANK_PORT STO A,DESTBANK ;Current bank is destination bank LDK BC,STBLLEN CALL BANKMOVE ;Move shadow table into setup area POP HL ;Restore start address of bank 0 tables LDK DE,ITBL_OFF ;Offset from start of bank 0 tables to initialization strings ADD HL,DE ;HL ==> Initialization strings LDK DE,INIT_TBL LDK BC,ITBLLEN + 1 CALL BANKMOVE ;Move Initialization tables and device timeout into setup area PAGE ;Get Logical Devices XRA A STO A,SCBSET ;Indicate SCB "get" operation LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = SCB offset to first logical device redirection flag LDK HL,DEVFLGS ;HL ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = SCB offset STO A,SCBOFF ;Set offset to redirection flag LDK C,GS_SCB CALL BDOS ;Get HL = value from SCB EX HL,DE ;Dcter LD A,MEMRET STO A,[HL] ;Restore ^RET character IN BANK_PORT ;Move old table back into ROM STO A,SRCBANK LDK A,ROM_BANK STO A,DESTBANK LDK HL,DISKBUFF LDK DE,KEYROM LDK BC,KEYLEN CALL BANKMOVE LD A,DINIT_FLAG ORA A JRZ :1 ;If devices don't need to be initialized CALL INITDEV ;Initialize physical devices :1: JMP 0000h ;Jump to CP/M GOOD_BYE: DB ESC,'e' ;Enable function key translation DB ESC,'s','0','Z'-040h DB 0 PAGE GETMEM: ;Get configuration from memory ;*NOTE* -- fakes out return to GOSEL and goes to main menu display instead ; Only call this routine from GOSEL ;ENTRY ;NONE ;EXIT ;NONE PROC CALL FROMMEM ;Get configuration from memory LD HL,BIOSVER ;Get version number CALL VERIFY ;Make sure source is a valid version number JRC :ERR ;Error if invalid version number CALL INIT_PPROT ;Initialize parallel protocol LD A,MEMCUR STO A,CURSOR_ATTRIB ;Set cursor type to what is noE = value from SCB POP HL ;HL ==> Current redirection flag STO E,[HL] INC HL STO D,[HL] ;Save redirection flags INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;GET VALUES FROM ROM'S RAM IN BANK_PORT ;Get current bank setting STO A,DESTBANK ;Set destination bank mask to current setting LDK A,ROMBANK STO A,SRCBANK ;Set source bank to ROM bank LDK DE,SETUP_TABLE ;Destination address LDK HL,ROM_TABLE ;Source address LDK BC,LEN_RTBL ;Length of ROM table CALL BANKMOVE ;Move table from ROM'S RAM to setup area CALL CONSET ;Convert cursor and background type from ROM format ; to SETUP format RET PAGE GETDRV: ;Get configuration from drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Get drive LD A,GETPARM ANI ROW ;Get selected row STO A,SOURCE ;Save configuration source flag SUB 1 ;Get drive number STO A,SDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: ;A=0 if ssdd, else A nz 840928 CALL READSEC ;Read from disk into DISKBUFF JRNZ :ERR ;If error LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values in this track ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table location in memory LDK BC,LEN_RTBL ;Length of table LDIR ;Move table into setup area LD A,CURSOR_ATTRIB CMP '5' ;Check if blinking only JRNZ :1 ;If not blinking only LDK A,'1' ;If blinking only, display as blinking block STO A,CURSOR_ATTRIB :1: CALL INIT_PPROT ;Initialize parallel protocol LDK B,0 ;Return to row 1 of main menu JMP FAKERET ;Fake return (go to main menu instead of get menu) ;RET ;Error exits :VERR: LDK HL,BADVER CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,CLRERR CALL PRINT ;Clear error message RET PAGE FAKERET: ISK ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error 840928 LD A,DISKBUFF+4 CMP EXECUTIVE ;Check product code JNZ :SERR ;No Executive system 840928 ;tracks 840928 CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 ;Return to specified row of main menu ;instead of returning to GOSEL ;"Fakes out" GOSEL routine ;*NOTE* THIS ROUTINE MUST ONLY BE USED TO FAKE A RETURN TO GOSEL ;ENTRY ;B = Row to return to in previous menu ;EXIT ;NONE PROC ;Set row to specified row LD A,SETPARM ANI NOT ROW ;Clear row bits OR B ;Set to specified STO A,SETPARM ;"Fake out" GOSEL and go to main menu POP HL ;Pop off return address to GOSEL POP HL ;Pop off HL ==> current parameter table LDK HL,SETPARM CALL DISP_SCR ;Display main menu RET ;Return to SELECT routine PAGE SAVEMEM: ;Save configuration to memory ;ENTRY ;None ;EXIT ;None PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Verify that BIOS version is compatible with this version of setup LD HL,VERSION STO HL,BIOSVER CALL VERIFY ;Check if compatible with this setup version JC :VERR ;If not OK ;Save I/O values ;PHYSICAL DEVICES CALL GETDTBL ;Get HL = address JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values ;A=0 if ssdd, else A nz 840928 :IORD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;If error ;Save source version number LD HL,DISKBUFF STO HL,BIOSVER ;Save BIOS source version number ;Verify source version number is OK CALL VERIFY JRC :VERR ;If invalid version number ;Move I/O values to setup area LDK HL,DISKBUFF LDK DE,DTBLOFF ;Offset to I/O values ADD HL,DE ;HL ==> Device tables in buffer LDK DE,DEVTBL ;DE ==> Setup's device table LDK BC,DTBLLEN+STBLLEN + ITBLLEN + REDIRLEN + 1 LDIR ;Move device table into setup area ;Get function keys, cursor type, background type ;First check # sides to get correct trk/sec values 840928 LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDof BIOS device table EX HL,DE ;DE = address of BIOS device table LDK HL,DEVTBL ;HL = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table PUSH HL ;Save start address of bank 0 tables EX HL,DE ;DE = address of BIOS shadow table IN BANK_PORT STO A,SRCBANK ;Source in current bank XRA A STO A,DESTBANK ;Destination bank = 0 LDK HL,SHAD_TBL ;HL = Setup shadow table LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 CALL BANKMOVE ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 POP HL LDK DE,ITBL_OFF ;Offset to initialization strings table ADD HL,DE EX HL,DE ;DE = Initialization strings table LDK HL,INIT_TBL ;HL = Setup's copy of initialization strings LDK BC,ITBLLEN+1 ;Move initiB,NOT HZ_MASK AND B :2: OUT SYS_CNB EI ;Done with this port now LDK HL,MEMSAVE CALL PRINT ;Print "saved to memory" message ORI 0FFH STO A,SAVEFLAG ;Set flag to show configuation has been saved RET :VERR: LDK HL,BADVER CALL ERROR ;Display invalid version LDK HL,SAVEINST JMP PRINT ;RET :SAVE_ATTRIBS: DB ESC,'s0',ESC,'x' :BACK: DB 0 DB ESC :CLICK: DB 0,0 PAGE SAVEDRV: ;Save system on drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Get drive LD A,SAVEPARM ANI ROW ;Get selected row SUB 1 ;Get drive number STO A,SDISK ;Save destination drive ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error LD A,DISKBUFF+4 CMP EXECUTIVE ;Check product code JNZ :SERR ;No alization string + device timeout CALL BANKMOVE ORI 0FFH STO A,DINIT_FLAG ;Indicate devices should be initialized on exit PAGE ;LOGICAL DEVICES LDK A,0FEH STO A,SCBSET ;Indicate set word value in SCB LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = Offset to first logical device redirection flag LDK HL,DEVFLGS ;DE ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = Offset STO A,SCBOFF ;Store offset to redirection flag LD A,[HL] STO A,SCBVAL ;Store word value to set INC HL LD A,[HL] STO A,SCBVAL+1 LDK C,GS_SCB CALL BDOS ;Get HL = value from SCB POP HL ;HL ==> Current redirection flag INC HL INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;Save console attributes :S1: LD A,BACK_ATTRIBS STO A,:BACK Executive system tracks CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values from destination drive ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values :IORD: CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;Return if error ;Make sure destination version is compatible with this version of setup LD HL,DISKBUFF CALL VERIFY JC :VERR ;If destina ;Save background CMP REVBACK ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB JRNZ :1 ;If not reverse video background CMP '1' JRNZ :1 ;If not blinking block cursor LDK A,'5' ;If reverse video background and blinking block cursor ;Actually set blinking only cursor :1: STO A,MEMCUR LD A,KEYCLICK STO A,:CLICK LK HL,:SAVE_ATTRIBS CALL PRINT ;Save function keys and external monitor frequency IN BANK_PORT ;Get current bank STO A,SRCBANK ;Source bank = current bank LDK HL,FUN_TABLE ;Source address LDK A,ROMBANK ;Destination bank STO A,DESTBANK LDK DE,ROM_TABLE ;Destination address LDK BC,LEN_FKEY+1 CALL BANKMOVE ;Move function keys into ROM's RAM ;Actually set monitor frequency LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz DI ;Just in case an interrupt routine changes this IN SYS_CNB JRNZ :60 ;If 60 Hertz LDK B,HZ_MASK OR B ;Set 50 Hz JR :2 :60: LDK tion version number isn't compatible ;Insert new I/O assignments into buffer ;Insert device table LDK DE,DISKBUFF+DTBLOFF ;Offset to I/O values LDK HL,DEVTBL ;HL ==> Setup's device table LDK BC,DTBLLEN LDIR ;Move device table from setup area to buffer ;Insert shadow table (except for routine address bytes) ;(Routine addresses aren't inserted since destination BIOS ;version might be different from source) LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 LDIR ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 PAGE ;Insert initialization strings, redirection vectors, and device timeout LDK DE,DISKBUFF+REDIR_OFF ;Redirection vectors and init strings in disk buffer LDK HL,DEVFLGS ;Location in setup area LDK BC,ITBLLEN+REDIRLEN+1 LDIR ;Move to disk buffer ;Write new PRINT ;Print "saved on drive" message ORI 0FFH STO A,SAVEFLAG ;Indicate configuration has been saved RET ;Error reporting :VERR: LDK HL,BADDEST ;Destination version isn't compatible with this version of setup CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,SAVEINST ;Display instructions after displaying error message JMP PRINT ;RET PAGE SAVEEXIT: ;Exit to CP/M from save menu ;ENTRY ;SAVEFLAG set if configuration has been saved ;EXIT ;NONE PROC LD A,SAVEFLAG ORA A JNZ EXITCPM ;If configuration has been saved then exit to CP/M LDK HL,YOUSURE CALL PRINT ;Ask if user is sure he wants to exit CALL GETCHAR ANI 5FH ;Make upper case CMP 'Y' JZ EXITCPM ;Override RET ;Return to menu if they don't really want to exit PAGE ; ***************************************** ; * FUNCTION KEYS * ; ***************************************** ; EDIT_FUN: ;Edit functioI/O assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO1 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IOWR ; 840928 :IO1: LDK B,IOTRK LDK C,IOSEC :IOWR: CALL WRITESEC JRNZ :ERR ;If write error ;Save function keys, cursor type, background type ;Get sector from destination drive LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB PUSH AF ;Save current cursor attributes CMP '1' JRNZ :1 ;If not blinking block cursor LD A,BACK_ATTRIB CMP REVBACK JRNZ :1 ;In key PROC LDK HL,FUNPARM LD A,[HL] ANI ROW ;Get current row INC A CMP 10 JRNZ :1 ;If 1-9 XRA A ;If 0 (0 comes after 9 in display to match keyboard) :1: STO A,KEYNUM ;Set key being edited ADD A,'0' STO A,FNUM ;Put key number into message LDK HL,FEDIT_INSTR CALL PRINT ;Display instructions LDK HL,FEDIT_POS STO HL,CUR_POINTER ;Set cursor position for start of editing area LDK A,FUNLEN ;Maximum number of characters to display per line LDK B,FUNROW ;Last row number CALL EDIT_KEY ;Edit the key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,70 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET PAGE ; ***************************************** ; * ARROW KEYS * ; f not reverse video background LDK A,'5' ;If blinking block cursor on reverse video background STO A,CURSOR_ATTRIB ;Set to blink only cursor ;Insert new assignments into buffer :1: LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table in setup area EX HL,DE LDK BC,LEN_RTBL ;Length LDIR ;Move table from setup area to buffer POP AF STO A,CURSOR_ATTRIB ;Restore cursor type ;Write new assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST1 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STWR ; 840928 :ST1: LDK B,STUPTRK LDK C,STUPSEC :STWR: CALL WRITESEC JRNZ :ERR ;If write error ;Return from successful save LD A,SAVEPARM ANI ROW ADD A,'A'-1 STO A,SAVDRV ;Insert drive letter in message LDK HL,DRVSAVE CALL  ***************************************** ; SET_TO_CPM: ;Set arrow key definition to CP/M default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK BC,8 SBC HL,BC ;Carry flag if not enought room for default definition JRC :ERR ;If not enough room LK HL,CPM_ARROWS LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET SET_TO_WS: ;Set arrow key definition to WordStar default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK BC,8 SBC HL,BC ;Carry flag if not enought rhe following parameters must be set up: ; CUR_POINTER holds Address of positioning string for displaying key ; KEY_TABLE holds Address of table of keys ; keys are stored contiguously ; with each key consisting of a length byte followed by the string ; END_KEY_TABLE holds Address of the last available position in the key table ; KEYNUM holds Number of the key within the table (starting counting with 0) ;EXIT ;NONE PROC STO A,ROWLEN ;Save maximum number of characters per row MOV A,B STO A,ROWMAX ;Save maximum number of rows LDK HL,0 STO HL,CURCOUNT ;Initialize cursor count (length of display string) LD HL,KEY_TABLE LDK DE,DISKBUFF LDK BC,100H LDIR ;Save current key setting in case user wants to quit ;without changing CAL CLRKE ;Clea ou ol ke definition LD HL,CUR_POINTER ;Initialize row and column settings LDK DE,CURROW ADD HL,DE ;HL ==> Row number in positioning string LDK A,OFFSET ;Cursor positioning offset + oom for default definition JRC :ERR ;If not enough room LK HL,WS_ARROWS LK BC,8 LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET CPM_ARROWS: DB 1,'K'-040h,1,'L'-040h,1,'J'-040h,1,'H'-040h WS_ARROWS: DB 1,'E'-040h,1,'D'-040h,1,'X'-040h,1,'S'-040h PAGE EDIT_ARR: ;Edit arrow key individually PROC LDK HL,AEDIT_INSTR CALL PRINT ;Display instructions LDK HL,ARRPARM LD A,[HL] ANI ROW ;Get current row ADD A,8 ;Get row number counting function keys STO A,KEYNUM ;Set key being edited SUB 10 ;Get key number in ATYPE_TBL LDK HL,ATYPE_TBL CALL LOOKUP CALL PRLINE ;Display which arrow key is being edited LDK HL,AEDIT_POS STO HL,CUR_POINTER ;;.Date 9/29/84 ;.Author Wendy James and Chris Mayer ;.Last modified: DAB ;.Title Setup V1.3 ; ;******************************************************** ;* * ;* OSBORNE EXECUTIVE CONFIGURATION PROGRAM * ;* * ;******************************************************** ;Changes since Gamma release (3/28/83) ;3/31/83 Changed INIT_PPROT to also initialize the number of parallel port selections ; (Since IEEE is different than Centronics) ;Changes since V1.1 release ;6/21/83 Added menu selection to select device timeout value ; (to aid BIOS printer timeout bug fix) ;6/22/83 Changed GETDRV and SAVEDRV routines to test for Executive product code ; If code is not there, an error message is given to indicate diskette is not ; initialized with Executive system tracks ;6/23/83 Moved verification of memory version from main routine to GET and SAVE to ; memory routines ;6/23/83 Changed GETMEM, GETDRV routines to clear window 7 (error message area) ; and not re-display Set up editing position LDK A,ARRLEN ;Maximum number of characters to display per line LDK B,ARRROW ;Last row number CALL EDIT_KEY ;Edit key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,66 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET ATYPE_TBL: ;Table of addresses of strings to display arrow type ;(ie UP, DOWN, RIGHT, or LEFT) DW ARR2 DW ARR3 DW ARR4 DW ARR5 PAGE EDIT_KEY: ;Edit function key, arrow key, or initialization string ;ENTRY ;A = Maximum number of characters to display per row ;B = Maximum number of rows ;T GET instructions (they're already there) ;7/5/83 Changed Device timeout routine to use maximum value of 995 ;Changes since V1.2 release: ; ;9/28/84 DAB Installed code in GETDRV, SAVEDRV, READSEC, WRITESEC and ; RWSEC to support Vixen format dsdd disks as well as OCC ssdd. PAGE ;CONSOLE EQUATES BDOS = 0005h ESC = 01Bh CR = 0Dh LF = 0Ah CRLF = 1FH UP = 8Ah DOWN = 8Ch RIGHT = 8Bh LEFT = 8Dh ENTER = 0Dh EXIT = ESC BKS = 'H'-040h MCDOWN = 16h KCOFF = '<' KCON = '>' REVBACK = '4' ;Reverse video mode NORMBACK = '0' ;Normal background HOME: = 1EH ;Home cursor OFFSET: = 32 ;Offset used for cursor positioning values EDDONE: = 8EH ;Done editing EDQUIT: = 8FH ;Quit editing without changing ;DRIVER MENU PARAMETER TABLE EQUATES LEFT_ON: = 1000_0000B ;Indicates Left menu is on the same screen RHT_ON: = 0100_0000B ;Indicates OK to move down from menu LEFT_OK: = 0010_0000B ;Indicates OK to move left from menu ROW = 0000_1111B ;Row mask WI DSIOTRK: = 0 ;Track which holds I/O 840928 ;information on a dsdd 840928 ;disk 840928 DSIOSEC: = 1 ;Sector which holds I/O 840928 ;information on a dsdd 840928 ;disk 840928 DTBL_OFF: = 16 * 2 + 2 ;Offset to device table entry on disk sector REDIR_OFF: = DTBL_OFF+DTBL_LEN +STBLLEN ;Offset to redirection vector table on disk sector STUPTRK: = 02 ;Track which holds setup information (except I/O) STUPSEC: = 05 ;Sector which holds setup information (except I/O) ;Always on side 1 for a dsdd disk: 840928 DSSTPTRK: = 00 ;Track which holds setup840928 ;information (except 840928 ;I/O) on dsdd disk 840928 DSSTPSEC: = 04 ;Sector which holds 840928 ;setup information 840928 ;(except I/O) on dsdd 840928 ;disk 840928 SETOFF: = 320 + 11 + 2 ;Offset to setup tables ;BDOS FUNCTION NUMBERS GS_SCB: = 49 ;BDOS function number for get/set SCB DIRBIOS: = 50 ;BDOS function number for direct BIOS calls NDOFF = 2 ;Offset to window number PREPOFF = 3 ;Offset to message address DISOFF = 5 ;Offset to display current settings routine SROWOFF = 7 ;Offset to start of menu row number STEPOFF = 8 ;Offset to step size between menu selections LINEOFF = 9 ;Offset to address of table of print string addresses for menu lines EXITOFF = 11 ;Temp SUBOFF = 13 ;Offset to submenu pointers ;MENU ROW ASSIGNMENTS ETXROW: = 2 ;ETX/ACK selection row CONROW: = 1 ;Console row MODROW: = 2 ;Modem port row PRNTROW: = 3 ;Printer port row NUMIEEE: = 3 ;Maximum selection number for IEEE menu NUMCEN: = 2 ;Maximum selection number for Centronics menu ;PHYSICAL DEVICE NUMBERS CRTNUM: = 0 ;CRT device number CENNUM: = 1 ;CEN device number MODNUM: = 2 ;MODEM device number PRNTNUM: = 3 ;PRNTR device number IEEENUM: = 4 ;IEEE device number NUMSDEV: = 5 ;Number of physical devices changable in setup PAGE ;I/O equates DNAMELEN: = 6 ;Device name length  ;BIOS FUNCTION NUMBERS CHRTBL: = 20 ;BIOS function number for getting address of character I/O table DEVINI: = 21 ;BIOS function number for initializing a physical device ;DEVICE TABLE EQUATES ;DEVICE TABLE FLAG MASKS XON_MASK: = 0001_0000B ;XON/XOFF flag mask ;SHADOW TABLE FLAG MASKS ETX_MASK: = 1000_0000B ;ETX/ACK protocol bit PAGE ;ROM'S RAM EQUATES ROM_TABLE: = 02155H ;Location of ROM's RAM setup area LEN_FKEY: = 512 ;Length of Function key buffer LEN_RTBL: = LEN_FKEY + 4 ;Length of ROM's RAM setup area KEYLEN: = 64 ;Length of each key translation table KEYROM: = 02015H + 2 * KEYLEN ;Key translation table for control keys ESCOFF: = 0 ;Offset to ESC key in table RETOFF: = 5 ;Offset to RET key in table ;HIGH MEMORY EQUATES BNKMOV_ADDR: = 0FD44H ;Location which holds hiogh memory bank move address DMABANK: = 0FD4AH ;Address to hold DMA bank for disk transfer DMADR: = 0FD4BH ;Address to hold DMA address for disk transfer SAV SHADLEN: = 4 ;Length of one entry in the shadow table STBLLEN: = SHADLEN * 16 ;Length of shadow table ITBLLEN: = 256 ;Length of device initialization string table SFLAG_OFF: = 2 ;Offset from beginning of shadow table entry to flag byte DNTRYLEN: = 8 DTBL_LEN: = DNTRYLEN * 16 ;Length of device table ; = Length of each entry * max number of entries NUM_LDEV: = 5 ;Number of logical devices REDIR_LEN: = NUM_LDEV * 2 ;Length of logical device redirection table ITBL_OFF: = STBLLEN+REDIR_LEN ;Offset from start of bank 0 tables to Initialization string buffer area LDEVOFF: = 22H ;Logical device offset in SCB ;I/O PORT EQUATES BANK_PORT: = 00 ;Bank I/O port ROMBANK: = 80H ;Mask for ROM bank SYS_CNB: = 03 ;System control port B HZ_MASK: = 08H ;Hertz mask (bit set = 50Hz, clear = 60Hz) ;SETUP DISK AREA EQUATES IOTRK: = 1 ;Track which holds I/O information IOSEC: = 5 ;Sector which holds I/O information ;Always on side 1 for a dsdd disk: 840928  SEC: = 0FD4DH ;Address to hold disk sector SAVTRK: = 0FD4EH ;Address to hold disk track SDISK: = 0FD50H ;Address to hold selected disk (0 for A, 1 for B) SAVTYP: = 0FD51H ;Address to hold disk type ; Bit 0 = Single density ; Bit 1 = Single sided ; Bits 2-3 = Sector size where: ; 00 = 128 bytes ; 01 = 256 bytes ; 10 = 512 bytes ; 11 = 1024 bytes SRCBANK: = 0FD56H ;Source bank for block move DESTBANK: = 0FD57H ;Destination bank for block move BIOSTK: = 0FDDCH ;High memory stack ;ROM JUMP TABLE OFFSETS ROMREAD: = 05AH ;ROM read sector routine ROMWRITE: = 05DH ;ROM write sector routine ROMSENDEN: = 060H ;ROM sense density routine ;VERSION CHECKING EQUATES VERSION: = 40H ;Location of version number (2 bytes) PRODUCT: = 42H ;Location of product byte in memory EXECUTIVE: = 2 ;Executive product code VALVER: = 3174H ;First valid BIOS version for this setup program BOOTTRK: =  ;NONE PROC IN BANK_PORT STO A,DESTBANK ;Read ROM's key translation tables to this bank LDK A,ROM_BANK STO A,SRCBANK LDK HL,KEYROM ;ROM Key tables LDK DE,DISKBUFF ;Temporary buffer LDK BC,KEYLEN ;Length to move CALL BANKMOVE ;Read in control table LDK HL,DISKBUFF ;Search for ESC Character LDK BC,KEYLEN LDK A,ESC CPIR JRZ :1 ;If match found LDK HL,DISKBUFF+ESCOFF+1 ;If no match, default to normal position for ESC :1: DEC HL ;Go back to matching location STO HL,ESCLOC ;Save location of ESC key LD A,[HL] STO A,MEMESC ;Save ^ESC character LDK A,EDQUIT STO A,[HL] ;Set new ^ESC character LDK HL,DISKBUFF ;Search for RET Character LDK BC,KEYLEN LDK A,CR CPIR JRZ :2 ;If match found LDK HL,DISKBUFF+RETOFF+1 ;If no match found, default to normal position for RET :2: DEC HL ;Go back to matching location STO HL,RETLOC ;Save location of RET key LD A,[HL] STO A,MEMRET ;Save ^RET character LDK A,ED00 ;Boot track holds product code for diskette BOOTSEC: = 01 ;Boot sector BOOTSIDE: = 00 ;Boot side 840928 FUNENT: = 14 ;Number of entries in function key table INITENT: = 16 ;Number of entries in device initialization string table ;MISCELLANEOUS EQUATES MAXTIM: = 3 ;Maximum number of digits in device timeout entry ORG 0100h PAGE JMP START ;Jump to start of program COPYRIGHT: DB ESC,'s7' ;Copyright message -- DB 'Z' - 40h DB ' ' DB ESC,'g','S'-40H,ESC,'G' ;(c) in a circle DB ' 1983 Osborne Computer Corporation, ' DB '26538 Danti Court, Hayward CA 94545',cr,lf DB ' ' DB ESC,'g','S'-40H,ESC,'G' ;(c) in a circle DB ' 1984 Future Systems, 828 Nob Hill Avenue, ' DB 'Pinole, CA 94564' DB 0 PAGE START: PROC LD HL,BDOS+1 ;Get top of user area DEC HL ;HL = Top of user area MOV SP,HL ;Put stack at top of user area LD A,PRODUCT ;Verify that machine is an Executive CMP EXECUTIVE JRNZ :PERR DONE STO A,[HL] ;Set new ^RET character IN BANK_PORT ;Move new table back into ROM STO A,SRCBANK LDK A,ROM_BANK STO A,DESTBANK LDK HL,DISKBUFF LDK DE,KEYROM LDK BC,KEYLEN CALL BANKMOVE RET PAGE SELECT: ;Select items from the menu and call routines to execute them ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;NONE PROC CALL DISP_SCR ;Display current screen :LOOP: PUSH HL ;Save menu parameter table pointer CALL GETCHAR ;Get a key POP HL ;Restore menu parameter LDK DE,:LOOP PUSH DE ;Set up return address CMP UP JZ MOVE_UP ;"Call" MOVE_UP CMP DOWN JZ MOVE_DOWN ;"Call" MOVE_DOWN CMP RIGHT JZ MOVE_RIGHT ;"Call" MOVE_RIGHT CMP LEFT JZ MOVE_LEFT ;"Call" MOVE_LEFT CMP ENTER JZ GOSEL ;Display next menu or perform selection ;and set HL to point to appropriate parameter table ANI 5FH ;Make upper case CMP EXIT JZ EXITPREV ;If exit to previous menu JMP BEEP  LD A,2 ;Get high byte of BIOS jump table STO A,BIOS_ADDR+1 ;Save start address of BIOS jump table STO A,RJ_ADDR+1 ;Save address of ROM jump LD HL,BNKMOV_ADDR ;Initialize BANKMOVE address STO HL,BMOVE+1 ;Store bank move address into BANKMOVE routine ;Set cursor type for returning to CP/M CALL FROMMEM ;Get current cursor type LD A,CURSOR_ATTRIB STO A,MEMCUR ;Save cursor type CALL SETEDKEYS ;Set up special editing keys (^ESC and ^RET) ;Initialize window definitions and header message LK HL,INIT_STRING CALL PRINT ;Initialize window definitions LDK HL,HEADER CALL PRINT ;Display header LDK HL,GETPARM ;Point HL to main menu parameter table JMP SELECT ;Go to driver program :PERR: LDK HL,NOTEXEC ;If machine is not an Executive CALL ERROR ;Display error message :ERR: LDK HL,GOODBYE CALL PRINT JMP 0000H ;Return to CP/M PAGE SETEDKEYS: ;Set up special editing keys (^ESC and ^RET) ;ENTRY ;NONE ;EXIT ;"Call" BEEP to indicate invalide key pressed PAGE MOVE_UP: ;Move up one line in menu ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;HL ==> Menu parameter table ;Cursor moved up a line PROC LD A,[HL] ANI ROW ;Get current row JRZ :ERR ;If at top row XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting for current line DEC [HL] ;Update row counter CALL PRDIS ;Print current settings for new selection CALL SETCUR ;Put cursor on new line RET :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_DOWN: ;Move cursor down one line in menu ;ENTRY ;HL ==> Menu parameter table for current menu ;EXIT ;HL ==> Menu parameter table ;Cursor moved down a line PROC LD A,[HL] ANI ROW ;Get A = row number INC HL ;HL ==> Maximum row number CMP [HL] ;Set Z flag if on last line DEC HL ;Restore HL JRNC :ERR ;If already on last line XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlightE :SEL: PUSH DE ;Save current parameter table address CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITPREV: ;Exit to previous menu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table PROC PUSH HL ;Save current parameter address XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting on previous selection ;GET PREVIOUS MENU'S PARAMETER TABLE LDK DE,EXITOFF CALL GETVAL INC HL ;HL ==> Maximum row number LD A,[HL] DEC HL ;Restore HL to beginning of table CMP 0FFH JRZ :SEL ;If this is a selection POP DE ;Restore stack ;DISPLAY NEW SCREEN LD A,[HL] ANI RHT_ON ;Check if new display JRZ :NEW ;If new display PUSH HL LDK HL,SET_INSTR CALL PRINT POP HL CALL SETCUR ;Position cursor RET :NEW: CAing on current line INC [HL] ;Update row counter CALL PRDIS ;Print current settings for this selection CALL SETCUR ;Put cursor on new lineI RET :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_RIGHT: ;Move cursor right to next submenu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table ;Cursor moved over to next submenu PROC PUSH HL CALL SELTBL ;Check if can move left from next menu LD A,[HL] ANI LEFT_OK ;Set Z flag if can't move left from next menu POP HL JRZ :ERR ;If can't move right JMP GOSEL ;OK, go to selected menu :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE MOVE_LEFT: ;Move cursor left to previous menu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table PROC LD A,[HL] ANI LEFT_OK JRZ :ERR ;If can't move left JMP EXITPREV :ERR: CALL BEEP ;Indicate invalid key pressed RET PAGE GLL DISP_SCR ;If new display LD A,[HL] ANI LEFT_ON RZ ;Done if not a right hand screen PUSH HL LDK HL,RHT_INSTR CALL PRINT POP HL CALL SETCUR RET ;IF SELECTION, CALL ROUTINE :SEL: CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITCPM: ;Exit to CP/M ;ENTRY ;NONE ;EXIT ;NONE PROC LK HL,GOOD_BYE ;Restore window to full screen and clear screen CALL PRINT LD A,MEMCUR ;Get selected cursor type STO A,CUR LDK HL,SET_CTYPE CALL PRINT IN BANK_PORT STO A,DESTBANK ;Read ROM's key translation tables to this bank LDK A,ROM_BANK STO A,SRCBANK LDK HL,KEYROM ;ROM Key tables LDK DE,DISKBUFF ;Temporary buffer LDK BC,KEYLEN ;Length to move CALL BANKMOVE LD HL,ESCLOC ;Location of ^ESC Character LD A,MEMESC STO A,[HL] ;Restore ^ESC chaOSEL: ;Go to selected parameter table. If it is a menu, display and set HL to ;the new parameter table. If it is a selection, call routine ;to handle selection and return with HL pointing to same old ;parameter table. ;ENTRY ;HL ==> Current parameter table ;EXIT ;HL ==> Next parameter table PROC ;CHECK IF MENU OR SELECTION PUSH HL ;Save current parameter table address CALL SELTBL ;Get HL = address of next parameter table POP DE ;DE = Current parmeter table header INC HL ;HL ==> Maximum row number LD A,[HL] DEC HL ;Restore HL to beginning of table CMP 0FFH JRZ :SEL ;If this is a selection ;IF MENU, DISPLAY IT ;START AT FIRST ROW LD A,[HL] ANI NOT ROW STO A,[HL] ;Start at first row ANI LEFT_ON ;Check if menu already on screen JRNZ :SAME ;If same screen CALL DISP_SCR ;If new screen RET :SAME: PUSH HL LDK HL,RHT_INSTR CALL PRINT POP HL CALL SETCUR ;Position cursor RET ;IF SELECTION, CALL ROUTIN racter LDK HL,RETLOC ;Location of ^RET Character LD A,MEMRET STO A,[HL] ;Restore ^RET character IN BANK_PORT ;Move old table back into ROM STO A,SRCBANK LDK A,ROM_BANK STO A,DESTBANK LDK HL,DISKBUFF LDK DE,KEYROM LDK BC,KEYLEN CALL BANKMOVE LD A,DINIT_FLAG ORA A JRZ :1 ;If devices don't need to be initialized CALL INITDEV ;Initialize physical devices :1: JMP 0000h ;Jump to CP/M GOOD_BYE: DB ESC,'e' ;Enable function key translation DB ESC,'s','0','Z'-040h DB 0 PAGE GETMEM: ;Get configuration from memory ;*NOTE* -- fakes out return to GOSEL and goes to main menu display instead ; Only call this routine from GOSEL ;ENTRY ;NONE ;EXIT ;NONE PROC CALL FROMMEM ;Get configuration from memory LD HL,BIOSVER ;Get version number CALL VERIFY ;Make sure source is a valid version number JRC :ERR ;Error if invalid version number CALL INIT_PPROT ;Initialize parallel protocol LD A,MEMCUR STOBDOS ;Get HL = value from SCB EX HL,DE ;DE = value from SCB POP HL ;HL ==> Current redirection flag STO E,[HL] INC HL STO D,[HL] ;Save redirection flags INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;GET VALUES FROM ROM'S RAM IN BANK_PORT ;Get current bank setting STO A,DESTBANK ;Set destination bank mask to current setting LDK A,ROMBANK STO A,SRCBANK ;Set source bank to ROM bank LDK DE,SETUP_TABLE ;Destination address LDK HL,ROM_TABLE ;Source address LDK BC,LEN_RTBL ;Length of ROM table CALL BANKMOVE ;Move table from ROM'S RAM to setup area CALL CONSET ;Convert cursor and background type from ROM format ; to SETUP format RET PAGE GETDRV: ;Get configuration from drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Get drive LD A,GETPARM ANI ROW ;Get selected row STO A,SOURCE ;Save configuration sour A,CURSOR_ATTRIB ;Set cursor type to what is normally in memory ; not the cursor type set specifically for setup LDK B,0 ;Go to Row 1 of main menu display JMP FAKERET ;"Fake out" GOSEL and "return" with main menu display instead ;RET :ERR: LDK HL,BADVER CALL ERROR ;Display invalid version number message LDK HL,CLRERR CALL PRINT ;Clear error message RET PAGE FROMMEM: ;Get configuration from memory ;ENTRY ;NONE ;EXIT ;Z bit set if no error PROC ;Save source version number LD HL,VERSION ;Get memory BIOS version STO HL,BIOSVER ;Save source BIOS version number ;Save configuration source flag XRA A STO A,SOURCE ;GET I/O VALUES ;Get Physical Devices CALL GETDTBL ;Get HL = address of BIOS device table LDK DE,DEVTBL ;DE = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table (in bank 0) PUSH HL ;Save start addressce flag SUB 1 ;Get drive number STO A,SDISK ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error 840928 LD A,DISKBUFF+4 CMP EXECUTIVE ;Check product code JNZ :SERR ;No Executive system 840928 ;tracks 840928 CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Doubl of bank 0 tables LDK DE,SHAD_TBL ;DE = Setup shadow table XRA A STO A,SRCBANK ;From bank 0 IN BANK_PORT STO A,DESTBANK ;Current bank is destination bank LDK BC,STBLLEN CALL BANKMOVE ;Move shadow table into setup area POP HL ;Restore start address of bank 0 tables LDK DE,ITBL_OFF ;Offset from start of bank 0 tables to initialization strings ADD HL,DE ;HL ==> Initialization strings LDK DE,INIT_TBL LDK BC,ITBLLEN + 1 CALL BANKMOVE ;Move Initialization tables and device timeout into setup area PAGE ;Get Logical Devices XRA A STO A,SCBSET ;Indicate SCB "get" operation LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = SCB offset to first logical device redirection flag LDK HL,DEVFLGS ;HL ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = SCB offset STO A,SCBOFF ;Set offset to redirection flag LDK C,GS_SCB CALL  e sided 840928 LDK C,DSIOSEC ; 840928 JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values ;A=0 if ssdd, else A nz 840928 :IORD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;If error ;Save source version number LD HL,DISKBUFF STO HL,BIOSVER ;Save BIOS source version number ;Verify source version number is OK CALL VERIFY JRC :VERR ;If invalid version number ;Move I/O values to setup area LDK HL,DISKBUFF LDK DE,DTBLOFF ;Offset to I/O values ADD HL,DE ;HL ==> Device tables in buffer LDK DE,DEVTBL ;DE ==> Setup's device table LDK BC,DTBLLEN+STBLLEN + ITBLLEN + REDIRLEN + 1 LDIR ;Move device table into setup area ;Get function keys, cursor type, background type ;First check # sides to get correct trk/sec values 840928 LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 CAL DEVICES CALL GETDTBL ;Get HL = address of BIOS device table EX HL,DE ;DE = address of BIOS device table LDK HL,DEVTBL ;HL = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table PUSH HL ;Save start address of bank 0 tables EX HL,DE ;DE = address of BIOS shadow table IN BANK_PORT STO A,SRCBANK ;Source in current bank XRA A STO A,DESTBANK ;Destination bank = 0 LDK HL,SHAD_TBL ;HL = Setup shadow table LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 CALL BANKMOVE ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 POP HL LDK DE,ITBL_OFF ;Offset to initialization strings table ADD HL,DE EX HL,DE ;DE = Initialization strings table LDK HL,INIT_TBL ;HL = Setup's copy of initial; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: ;A=0 if ssdd, else A nz 840928 CALL READSEC ;Read from disk into DISKBUFF JRNZ :ERR ;If error LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values in this track ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table location in memory LDK BC,LEN_RTBL ;Length of table LDIR ;Move table into setup area LD A,CURSOR_ATTRIB CMP '5' ;Check if blinking only JRNZ :1 ;If not blinking only LDK A,'1' ;If blinking only, display as blinking block STO A,CURSOR_ATTRIB :1: CALL INIT_PPROT ;Initialize parallel protocol LDK B,0 ;Return to row 1 of main menu JMP FAKERET ;Fake return (go to main menu instead of get menu) ;RET ;Error exits :VERR: LDK HL,BADVER CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,CLRERR CALL PRINT ;Clization strings LDK BC,ITBLLEN+1 ;Move initialization string + device timeout CALL BANKMOVE ORI 0FFH STO A,DINIT_FLAG ;Indicate devices should be initialized on exit PAGE ;LOGICAL DEVICES LDK A,0FEH STO A,SCBSET ;Indicate set word value in SCB LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = Offset to first logical device redirection flag LDK HL,DEVFLGS ;DE ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = Offset STO A,SCBOFF ;Store offset to redirection flag LD A,[HL] STO A,SCBVAL ;Store word value to set INC HL LD A,[HL] STO A,SCBVAL+1 LDK C,GS_SCB CALL BDOS ;Get HL = value from SCB POP HL ;HL ==> Current redirection flag INC HL INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;Save console attriear error message RET PAGE FAKERET: ;Return to specified row of main menu ;instead of returning to GOSEL ;"Fakes out" GOSEL routine ;*NOTE* THIS ROUTINE MUST ONLY BE USED TO FAKE A RETURN TO GOSEL ;ENTRY ;B = Row to return to in previous menu ;EXIT ;NONE PROC ;Set row to specified row LD A,SETPARM ANI NOT ROW ;Clear row bits OR B ;Set to specified STO A,SETPARM ;"Fake out" GOSEL and go to main menu POP HL ;Pop off return address to GOSEL POP HL ;Pop off HL ==> current parameter table LDK HL,SETPARM CALL DISP_SCR ;Display main menu RET ;Return to SELECT routine PAGE SAVEMEM: ;Save configuration to memory ;ENTRY ;None ;EXIT ;None PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Verify that BIOS version is compatible with this version of setup LD HL,VERSION STO HL,BIOSVER CALL VERIFY ;Check if compatible with this setup version JC :VERR ;If not OK ;Save I/O values ;PHYSI butes :S1: LD A,BACK_ATTRIBS STO A,:BACK ;Save background CMP REVBACK ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB JRNZ :1 ;If not reverse video background CMP '1' JRNZ :1 ;If not blinking block cursor LDK A,'5' ;If reverse video background and blinking block cursor ;Actually set blinking only cursor :1: STO A,MEMCUR LD A,KEYCLICK STO A,:CLICK LK HL,:SAVE_ATTRIBS CALL PRINT ;Save function keys and external monitor frequency IN BANK_PORT ;Get current bank STO A,SRCBANK ;Source bank = current bank LDK HL,FUN_TABLE ;Source address LDK A,ROMBANK ;Destination bank STO A,DESTBANK LDK DE,ROM_TABLE ;Destination address LDK BC,LEN_FKEY+1 CALL BANKMOVE ;Move function keys into ROM's RAM ;Actually set monitor frequency LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz DI ;Just in case an interrupt routine changes this IN SYS_CNB JRNZ :60 ;If 60 Hertz LDK B,HZ_MAISKBUFF CALL VERIFY JC :VERR ;If destination version number isn't compatible ;Insert new I/O assignments into buffer ;Insert device table LDK DE,DISKBUFF+DTBLOFF ;Offset to I/O values LDK HL,DEVTBL ;HL ==> Setup's device table LDK BC,DTBLLEN LDIR ;Move device table from setup area to buffer ;Insert shadow table (except for routine address bytes) ;(Routine addresses aren't inserted since destination BIOS ;version might be different from source) LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 LDIR ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 PAGE ;Insert initialization strings, redirection vectors, and device timeout LDK DE,DISKBUFF+REDIR_OFF ;Redirection vectors and init strings in disk buffer LDK HL,DEVFLGS ;Location in setup area LDK BC,ITBLLEN+REDIRLEN+SK OR B ;Set 50 Hz JR :2 :60: LDK B,NOT HZ_MASK AND B :2: OUT SYS_CNB EI ;Done with this port now LDK HL,MEMSAVE CALL PRINT ;Print "saved to memory" message ORI 0FFH STO A,SAVEFLAG ;Set flag to show configuation has been saved RET :VERR: LDK HL,BADVER CALL ERROR ;Display invalid version LDK HL,SAVEINST JMP PRINT ;RET :SAVE_ATTRIBS: DB ESC,'s0',ESC,'x' :BACK: DB 0 DB ESC :CLICK: DB 0,0 PAGE SAVEDRV: ;Save system on drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Get drive LD A,SAVEPARM ANI ROW ;Get selected row SUB 1 ;Get drive number STO A,SDISK ;Save destination drive ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error LD A,DISKBUFF+4 CMP EX1 LDIR ;Move to disk buffer ;Write new I/O assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO1 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IOWR ; 840928 :IO1: LDK B,IOTRK LDK C,IOSEC :IOWR: CALL WRITESEC JRNZ :ERR ;If write error ;Save function keys, cursor type, background type ;Get sector from destination drive LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB PUSH AF ;Save current cursor attributes CMP '1' JRNZ :1 ;If not blinking block cursor ECUTIVE ;Check product code JNZ :SERR ;No Executive system tracks CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values from destination drive ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values :IORD: CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;Return if error ;Make sure destination version is compatible with this version of setup LD HL,D LD A,BACK_ATTRIB CMP REVBACK JRNZ :1 ;If not reverse video background LDK A,'5' ;If blinking block cursor on reverse video background STO A,CURSOR_ATTRIB ;Set to blink only cursor ;Insert new assignments into buffer :1: LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table in setup area EX HL,DE LDK BC,LEN_RTBL ;Length LDIR ;Move table from setup area to buffer POP AF STO A,CURSOR_ATTRIB ;Restore cursor type ;Write new assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST1 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STWR ; 840928 :ST1: LDK B,STUPTRK LDK C,STUPSEC :STWR: CALL WRITESEC JRNZ :ERR ;If write error ;Return from successful save LD A,SAVEPARM ANI ROW ADD A,'A'-1 STO A,SAVDRV ;Insert dr************* ; * ARROW KEYS * ; ***************************************** ; SET_TO_CPM: ;Set arrow key definition to CP/M default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK BC,8 SBC HL,BC ;Carry flag if not enought room for default definition JRC :ERR ;If not enough room LK HL,CPM_ARROWS LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET SET_TO_WS: ;Set arrow key definition to WordStar default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK ive letter in message LDK HL,DRVSAVE CALL PRINT ;Print "saved on drive" message ORI 0FFH STO A,SAVEFLAG ;Indicate configuration has been saved RET ;Error reporting :VERR: LDK HL,BADDEST ;Destination version isn't compatible with this version of setup CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,SAVEINST ;Display instructions after displaying error message JMP PRINT ;RET PAGE SAVEEXIT: ;Exit to CP/M from save menu ;ENTRY ;SAVEFLAG set if configuration has been saved ;EXIT ;NONE PROC LD A,SAVEFLAG ORA A JNZ EXITCPM ;If configuration has been saved then exit to CP/M LDK HL,YOUSURE CALL PRINT ;Ask if user is sure he wants to exit CALL GETCHAR ANI 5FH ;Make upper case CMP 'Y' JZ EXITCPM ;Override RET ;Return to menu if they don't really want to exit PAGE ; ***************************************** ; * FUNCTION KEYS * ; ************************BC,8 SBC HL,BC ;Carry flag if not enought room for default definition JRC :ERR ;If not enough room LK HL,WS_ARROWS LK BC,8 LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET CPM_ARROWS: DB 1,'K'-040h,1,'L'-040h,1,'J'-040h,1,'H'-040h WS_ARROWS: DB 1,'E'-040h,1,'D'-040h,1,'X'-040h,1,'S'-040h PAGE EDIT_ARR: ;Edit arrow key individually PROC LDK HL,AEDIT_INSTR CALL PRINT ;Display instructions LDK HL,ARRPARM LD A,[HL] ANI ROW ;Get current row ADD A,8 ;Get row number counting function keys STO A,KEYNUM ;Set key being edited SUB 10 ;Get key number in ATYPE_TBL LDK HL,ATYPE_TBL CALL LOOKUP CALL PRLINE ;Display which arrow key is being edite***************** ; EDIT_FUN: ;Edit function key PROC LDK HL,FUNPARM LD A,[HL] ANI ROW ;Get current row INC A CMP 10 JRNZ :1 ;If 1-9 XRA A ;If 0 (0 comes after 9 in display to match keyboard) :1: STO A,KEYNUM ;Set key being edited ADD A,'0' STO A,FNUM ;Put key number into message LDK HL,FEDIT_INSTR CALL PRINT ;Display instructions LDK HL,FEDIT_POS STO HL,CUR_POINTER ;Set cursor position for start of editing area LDK A,FUNLEN ;Maximum number of characters to display per line LDK B,FUNROW ;Last row number CALL EDIT_KEY ;Edit the key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,70 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET PAGE ; **************************** d LDK HL,AEDIT_POS STO HL,CUR_POINTER ;Set up editing position LDK A,ARRLEN ;Maximum number of characters to display per line LDK B,ARRROW ;Last row number CALL EDIT_KEY ;Edit key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,66 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET ATYPE_TBL: ;Table of addresses of strings to display arrow type ;(ie UP, DOWN, RIGHT, or LEFT) DW ARR2 DW ARR3 DW ARR4 DW ARR5 PAGE EDIT_KEY: ;Edit function key, arrow key, or initialization string ;ENTRY ;A = Maximum number of characters to dIndicate error JRZ :LOOP :QUIT: LDK HL,DISKBUFF LD DE,KEY_TABLE LDK BC,100H LDIR ;Restore old key definitions :EXIT: CALL SPACE_LEFT ;Display amount of space left LDK HL,CLREDIT CALL PRINT ;Clear editing lines LDK HL,CURON CALL PRINT ;Make sure cursor is on RET PAGE ADDCHAR: ;Add a character to the end of the currently selected string ;ENTRY ; A = Character to add ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC PUSH AF ;Save character ;Move table down to make room for new character LD A,KEYNUM INC A CALL SET_HL ;Get start address of next key PUSH HL ;Save location to store byte CALL DIST2END ;Get distance to end of table ;BC = Distance to end of table LD HL,END_KEY_TABLE PUSH HL POP DE ;DE = Last byte in buffer area DEC HL ;HL = 2nd to last position LDDR ;Shift table to insert character ;Insert byte POisplay per row ;B = Maximum number of rows ;The following parameters must be set up: ; CUR_POINTER holds Address of positioning string for displaying key ; KEY_TABLE holds Address of table of keys ; keys are stored contiguously ; with each key consisting of a length byte followed by the string ; END_KEY_TABLE holds Address of the last available position in the key table ; KEYNUM holds Number of the key within the table (starting counting with 0) ;EXIT ;NONE PROC STO A,ROWLEN ;Save maximum number of characters per row MOV A,B STO A,ROWMAX ;Save maximum number of rows LDK HL,0 STO HL,CURCOUNT ;Initialize cursor count (length of display string) LD HL,KEY_TABLE LDK DE,DISKBUFF LDK BC,100H LDIR ;Save current key setting in case user wants to quit ;without changing CAL CLRKE ;Clea ou ol ke definition LD HL,CUR_POINTER ;Initialize row and column settings LDK DE,CURROW ADD HL,DE ;HL ==> Row number in positioning strinP HL ;Get location to store character POP AF ;Get character STO A,[HL] ;Update counters PUSH AF ;Save character LD A,KEYNUM CALL SET_HL INC [HL] ;BUMP KEY COUNTER LK HL,NUM_BLANKS DEC [HL] ;1 LESS SPACE POP AF ;Restore chartacter PUSH AF ;Save CALL EXPANLEN ;Get length of expansion of character CALL POSCUR ;Figure out new cursor position POP AF ;Restore ;Display character LDK B,5 ;Longest possible expansion CALL DISPLAY RET PAGE DELETE: ;Delete last character from specified key definition ;ENTRY ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC LD A,KEYNUM INC A CALL SET_HL ;HL = First position of next key DEC HL ;HL = Position of character to be erased LD A,[HL] PUSH AF ;Save character to be deleted ;Clear character from table CALL DIST2END ;BC = Distance to end of table ;HL = Position of character to g LDK A,OFFSET ;Cursor positioning offset + 0 STO A,[HL] ;Row 0 INC HL STO A,[HL] ;Column = 0 :LOOP: CALL SPACE_LEFT ;Display number of bytes remaining LD HL,CUR_POINTER CALL PRINT ;Position cursor to beginning of string :1: LDK HL,CURON CALL PRINT ;Turn on cursor CALL GET_CHAR PUSH AF ;Save character LDK HL,CUROFF CALL PRINT ;Turn off cursor POP AF ;Restore character CMP LEFT JRZ :ERASE ;ERASE LAST ENTRY CMP EDDONE JRZ :EXIT ;If done editting CMP EDQUIT JRZ :QUIT ;Quit without changing CMP 80H JRNC :ERR ;If invalid MOV B,A ;Save character LD A,NUM_BLANKS ORA A JRZ :ERR ;If no space left MOV A,B ;A = Character CALL ADDCHAR ;Add a character to key definition JR :LOOP ;Get next character :ERASE: LD A,KEYNUM CALL SET_HL LD A,[HL] ORA A JRZ :ERR ;If nothing to erase CALL DELETE ;Delete character JR :LOOP ;Next character :ERR: CALL BEEP ; be erased (unchanged) PUSH HL POP DE ;DE = Position of character to be deleted INC HL ;HL = Next position in table LDIR ;Move table up and erase character ;Update counters LD A,KEYNUM CALL SET_HL DEC [HL] ;One less character in this key definition LK HL,NUM_BLANKS INC [HL] ;1 MORE AVAILABLE SPACE ;Delete character from screen POP AF ;Get deleted character CALL EXPANLEN ;Get length of character expansion PUSH DE ;DE = Length of expansion string ORA A ;Clear carry LDK HL,0 SBC HL,DE ;Get -(length) EX HL,DE CALL POSCUR ;Calculate new cursor position ;Returns A = row number + offset, Z flag set if same row as last time POP DE ;Restore JRZ :1 ;If same row, then no need to re-display key definition LDK HL,ROWMAX SUB OFFSET ;Get row number CMP [HL] ;Check if on last row JRC :1 ;If not on last row, then no need to re-display ;Re-display key to show line which used to be scrolled off screeg a character) ;EXIT ;Z flag = set if same row as before ;A = Row number PROC LD HL,CURCOUNT ;Get number of characters previously displayed ADD HL,DE ;Add number of new characters displayed STO HL,CURCOUNT ;Save new number of characters displayed ;Calculate row and column LD A,ROWLEN MOV E,A LDK D,0 ;DE = Number of characters per row LDK C,-1 ;C will hold row number :LOOP: INC C ;Next row ORA A SBC HL,DE ;Subtract 1 row's worth from number of character positions JRNC :LOOP ;If haven't gone over the number of rows ADD HL,DE ;Add back to get the number of columns MOV A,L ;Now C = Number of rows ; A = Number of columns ;Store row and column values in cursor positioning string LD HL,CUR_POINTER LDK DE,CURROW ;Offset to row byte ADD HL,DE INC HL ;HL ==> Column byte ADD A,OFFSET STO A,[HL] ;Store column value DEC HL MOV A,C ADD A,OFFSET CMP [HL] ;Set Z flag if same row STO A,[HL]n LD HL,CUR_POINTER CALL PRLINE ;Go to display window LD A,KEYNUM LDK B,0FFH ;No maximum length LDK C,0 ;Don't display the word NONE if length = 0 CALL SHOW_KEY ;Display key RET :1: MOV B,E ;B = Length of string :LOOP: PUSH BC ;Save count LDK HL,BACKONE CALL PRINT ;Backspace one position POP BC DJNZ :LOOP ;If more places to backspace RET PAGE CLRKEY: ;Clear old key definition out of key table ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,KEYNUM CALL SET_HL ;HL ==> Key definition LD A,[HL] ;Get length ORA A RZ ;Done if key already empty STO 0,[HL] ;Set length to 0 PUSH HL ;Save address of this key's length byte MOV E,A LDK D,0 ;DE = Distance to next key def ADD HL,DE ;HL = Last address of key CALL DIST2END ;BC = Distance from next key to end of table INC HL ;HL = Start address of next key POP DE ;DE = Start address of the key we're clearing INC DE ;DE = New positio ;Store row value RET PAGE ; ***************************************** ; * CURSOR ATTRIBUTES * ; ***************************************** CURTYPE: ;Set cursor type PROC LDK HL,CURPARM LD A,[HL] ANI ROW ;Get selection number ADD A,'0' ;Convert to ASCII number STO A,CURSOR_ATTRIB ;Set cursor attribute CALL SHOW_CURSOR RET PAGE ; ***************************************** ; * BACKKGROUND ATTRIBUTES * ; ***************************************** BACKTYPE: ;Set background type PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,BACK_ATTRIB CMP REVBACK JRZ :REV ;If Reverse video background ;If Normal background LDK A,REVBACK ;Toggle to reverse video LDK HL,REVERSE JR :SAVE :REV: LDK A,NORMBACK ;Toggle to normal background LDK HL,NORMAL :SAVE: STO A,BACK_ATTRIB CALL PRINT RET PAGE ; ***************************************** ; * n to store next key LDIR RET PAGE DIST2END: ;Distance from selected start position to end of table ;ENTRY ;HL = Start location ;EXIT ;BC = Distance ;HL unchanged PROC EX HL,DE ;DE = Position to insert new key LD HL,END_KEY_TABLE ;HL = End byte of function keys OR A SBC HL,DE PUSH HL POP BC ;BC = Distance between end of edit area and new key spot EX HL,DE ;Restore HL RET PAGE EXPANLEN: ;Get length of expansion string for character ;ENTRY ;A = Character ;EXIT ;DE = Length of expansion string PROC LDK D,0 CMP 20H LDK E,1 ;Length of normal character expansion RNC ;Done if normal character LDK E,5 ;Length of ESC and RETURN expansions CMP ESC RZ ;Done if ESC CMP CR RZ ;Done if CR LDK E,2 ;Length of ordinary control character expansions RET PAGE POSCUR: ;Set up new cursor position for editing string ;ENTRY ;DE = Amount to move cursor ; (This number will be negative if deletin KEY CLICK * ; ***************************************** TOGCLICK: ;Toggle key click status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,KEYCLICK CMP KCOFF ;Set Z flag if off LDK A,KCON ;Toggle to on LDK HL,ON JRZ :SAVE ;If off ;If on LDK A,KCOFF ;Toggle to off LDK HL,OFF :SAVE: STO A,KEYCLICK CALL PRINT RET PAGE ; ***************************************** ; * MONITOR FREQUENCY * ; ***************************************** TOGHERTZ: ;Toggle Hertz status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to 50/60 Hertz line LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz LDK HL,SIXTYHZ LDK A,60 JRZ :SAVE ;If 50Hz, toggle to 60 LDK HL,FIFTYHZ LDK A,50 ;If 60Hz, toggle to 50 :SAVE: STO A,HERTZ CALL PRINT RET PAGE ; ***************************************** ; * INIssign this physical device :1: MOV A,E ;A = Physical device PUSH DE ;Save physical device number CALL SETLOG ;Set or clear logical assignment POP DE ;Restore POP BC INC C ;Next logical device MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more logical devices CALL SHOW_DEV ;Display current device assignment RET LOGTBL: ;Table of logical device assignments for selected choice ;Bit 0 = CONIN: ;Bit 1 = CONOUT: ;Bit 2 = AUXIN: ;Bit 3 = AUXOUT: ;Bit 4 = LST: ;A 1 indicates assign device, 0 indicates unassign device DB 0001_0000B ;LST: DB 0000_0011B ;CONIN:/CONOUT: DB 0000_1100B ;AUXIN:/AUXOUT: DB 0000_0000B ;None PAGE ; ***************************************** ; * SERIAL PROTOCOL * ; ***************************************** SETPROT: ;Set or clear XON/XOFF protocol ;ENTRY ;NONE ;EXIT ;NONE PROC ;Set or clear protocol bit in device table CALL GETMODE ;Get HL ==> Mode byte LD A,PROTPARM ;Get seTIALIZATION STRING * ; ***************************************** EDIT_INIT: ;Edit initialization string ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IEDIT_INSTR CALL PRINT ;Display initialization instructions LDK HL,IEDIT_POS ;Position to edit initialization string STO HL,CUR_POINTER CALL GETDEV ;Get device number STO A,KEYNUM ;Set key number to be editted LDK A,INITLEN ;Maximum number of characters to be displayed per line LDK B,INITROW ;Last row number in display CALL EDIT_KEY ;Edit string LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions LD A,KEYNUM ;Get device number LDK HL,DINIT_TBL ;Table of addresses of positioning strings CALL LOOKUP ;Look up string for this device CALL PRINT ;Position cursor LD A,KEYNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new initialization string RET DINIT_TBL: ;Table of addresses of positionlected row ANI ROW ;Set Z flag if no protocol LD A,[HL] ;Get mode byte JRNZ :XON ;If XON/XOFF protocol ANI NOT XON_MASK ;Set to no protocol STO A,[HL] JR :DONE :XON: ORI XON_MASK ;Set XON/XOFF or ETX/ACK protocol :1: STO A,[HL] ;Set or clear ETX bit in shadow table CALL GETSFLAG ;Get HL ==> Shadow table flag byte LD A,PROTPARM ;Get selected row ANI ROW CMP ETXROW ;Set Z flag if ETX/ACK LD A,[HL] ;Get current flag byte JRZ :ETX ;If ETX ANI NOT ETX_MASK ;Clear ETX/ACK protocol bit JR :2 :ETX: ORI ETX_MASK ;Set ETX protocol :2: STO A,[HL] :DONE: CALL SHOW_PROT ;Display current protocol setting RET PAGE ; ***************************************** ; * BAUD RATE * ; ***************************************** SETBAUD: ;Set baud rate parameter PROC CALL GETBAUD ;Get HL ==> Baud rate byte for currently selected device LD A,BAUDPARM ;Get selected row ANI ROW ;Set Z flag if no proting strings for device initialization strings DW DCONINIT ;CRT device DW DPARINIT ;CEN device DW DMODINIT ;MODEM device DW DPRINIT ;PRNTR device DW DPARINIT ;IEEE device PAGE ; ***************************************** ; * DEVICE ASSIGNMENT * ; ***************************************** DEVASSIGN: ;Logical device assignment ;ENTRY ;NONE ;EXIT ;NONE PROC CALL GETDEV ;Get physical device number MOV E,A ;Save LD A,DEVPARM ANI ROW ;A = Selected device assignment LDK HL,LOGTBL ;HL = Table of assignments corresponding to selection MOV C,A LDK B,0 ADD HL,BC LD B,[HL] ;B = Selected assignment mask LDK C,0 ;First logical device to set or clear :LOOP: SRL B ;Carry bit = Mask for logical device ; (0 = unassign the physical device, 1 = assign it) PUSH BC ;Save mask and number of logical devices left LDK B,0 ;Guess unassign this physical device JRNC :1 ;If unassign LDK B,0FFH ;If aocol INC A ;Get baud rate number STO A,[HL] ;Set baud rate CALL SHOW_BAUD ;Display current baud rate setting RET PAGE ; ***************************************** ; * PARALLEL PROTOCOL * ; ***************************************** PARPROT: ;Select parallel protocol ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,PPROT XOR 0FFH ;Toggle and set Z flag if Centronics STO A,PPROT ;Save toggled protocol setting LDK HL,PARPARM+1 ;HL ==> Number of choices in menu JRZ :1 ;If Centronics INC [HL] ;If toggled to IEEE, add 1 to number of items in list JR :DONE :1: DEC [HL] ;If toggled to Centronics, subtract 1 from number of items :DONE: CALL DISPAR ;Display settings for this protocol LDK HL,RHT_INSTR CALL PRINT RET PAGE ; ***************************************** ; * IEEE ADDRESS * ; ***************************************** SETIADDR: ;Set IEEE device address ;ENTRY ;NONE ;EXIT ;NONE nore backspace DEC HL ;Backspace in number buffer INC B ;Increment maximum number of digits remaining PUSH HL ;Save buffer pointer PUSH BC LDK HL,BACKONE CALL PRINT ;Print backspace POP BC POP HL JRZ :LOOP ;Input next character :DIGIT: STO A,[HL] ;Store number entered INC HL ;Move pointer to next digit position DJNZ :LOOP ;Get next character PAGE ;Get number of 5 second chunks :DONE: MOV A,B ;Check if anything was entered CMP MAXTIM JRZ :EXIT ;Quit, if nothing entered LDK HL,NUMBUFF ;HL => Start of number LDK A,MAXTIM ;Maximum number of digits to enter for timeout SUB B ;A = Number of digits entered DEC A ;A = Number of digits above one's place CALL ASC_BIN ;Get binary number for number of 10's ADD A,A ;A = Number of 5's in positions above one's place MOV D,A ;Save in D ;Check for number too larger ( < 995) CMP 99*2 ;Set Z flag if number entered is <= 990 LD A,[HL] ;Get one's digit JPROC LDK HL,IEEEINST CALL PRINT ;Display instructions :1: LDK C,'9' CALL GET_DIGIT ;Get digit <= 9 CPI LEFT JRZ :1 ;If backspace, get character over again CPI ENTER JRZ :EXIT ;Quit if nothing entered :DIG: SUB '0' STO A,IEEEADDR ;Save new IEEE address ;DECIDE MAXIMUM VALUE FOR NEXT DIGIT (Maximum IEEE address = 31) CPI 3 ;Set flags LDK C,'9' JRC :2 ;If first digit < 2, then any second digit is OK LDK C,'0' ;Maximum if first digit = 3 JRNZ :DONE ;If first digit > 3, then can only be 1 digit long :2: CALL GET_DIGIT CPI ENTER JRZ :DONE ;If done CPI LEFT JRNZ :DIG2 ;If a digit LDK HL,BACKONE CALL PRINT JR :1 ;If backspace :DIG2: SUB '0' MOV E,A ;Save 2nd digit LD A,IEEEADDR ;Get first digit LDK B,9 ;Get first digit * 10 MOV C,A :LOOP: ADD A,C DJNZ :LOOP ;A * 10 ADD A,E STO A,IEEEADDR :DONE: LD A,IEEEADDR LDK DE,IEEEVAL CALL BIN_ASC ;Save ASCII valueRNZ :ROUND ;If number can't be too large ( > 990) ;Number >= 990 CMP '6' ;Check if one's digit is > 5 JRC :ROUND ;If number is small enough ( <=5 ) CALL BEEP ;Indicate number is out of range INC HL ;Set up pointer to next character position LDK B,0 ;Set maximum number of additional characters which can be entered JR :ERASE ;Erase invalid one's character ; and get new input ;"Round off" one's position :ROUND: CPI '3' JRC :1 ;If less than 3, round to 0 INC D ;If >= 3, then count at least one 5 CMP '8' JRC :1 ;If less than 8 then no more one's INC D ;If >= 8, count another 5 :1: MOV A,D ;A = Number of 5's in entered number STO A,TIMEOUT ;Store new timeout ;Display new setting LDK HL,GENPARM CALL SETCUR ;Put cursor back to menu LDK HL,TIMEPOS CALL PRINT ;Position cursor to display new setting CALL PR_TIME ;Display new settings :EXIT: LDK HL,CLREDIT CALL PRINT ;Clear edit instructi of IEEE address :3: LDK HL,PARPARM CALL SETCUR ;Put cursor back to menu LDK HL,IEEEPOS CALL PRINT ;Display new setting :EXIT: LDK HL,SUBINSTR CALL PRINT ;Re-display instructions RET PAGE ; *********************************** ; * DEVICE TIMEOUT * ; *********************************** SETTIME: ;Set device timeout ;(Value entered in seconds, saved in units of 5 seconds) ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display instructions LDK HL,TIMEINST CALL PRINT ;Input timeout in seconds LDK HL,NUMBUFF ;Buffer to hold number string LDK B,MAXTIM ;Maximum number of characters to enter :LOOP: PUSH HL ;Save PUSH BC LDK C,'9' ;Indicate largest allowable digit is 9 CALL GET_DIGIT ;Get digit <= 9 POP BC POP HL ;Restore CPI ENTER JRZ :DONE ;If done entering digits CPI LEFT JRNZ :DIGIT ;If not backspace, then digit :ERASE: MOV A,B CPI MAXTIM JRZ :LOOP ;If no characters entered yet, igons LDK HL,SUBINSTR CALL PRINT ;Re-display instructions RET PAGE ; +-----------------------------------------------+ ; | DISPLAY MENU ROUTINES | ; +-----------------------------------------------+ GETDIS: ;Display get configuration menu PROC LDK HL,GETMESS CALL PRINT ;Display menu LDK HL,GETINSTR ;Instructions CALL PRINT ;"Call" PRINT LDK HL,COPYRIGHT JMP PRINT ;Display copyright message ;RET SETDIS: ;Display set configuration menu PROC LDK HL,SETMESS CALL PRINT ;"Call" PRINT LDK HL,SET_INSTR CALL PRINT RET SAVEDIS: ;Display save configuration menu PROC LDK HL,SAVEPARM LD A,[HL] ANI NOT ROW ;Set to row 0 STO A,[HL] ;Always start save menu on row 0 LDK HL,SAVMESS CALL PRINT ;Display menu LDK HL,SAVEINST ;Instructions JMP PRINT ;"Call" PRINT ;RET PAGE FUNDIS: ;Display function key menu PROC LDK HL,FUN_PLATE CALL PRINT CALL SHO LDK HL,CURARRTBL ;Table of addresses of positioning strings LDK B,4 ;Display 4 key definitions LDK C,10 ;Start with function key 11 LDK A,25 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments RET PAGE ARRDEF: ;Check for WS, CP/M or special arrow key definition ;ENTRY ;NONE ;EXIT ;HL ==> ASCII string for type of definition (WS, CP/M, or Special) ;A = 0 if CP/M or WS ;Z bit set if CP/M or WS PROC LDK A,10 CALL SET_HL ;Get HL = Start of arrow keys in table PUSH HL LDK DE,CPM_ARROWS LDK B,8 CALL COMPARE POP HL JRZ :CPM ;If CP/M arrow key definition LDK DE,WS_ARROWS LDK B,8 CALL COMPARE LDK HL,WS JRZ :WSORCPM ;If WordStar arrow key definition LDK HL,SPECIAL ORI 0FFH ;Indicate special definition RET :CPM: LDK HL,CPM :WSORCPM: XRA A ;Indicate WS or CP/M RET PAGE CURFUNTBL: ;Table of addresses of positioning strings for function key current settings displaW_F_KEYS CALL SPACE_LEFT LDK HL,SUBINSTR CALL PRINT RET ARRDIS: ;Display arrow key menu PROC LDK HL,ARR_PLATE CALL PRINT CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT LDK HL,SUBINSTR CALL PRINT RET CURDIS: ;Display cursor menu PROC LDK HL,CURMENU CALL PRINT CALL SHOW_CURSOR LDK HL,SUBINSTR CALL PRINT ;Display instructions RET PAGE BAUDDIS: ;Display baud rate menu PROC LDK HL,BAUDMENU CALL PRINT CALL SHOW_BAUD ;Display current baud rate LDK HL,SUBINSTR CALL PRINT RET PROTDIS: ;Display protocol menu PROC LDK HL,PROTMENU CALL PRINT CALL SHOW_PROT LDK HL,SUBINSTR CALL PRINT RET PAGE DEVDIS: ;Display device assignment menu ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,DEVMENU CALL PRINT CALL SHOW_DEVy DW FKEY0 DW FKEY1 DW FKEY2 DW FKEY3 DW FKEY4 DW FKEY5 DW FKEY6 DW FKEY7 DW FKEY8 DW FKEY9 CURARRTBL: ;Table of addresses of positioning strings for arrow key current settings DW UPKEY DW DOWNKEY DW RIGHTKEY DW LEFTKEY PAGE DISCON: ;Display console values ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,CUR_HDR CALL PRINT LD A,CURSOR_ATTRIB ;Get cursor attribute assignment SUB '0' LDK HL,CURTBL CALL LOOKUP ;Look up address of current cursor type ASCII string CALL PRLINE LDK HL,BACK_HDR CALL PRINT LDK HL,REVERSE ;Guess reverse video background LD A,BACK_ATTRIB CMP REVBACK JRZ :1 ;If it really is reverse video LDK HL,NORMAL ;If normal background :1: CALL PRINT LDK HL,CLIC_HDR ;Insert Key Click header CALL PRINT LD A,KEYCLICK CMP KCOFF ;Check for key click off LDK HL,OFF JRZ :2 ;If off LDK HL,ON :2: CALL PRINT LDK HL,HZ_HDR ;Move "External Monitor Fr ;Display current device settings LDK HL,SUBINSTR CALL PRINT RET PAGE DISKEY: ;Display current function keys and arrow keys ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display template LDK HL,FUN_FRAME CALL PRINT ;Display function key header ;Display current function key settings CALL FUNINIT ;Initialize variables for displaying function keys LDK HL,FSETWIND CALL PRINT ;Set window for displaying current function keys LDK HL,CURFUNTBL ;Table of addresses of positioning strings LDK B,10 ;Display 10 key definitions LDK C,0 ;Start with key 1 LDK A,30 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments ;Display current arrow key settings LDK HL,ARR_POS CALL PRINT ;Position cursor CALL ARRDEF ;Check if WS,CP/M, or special definition JRNZ :1 ;If special CALL PRINT ;If WS or CP/M RET :1: LDK HL,ARR_TYPES CALL PRINT ;Display arrow key template LDK HL,FSETWIND CALL PRINT equency" into message CALL PRINT LD A,HERTZ CMP 50 ;Set Z flag if 50Hz LDK HL,FIFTYHZ JRZ :3 ;If 50 Hz LDK HL,SIXTYHZ :3: CALL PRINT LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,CRTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISMOD: ;Display modem port parameters PROC LDK HL,MODPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate routine will return to modem menu STO HL,PROTPARM+EXITOFF ;Make sure protocol returns to modem port STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display ACT I 808x Copyright SORCIM Corp. 1981 S/N- 007,Version 3.5EEV SorcALL ASMFilenameHEXFilenamePRNτ?1;͟4199!42 ͣ'6 #6 #6͎ 4!:f'*:;'*:;'F<*99>T29>2a$o*9|LH&*9*9*9(%b;'*9*9(%! ͩ"e:U&*:;'!HHF*|ʧ&!"F*e:|:9!B6 29!l$ Last error occurred on Page 123 Total LOST references were !?="9*9"929go"9*9&"9>s2K2:2:͎ 2929292929292929292Q:go"9!e:"^:"9*9":"9:92:5:9=29>2929>T29> 2K*9196:94H*:"9*9"9*9X!.X:9͓*9 "9:9:9*9}eG:9=__ͻ$#D> 24d"`:~G&vG!.#%fh"c:2e:*9"nx(:9¶ x= :9:9x(=:c:G 6)!K="9! B629>22>22J! :9ĭ!current protocol setting LDK HL,DEV_HDR CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,MODNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPNTR: ;Display printer port parameters PROC LDK HL,PNTRPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate will return to printer menu STO HL,PROTPARM+EXITOFF ;Make sure protocol routine returns to printer menu STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display current protocol set$:9ĭFUnterminated IF nest. IUnterminated MACRO definition. !.~O#%~wy<#%J*9*9 ~w# œ~?ʜp ^#V#N#F r+s 9'n!ͭ~24#W$OToo many PROCs in program. *9?9' "9*9 "9yx  !e: f':d:_ :9¶!"f:":>(=*9"n!%4:c:#%^#V>SE>E24\*^:}!e:"^:2d::9 e::d: !9>wd:G::ʁ!4 W † :9 ͓!9~wÁn>-24>O>Y>S>E>A24*n|c~c=ͅ"::s2:ͨ :9ʽ:9>Y:9>F24292929͗!T.:9>P?*9~24 ͒ | >P24 R::9pͬ% ͬ/ƒͺ:9Ҿp %ҭ!f'!9~G?2:>N*nͻ,#!94:9ʤ>Ov ͼ ðv":"9:s2:2:> 2:Dv"9:s2:G::’*:9'> ʔ>#2:!4wðv:rG:e:N:9*:°>L24ð!e:~"^:*92~c!e:~"^:2*92ͬc!e:"^:ting LDK HL,DEV_HDR CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,PRNTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPAR: ;Display current parallel port settings PROC LDK HL,PARPARM STO HL,DEVPARM+EXITOFF ;Make sure device selection routine returns to parallel menu STO HL,INITPARM+EXITOFF ;and initialization string routine LDK HL,PPROT_HDR CALL PRINT ;Print "Protocol:" LD A,PPROT ORA A ;Set Z flag if Centronics protocol LDK HL,CENPROT JRZ :1 LDK HL,IEEEPROT :1: CALL PRINT LDK HL,DEV_HDR CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT v | } >W24>2[:\> ͒"\:, ::*^:w\>S24\*9e:':9 b *9?9'>O "9 *n~*!99ʽ f'ͬ-™ ͬ+ ͭ>UN!9{_~wͬ,ʋ N'*n#~T L@ C D F G M R͒:9@S ͒U͍f:9@͍^!9F6:96 I :9@I ͍!9~w*9~>S## C>E>S~29*9#N# f'! f'! W$Unknown CPU: '' ͓!46'#*9ͩ Of' ;' !) ͍'!4>!O$͓' 2929v}29| :9ͤ=D !94:e:- *9?>L͇ "9< ####>*9##"9'!:͡':92:*9:*9 f'"9x #"95%*9~w##s#r*9##h'%0+  3 Ƃ~ G >@w!:͆>w :9ē*9#"9 *c3 ~ ʪ(~w##^#V*9ʠ w#Ò ͤO:9= y*9#%N#Fx w# Ò *9"9|~ : # !"96!0 :Q:zzB~G#4V#^6Z6T]#%>2rxß*n+ͭ"n#~G:l x+~!9Oʃ!:Pʃ!9Lʃ>2r^#V#F>ßG> x,\]/*$+^^^&()=<> <= >= < > ~-ANDDEFEQGT GE HIGHLE LOWLT MODNE NOTORREVSHLSHRXOR+%>N>2r>#ß:px2p%x2pU+ͭڒ{ڒ#~"n*n+:s*n2s"n,> *n|ͻ#"n#~ ʺ*n+~ȷ+"n*f;9'>O+~2r+~+^+V"f:r2r2s=#%~+fo>>2s&:s*f<;9'>Sr#s#w#:rw#"fG*h;9'>Sp#"h>2q*h};9'+"h~!#%9nu d)0<D {ozg) {oz {oz#!)#!)##?##? 9'l3>2q}l:rG>2rx x> 24 ) ) 5%)5%) ͭ%) E=%) ͩ)z|5%ڻ PY ͩ)):*9 f':9="9$"9 !W$ "9*9"9!9"9*9;'*9!9f'*9zV  6 s#r#Z ,;  >P ) s#r#"9x29O:9Gʃ ˆ =29} :9¶29>F:9ʴ ¶} :e:b !94:9¶vz°n:9ē:929*9"9*:":Y*9"9*9"9>L >S24!::9w:9 {: :9Ox~ :92*:*:":":͙ x (::2:>*9G:92:":!"9*9|? *n~}:} 1"9F::O@°yw*:#::w#s#rx ʴx@´>w:9x>D :9>:9:[:O::G!d:yO4Q Jx2::[:*\: lMW͛%O::_G͆%!:w{=@~6*^:w#"^:!d:4 ::W{2:[: !46^#þ':9M*9##(%"f:!46=##þ' ͩʝV=ʝ#^=ʝ>V24*^:s#r+y *^:>A+w¬ͩOGx!46V*n+6:d:2d:*^::9y#% Aw# "^:*n+~#:9(=*9"n*94;'::;>~;7ʧ*7ʧ 7ʧ:9¡ ڧ'.!_ʚ;Œ:9¯> #„òaژ{Ҙ #V#Ҟ#:9ʲ*9"9 ʵ>!;?~   7ȷy#:9ʲ*9ͤõ#N f'V Memory OVERFLOW Stopped ACT!/q#p# *9(%:9"9:~%"n::::`:97͆`i?ځ'ځ!d3r+s+7!`3Fx!.H!d0R!2Ͱ2b:!?GN#xy_y_ѯ°#7# y÷y?>E2:2:1>w##^#VO:9#y2r>U724*9*98*9*9:9'b! =# cSh= :|:9 ^= :~ w “9'ʺ# µ¥þÐ7!6> oD# 9'7ȷ0 :?[$b#b.b~J%# ~#,4J%~#o$4f'HO$:9@Õ!9~w*9z^:4 |.> 24.5:9 :4!?怰G:9W:9O@:9ʺyzz>@GzGG&z>+24*94~# !4> #6 #6#2*9#"9!4O$H> 245!4:G~=> w# 56 #6:9@!4\!94:9l$*9:9Gʅw#xl͜lx29"9*9:9q<•!z8$Ҹ:9@29!W$G29!"9List file write error. *9}J%: !f'*>#"'#~'"# x)+pV9 B#0+> !"9"9"9!9!;~ p ~# f}| fO!~ʌ#7y,+-*/()><=^&[] : \(%*9*99'+~ y¹*99'"929*9.:9g"9"9:9 *9*99' "9>a*<<4:9W~#29  F  Rf> z > : "<<> `i"9!429z29 >=9'ҁͪ> !\#!7\\\ END Statement Missing !><\#6y  !W$ACT stopped by user. *99'"9"9\ f'ͻ#$!Ve%!VC f'>2a$!C͂$f$!>="<<6 Pass 1 - Reading D:FILENAME.EXT ;}; ͒:r >Uá*9"n|’7*nͩڤ?>E247go!"t."r!9"jz>Sͼ2l K*h};9'+~ffbMb*h};9' *f;9';A:@2s"tb*h9'+~H"h> 2l!z#%9'F#N   de~# ʼ+"n>2l!;"f!};"h6>2q>E*j24!"tt>2s7ͬ&*9"2<29*9#"9&!\! \4>2$:9>B>20:0294:OJ%>$!4".%~*.>  ʄ>sw#UҚDښڛnpf'*99'ڼA6m#6a#6c#6 ###".6:9o:9=29bH:9!0*.6 #C*9!?~: ~ ~w 9'*9DM !?~Ex1}1Fd] d#KT]f 6 ^#VogʉNs#FrYP+y>!4".29|^#V#~/#oy&&".:9=29•5>Ë:9H#^*.&O:9:9:9:::?:92@/7N#F:@+w:9+w+p+qr+s*9#"9~#foþ' no ERRORs, 1234 Labels, h bytes not used. Program LWA = h. *Error page 999SYMBOL TABLE *Error page 999 SORCIM 808x Assembler ver 3.5E mm/dd/yy hh:mm Page 999 ~':9*:9'":Oi`) ))6 2:2:͎ *:"9p : f'::p : f'*:^ ͙ ~ *: ^ "::9:9w"*O::Q:#%9'!!*:"O:G_ :9:9<"#"m( (me3͓-(-3͓-͒"f:cme3͓-g-à,..͒Xx.c>I*͹-..e3M-M.>!.c3-ڰ)ͥ-*-3>)O- M."-.c3-ڰ)͹-3-- M.>!.cs-e3l- *n+~)͹-M.cs-3@-C*n"9e3\-)ͥ-M..cs-͹-g-3-*ͥ-3-(s-e3\-)ͥ-M..J,3-j*:-ʉ**3 *--"-ڰ*ͥ-.cs-3 -*3-a* \s-s-3-ڃ*:-ƒ*3-a*Ã*s-s-3-ڃ*3-ڃ*:-ƒ*a*s-s-3@-ڃ*͹-..c>H2+3@-++3 *n-+͹-M.cs-~[.+"nÝ,s-s-3-M+3-M+͹-(s-3-^+,s-3)-ڀ+͹-M.>!.͒"g:cs-e3:+O-ڧ+M.e3-Cͥ-.c:+>s-͒"f:́.Ó+H͹->!.c3-+:- ͹-(s-+>d.,Ce3\-Cͥ-M.>!..c3=-*,ͥ-M.͒"f:G,s-e3I-Cͥ-M.͒"f:́..>c3=-l,ͥ-M..cs-e3]-Cͥ-M..c3-ښ,ͥ-.cs-͹-͒"f:c3@-,3-,͹-M.>!.cs-3-,͹-M.>!.3@-Ccs-3 -" >!y2Q:&!!y2Q::Q: Q:G!!:"""#"z P!:N:'6 #6  :r!*O::Q:#%"O:2Q:2N:!):*@5w#}B!|6!!!B5u!"@5:9:9·"!!>12':*:"O: (!*@5B5!!B5V$!:929!!W$Hex file write error.  9'!p#9' "O:N:2N:yW :Q:O!):#%:9:9—"*O:x#%"O:!:~#f" #Oog5#o"_j#I"::O*O:9'Š":M:y2M:> "O:">\#!]#> *6"> *6"::O>*:":Y:"X:r!*@5B5!!"\#5#>>?:Z:y2Z:>\#yp ~ ###t#^#r# &#y?H#"N#_Pt#r#\r#@_t#\j#t#zK͛%O:Y:_G͆%!X:w{=#r!2X::Y:W{2Y:bzWu# Y w# ##7! wD$ѷ$ #7D$ѷ$ $D$7:k$`$l$f$>2k$>b$:k$O$2a$2k$O ͻ$~# ¡$Ù$ ͻ$x“$> _xUү$ͻ$Ä$|ͻ$ ͻ$ ~Oʹ#!$`$$ ?? OPEN error - l$!;6#e%!;l-3-Cͥ-.cs-e3m-;-M.e3l-;-͹-M.cs-3->:->3%->͹-M.>.8,͒"f:́.c!b:55>*9"n*`:##"`:~2d:#~2e:-CM.ͥ-.-ʹ-!d:4-4:9 *nͭ"ny_b#V"-|-͒x.}2-]Cͬ,=-@!.!g:Fw#p*f:"g:*d:o"e::9>C >$24:9>C >#:.*-}o|-^.!e:w͒د†.z†.[.}|†.|<:4 >V24ASMHEX080808085Z80 =+CADD ADICADCJACIANA#ANDANIASEG.ASSERT6BIT@CALLCBITCCCLCCMA/CMC?#CMPCMCNZCNCCPECPOCPDRCPDCPIRCPI#CPICPU3CPCSEG.CZDAA'DAD DA&DBE%DB%DCE%DCRDCX DC%@#DEC DIDJNZDSEG.DS!DW&ECHO5EIEJECT:ELSE=ENDM<endm<ENDIF=END(ENTRY,EQU+ERR;EXT-EXXBEXHLTvIDENT0IF=IM0FIM1VIM2^#INCINDRINDINIRINIINRINXIN,C@IN#JMPJNZJMJCJNCJPEJPOJPJZJRC8JR$:9%V:9͍zɅo$MDy_xW{z/W{/_xzW{_=%>  L%~ J%J%# S% As%@O:q#p#f'>.f'xy%%ɷ”%!%#%~?BK!xʾ% ô%BJ~0%:%A%[% #%+FyR&:p &x &Bʯ&N&Ql&Hʆ& :pBʯ&Ql&Hʆ&yG&A&;&5&'V&V&dV& V&V&7N&~0Q& Q&# =e&~0R&R&_ #M&)))l&~0R&:&AR&GR&_# M&))))Æ&~0R&R&)o# ²&M&&'&'&'&'}0>02'>0]T< &=kbG:''> x>2'0~0~0#y'z{x7# A'9'h' +~ x['x~# h'x~aڅ'{҅'# u'~#Í'7#Ö'zq#ã'O:'=@I±' ®'V|'}'Ɛ'@'ɯ2(#~:+:\'~@8(##(ͬ#<~>:7:(.$(~.#$(y^(!S:( ^(:(7x7~i(#.^(*V(>?a(~# :(G>  a(x!8(|8(;8(=8(:8(@ʖ(#ʖ(*ʖ(?›(2(a({ w!d:6͹-2e:>I24\..(>.c3]-Cͥ-M..c-3͓-c>d.cle3͓-cNC0JRNZ JRZ(JRLDAX LDA:LDDRLDDLDIRLDI#LDKrLD :*KFLHLD*LINK2LIST8"LKLOC#LXIMACRO5MVISMOVWG@(MSG9NEGDNOPORG"ORAORI"OROTDROTIROT,CAOUTDOUTIOUTPAGE:PCHLPOPPROC$PUSHRALRARRCREPT5RETIMRETNERETRIM RLC#RLCRLDo"RLRMRNCRNZRPERPORPRRC#RRCRRDgRRRSTRZSBBCSBCBSBITSBISET+@SHLD"SIM0SLA SPACE7SPHLSRA(SRL8STAXSTA2STC7sSTO2"Cp63SUBSUITITLE1USE/VFD)XCHG#XORXRAXRIXTHL'*M%6[HL]6[IX[IYB C D E H $L -AA?IR AFA6PSWA6SP!6IX$IYdBC B DE D HL$H$AFA6SP!6IX$IYdBC DE HL$[SP]!6[IX]$[IY]d[BC] [DE] [HL]$(((() )%)-))0)3)+G)(((+++*B),U,(,`))*!*8*,6Kl#([ uX" F a T E w  2ͮ8>2k$!"R:ͬ#<@27a5:2$:29͈8*9!\ f'"9"9:94!Vͪ5:95!zͪ5!Af'!~6!l$2!T l$!.7:9f$6!=5$h'*ABS *CODE *DATA !"5!~ 8#O 65͹8!?="9l9 8}6:929l96ͭ8^#VPY##$!\ ?'\!5$ ?? Hex or Prn file name same as Input = 5@R6H=06H=6LO7L=06L=CON:6L=LP:6L=6L6O7PS(7SLA7S=_7S\7R=07R=S7R=F7R7!.7\'8\V!.7z! 77:929Ô5!.V7Ô5>29!RE".>L2.P!:͡'Ô5Í5:9ï6>`2i$:9ï6! 7z7:9ï6PRN;729Ô5;7"9Ô5:;7d!x8872Ô5P;72`i+~=7#%8{7':!d8$YPf'7Sf'!8l$!288!R88!d88Command input errorNO source file specified, ABORTMal-formed numberIll-formed filenamePS > 99SL < 60/!'> :!'!8f' Page *%"9"9OD9T9 .9}|:k99~ 9 9, 9; 9|.9 .9.9a @ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! 9{ 9 w#86#8:k9(9~ .9.9#96#86go~<9ѯx~ O9 S9#D9~'d9"d92k96#2k95~#ʇ9<+w#_^#Vѯ7TTTTTTTTTTTTTTTTT=99hhhh?=???99?=?9 :9999990099 ?\:e:`: prompt/command response JMP X30D2 ; end  ',* ;I/O Character device table (physical devices) DS DTBLLEN ;Each entry in the table consists of: ; Device name: 6 bytes ; Mode byte: 1 byte ; Baud rate: 1 byte SHAD_TBL: DS STBLLEN ;Device shadow table ;Each entry in the table consists of: ; Routine address: 2 bytes ; Flag byte: 1 byte ; IEEE device number 1 byte IEEEADDR: = SHAD_TBL + (IEEENUM * 4) + 3 ;IEEE device address byte of ; IEEE shadow table entry DEVFLGS: ;I/O Device fla6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#WA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!Eâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1 ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK HL,DPARINIT STO HL,CUR_POINTER ;Display current setting at DCONINIT LD A,PPROT ORA A JRNZ :IEEE ;If IEEE protocol LDK A,CENNUM ;Get string number LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET :IEEE: LDK A,IEEENUM ;Get string number LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string LDK HL,IEEE_HDR ;If IEEE protocol CALL PRINT ;Print "IEEE Address:" LDK DE,IEEEVAL LD A,IEEEADDR CALL BIN_ASC ;Put binary number in string LDK HL,IEEEPOS CALL PRINT ;Display current IEEE address RET PAGE DISGEN: ;Display general parameters PROC LDK HL,DEVTIM_HDR CALL PRINT ;Print "Device Timeout:" CALL PR_TI EXECUTIVE SETUP GENERATION PROCEDURES 1 Cop th followin file fro th maste dis t you wor area: SETUP.ASM ACT.COM LOAD.COM 2) Assemble the file by typing: ACT SETUP R=F L=B: 3) Load the file by typing: LOAD SETUP 4) That's all, you should have a working copy called SETUP.COM A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#WA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!Eâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1ME ;Display current device timeout setting RET PAGE DISCLR: ;Display nothing PROC LDK HL,CURSET CALL PRINT ;Clear current settings RET PAGE ; +-----------------------------------------------+ ; | DRIVER UTILITY ROUTINES | ; +-----------------------------------------------+ DISP_SCR: ;Display current menu and all previous menus on same screen ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> Current menu parameter table PROC PUSH HL ;Save pointer CALL CLRALL ;Clear screen (except header) LD A,[HL] ANI LEFT_ON ;Check if on right side JRZ :1 ;If not on right side LDK DE,EXITOFF CALL GETVAL ;If on right side, display screen for left menu :1: CALL PREPMENU ;Prepare this menu CALL PRDIS ;Display current settings POP HL ;Restore pointer CALL SETCUR ;Position cursor RET PAGE SELTBL: ;Get address of menu parameter table which corresponds to current menu selec org 100h jp 4000h org 4000h in a,(sys) or 80h out (sys),a ld hl,0 ld de,5000h ld bc,8*1024 ldir in a,(sys) and 7fh out (sys),a ld de,fcb ld c,13h ;delete old call 5 ld de,fcb ld c,16h ;make new call 5 xor a ld (fcb+15),a ld hl,0 ld (fcbnr),hl ld e,64 ld c,2ch ;set multi-rec call 5 ld de,5000h ld c,1ah ;set dma call 5  < < < N O - F I L E M E N U > > >  D Open Document File | Y DELETE a file | H Set HELP LEVEL  N Open Non-document File | E RENAME a file | L Change Drive  X EXIT to System | O COPY a file | R Run a program  F Directory + | P   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  M Run MailMerge S Run SpellStar < < < N O - F I L E M E N U > > >   ;HL ==> Menu parameter table PROC PUSH HL ;Save pointer CALL GOWIND ;Go to correct window LDK DE,PREPOFF ;Offset to menu preparation routine ADD HL,DE ;HL ==> menu prep routine address LD A,[HL] INC HL LD H,[HL] MOV L,A ;HL = Menu prep routine address LDK DE,:RET PUSH DE ;Set return address JMP [HL] ;"Call" routine :RET: POP HL CALL SETCUR ;Highlight selection RET PAGE SETCUR: ;Position cursor to selected window and row ;ENTRY ;HL ==> Menu parameter table ;EXIT ;HL ==> Menu parameter table ;Cursor positioned PROC PUSH HL ;Save LDK HL,CUROFF ;Turn cursor off CALL PRINT POP HL ORI 0FFH STO A,HIFLAG CALL HIGHLIGHT ;Highlight this selection PUSH HL LDK HL,CURON ;Turn cursor back on CALL PRINT POP HL ;Restore RET PAGE HIGHLIGHT: ;Highlight selected line ;ENTRY ;HL ==> Menu parameter table ;HIFLAG = 0 to unhighlight, 0FFH to highlight ;EXIT ;HL ==> Menu parameter tablefset from beginning of shadow table entry to flag byte DNTRYLEN: = 8 DTBL_LEN: = DNTRYLEN * 16 ;Length of device table ; = Length of each entry * max number of entries NUM_LDEV: = 5 ;Number of logical devices REDIR_LEN: = NUM_LDEV * 2 ;Length of logical device redirection table ITBL_OFF: = STBLLEN+REDIR_LEN ;Offset from start of bank 0 tables to Initialization string buffer area LDEVOFF: = 22H ;Logical device offset in SCB ;I/O PORT EQUATES BANK_PORT: = 00 ;Bank I/O port ROMBANK: = 80H ;Mask for ROM bank SYS_CNB: = 03 ;System control port B HZ_MASK: = 08H ;Hertz mask (bit set = 50Hz, clear = 60Hz) ;SETUP DISK AREA EQUATES IOTRK: = 1 ;Track which holds I/O information IOSEC: = 5 ;Sector which holds I/O information DTBL_OFF: = 16 * 2 + 2 ;Offset to device table entry on disk sector REDIR_OFF: = DTBL_OFF+DTBL_LEN +STBLLEN ;Offset to redirection vector table on disk sector STUPTRK: = 02 ;Track which holds setup information (except I/O) STUPSEC:  PROC PUSH HL CALL GOROW ;Position cursor on selected row CALL PTROW ;Point to print string for current row LD A,[HL] INC HL PUSH HL ;Save 2nd byte in string CALL OUTCHAR ;Print first byte unhighlighted POP HL LD A,[HL] INC HL PUSH HL CALL OUTCHAR ;Print 2nd byte unhighlighted LD A,HIFLAG ORA A LDK HL,HIGHOFF JRZ :1 ;If turn off highlight LDK HL,HIGHON :1: CALL PRINT POP HL CALL PRLINE ;Display line LDK HL,HIGHOFF CALL PRINT ;Now turn off highlighting LDK A,CR CALL OUTCHAR ;Go back to beginning of device POP HL RET PAGE PTROW: ;Point to row to print ;ENTRY ;HL = Menu parameter table ;EXIT ;HL = Address of string to print PROC LD A,[HL] ANI ROW ;Get row number LDK DE,LINEOFF ADD HL,DE LD E,[HL] INC HL LD H,[HL] MOV L,E ;HL = Address of table of pointers CALL LOOKUP ;Get address of string RET PAGE GOROW: ;Go to menu row speciftion ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> Next menu parameter table PROC LD A,[HL] ANI ROW ;Get row number ADD A ;* 2 LDK E,SUBOFF ;Offset to submenu pointers ADD E ;A = Offset to submenu pointer for current row MOV E,A LDK D,0 ;DE = Offset to submenu pointer CALL GETVAL ;Get value from parameter table RET PAGE PRDIS: ;Call routine to display current settings for menu selection ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> Current menu parameter table ;Window set to "current settings" window PROC PUSH HL ;Save current table pointer CALL SELTBL ;HL ==> Submenu table LDK DE,DISOFF ;Offset to current settings display routine CALL GETVAL ;Get DE = value in offset location of parameter table LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" display routine :RET: POP HL RET PAGE PREPMENU: ;Prepare menu display ;ENTRY ;HL ==> Menu parameter table ;EXIT ied by menu parameter table ;ENTRY ;NONE ;EXIT ;NONE PROC PUSH HL CALL GOWIND ;Move to the window CALL GETSTEP ;Get step size between menu selections MOV B,A ;B = Step size LD A,[HL] ;Get row number within this window ANI ROW DEC B ;B = Step size - 1 JRZ :1 ;If step size = 1 MOV C,A ;C = Row number :LOOP1: ADD C DJNZ :LOOP1 ;Row * Step size :1: MOV B,A ;B = Row * Step size CALL GETSTROW ;A = Start row ADD B JRZ :EXIT ;Done if row 0 MOV B,A ;B = Start row + (Row * Step size) :LOOP: PUSH BC ;Save number of rows to move down LDK A,MCDOWN CALL OUTCHAR ;Move down one space POP BC DJNZ :LOOP ;If more rows :EXIT: POP HL RET PAGE GOWIND: ;Go to window in menu parameter table ;ENTRY ;HL ==> Menu parameter table ;EXIT ;HL ==> Menu parameter table PROC PUSH HL LDK DE,WINDOFF ;DE = Offset to window number ADD HL,DE ;HL ==> Window number LD A,[HL] ;A = Window numbe0 STO A,[HL] ;Row 0 INC HL STO A,[HL] ;Column = 0 :LOOP: CALL SPACE_LEFT ;Display number of bytes remaining LD HL,CUR_POINTER CALL PRINT ;Position cursor to beginning of string :1: LDK HL,CURON CALL PRINT ;Turn on cursor CALL GET_CHAR PUSH AF ;Save character LDK HL,CUROFF CALL PRINT ;Turn off cursor POP AF ;Restore character CMP LEFT JRZ :ERASE ;ERASE LAST ENTRY CMP EDDONE JRZ :EXIT ;If done editting CMP EDQUIT JRZ :QUIT ;Quit without changing CMP 80H JRNC :ERR ;If invalid MOV B,A ;Save character LD A,NUM_BLANKS ORA A JRZ :ERR ;If no space left MOV A,B ;A = Character CALL ADDCHAR ;Add a character to key definition JR :LOOP ;Get next character :ERASE: LD A,KEYNUM CALL SET_HL LD A,[HL] ORA A JRZ :ERR ;If nothing to erase CALL DELETE ;Delete character JR :LOOP ;Next character :ERR: CALL BEEP ;Indicate error JRZ :LOOP :QUIT: LDK HL,DIr CALL SETWIND ;Go to submenu window POP HL RET PAGE SETWIND: ;Set selected window on and move to home position of that window ;ENTRY ;A = Window number ;EXIT ;Window set PROC STO A,WINDOW ;Set window number into SWIND string LDK HL,SWIND CALL PRINT ;Send "set window" ESC sequence RET PAGE GETVAL: ;Get value from parameter table ;ENTRY ;HL ==> Table ;DE = Offset ;EXIT ;HL = Value at offset PROC ADD HL,DE ;HL = Address + table offset LD A,[HL] INC HL LD H,[HL] ;DE = Value in table at offset MOV L,A RET PAGE GETSTROW: ;Get row number of start row of current menu ;ENTRY ;HL ==> Menu parameter table ;EXIT ;A = Start row ;HL ==> Menu parameter table PROC PUSH HL LDK DE,SROWOFF ;Offset to start row in table ADD HL,DE ;HL ==> Start row LD A,[HL] ;A = Start row POP HL RET PAGE GETSTEP: ;Get step size between menu selections ;ENTRY ;HL ==> Menu parameter table ;EXIT ;A = Step size ;SKBUFF LD DE,KEY_TABLE LDK BC,100H LDIR ;Restore old key definitions :EXIT: CALL SPACE_LEFT ;Display amount of space left LDK HL,CLREDIT CALL PRINT ;Clear editing lines LDK HL,CURON CALL PRINT ;Make sure cursor is on RET PAGE ADDCHAR: ;Add a character to the end of the currently selected string ;ENTRY ; A = Character to add ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC PUSH AF ;Save character ;Move table down to make room for new character LD A,KEYNUM INC A CALL SET_HL ;Get start address of next key PUSH HL ;Save location to store byte CALL DIST2END ;Get distance to end of table ;BC = Distance to end of table LD HL,END_KEY_TABLE PUSH HL POP DE ;DE = Last byte in buffer area DEC HL ;HL = 2nd to last position LDDR ;Shift table to insert character ;Insert byte POP HL ;Get location to store character POP AHL ==> Menu parameter table PROC PUSH HL LDK DE,STEPOFF ;Offset to step size in table ADD HL,DE ;HL ==> Step size LD A,[HL] ;A = Step size POP HL RET PAGE SHOW_F_KEYS: LDK HL,FPOSTBL ;Table of addresses of function key positioning strings LDK B,10 ;10 keys LDK C,0 ;Start with key 1 LDK A,70 ;Maximum display length CALL PRINTFKEY ;Display function keys RET SHOW_A_KEYS: LDK HL,APOSTBL ;Table of addresses of arrow key positioning strings LDK B,4 ;4 keys LDK C,10 ;Start with function key 11 LDK A,66 ;Maximum display length CALL PRINTFKEY ;Display arrow keys RET FPOSTBL: DW POS_0 DW POS_1 DW POS_2 DW POS_3 DW POS_4 DW POS_5 DW POS_6 DW POS_7 DW POS_8 DW POS_9 APOSTBL: DW POS_UP DW POS_DOWN DW POS_RIGHT DW POS_LEFT PAGE SHOW_KEY: ;PRINT OUT THE STRING FOR THE GIVEN FUNCTION OR ARROW KEY ; AT THE CURRENT CURSOR POSITION. ;ENTRY ;A = Key to expand (0-13) ;B = Maximum nuF ;Get character STO A,[HL] ;Update counters PUSH AF ;Save character LD A,KEYNUM CALL SET_HL INC [HL] ;BUMP KEY COUNTER LK HL,NUM_BLANKS DEC [HL] ;1 LESS SPACE POP AF ;Restore chartacter PUSH AF ;Save CALL EXPANLEN ;Get length of expansion of character CALL POSCUR ;Figure out new cursor position POP AF ;Restore ;Display character LDK B,5 ;Longest possible expansion CALL DISPLAY RET PAGE DELETE: ;Delete last character from specified key definition ;ENTRY ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC LD A,KEYNUM INC A CALL SET_HL ;HL = First position of next key DEC HL ;HL = Position of character to be erased LD A,[HL] PUSH AF ;Save character to be deleted ;Clear character from table CALL DIST2END ;BC = Distance to end of table ;HL = Position of character to be erased (unchanged) PUSH HL POP DE ;DEDIST2END: ;Distance from selected start position to end of table ;ENTRY ;HL = Start location ;EXIT ;BC = Distance ;HL unchanged PROC EX HL,DE ;DE = Position to insert new key LD HL,END_KEY_TABLE ;HL = End byte of function keys OR A SBC HL,DE PUSH HL POP BC ;BC = Distance between end of edit area and new key spot EX HL,DE ;Restore HL RET PAGE EXPANLEN: ;Get length of expansion string for character ;ENTRY ;A = Character ;EXIT ;DE = Length of expansion string PROC LDK D,0 CMP 20H LDK E,1 ;Length of normal character expansion RNC ;Done if normal character LDK E,5 ;Length of ESC and RETURN expansions CMP ESC RZ ;Done if ESC CMP CR RZ ;Done if CR LDK E,2 ;Length of ordinary control character expansions RET PAGE POSCUR: ;Set up new cursor position for editing string ;ENTRY ;DE = Amount to move cursor ; (This number will be negative if deleting a character) ;EXIT ;Z flag = set if same r = Position of character to be deleted INC HL ;HL = Next position in table LDIR ;Move table up and erase character ;Update counters LD A,KEYNUM CALL SET_HL DEC [HL] ;One less character in this key definition LK HL,NUM_BLANKS INC [HL] ;1 MORE AVAILABLE SPACE ;Delete character from screen POP AF ;Get deleted character CALL EXPANLEN ;Get length of character expansion PUSH DE ;DE = Length of expansion string ORA A ;Clear carry LDK HL,0 SBC HL,DE ;Get -(length) EX HL,DE CALL POSCUR ;Calculate new cursor position ;Returns A = row number + offset, Z flag set if same row as last time POP DE ;Restore JRZ :1 ;If same row, then no need to re-display key definition LDK HL,ROWMAX SUB OFFSET ;Get row number CMP [HL] ;Check if on last row JRC :1 ;If not on last row, then no need to re-display ;Re-display key to show line which used to be scrolled off screen LD HL,CUR_POINTER CALL PRLINE ;Go ow as before ;A = Row number PROC LD HL,CURCOUNT ;Get number of characters previously displayed ADD HL,DE ;Add number of new characters displayed STO HL,CURCOUNT ;Save new number of characters displayed ;Calculate row and column LD A,ROWLEN MOV E,A LDK D,0 ;DE = Number of characters per row LDK C,-1 ;C will hold row number :LOOP: INC C ;Next row ORA A SBC HL,DE ;Subtract 1 row's worth from number of character positions JRNC :LOOP ;If haven't gone over the number of rows ADD HL,DE ;Add back to get the number of columns MOV A,L ;Now C = Number of rows ; A = Number of columns ;Store row and column values in cursor positioning string LD HL,CUR_POINTER LDK DE,CURROW ;Offset to row byte ADD HL,DE INC HL ;HL ==> Column byte ADD A,OFFSET STO A,[HL] ;Store column value DEC HL MOV A,C ADD A,OFFSET CMP [HL] ;Set Z flag if same row STO A,[HL] ;Store row value RET PAGE ; *to display window LD A,KEYNUM LDK B,0FFH ;No maximum length LDK C,0 ;Don't display the word NONE if length = 0 CALL SHOW_KEY ;Display key RET :1: MOV B,E ;B = Length of string :LOOP: PUSH BC ;Save count LDK HL,BACKONE CALL PRINT ;Backspace one position POP BC DJNZ :LOOP ;If more places to backspace RET PAGE CLRKEY: ;Clear old key definition out of key table ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,KEYNUM CALL SET_HL ;HL ==> Key definition LD A,[HL] ;Get length ORA A RZ ;Done if key already empty STO 0,[HL] ;Set length to 0 PUSH HL ;Save address of this key's length byte MOV E,A LDK D,0 ;DE = Distance to next key def ADD HL,DE ;HL = Last address of key CALL DIST2END ;BC = Distance from next key to end of table INC HL ;HL = Start address of next key POP DE ;DE = Start address of the key we're clearing INC DE ;DE = New position to store next key LDIR RET PAGE **************************************** ; * CURSOR ATTRIBUTES * ; ***************************************** CURTYPE: ;Set cursor type PROC LDK HL,CURPARM LD A,[HL] ANI ROW ;Get selection number ADD A,'0' ;Convert to ASCII number STO A,CURSOR_ATTRIB ;Set cursor attribute CALL SHOW_CURSOR RET PAGE ; ***************************************** ; * BACKKGROUND ATTRIBUTES * ; ***************************************** BACKTYPE: ;Set background type PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,BACK_ATTRIB CMP REVBACK JRZ :REV ;If Reverse video background ;If Normal background LDK A,REVBACK ;Toggle to reverse video LDK HL,REVERSE JR :SAVE :REV: LDK A,NORMBACK ;Toggle to normal background LDK HL,NORMAL :SAVE: STO A,BACK_ATTRIB CALL PRINT RET PAGE ; ***************************************** ; * KEY CLICK * ; ************************** DW DCONINIT ;CRT device DW DPARINIT ;CEN device DW DMODINIT ;MODEM device DW DPRINIT ;PRNTR device DW DPARINIT ;IEEE device PAGE ; ***************************************** ; * DEVICE ASSIGNMENT * ; ***************************************** DEVASSIGN: ;Logical device assignment ;ENTRY ;NONE ;EXIT ;NONE PROC CALL GETDEV ;Get physical device number MOV E,A ;Save LD A,DEVPARM ANI ROW ;A = Selected device assignment LDK HL,LOGTBL ;HL = Table of assignments corresponding to selection MOV C,A LDK B,0 ADD HL,BC LD B,[HL] ;B = Selected assignment mask LDK C,0 ;First logical device to set or clear :LOOP: SRL B ;Carry bit = Mask for logical device ; (0 = unassign the physical device, 1 = assign it) PUSH BC ;Save mask and number of logical devices left LDK B,0 ;Guess unassign this physical device JRNC :1 ;If unassign LDK B,0FFH ;If assign this physical device :1: MOV A,E ;A *************** TOGCLICK: ;Toggle key click status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,KEYCLICK CMP KCOFF ;Set Z flag if off LDK A,KCON ;Toggle to on LDK HL,ON JRZ :SAVE ;If off ;If on LDK A,KCOFF ;Toggle to off LDK HL,OFF :SAVE: STO A,KEYCLICK CALL PRINT RET PAGE ; ***************************************** ; * MONITOR FREQUENCY * ; ***************************************** TOGHERTZ: ;Toggle Hertz status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to 50/60 Hertz line LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz LDK HL,SIXTYHZ LDK A,60 JRZ :SAVE ;If 50Hz, toggle to 60 LDK HL,FIFTYHZ LDK A,50 ;If 60Hz, toggle to 50 :SAVE: STO A,HERTZ CALL PRINT RET PAGE ; ***************************************** ; * INITIALIZATION STRING * ; *********************= Physical device PUSH DE ;Save physical device number CALL SETLOG ;Set or clear logical assignment POP DE ;Restore POP BC INC C ;Next logical device MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more logical devices CALL SHOW_DEV ;Display current device assignment RET LOGTBL: ;Table of logical device assignments for selected choice ;Bit 0 = CONIN: ;Bit 1 = CONOUT: ;Bit 2 = AUXIN: ;Bit 3 = AUXOUT: ;Bit 4 = LST: ;A 1 indicates assign device, 0 indicates unassign device DB 0001_0000B ;LST: DB 0000_0011B ;CONIN:/CONOUT: DB 0000_1100B ;AUXIN:/AUXOUT: DB 0000_0000B ;None PAGE ; ***************************************** ; * SERIAL PROTOCOL * ; ***************************************** SETPROT: ;Set or clear XON/XOFF protocol ;ENTRY ;NONE ;EXIT ;NONE PROC ;Set or clear protocol bit in device table CALL GETMODE ;Get HL ==> Mode byte LD A,PROTPARM ;Get selected row ANI ROW ;Set Z flag if no protoc******************** EDIT_INIT: ;Edit initialization string ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IEDIT_INSTR CALL PRINT ;Display initialization instructions LDK HL,IEDIT_POS ;Position to edit initialization string STO HL,CUR_POINTER CALL GETDEV ;Get device number STO A,KEYNUM ;Set key number to be editted LDK A,INITLEN ;Maximum number of characters to be displayed per line LDK B,INITROW ;Last row number in display CALL EDIT_KEY ;Edit string LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions LD A,KEYNUM ;Get device number LDK HL,DINIT_TBL ;Table of addresses of positioning strings CALL LOOKUP ;Look up string for this device CALL PRINT ;Position cursor LD A,KEYNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new initialization string RET DINIT_TBL: ;Table of addresses of positioning strings for device initialization strings ol LD A,[HL] ;Get mode byte JRNZ :XON ;If XON/XOFF protocol ANI NOT XON_MASK ;Set to no protocol STO A,[HL] JR :DONE :XON: ORI XON_MASK ;Set XON/XOFF or ETX/ACK protocol :1: STO A,[HL] ;Set or clear ETX bit in shadow table CALL GETSFLAG ;Get HL ==> Shadow table flag byte LD A,PROTPARM ;Get selected row ANI ROW CMP ETXROW ;Set Z flag if ETX/ACK LD A,[HL] ;Get current flag byte JRZ :ETX ;If ETX ANI NOT ETX_MASK ;Clear ETX/ACK protocol bit JR :2 :ETX: ORI ETX_MASK ;Set ETX protocol :2: STO A,[HL] :DONE: CALL SHOW_PROT ;Display current protocol setting RET PAGE ; ***************************************** ; * BAUD RATE * ; ***************************************** SETBAUD: ;Set baud rate parameter PROC CALL GETBAUD ;Get HL ==> Baud rate byte for currently selected device LD A,BAUDPARM ;Get selected row ANI ROW ;Set Z flag if no protocol INC A ;Get baud rate number STO A,[SETCUR ;Put cursor back to menu LDK HL,IEEEPOS CALL PRINT ;Display new setting :EXIT: LDK HL,SUBINSTR CALL PRINT ;Re-display instructions RET PAGE ; *********************************** ; * DEVICE TIMEOUT * ; *********************************** SETTIME: ;Set device timeout ;(Value entered in seconds, saved in units of 5 seconds) ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display instructions LDK HL,TIMEINST CALL PRINT ;Input timeout in seconds LDK HL,NUMBUFF ;Buffer to hold number string LDK B,MAXTIM ;Maximum number of characters to enter :LOOP: PUSH HL ;Save PUSH BC LDK C,'9' ;Indicate largest allowable digit is 9 CALL GET_DIGIT ;Get digit <= 9 POP BC POP HL ;Restore CPI ENTER JRZ :DONE ;If done entering digits CPI LEFT JRNZ :DIGIT ;If not backspace, then digit :ERASE: MOV A,B CPI MAXTIM JRZ :LOOP ;If no characters entered yet, ignore backspace DEC HL ;Backspace in numbeHL] ;Set baud rate CALL SHOW_BAUD ;Display current baud rate setting RET PAGE ; ***************************************** ; * PARALLEL PROTOCOL * ; ***************************************** PARPROT: ;Select parallel protocol ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,PPROT XOR 0FFH ;Toggle and set Z flag if Centronics STO A,PPROT ;Save toggled protocol setting LDK HL,PARPARM+1 ;HL ==> Number of choices in menu JRZ :1 ;If Centronics INC [HL] ;If toggled to IEEE, add 1 to number of items in list JR :DONE :1: DEC [HL] ;If toggled to Centronics, subtract 1 from number of items :DONE: CALL DISPAR ;Display settings for this protocol LDK HL,RHT_INSTR CALL PRINT RET PAGE ; ***************************************** ; * IEEE ADDRESS * ; ***************************************** SETIADDR: ;Set IEEE device address ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IEEEINST CALL PRINT ;Displayr buffer INC B ;Increment maximum number of digits remaining PUSH HL ;Save buffer pointer PUSH BC LDK HL,BACKONE CALL PRINT ;Print backspace POP BC POP HL JRZ :LOOP ;Input next character :DIGIT: STO A,[HL] ;Store number entered INC HL ;Move pointer to next digit position DJNZ :LOOP ;Get next character PAGE ;Get number of 5 second chunks :DONE: MOV A,B ;Check if anything was entered CMP MAXTIM JRZ :EXIT ;Quit, if nothing entered LDK HL,NUMBUFF ;HL => Start of number LDK A,MAXTIM ;Maximum number of digits to enter for timeout SUB B ;A = Number of digits entered DEC A ;A = Number of digits above one's place CALL ASC_BIN ;Get binary number for number of 10's ADD A,A ;A = Number of 5's in positions above one's place MOV D,A ;Save in D ;Check for number too larger ( < 995) CMP 99*2 ;Set Z flag if number entered is <= 990 LD A,[HL] ;Get one's digit JRNZ :ROUND ;If number can't be too large ( > 9 instructions :1: LDK C,'9' CALL GET_DIGIT ;Get digit <= 9 CPI LEFT JRZ :1 ;If backspace, get character over again CPI ENTER JRZ :EXIT ;Quit if nothing entered :DIG: SUB '0' STO A,IEEEADDR ;Save new IEEE address ;DECIDE MAXIMUM VALUE FOR NEXT DIGIT (Maximum IEEE address = 31) CPI 3 ;Set flags LDK C,'9' JRC :2 ;If first digit < 2, then any second digit is OK LDK C,'0' ;Maximum if first digit = 3 JRNZ :DONE ;If first digit > 3, then can only be 1 digit long :2: CALL GET_DIGIT CPI ENTER JRZ :DONE ;If done CPI LEFT JRNZ :DIG2 ;If a digit LDK HL,BACKONE CALL PRINT JR :1 ;If backspace :DIG2: SUB '0' MOV E,A ;Save 2nd digit LD A,IEEEADDR ;Get first digit LDK B,9 ;Get first digit * 10 MOV C,A :LOOP: ADD A,C DJNZ :LOOP ;A * 10 ADD A,E STO A,IEEEADDR :DONE: LD A,IEEEADDR LDK DE,IEEEVAL CALL BIN_ASC ;Save ASCII value of IEEE address :3: LDK HL,PARPARM CALL 90) ;Number >= 990 CMP '6' ;Check if one's digit is > 5 JRC :ROUND ;If number is small enough ( <=5 ) CALL BEEP ;Indicate number is out of range INC HL ;Set up pointer to next character position LDK B,0 ;Set maximum number of additional characters which can be entered JR :ERASE ;Erase invalid one's character ; and get new input ;"Round off" one's position :ROUND: CPI '3' JRC :1 ;If less than 3, round to 0 INC D ;If >= 3, then count at least one 5 CMP '8' JRC :1 ;If less than 8 then no more one's INC D ;If >= 8, count another 5 :1: MOV A,D ;A = Number of 5's in entered number STO A,TIMEOUT ;Store new timeout ;Display new setting LDK HL,GENPARM CALL SETCUR ;Put cursor back to menu LDK HL,TIMEPOS CALL PRINT ;Position cursor to display new setting CALL PR_TIME ;Display new settings :EXIT: LDK HL,CLREDIT CALL PRINT ;Clear edit instructions LDK HL,SUBINSTR CALL PRINT ;Re-displINSTR CALL PRINT RET PAGE DISKEY: ;Display current function keys and arrow keys ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display template LDK HL,FUN_FRAME CALL PRINT ;Display function key header ;Display current function key settings CALL FUNINIT ;Initialize variables for displaying function keys LDK HL,FSETWIND CALL PRINT ;Set window for displaying current function keys LDK HL,CURFUNTBL ;Table of addresses of positioning strings LDK B,10 ;Display 10 key definitions LDK C,0 ;Start with key 1 LDK A,30 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments ;Display current arrow key settings LDK HL,ARR_POS CALL PRINT ;Position cursor CALL ARRDEF ;Check if WS,CP/M, or special definition JRNZ :1 ;If special CALL PRINT ;If WS or CP/M RET :1: LDK HL,ARR_TYPES CALL PRINT ;Display arrow key template LDK HL,FSETWIND CALL PRINT LDK HL,CURARRTBL ;Table of addresses of posay instructions RET PAGE ; +-----------------------------------------------+ ; | DISPLAY MENU ROUTINES | ; +-----------------------------------------------+ GETDIS: ;Display get configuration menu PROC LDK HL,GETMESS CALL PRINT ;Display menu LDK HL,GETINSTR ;Instructions CALL PRINT ;"Call" PRINT LDK HL,COPYRIGHT JMP PRINT ;Display copyright message ;RET SETDIS: ;Display set configuration menu PROC LDK HL,SETMESS CALL PRINT ;"Call" PRINT LDK HL,SET_INSTR CALL PRINT RET SAVEDIS: ;Display save configuration menu PROC LDK HL,SAVEPARM LD A,[HL] ANI NOT ROW ;Set to row 0 STO A,[HL] ;Always start save menu on row 0 LDK HL,SAVMESS CALL PRINT ;Display menu LDK HL,SAVEINST ;Instructions JMP PRINT ;"Call" PRINT ;RET PAGE FUNDIS: ;Display function key menu PROC LDK HL,FUN_PLATE CALL PRINT CALL SHOW_F_KEYS CALL SPACE_LEFT LDK HL,SUBINSTRitioning strings LDK B,4 ;Display 4 key definitions LDK C,10 ;Start with function key 11 LDK A,25 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments RET PAGE ARRDEF: ;Check for WS, CP/M or special arrow key definition ;ENTRY ;NONE ;EXIT ;HL ==> ASCII string for type of definition (WS, CP/M, or Special) ;A = 0 if CP/M or WS ;Z bit set if CP/M or WS PROC LDK A,10 CALL SET_HL ;Get HL = Start of arrow keys in table PUSH HL LDK DE,CPM_ARROWS LDK B,8 CALL COMPARE POP HL JRZ :CPM ;If CP/M arrow key definition LDK DE,WS_ARROWS LDK B,8 CALL COMPARE LDK HL,WS JRZ :WSORCPM ;If WordStar arrow key definition LDK HL,SPECIAL ORI 0FFH ;Indicate special definition RET :CPM: LDK HL,CPM :WSORCPM: XRA A ;Indicate WS or CP/M RET PAGE CURFUNTBL: ;Table of addresses of positioning strings for function key current settings display DW FKEY0 DW FKEY1 DW FKEY2 DW FKEY CALL PRINT RET ARRDIS: ;Display arrow key menu PROC LDK HL,ARR_PLATE CALL PRINT CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT LDK HL,SUBINSTR CALL PRINT RET CURDIS: ;Display cursor menu PROC LDK HL,CURMENU CALL PRINT CALL SHOW_CURSOR LDK HL,SUBINSTR CALL PRINT ;Display instructions RET PAGE BAUDDIS: ;Display baud rate menu PROC LDK HL,BAUDMENU CALL PRINT CALL SHOW_BAUD ;Display current baud rate LDK HL,SUBINSTR CALL PRINT RET PROTDIS: ;Display protocol menu PROC LDK HL,PROTMENU CALL PRINT CALL SHOW_PROT LDK HL,SUBINSTR CALL PRINT RET PAGE DEVDIS: ;Display device assignment menu ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,DEVMENU CALL PRINT CALL SHOW_DEV ;Display current device settings LDK HL,SUB3 DW FKEY4 DW FKEY5 DW FKEY6 DW FKEY7 DW FKEY8 DW FKEY9 CURARRTBL: ;Table of addresses of positioning strings for arrow key current settings DW UPKEY DW DOWNKEY DW RIGHTKEY DW LEFTKEY PAGE DISCON: ;Display console values ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,CUR_HDR CALL PRINT LD A,CURSOR_ATTRIB ;Get cursor attribute assignment SUB '0' LDK HL,CURTBL CALL LOOKUP ;Look up address of current cursor type ASCII string CALL PRLINE LDK HL,BACK_HDR CALL PRINT LDK HL,REVERSE ;Guess reverse video background LD A,BACK_ATTRIB CMP REVBACK JRZ :1 ;If it really is reverse video LDK HL,NORMAL ;If normal background :1: CALL PRINT LDK HL,CLIC_HDR ;Insert Key Click header CALL PRINT LD A,KEYCLICK CMP KCOFF ;Check for key click off LDK HL,OFF JRZ :2 ;If off LDK HL,ON :2: CALL PRINT LDK HL,HZ_HDR ;Move "External Monitor Frequency" into message CALL PRINT LD A,H"Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,PRNTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPAR: ;Display current parallel port settings PROC LDK HL,PARPARM STO HL,DEVPARM+EXITOFF ;Make sure device selection routine returns to parallel menu STO HL,INITPARM+EXITOFF ;and initialization string routine LDK HL,PPROT_HDR CALL PRINT ;Print "Protocol:" LD A,PPROT ORA A ;Set Z flag if Centronics protocol LDK HL,CENPROT JRZ :1 LDK HL,IEEEPROT :1: CALL PRINT LDK HL,DEV_HDR CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALERTZ CMP 50 ;Set Z flag if 50Hz LDK HL,FIFTYHZ JRZ :3 ;If 50 Hz LDK HL,SIXTYHZ :3: CALL PRINT LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,CRTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISMOD: ;Display modem port parameters PROC LDK HL,MODPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate routine will return to modem menu STO HL,PROTPARM+EXITOFF ;Make sure protocol returns to modem port STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display current protocol setting LDK HL,DEV_HDR L INIT_INIT ;Initialize initialization string display variables LDK HL,DPARINIT STO HL,CUR_POINTER ;Display current setting at DCONINIT LD A,PPROT ORA A JRNZ :IEEE ;If IEEE protocol LDK A,CENNUM ;Get string number LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET :IEEE: LDK A,IEEENUM ;Get string number LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string LDK HL,IEEE_HDR ;If IEEE protocol CALL PRINT ;Print "IEEE Address:" LDK DE,IEEEVAL LD A,IEEEADDR CALL BIN_ASC ;Put binary number in string LDK HL,IEEEPOS CALL PRINT ;Display current IEEE address RET PAGE DISGEN: ;Display general parameters PROC LDK HL,DEVTIM_HDR CALL PRINT ;Print "Device Timeout:" CALL PR_TIME ;Display current device timeout setting CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,MODNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPNTR: ;Display printer port parameters PROC LDK HL,PNTRPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate will return to printer menu STO HL,PROTPARM+EXITOFF ;Make sure protocol routine returns to printer menu STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display current protocol setting LDK HL,DEV_HDR CALL PRINT ;Print RET PAGE DISCLR: ;Display nothing PROC LDK HL,CURSET CALL PRINT ;Clear current settings RET PAGE ; +-----------------------------------------------+ ; | DRIVER UTILITY ROUTINES | ; +-----------------------------------------------+ DISP_SCR: ;Display current menu and all previous menus on same screen ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> Current menu parameter table PROC PUSH HL ;Save pointer CALL CLRALL ;Clear screen (except header) LD A,[HL] ANI LEFT_ON ;Check if on right side JRZ :1 ;If not on right side LDK DE,EXITOFF CALL GETVAL ;If on right side, display screen for left menu :1: CALL PREPMENU ;Prepare this menu CALL PRDIS ;Display current settings POP HL ;Restore pointer CALL SETCUR ;Position cursor RET PAGE SELTBL: ;Get address of menu parameter table which corresponds to current menu selection ;ENTRY ;HL ==> Current menu parameter tabcursor on selected row CALL PTROW ;Point to print string for current row LD A,[HL] INC HL PUSH HL ;Save 2nd byte in string CALL OUTCHAR ;Print first byte unhighlighted POP HL LD A,[HL] INC HL PUSH HL CALL OUTCHAR ;Print 2nd byte unhighlighted LD A,HIFLAG ORA A LDK HL,HIGHOFF JRZ :1 ;If turn off highlight LDK HL,HIGHON :1: CALL PRINT POP HL CALL PRLINE ;Display line LDK HL,HIGHOFF CALL PRINT ;Now turn off highlighting LDK A,CR CALL OUTCHAR ;Go back to beginning of device POP HL RET PAGE PTROW: ;Point to row to print ;ENTRY ;HL = Menu parameter table ;EXIT ;HL = Address of string to print PROC LD A,[HL] ANI ROW ;Get row number LDK DE,LINEOFF ADD HL,DE LD E,[HL] INC HL LD H,[HL] MOV L,E ;HL = Address of table of pointers CALL LOOKUP ;Get address of string RET PAGE GOROW: ;Go to menu row specified by menu parameter table ;ENTRY ;NONE ;Ele ;EXIT ;HL ==> Next menu parameter table PROC LD A,[HL] ANI ROW ;Get row number ADD A ;* 2 LDK E,SUBOFF ;Offset to submenu pointers ADD E ;A = Offset to submenu pointer for current row MOV E,A LDK D,0 ;DE = Offset to submenu pointer CALL GETVAL ;Get value from parameter table RET PAGE PRDIS: ;Call routine to display current settings for menu selection ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> Current menu parameter table ;Window set to "current settings" window PROC PUSH HL ;Save current table pointer CALL SELTBL ;HL ==> Submenu table LDK DE,DISOFF ;Offset to current settings display routine CALL GETVAL ;Get DE = value in offset location of parameter table LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" display routine :RET: POP HL RET PAGE PREPMENU: ;Prepare menu display ;ENTRY ;HL ==> Menu parameter table ;EXIT ;HL ==> Menu parameter table PROC PUSH HLXIT ;NONE PROC PUSH HL CALL GOWIND ;Move to the window CALL GETSTEP ;Get step size between menu selections MOV B,A ;B = Step size LD A,[HL] ;Get row number within this window ANI ROW DEC B ;B = Step size - 1 JRZ :1 ;If step size = 1 MOV C,A ;C = Row number :LOOP1: ADD C DJNZ :LOOP1 ;Row * Step size :1: MOV B,A ;B = Row * Step size CALL GETSTROW ;A = Start row ADD B JRZ :EXIT ;Done if row 0 MOV B,A ;B = Start row + (Row * Step size) :LOOP: PUSH BC ;Save number of rows to move down LDK A,MCDOWN CALL OUTCHAR ;Move down one space POP BC DJNZ :LOOP ;If more rows :EXIT: POP HL RET PAGE GOWIND: ;Go to window in menu parameter table ;ENTRY ;HL ==> Menu parameter table ;EXIT ;HL ==> Menu parameter table PROC PUSH HL LDK DE,WINDOFF ;DE = Offset to window number ADD HL,DE ;HL ==> Window number LD A,[HL] ;A = Window number CALL SETWIND ;Go to submenu window POP ;Save pointer CALL GOWIND ;Go to correct window LDK DE,PREPOFF ;Offset to menu preparation routine ADD HL,DE ;HL ==> menu prep routine address LD A,[HL] INC HL LD H,[HL] MOV L,A ;HL = Menu prep routine address LDK DE,:RET PUSH DE ;Set return address JMP [HL] ;"Call" routine :RET: POP HL CALL SETCUR ;Highlight selection RET PAGE SETCUR: ;Position cursor to selected window and row ;ENTRY ;HL ==> Menu parameter table ;EXIT ;HL ==> Menu parameter table ;Cursor positioned PROC PUSH HL ;Save LDK HL,CUROFF ;Turn cursor off CALL PRINT POP HL ORI 0FFH STO A,HIFLAG CALL HIGHLIGHT ;Highlight this selection PUSH HL LDK HL,CURON ;Turn cursor back on CALL PRINT POP HL ;Restore RET PAGE HIGHLIGHT: ;Highlight selected line ;ENTRY ;HL ==> Menu parameter table ;HIFLAG = 0 to unhighlight, 0FFH to highlight ;EXIT ;HL ==> Menu parameter table PROC PUSH HL CALL GOROW ;Position  HL RET PAGE SETWIND: ;Set selected window on and move to home position of that window ;ENTRY ;A = Window number ;EXIT ;Window set PROC STO A,WINDOW ;Set window number into SWIND string LDK HL,SWIND CALL PRINT ;Send "set window" ESC sequence RET PAGE GETVAL: ;Get value from parameter table ;ENTRY ;HL ==> Table ;DE = Offset ;EXIT ;HL = Value at offset PROC ADD HL,DE ;HL = Address + table offset LD A,[HL] INC HL LD H,[HL] ;DE = Value in table at offset MOV L,A RET PAGE GETSTROW: ;Get row number of start row of current menu ;ENTRY ;HL ==> Menu parameter table ;EXIT ;A = Start row ;HL ==> Menu parameter table PROC PUSH HL LDK DE,SROWOFF ;Offset to start row in table ADD HL,DE ;HL ==> Start row LD A,[HL] ;A = Start row POP HL RET PAGE GETSTEP: ;Get step size between menu selections ;ENTRY ;HL ==> Menu parameter table ;EXIT ;A = Step size ;HL ==> Menu parameter table PROC PUSH HL If more JR :DONE ;If all characters expanded :NONE: LD A,TEMP LDK HL,CEOL_STR ORA A JRZ :2 ;If don't display none message LDK HL,NONE_STR :2: CALL PRINT ;Display message :DONE: LK HL,CEOL_STR ;Clear to end of line CALL PRINT RET RET_EXPANSION: DB '' ESC_EXPANSION: DB '' CTRL_EXPANSION: DB '^' DB 'A' ;Spot for control character CEOL_STR: DB ESC,'T',0 NONE_STR: DB ESC,')','',ESC,'(',0 PAGE DISPLAY: ;Display character for key definition and intiialization string ;ENTRY ;A = Character ;B = Maximum number of characters to display ;EXIT ;B = Remaining number of characters to display PROC MOV C,A ;Save character MOV A,B ORA A RZ ;Don't display anything if maximum = 0 MOV A,C ;A = Character CMP 20H JRC :CONTROL ;If control character PUSH BC CALL OUTCHAR ;Display character POP BC DEC B ;Decrement maximum number of characters left to display RET ;CONTROL CH LDK DE,STEPOFF ;Offset to step size in table ADD HL,DE ;HL ==> Step size LD A,[HL] ;A = Step size POP HL RET PAGE SHOW_F_KEYS: LDK HL,FPOSTBL ;Table of addresses of function key positioning strings LDK B,10 ;10 keys LDK C,0 ;Start with key 1 LDK A,70 ;Maximum display length CALL PRINTFKEY ;Display function keys RET SHOW_A_KEYS: LDK HL,APOSTBL ;Table of addresses of arrow key positioning strings LDK B,4 ;4 keys LDK C,10 ;Start with function key 11 LDK A,66 ;Maximum display length CALL PRINTFKEY ;Display arrow keys RET FPOSTBL: DW POS_0 DW POS_1 DW POS_2 DW POS_3 DW POS_4 DW POS_5 DW POS_6 DW POS_7 DW POS_8 DW POS_9 APOSTBL: DW POS_UP DW POS_DOWN DW POS_RIGHT DW POS_LEFT PAGE SHOW_KEY: ;PRINT OUT THE STRING FOR THE GIVEN FUNCTION OR ARROW KEY ; AT THE CURRENT CURSOR POSITION. ;ENTRY ;A = Key to expand (0-13) ;B = Maximum number of characters to display ; (0FFH implies ARACTER :CONTROL: LDK HL,RET_EXPANSION ;String to display for RETURN CMP CR ; ? JRZ :1 ;If return LDK HL,ESC_EXPANSION CMP ESC ; ? JRNZ :2 ;If ESC :1: PUSH BC ;Save maximum number of bytes PUSH HL ;Save address of string to display LDK HL,HALFON CALL PRINT ;Turn on half intensity POP HL ;Restore string address POP BC LDK C,5 ;C = Length of string JR :LOOP :2: LDK HL,CTRL_EXPANSION LDK C,2 ADD A,40H ;Convert to ASCII control letter STO A,CTRL_EXPANSION+1 :LOOP: PUSH BC ;Save number of characters left to display PUSH HL ;Save pointer to string to display LD A,[HL] CALL OUTCHAR POP HL POP BC INC HL ;Next position in string DEC B ;Decrement maximum number of characters left to display JRZ :DONE ;Return if maximum reached DEC C ;Decrement count of number of characters left in string JRNZ :LOOP ;If more characters left in string :DONE: PUSH BC LDK HL,HALFOFF CALL no maximum) ;C = None flag -- determines if should be displayed when an empty string is found ; 0 = No, 0FFH = Yes ;EXIT ;NONE PROC PUSH AF ;Save key MOV A,C STO A,TEMP ;Save none flag MOV A,B STO A,LIMFLAG ;Save limit flag (0ffh = no limit) POP AF PUSH BC CALL SET_HL ;POINT HL TO # OF BYTES IN KEY POP BC LD A,[HL] ORA A JRZ :NONE ;If length is 0 MOV D,A ;D = Number of characters to expand INC HL ;POINT TO FIRST CHARACTER :LOOP: LD A,[HL] INC HL ;GET CHARACTER AND POINT TO NEXT PUSH DE ;Save number of characters left to expand PUSH HL ;Save position in string CALL DISPLAY ;Display a character POP HL POP DE LD A,LIMFLAG CMP 0FFH JRZ :1 ;If no limit, set B back to 0ffh MOV A,B ;Maximum number of characters left to display ORA A RZ ;If space used up :1: MOV B,A ;Restore maximum number of bytes to display DEC D ;Number of characters left to expand JRNZ :LOOP ;PRINT ;Turn half intensity off POP BC RET PAGE SET_HL: ;SET HL TO POINT TO THE Nth ENTRY IN THE KEY TABLE ;A = ENTRY # (1 = FUNCTION KEY 1, 0 = F. KEY 0, 11 = UP ARROW) PROC PUSH BC ;SAVE REGISTER LD HL,KEY_TABLE ;POINT TO START OF TABLE ORA A JRZ :1 ;IF DONE LDK B,0 ;Set high byte to 0 for addition :LOOP: LD C,[HL] ;GET # OF ENTRIES FOR THIS KEY INC C ;Count length byte ADD HL,BC ;Add length of this to address so far DEC A JRNZ :LOOP ;IF NOT DONE, ADD NEXT LENGTH :1: POP BC ;RESTORE REGISTER RET SPACE_LEFT: LD A,NUMENT ;A = Number of entries (strings) CALL SET_HL ;Get address of first free position DEC HL ;HL = Last used position EX HL,DE ;DE = Last used position LD HL,END_KEY_TABLE ;HL = Last available position used ORA A ;Clear carry flag SBC HL,DE ;L = Number of spaces left MOV A,L STO A,NUM_BLANKS ;Save new number of spaces left LD HL,POS_SPACE CALL PRINT ;POSITION CURvice flags SLA C ;Length of each logical entry is 2 LDK B,0 ;BC = Table offset LDK HL,DEVFLGS ;Logical device assignment table ADD HL,BC ;Logical device entry SUB 8 ;Check if high or low byte of flags JRNC :1 ;If low byte INC HL ;Set HL to high byte ADD A,8 ;Get high bit number ;Get mask A = Bit in logical device table :1: PUSH HL ;Save flag byte location LDK HL,DMASKTBL ;Table of masks MOV E,A LDK D,0 ADD HL,DE LD A,[HL] ;A = Mask POP HL ;Set or clear bit POP BC MOV C,A ;Save mask MOV A,B ;A = Set/Clear flag ORA A ;Z bit set if "clear bit" selected MOV A,C ;Restore mask JRNZ :2 ;If "set bit" XOR 0FFH ;If "clear bit" AND [HL] ;Clear bit JR :3 :2: OR [HL] ;Set bit :3: STO A,[HL] RET ;If right bit DMASKTBL: ;Device mask table of bit masks DB 1000_0000B ;Physical device 0 mask DB 0100_0000B ;Device 1 DB 0010_0000B ;Device 2 DB 0001_0000B ;Device 3 SOR LD A,NUM_BLANKS ;GET NUMBER OF SPACES LEFT LDK DE,NUMBUFF CALL BIN_ASC XRA A STO A,[DE] LDK HL,NUMBUFF CALL PRINT RET PAGE PRINTFKEY: ;Display function key (or arrow key) setting ;ENTRY ;HL = Table of positioning string addresses ;A = Maximum line length to display ;B = Number of keys to display ;C = First key number to display PROC STO A,LENGTH ;Save maximum length to display :LOOP: LD E,[HL] INC HL LD D,[HL] ;DE = Positioning string address INC HL PUSH HL ;Save next positioning string address PUSH BC ;Save current key number and number of keys left EX HL,DE ;HL = Positioning string address CALL PRINT ;Position cursor POP BC PUSH BC LD A,LENGTH MOV B,A ;B = maximum number of characters to display MOV A,C ;A = Current key to display LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display key settings POP BC POP HL INC C ;Next key DJNZ :LOOP ;If more DB 0000_1000B ;Device 4 DB 0000_0100B ;Device 5 DB 0000_0010B ;Device 6 DB 0000_0001B ;Device 7 PAGE BAUDTBL: ;Baud rate table DW BAUD0 DW BAUD1 DW BAUD2 DW BAUD3 DW BAUD4 DW BAUD5 DW BAUD6 DW BAUD7 DW BAUD8 DW BAUD9 DW BAUD10 DW BAUD11 DW BAUD12 DW BAUD13 DW BAUD14 DW BAUD15 BAUD0: DB ' NONE ',0FFH,0 PAGE FINDPHYS: ;Find physical device table entry ;ENTRY ;A = Device number ;EXIT ;HL ==> Device table entry PROC ;Get offset into device table LDK B,DNTRYLEN-1 ;Length of entry MOV C,A :LOOP: ADD C DJNZ :LOOP ;A = Device number * Entry length ;Get HL ==> Entry MOV C,A LDK B,0 ;BC = Table offset LDK HL,DEVTBL ADD HL,BC ;HL ==> Device table entry RET FINDSHAD: ;Find shadow table entry ;ENTRY ;A = Device number ;EXIT ;HL ==> Shadow table entry PROC ;Get offset into shadow table LDK B,SHADLEN-1 ;Length of shadow table entry (-1) MOV C,A ;C = devic keys to print RET PAGE DEVASGN: ;Check if logical device is assigned to physical device ;ENTRY ;A = Physical device number ;C = Logical device number ;EXIT ;C bit set if assigned PROC ;Get logical device flags SLA C ;Length of each logical entry is 2 LDK B,0 ;BC = Table offset LDK HL,DEVFLGS ;Logical device assignment table ADD HL,BC ;Logical device entry SUB 8 ;Check if high or low byte of flags JRNC :1 ;If low byte INC HL ;Set HL to high byte ADD A,8 ;Get high bit number :1: LD C,[HL] ;Get flag byte INC A ;A = Physical device number + 1 :2: RLC# C ;Get bit in carry DEC A JRNZ :2 ;If not at right bit RET ;If right bit ;Carry flag = 1 if device assigned PAGE SETLOG: ;Set or clear physical device bit in logical device flag ;ENTRY ;A = Physical device number ;C = Logical device number ;B = Set/Clear flag (0 = Clear, 0FFH = Set) ;EXIT ;NONE PROC PUSH BC ;Save flag ;Get logical dee number :LOOP: ADD A,C ;A + Device number DJNZ :LOOP ;Get SHADLEN * Device number ;Get HL ==> Entry MOV C,A LDK B,0 LDK HL,SHADTBL ADD HL,BC ;HL ==> Entry RET PAGE FUNINIT: ;Initialize variables for displaying function and arrow keys ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,FUNENT STO A,NUMENT ;Set number of entries LDK HL,FUN_TABLE STO HL,KEY_TABLE ;Set start of key table LDK HL,END_FUN STO HL,END_KEY_TABLE ;Set end of key table LDK HL,FREMAIN STO HL,POS_SPACE ;Set place to display number of bytes remaining RET INIT_INIT: ;Initialize variables to edit initialization strings ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,INITENT STO A,NUMENT ;Set number of entries (strings) in table LDK HL,INIT_TBL STO HL,KEY_TABLE ;Set start address of table LDK HL,INIT_TBL+255 STO HL,END_KEY_TABLE ;Set end address of table LDK HL,IREMAIN STO HL,POS_SPACE ;Set address of positioning string for printing space remainintion cursor CALL PR_PROT ;Print protocol LDK HL,HALFOFF CALL PRINT ;Turn off half intensity RET PAGE SHOW_DEV: ;Display current device assignment settings ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,DEV_POS CALL PRINT CALL PR_DEV RET PAGE PR_BAUD: ;Print baud rate of currently selected port ;ENTRY ;Cursor postitioned ;EXIT ;NONE PROC CALL GETBAUD ;Get HL ==> Current device baud rate byte LD A,[HL] ;A = Baud rate value LDK HL,BAUDTBL CALL LOOKUP ;Get HL ==> ASCII baud rate string CALL PRLINE ;Display current baud rate RET PAGE PR_DEV: ;Print device assignment for currently selected port ;ENTRY ;NONE ;EXIT ;NONE PROC CALL GETDEV ;A = Physical device number LDK C,0 ;C = Logical device number to check MOV B,A :LOOP: PUSH BC ;Save physical and logical device numbers MOV A,B ;A = Physical device number CALL DEVASGN ;Check if physicaldevice is assigned to this logical device g RET PAGE GETBAUD: ;Point to baud rate byte in device table ;ENTRY ;NONE ;EXIT ;HL ==> Baud rate byte for currently selected device PROC CALL GETDEV ;Get device number of currently selected port CALL FINDPHYS ;Get HL ==> Device table entry LDK BC,DNAMELEN+1 ADD HL,BC ;HL ==> Baud rate byte RET GETMODE: ;Point to mode byte in device table ;ENTRY ;NONE ;EXIT ;HL ==> Mode byte for currently selected device PROC CALL GETDEV ;Get device number CALL FINDPHYS ;Get HL ==> Device table entry LDK BC,DNAMELEN ADD HL,BC RET ;HL ==> Mode byte GETSFLAG: ;Point to flag byte in shadow table ;ENTRY ;NONE ;EXIT ;HL ==> Flag byte for shadow table PROC CALL GETDEV ;GET DEVICE NUMBER CALL FINDSHAD ;Point to shadow table LDK BC,SFLAG_OFF ADD HL,BC RET ;HL ==> Flag byte in shadow table PAGE GETDEV: ;Get device number of currently selected PORT ;ENTRY ;NONE ;EXIT ;A = Device PROC LD A,SETPARM ;Check whichPOP BC JRC :SET ;If assigned, print message INC C ;Check next logical device MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more logical devices to check :SET: MOV A,C ;A = Logical device number LDK HL,DMESS_TBL ;Look up device assignment message in table CALL LOOKUP CALL PRINT ;Display device assignment message RET DMESS_TBL: ;Device assignment message table DW TERM ;CONIN ==> Terminal message DW TERM ;CONOUT ==> Terminal message DW OTHER ;AUXIN: ==> Other message DW OTHER ;AUXOUT: ==> Other message DW PRINTER ;LST: ==> Printer message DW NOTASSIGNED ;Not assigned PAGE PR_PROT: ;Print protocol for currently selected port PROC CALL GETMODE LD A,[HL] ANI XON_MASK ;Set Z bit if No protocol LDK HL,NOPROT JRZ :DONE ;If no protocol CALL GETSFLAG LD A,[HL] ANI ETX_MASK ;Set Z flag if XON/XOFF protcol LDK HL,XONPROT JRZ :DONE ;If XON/XOFF protocol LDK HL,ETXPROT ;If ETX/ACK protocol :DONE:  row was selected ANI ROW CMP MODROW ;Set Z flag if modem port JRZ :MOD ;If modem CMP PRNTROW JRZ :PRNT ;If printer port CMP CONROW LDK A,CRTNUM RZ ;If CRT device LD A,PPROT ORA A LDK A,CENNUM RZ ;If Centronics device LDK A,IEEENUM RET ;If IEEE device :MOD: LDK A,MODNUM RZ ;If modem device :PRNT: LDK A,PRNTNUM ;If printer device RET PAGE Y_BASE EQU 32 X_BASE EQU 32 CUR_POS: DB ESC,'s3',ESC,'=',32+1,32+0,0 ;Current cursor type display position SHOW_CURSOR: LK HL,CUR_POS CALL PRINT ;POSITION CURSOR AT TOP LD A,CURSOR_ATTRIB SUB '0' LDK HL,CURTBL CALL LOOKUP ;Look up address of current cursor type ASCII string CALL PRLINE RET PAGE SHOW_BAUD: ;Display current baud rate setting PROC LDK HL,BAUD_POS CALL PRINT ;Position cursor CALL PR_BAUD ;Print baud rate RET SHOW_PROT: ;Display current protocol settings PROC LDK HL,PROT_POS CALL PRINT ;Posi CALL PRINT ;Print protocol message RET PAGE INIT_PPROT: ;Initialize parallel protocol flag ;If the IEEE device is assigned to any logical device, then come up ;with that IEEE protocol, otherwise start by displaying Centronics protocol ;ENTRY ;NONE ;EXIT ;NONE PROC LDK C,0 ;First logical device to check LDK B,IEEENUM ;Check for IEEE assignments :LOOP: PUSH BC MOV A,B CALL DEVASGN ;Check if IEEE device assigned to this physical device POP BC JRC :IEEE ;If IEEE device assigned INC C MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more devices to check XRA A ;If IEEE not assigned, show CEN LDK B,NUMCEN ;Maximum row number for Centronics menu JR :1 :IEEE: ORI 0FFH ;If IEEE assigned, show IEEE LDK B,NUMIEEE ;Maximum row number for IEEE menu :1: STO A,PPROT MOV A,B STO A,PARPARM+1 ;Set maximum row number RET PAGE PR_TIME: ;Print device timeout in seconds (at current cursor position) ;ENTRY ;NONE ;y) are ignored ;If no valid cursor attributes are assigned, the default value is steady block ; ROM SETTING SETUP SETTING DB '0' ;0 = Invisible Invisible DB '1' ;1 = Blink Blinking block DB '4' ;2 = Underline Steady underline DB '3' ;3 = Underline, Blink Blinking underline DB '2' ;4 = Half intensity Steady block DB '1' ;5 = Half intensity, Blink Blinking block DB '4' ;6 = Hf intensity,Underline Steady underline DB '3' ;7 = Hf intensity,Underline Blinking underline ; Blink DB '2' ;8 = Block Steady block DB '1' ;9 = Block, Blink Blinking block DB '2' ;10 = Block, Underline Steady block DB '1' ;11 = Block, Underline,Blink Blinking block DB '2' ;12 = Block, Half intensity Steady block DB '1' ;13 = Block, Half intenisty Blinking block ; Blink DB '2' ;14 = Block, Half intensity Steady block ; Underline DB '1' ;15 = Block, Half intensity Blinking block ; Underline, BlinEXIT ;NONE PROC LD A,TIMEOUT ;Get timeout in units of 5 seconds SRL A ;Get timeout in units of 10 seconds PUSH AF ;Save carry flag (set if there is an odd 5 sec unit) ; and Z flag (set if no tens) LDK DE,NUMBUFF ;ASCII string buffer CALL BIN_ASC ;Get ASCII value for number 10 sec units in timeout POP AF JRNZ :1 ;If 10 or more seconds LDK A,' ' ;If less than 10 seconds DEC DE ; replace 0 left by BIN_ASC STO A,[DE] ; with a space INC DE :1: ;Carry flag preserved (set if there is an odd 5 sec unit) LDK A,'0' ;"Guess" one's digit is 0 JRNC :2 ;If one's digit is 0 LDK A,'5' ;If one's digit is 5 :2: STO A,[DE] ;Put one's digit in string INC DE XRA A STO A,[DE] ;Mark end of string LDK HL,NUMBUFF CALL PRINT ;Display ASCII value for timeout (except one's digit) RET PAGE CONSET: ;Convert console values from ROM encoded form to SETUP form ;ENTRY ;CURSOR_ATTRIB, BACK_ATTRIB, KEY_CLICK sk LOOK_BA: ;Background attribute look up table DB NORMBACK ;0 = No special background (amber characters on black background) DB NORMBACK ;1 = Blinking DB NORMBACK ;2 = Underline DB NORMBACK ;3 = Blinking, underline DB NORMBACK ;4 = Half intensity DB NORMBACK ;5 = Half intensity, blink DB NORMBACK ;6 = Half intensity, underline DB NORMBACK ;7 = Half intensity, underline, blink DB REVBACK ;8 = Reverse video DB REVBACK ;9 = Reverse video, blink DB REVBACK ;10 = Reverse video, underline DB REVBACK ;11 = Reverse video, underline, blink DB REVBACK ;12 = Reverse video, half intensity DB REVBACK ;13 = Reverse video, half intensity, blink DB REVBACK ;14 = Reverse video, half intensity, underline DB REVBACK ;15 = Reverse video, half intensity, underline, blink PAGE VERIFY: ;Verify that version is valid for this verison of setup ;ENTRY ;HL = Version number ;EXIT ;C bit set if error PROC LDK DE,VALVER ;Lowest validet to ROM form ;EXIT ;CURSOR_ATTRIB, BACK_ATTRIB KEY_CLICK set to SETUP form PROC ;Get cursor attributes XRA A ;Clear high nibble of A LDK HL,CURSOR_ATTRIB RLD ;Lower nibble of A gets high nibble of CURSOR_ATTRIB MOV C,A LDK B,0 ;BC = Look up table offset LDK HL,LOOK_CA ;Look up cursor attribute table ADD HL,BC LD A,[HL] STO A,CURSOR_ATTRIB ;Save SETUP form of cursor attributes ;Get background attributes XRA A LDK HL,BACK_ATTRIB RLD ;lower nibble of A gets higher nibble of BTYPE MOV C,A LDK B,0 LDK HL,LOOK_BA ADD HL,BC LD A,[HL] STO A,BACK_ATTRIB ;Save SETUP form of background attributes ;Get key click value LDK HL,KEYCLICK LD A,[HL] ORA A ;Set Z flag if key click off LDK A,KCOFF ;A = Off character JRZ :DONE ;If off LDK A,KCON ;A = On character :DONE: STO A,[HL] ;Save key click value RET PAGE LOOK_CA: ;Look up table for CURSOR_ATTRIB ;Invalid cursor attributes (eg half intensit version number ORA A ;Clear carry SBC HL,DE ;Set C bit if source too old RET PAGE COMPARE: ;Compare two strings ;ENTRY ;HL ==> First string ;DE ==> Second string ;B = Length to compare ;EXIT ;Z bit set iff strings match PROC MOV A,B ORA A RZ ;Return match if length = 0 :LOOP: LD A,[DE] CMP [HL] RNZ ;Done if no match INC DE INC HL DJNZ :LOOP ;If more bytes to check RET ;Return Z bit set if strings match PAGE INITDEV: ;Initializes all physical devices changable from setup ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,DEVINI STO A,BIOSFUNC ;Set function number LDK B,NUMSDEV ;Number of devices changeable from setup :LOOP: PUSH BC ;Save device number MOV C,B DEC C STO BC,BIOSBCREG ;Set device number LDK C,DIRBIOS LDK DE,BIOSPB ;BIOS parameter block CALL BDOS ;"Direct" BIOS call POP BC DJNZ :LOOP RET PAGE GETDTBL: ;Get address of BIOS device table ;ENTRY ;NONE ;EXIT ,[DE] INC DE RET PAGE DIVIDE: ;Divide A/C ;ENTRY ;A = Dividend ;C = Divisor ;EXIT ;A = Quotient ;C = Remainder PROC LDK B,-1 ;Initialize count :LOOP: INC B ;Count SUB C JRNC :LOOP ;Loop until too many subtracted ADD A,C ;Restore remainder MOV C,A ;C = Remainder MOV A,B ;A = Quotient RET PAGE ASC_BIN: ;Convert an ASCII string to a binary number (number must be less than 256) ;ENTRY ;HL => String ;A = String length ;EXIT ;A = Binary value ;HL => Next position in string PROC ORA A RZ ;Done if string length = 0 MOV B,A ;B = String length XRA A ;Start with 0 :LOOP: CALL XTEN ;Multiply A * 10 MOV C,A ;C = Number so far LD A,[HL] SUB '0' ;Get next digit ADD A,C ;Add new digit to sum so far INC HL ;Point to next digit DJNZ :LOOP ;Get next digit RET PAGE XTEN: ;Multiply A * 10 ;ENTRY ;A = Number to multiply ;EXIT ;A = A * 10 ;Registers preserved;HL = Device table address PROC LDK A,CHRTBL ;BIOS Device table function number STO A,BIOSFUNC ;Set function number LDK C,DIRBIOS ;Direct BIOS call LDK DE,BIOSPB ;BIOS Parameter block CALL BDOS RET GETSTBL: ;Get address of BIOS shadow table (in bank 0) ;ENTRY ;NONE ;EXIT ;HL = Shadow table address PROC CALL GETDTBL ;Get address of device table DEC HL ;Back up to look up address of shadow table LD A,[HL] ;Get high byte DEC HL LD L,[HL] ;Get low byte MOV H,A ;HL = Address RET PAGE LOOKUP: ;Look up address in table ;ENTRY ;HL = Table address ;A = Item number ;EXIT ;HL = Address stored in table PROC ADD A,A ;A = Offset in bytes MOV C,A LDK B,0 ;BC = Offset ADD HL,BC LD A,[HL] INC HL LD H,[HL] MOV L,A ;HL = Contents of table RET PAGE CURTBL: ;Table of addresses of cursor type ASCII strings DW CTYPE0 DW CTYPE1 DW CTYPE2 DW CTYPE3 DW CTYPE4 PAGE BIN_A PROC PUSH BC ;Save LDK B,9 MOV C,A :LOOP: ADD A,C DJNZ :LOOP POP BC ;Restore RET ;A * 10 PAGE GET_DIGIT: ;Input a digit ;ENTRY ;A = Highest digit to input ;EXIT ;A = Digit, ENTER character, or LEFT character ; If character is a digit, it is displayed, otherwise it is just returned PROC INC C ;C = 1 more than maximum allowable :LOOP: PUSH BC ;Save maximum digit CALL GET_CHAR POP BC ;Restore maximum digit CPI ENTER RZ ;Return if ENTER CPI LEFT RZ ;If backspace CPI '0' JRC :LOOP ;If not a digits CMP C JRNC :LOOP ;If not an allowable digit PUSH AF CALL OUTCHAR ;Display digit POP AF RET ;Return A = character PAGE BANKMOVE: ;Move data between any two banks ;ENTRY ;HL = Source address ;DE = Destination address ;BC = Length ;SRCBANK = Source bank mask ;DESTBANK = Destination bank mask ;EXIT ;HL = Next source address ;DE = Next destination address PROC SC: ;Convert a 1-byte binary number to a base-10 ASCII number ;Inserts leading spaces ;ENTRY ;A = Number ;DE ==> Location to store number ;EXIT ;DE ==> Next location (Start location + 3) PROC MOV B,A XRA A STO A,DIGFLAG ;Set to "hundred's digit displayed" MOV A,B LDK C,100 CALL DIVIDE ;Get A/C ;Returns A = quotient, C = remainder ADD A,'0' ;Convert to ASCII digit CPI '0' JRNZ :HUND ;Store digit ORI 0FFH STO A,DIGFLAG ;Indicate no hundreds digit LDK A,' ' :HUND: STO A,[DE] ;Store hundreds digit INC DE MOV A,C ;Get remainder from divide by 100 LDK C,10 CALL DIVIDE ;Divide by 10 ADD A,'0' ;Convert to ASCII digit CMP '0' JRNZ :TENS ;Store digit LD A,DIGFLAG ORA A LDK A,'0' JRZ :TENS ;If there was a hundred's digit, display ten's 0 LDK A,' ' ;If no hundred's digit, insert a space for ten's 0 :TENS: STO A,[DE] ;Save tens digit INC DE :ONES: MOV A,C ADD A,'0' STO A ;Switch stacks to a high memory stack STO SP,SAVSTK ;Save current stack pointer LDK SP,BIOSTK ;Set high memory stack ;Call high memory bank move routine BMOVE: CALL 0000 ;Address filled in during initialization ;Restore stack LD SP,SAVSTK RET PAGE READSEC: ;Read a sector from disk ;ENTRY ;SDISK set (0 for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector ;EXIT ;Sector read to DISKBUFF ;Z bit set if no error PROC PUSH AF ;Save # sides 840928 XRA A STO A,RWFLAG ;Indicate read POP AF ;Restore # sides 840928 JMP RWSEC ;"Call" Read/Write Sector ;RET PAGE WRITESEC: ;Write a sector to disk ;ENTRY ;SDISK set (O for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector PROC PUSH AF ;Save # sides 840928 LDK A,0FFH STO A,RWFLAG ;Indicate write POP AF ;Restore # sides 840928 JMP RWSEC ;"Call" Read/Write Sector  SAVSEC, SAVTRK, DMABANK, DMADR set PROC LDK E,ROMWRITE JMP ROMJUMP ;RET SENDEN: ;Call ROM sense density routine PROC LDK E,ROMSENDEN JMP ROMJUMP ;RET PAGE BEEP: ;Saves HL PUSH HL LK A,'G'-040h CALL OUTCHAR POP HL RET CLS: ;Clear screen LK A,'Z'-040h CALL OUTCHAR RET CLRALL: ;Clear full display screen PUSH HL ;Save HL LDK A,'1' CALL SETWIND ;Set window to full display screen CALL CLS POP HL ;Restore HL RET PAGE GET_CHAR: ;Input a character ;EXIT ;A = Character LK E,0FFh LK C,6 CALL BDOS CMP 0 JRZ GET_CHAR RET OUTCHAR: ;Output a character ;ENTRY ;A = Character MOV E,A LD C,2 CALL BDOS RET PAGE PRINT: ;Output a string (end marker = 0) ;ENTRY ;HL ==> String LD A,[HL] ORA A RZ ;0 ends string INC HL CMP 0FFH JRZ PRINT ;Ignore 0FFH PUSH HL CALL OUTCHAR POP HL JR PRINT PRLINE: ;Output a string (end mar ;RET PAGE RWSEC: ;Read or Write a sector to disk ;ENTRY ;RWSEC set (0 for read, 0FFH for write) ;SDISK set (0 for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector PROC STO A,:LSIDE ;Save side flag locally 840928 PUSH BC ;Save track and sector CALL SENDEN ;Check density POP BC ;Restore track and sector JNZ :RERR ;Read error LD A,SAVTYP ;Check for double density RRC A JRC :SERR ;If single density, then not system tracks LD A,:LSIDE ;Load side flag 840928 OR A ; 840928 LD A,SAVTYP ;Load savtyp 840928 JRZ :SS ;It's ssdd 840928 ; SBIT 1,A ;Set side bit 840928 JR :GO ;Go for it 840928 ; :SS: CBIT 1,A ;Reset side bit 840928 :GO: STO A,SAVTYP ;Save savtyp it back 840928 MOV A,C STO A,SAVSEC ;Set sector MOV A,B STO A,SAVTRK ;Set track IN BANK_PORT STO A,DMABANK ;Set DMA bank LDK HL,DISKBUFF ;Set DMA address STO HL,DMADR LDK B,1 ;Reker = 0FFH) ;ENTRY ;HL ==> String ;EXIT ;NONE PROC LD A,[HL] CMP 0FFH RZ ;0FFH ends string INC HL ORA A JRZ PRLINE ;Ignore 0 PUSH HL CALL OUTCHAR POP HL JR PRLINE PAGE ROMJUMP: ;Jump to ROM ;ENTRY ;E = Jump table offset ;HL,BC,A = ROM parameters PROC LD IX,RJ_ADDR ;IX = BIOS jump to ROM jump JMP [IX] ;RET RETPROC: RET PAGE ;***** MENU PARAMETER TABLES ;GET CONFIGURATION MENU GETPARM: DB 00 ;Flags = OK to move left DB 3 ;Maximum row number DB '6' ;Window number DW GETDIS ;Get configuration menu display DW RETPROC ;Display current settings routine DB 04 ;Start row of menu DB 01 ;Step size between menu selections DW GETLINES ;Table of addresses of menu line strings DW EXITPARM ;Previous menu = Main menu DW GETMPARM ;Get configuration from memory DW GETDPARM ;Get from drive A DW GETDPARM ;Get from drive B DW EXITPARM ;Exit to CP/M PAGE ;Sad 1 sector LD A,RWFLAG ORA A JRZ :READ ;If read CALL WRITE JRNZ :WERR ;Operation complete RET :READ: CALL READ ;Call ROM's read routine RZ ;If no error ;Error reporting :RERR: LDK HL,READERR CALL ERROR ;Display Read error message JR :ERR :WERR: LDK HL,WRTERR CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR ;Display not a system disk CALL ERROR :ERR: ORI 0FFH ;Set error flag RET :LSIDE: DS 1 ;Local side flag stg 840928 PAGE ERROR: ;Display error message and prompt for ESC ;ENTRY ;HL = Error message address ;EXIT ;NONE PROC CALL PRINT ;Display error message :LOOP: CALL GET_CHAR CMP ESC JRNZ :LOOP ;Wait for ESC RET PAGE READ: ;Call ROM routine to read a sector ;ENTRY ;B = Number of sectors to read ;SDISK, SAVSEC, SAVTRK, DMABANK, DMADR set PROC LDK E,ROMREAD JMP ROMJUMP ;RET WRITE: ;Call ROM routine to write a sector ;ENTRY ;B = Number of sectors to read ;SDISK,ET CONFIGURATION MENU SETPARM: DB RHT_ON ;Flags = Can't move left or right DB 6 ;Maximum row number DB '2' ;Window number DW SETDIS ;Set configuration menu display DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW SETLINES ;Table of addresses of menu line strings DW SAVEPARM ;Previous menu = Main menu DW KEYPARM ;Key definition menu DW CONPARM ;Console parameters menu DW MODPARM ;Modem port parameters DW PNTRPARM ;Printer port parameters DW PARPARM ;Parallel port parameters DW GENPARM ;General parameters DW SAVEPARM ;Exit to save menu ;SAVE CONFIGURATION MENU SAVEPARM: DB 00 ;Flags = OK to move left DB 4 ;Maximum row number DB '6' ;Window number DW SAVEDIS ;Save configuration menu display DW DISCLR ;Display current settings routine DB 04 ;Start row of menu DB 01 ;Step size between menu selections DW SAVELINES ;Table of aw number DB '1' ;Window number DW FUNDIS ;Message address DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW FUNLINES ;Table of addresses of menu line strings DW KEYPARM ;Exit menu is key definitions menu DW EDKEYPARM ;Edit key parameter table DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM ARRPARM: DB LEFT_OK ;Not used DB 5 ;Maximum row number DB '1' ;Window number DW ARRDIS ;Display menu DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW ARRLINES ;Table of addresses of menu line strings DW KEYPARM ;Exit menu DW CPMPARM ;Set to CP/M DW WSPARM ;Set to WS DW EDARRPARM ;Edit arrow key table DW EDARRPARM DW EDARRPARM DW EDARRPARM PAGE ;CONSOLE MENU CHOICES CONPARM: DB LEFT_Oddresses of menu line strings DW SAVEEPARM ;Previous menu is main menu DW SAVEMPARM ;Save configuration in memory DW SAVEDPARM ;Save on drive A DW SAVEDPARM ;Save on drive B DW SETPARM ;Go back to edit menu DW EXITPARM ;Exit to CP/M PAGE EXITPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 0 ;Not used DW 00 ;Table of addresses of menu line strings DW EXITCPM ;Get configuration from memory PAGE ;GET CONFIGURATION CHOICES GETMPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addressK + LEFT_ON ;Can move down DB 4 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISCON ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW CONLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW CURPARM ;Cursor type selection parameter table DW BACKPARM DW CLICKPARM DW HZPARM DW INITPARM ;Device initialization string CURPARM: DB LEFT_OK ;Can move down DB 4 ;Maximum row number DB '2' ;Window number DW CURDIS ;Message address DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW CURLINES ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW CTYPEPARM ;Cursor type selection parameter table DW CTYPEPARM DW CTYPEPARM DW CTYPEPARM DW CTYPEPARM BACKPARM: DB LEFT_OK ;Can move up DB 0FFH ;Maximum row number DB 'es of menu line strings DW 0 ;Not used DW GETMEM ;Get configuration from memory GETDPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW GETDRV ;Get configuration from drive A PAGE ;KEY DEFINITION CHOICES KEYPARM: DB LEFT_OK + LEFT_ON ;OK to move down DB 1 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISKEY ;Display current settings routine DB 00 ;Start row of menu DB 12 ;Step size between menu selections DW KEYLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu is save setup menu DW FUNPARM ;Edit key parameter table DW ARRPARM FUNPARM: DB LEFT_OK ;OK to move left or right DB 9 ;Maximum ro2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 01 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Exit menu DW BACKTYPE ;Define background type (selection 0) PAGE CLICKPARM: DB LEFT_OK ;Can move up DB 0FFH ;Maximum row number DB '2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 14 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW TOGCLICK ;Select click HZPARM: DB LEFT_OK ;Can move up DB 0FFH ;Maximum row number DB '2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 14 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line striw number DW SETDIS ;Message address DW DISGEN ;Display current settings DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW GENLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW TIMPARM ;Set device timeout parameters PAGE ;SAVE CONFIGURATION CHOICES SAVEMPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SAVEMEM ;Get configuration from memory SAVEDPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 0ngs DW CONPARM ;Previous menu DW TOGHERTZ ;Select click DEVPARM: DB LEFT_OK ;Can move down DB 3 ;Maximum row number DB '2' ;Window number DW DEVDIS ;Message address DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW DEVLINES ;Table of addresses of menu line strings DW MODPARM ;Previous menu DW DTYPEPARM ;Device type selection parameter table DW DTYPEPARM DW DTYPEPARM DW DTYPEPARM DW DTYPEPARM PAGE MODPARM: DB LEFT_OK + LEFT_ON ;OK to move left DB 03 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISMOD ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW MODLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW BAUDPARM ;Miscellaneous stuff menu DW PROTPARM ;Set protocol DW DEVPARM DW INITPARM PNTRPARM: DB LEFT_OK + LEFT0 ;Table of addresses of menu line strings DW 0 ;Not used DW SAVEDRV ;Get configuration from drive A SAVEEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 0 ;Not used DW 00 ;Table of addresses of menu line strings DW SAVEEXIT ;Exit to CP/M if configuration has been saved ;or user wants to exit anyway (ask) PAGE ;I/O DEVICE CHOICES PROTPARM: DB LEFT_OK ;Can't move to another menu on same screen DB 2 ;Maximum row number DB '2' ;Not used DW PROTDIS ;Prepare message routine DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW PROTLINES ;Table of addresses of menu line strings DW MODPARM ;Previous menu DW SETPPARM ;No Protocol DW SETPP_ON ;OK to move left DB 03 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISPNTR ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW PNTRLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW BAUDPARM ;Baud rate menu DW PROTPARM ;Protocol parameter DW DEVPARM DW INITPARM PARPARM: DB LEFT_OK + LEFT_ON ;OK to move left DB 02 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISPAR ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW PARLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW PPROTPARM ;Set parallel protocol DW DEVPARM ;Device assignment DW INITPARM DW IADDRPARM ;Set IEEE address GENPARM: DB LEFT_OK + LEFT_ON ;OK to move left and left menu is on same screen DB 00 ;Maximum row number DB '3' ;WindoARM ;XON/XOFF Protocol DW SETPPARM ;ETX/ACK Protocol BAUDPARM: DB LEFT_OK ;Can move left DB 14 ;Maximum row number DB '2' ;Window number DW BAUDDIS ;Not used DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW BAUDLINES ;Table of addresses of menu line strings DW MODPARM ;Previous menu DW SETBPARM ; 50 Baud DW SETBPARM ; 75 Baud DW SETBPARM ; 110 Baud DW SETBPARM ;134.5 Baud DW SETBPARM ; 150 Baud DW SETBPARM ; 300 Baud DW SETBPARM ; 600 Baud DW SETBPARM ; 1200 Baud DW SETBPARM ; 1800 Baud DW SETBPARM ; 2400 Baud DW SETBPARM ; 3600 Baud DW SETBPARM ; 4800 Baud DW SETBPARM ; 7200 Baud DW SETBPARM ; 9600 Baud DW SETBPARM ;19200 Baud PAGE PPROTPARM: DB LEFT_OK ;Can't move to another menu on same screen DB 0FFH ;Maximum row number DB '2' ;Not used DW 0 ;Prepare message routine DW RETPROC ;Display current set settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SET_TO_CPM ;Set arrow keys to CP/M WSPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SET_TO_WS ;Terminal emulation PAGE ;CONSOLE CHOICES CTYPEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW CURTYPE ;Set cursor type tings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 00 ;Previous menu DW PARPROT ;Set parallel protocol PAGE IADDRPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Maximum row number DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 00 ;Previous menu DW SETIADDR ;Set IEEE address TIMPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Indicate this is a function selection DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu lines DW 00 ;Previous menu DW SETTIME ;Set device timeout PAGE ;KEY DE PAGE INITPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Maximum row number DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW EDIT_INIT ;Edit initialization string PAGE SETPPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SETPROT ;Set protocol SETBPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start rowFINITION CHOICES ;Edit function keys EDKEYPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW EDIT_FUN ;Edit function keys EDARRPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW EDIT_ARR ;Edit arrow keys CPMPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SETBAUD ;Set protocol DTYPEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW DEVASSIGN ;Set cursor type PAGE ;***** MENU ROW ADDRESS TABLES ;Tables of addresses of strings to display individual menu rows ;(Used in highlighting selected row) GETLINES: ;Get configuration menu lines DW GET0 DW GET1 DW GET2 DW GET3 SETLINES: ;Set configuration menu lines DW SET0 DW SET1 DW SET2 DW SET3 DW SET4 DW SET5 DW SET6 SAVELINES: ;Save configuration menu lines DW SAVE0 DW SAVE1 DW SAVE2 DW SAVE3 DW SAVE4 ,0FFH DB ESC,'s1',ESC,'=',32+1,32+45,ESC,'l','Current Settings',ESC,'m' DB 0 SAVMESS: DB ESC,'=',32+2,32+0,'Select destination for configuration',CRLF,LF ;Save configuration menu display SAVE0: DB ' TO MEMORY ',0FFH,CRLF SAVE1: DB ' TO DRIVE A ',0FFH,CRLF SAVE2: DB ' TO DRIVE B ',0FFH,CRLF SAVE3: DB ' RETURN TO EDIT MENU ',0FFH,CRLF SAVE4: DB ' EXIT TO CP/M ',0FFH DB 0 PAGE ;KEY DEFINITION DISPLAYS FUN_FRAME: DB ESC,'s3','Z'-40H KEY0 D ',ESC,')', Functio Keys ',ESC,'(',0FFH,CRLF DB ' 1 -',CRLF DB ' 2 -',CRLF DB ' 3 -',CRLF DB ' 4 -',CRLF DB ' 5 -',CRLF DB ' 6 -',CRLF DB ' 7 -',CRLF DB ' 8 -',CRLF DB ' 9 -',CRLF DB ' 0 -',CRLF DB CRLF KEY1: DB ' ',ESC,')',' Arrow keys: ',ESC,'(',0FFH,CRLF DB 0 ARR_TYPES: DB ' UP -',CRLF DB ' RIGHT -',CRLF DB ' DOWN -',CRLF DB ' LEFT -' DB 0 FUN_PLATE: DB 'Z'-040h DB ESC,'=',32+13,32+20,'character plKEYLINES: ;Key definition menu lines DW KEY0 DW KEY1 FUNLINES: ;Function key menu lines DW FUN0 DW FUN1 DW FUN2 DW FUN3 DW FUN4 DW FUN5 DW FUN6 DW FUN7 DW FUN8 DW FUN9 ARRLINES: ;Arrow key menu lines DW ARR0 DW ARR1 DW ARR2 DW ARR3 DW ARR4 DW ARR5 PAGE CONLINES: ;Console menu lines DW CON0 DW CON1 DW CON2 DW CON3 DW MOD3 CURLINES: ;Cursor menu lines DW CTYPE0 DW CTYPE1 DW CTYPE2 DW CTYPE3 DW CTYPE4 MODLINES: ;Modem menu lines DW MOD0 DW MOD1 DW MOD2 DW MOD3 PNTRLINES: ;Printer port menu lines DW MOD0 DW MOD1 DW MOD2 DW MOD3 PARLINES: ;Parallel port menu lines DW PAR0 DW MOD2 DW MOD3 DW PAR3 GENLINES: ;General menu lines DW GEN0 PROTLINES: ;Serial port protocol menu lines DW PROT0 DW PROT1 DW PROT2 BAUDLINES: ;Baud rate menu lines DW BAUD1 DW BAUD2 DW BAUD3 DW BAUD4 DW BAUD5 DW BAUD6 DW BAUD7 aces remaining',HOME DB 'Select the function keys you want to change',CRLF,LF FUN0: DB ' 1 - ',0FFH,CRLF FUN1: DB ' 2 - ',0FFH,CRLF FUN2: DB ' 3 - ',0FFH,CRLF FUN3: DB ' 4 - ',0FFH,CRLF FUN4: DB ' 5 - ',0FFH,CRLF FUN5: DB ' 6 - ',0FFH,CRLF FUN6: DB ' 7 - ',0FFH,CRLF FUN7: DB ' 8 - ',0FFH,CRLF FUN8: DB ' 9 - ',0FFH,CRLF FUN9: DB ' 0 - ',0FFH,CRLF DB 0 ARR_PLATE: DB ESC,'=',32+13,32+20,'character places remaining',HOME DB 'Select a standard arrow key definition',CRLF DB 'or select individual arrow keys to define any way you like', ESC,'(',CRLF,LF ARR0: DB ' CP/M standard ',0FFH,CRLF ARR1: DB ' WordStar standard ',0FFH,CRLF ARR2: DB ' UP - ',0FFH,CRLF ARR3: DB ' RIGHT - ',0FFH,CRLF ARR4: DB ' DOWN - ',0FFH,CRLF ARR5: DB ' LEFT - ',0FFH DB ESC,'s3',LF DB ESC,'l','Current Arrow Key Settings',ESC,'m' DB 0 PAGE POS_1: DB ESC,'s1',ESC,'=',Y_BASE+2,X_BASE+8,0 POS_2: DB ESC,'s1',ESC,'=',Y_BASE+3,X_BASE+8,0 POS_3: DW BAUD8 DW BAUD9 DW BAUD10 DW BAUD11 DW BAUD12 DW BAUD13 DW BAUD14 DW BAUD15 DEVLINES: ;Device assignment menu lines DW DEV0 DW DEV1 DW DEV2 DW DEV3 PAGE ;***** SYSTEM MESSAGES ;Menu messages HEADER: DB ESC,'s','0','Z'-040h DB ' *** Osborne Executive Configuration Program *** V1.3' DB 0 GETMESS: DB ESC,'=',32+2,32+0,'Select source for configuration',CRLF,LF ;Get configuration menu display GET0: DB ' FROM MEMORY ',0FFH,CRLF GET1: DB ' FROM DRIVE A ',0FFH,CRLF GET2: DB ' FROM DRIVE B ',0FFH,CRLF GET3: DB ' EXIT TO CP/M ',0FFH DB 0 SETMESS: DB 'Z'-40h ;Set parameters menu display DB 'Select the items you want to change:',CRLF,LF SET0: DB ' KEY DEFINITIONS ',0FFH,CRLF SET1: DB ' CONSOLE PARAMETERS ',0FFH,CRLF SET2: DB ' MODEM PORT ',0FFH,CRLF SET3: DB ' PRINTER PORT ',0FFH,CRLF SET4: DB ' PARALLEL PORT ',0FFH,CRLF SET5: DB ' GENERAL ',0FFH,CRLF SET6: DB ' EXIT TO SAVE MENU ' DB ESC,'s1',ESC,'=',Y_BASE+4,X_BASE+8,0 POS_4: DB ESC,'s1',ESC,'=',Y_BASE+5,X_BASE+8,0 POS_5: DB ESC,'s1',ESC,'=',Y_BASE+6,X_BASE+8,0 POS_6: DB ESC,'s1',ESC,'=',Y_BASE+7,X_BASE+8,0 POS_7: DB ESC,'s1',ESC,'=',Y_BASE+8,X_BASE+8,0 POS_8: DB ESC,'s1',ESC,'=',Y_BASE+9,X_BASE+8,0 POS_9: DB ESC,'s1',ESC,'=',Y_BASE+10,X_BASE+8,0 POS_0: DB ESC,'s1',ESC,'=',Y_BASE+11,X_BASE+8,0 POS_UP: DB ESC,'s1',ESC,'=',Y_BASE+5,X_BASE+12,0 POS_DOWN: DB ESC,'s1',ESC,'=',Y_BASE+6,X_BASE+12,0 POS_RIGHT: DB ESC,'s1',ESC,'=',Y_BASE+7,X_BASE+12,0 POS_LEFT: DB ESC,'s1',ESC,'=',Y_BASE+8,X_BASE+12,0 FREMAIN: DB ESC,'s1',ESC,'=',Y_BASE+13,X_BASE+16,0 FSETWIND: ;Set up window for displaying current settings ;of key definitions DB ESC,'s5' DB 0 ;Cursor positioning strings for displaying keys FKEY1: DB ESC,'=',32+1,32+0,ESC,'T',0 FKEY2: DB ESC,'=',32+2,32+0,ESC,'T',0 FKEY3: DB ESC,'=',32+3,32+0,ESC,'T',0 FKEY4: DB ESC,'=',32+4,32+0,ESC,'T',0 FKEY5: DB ESC,'=',32+5,32+0,ESC,'T',0 FSC,'(',0FFH,CR,0 BAUD_POS: DB ESC,'s3',CRLF,0 PROT_POS: DB ESC,'s3',CRLF,0 DEV_POS: DB ESC,'s3',CRLF,LF,0 PAGE PROTMENU: ;Serial protocol display DB ESC,'s1',LF,'Select Protocol:' DB ESC,'s2',CRLF,LF PROT0: DB ' No Protocol ',ESC,'T',0FFH,CRLF PROT1: DB ' XON/XOFF ',ESC,'T',0FFH,CRLF PROT2: DB ' ETX/ACK ',ESC,'T',0FFH DB ESC,'s3',ESC,'l','Current Protocol',ESC,'m' DB 0 BAUDMENU: DB ESC,'s1',LF,'Select Baud Rate:' DB ESC,'s2',CRLF,LF BAUD1: DB ' 50 ',ESC,'T',0FFH,CRLF BAUD2: DB ' 75 ',ESC,'T',0FFH,CRLF BAUD3: DB ' 110 ',ESC,'T',0FFH,CRLF BAUD4: DB ' 134.5 ',ESC,'T',0FFH,CRLF BAUD5: DB ' 150 ',ESC,'T',0FFH,CRLF BAUD6: DB ' 300 ',ESC,'T',0FFH,CRLF BAUD7: DB ' 600 ',ESC,'T',0FFH,CRLF BAUD8: DB ' 1200 ',ESC,'T',0FFH,CRLF BAUD9: DB ' 1800 ',ESC,'T',0FFH,CRLF BAUD10: DB ' 2400 ',ESC,'T',0FFH,CRLF BAUD11: DB ' 3600 ',ESC,'T',0FFH,CRLF BAUD12: DB ' 4800 ',ESC,'T',0FFH,CRLF BAUD13: DB ' 7200 ',ESC,'T',0FKEY6: DB ESC,'=',32+6,32+0,ESC,'T',0 FKEY7: DB ESC,'=',32+7,32+0,ESC,'T',0 FKEY8: DB ESC,'=',32+8,32+0,ESC,'T',0 FKEY9: DB ESC,'=',32+9,32+0,ESC,'T',0 FKEY0: DB ESC,'=',32+10,32+0,ESC,'T',0 UPKEY: DB ESC,'=',32+13,32+5,ESC,'T',0 DOWNKEY: DB ESC,'=',32+14,32+5,ESC,'T',0 RIGHTKEY: DB ESC,'=',32+15,32+5,ESC,'T',0 LEFTKEY DB ESC,'=',32+16,32+5,ESC,'T',0 CARR_POS: DB ESC,'s3',LF,LF,0 ARR_POS: DB ESC,'s3',ESC,'=',32+13,32+0,0 CPM: DB ' CP/M',ESC,'T',0FFH,0 WS: DB ' WordStar',ESC,'T',0FFH,0 SPECIAL: DB ' Special',ESC,'T',0FFH,0 PAGE ;CONSOLE DISPLAYS CUR_HDR: DB ESC,'s3','Z'-40h CON0: DB ' ',ESC,')',' Cursor type: ',ESC,'(',0FFH,CRLF,' ',0 ;Cursor type device header message BACK_HDR: DB CRLF,LF CON1: DB ' ',ESC,')',' Background attributes: ',ESC,'(',0FFH,CRLF,0 CLIC_HDR: DB CRLF,LF CON2: DB ' ',ESC,')',' Key Click: ',ESC,'(',0FFH,CRLF,0 HZ_HDR: DB CRLF,LF CON3: DB ' ',ESC,')',' Monitor Frequency: ',ESC,'(',0FFH,CRLF,0 CURMENU: DB ESC,'FH,CRLF BAUD14: DB ' 9600 ',ESC,'T',0FFH,CRLF BAUD15: DB ' 19200 ',ESC,'T',0FFH DB ESC,'s3',ESC,'l','Current Baud Rate',ESC,'m' DB 0 DEVMENU: DB ESC,'s1',LF,'Select the type of device you plan to attach to this port' DB ESC,'s2',CRLF,LF,LF DEV0: DB ' PRINTER (LST:) ',ESC,'T',0FFH,CRLF DEV1: DB ' TERMINAL (CONIN:/CONOUT:) ',ESC,'T',0FFH,CRLF DEV2: DB ' OTHER DEVICE (AUXIN:/AUXOUT:) ',ESC,'T',0FFH,CRLF DEV3: DB ' NO DEVICE ',ESC,'T',0FFH DB ESC,'s3',CRLF,ESC,'l','Current Device Selection',ESC,'m' DB 0 PAGE DCONINIT: DB ESC,'s3',ESC,'=',32+13,32+5,ESC,'T',0 DMODINIT: DB ESC,'s3',ESC,'=',32+10,32+5,ESC,'T,0 DPRINIT: DB ESC,'s3',ESC,'=',32+10,32+5,ESC,'T',0 DPARINIT: DB ESC,'s3',ESC,'=',32+ 7,32+5,ESC,'T',0 IEDIT_INSTR: DB ESC,'s4',ESC,'=',32+15,32+2,'Enter initialization string: ' DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+19,'character places remaining' DB ESC,'s7',ESC,'=',32+2,32+15,'Press ^RETURN to save string, ^ESC to exit without changing' Ds1',LF,'Select cursor type:' DB ESC,'s2',CRLF,LF CTYPE0: DB ' Invisible ',ESC,'T',0FFH,CRLF CTYPE1: DB ' Blinking Block ',ESC,'T',0FFH,CRLF CTYPE2: DB ' Steady Block ',ESC,'T',0FFH,CRLF CTYPE3: DB ' Blinking Underline ',ESC,'T',0FFH,CRLF CTYPE4: DB ' Steady Underline ',ESC,'T',0FFH DB ESC,'s3' DB ESC,'l','Current Cursor Type',ESC,'m' DB 0 ON: DB ' On',ESC,'T',0 OFF: DB ' Off',ESC,'T',0 PAGE ;I/O DEVICE DISPLAYS BAUD_HDR: DB ESC,'s3','Z'-40H MOD0: DB ' ',ESC,')',' Baud Rate: ',ESC,'(',0FFH,CRLF,' ',0 PROT_HDR: DB ESC,'s3',CRLF,LF,LF MOD1: DB ' ',ESC,')',' Protocol: ',ESC,'(',0FFH,CRLF,' ',0 DEV_HDR: DB CRLF,LF MOD2: DB ' ',ESC,')',' Device Selection: ',ESC,'(',0FFH,CRLF,0 INIT_HDR: DB CRLF,LF MOD3: DB ' ',ESC,')',' Initialization String: ',ESC,'(',0FFH,CRLF,' ',0 PPROT_HDR: DB ESC,'s3','Z'-40H PAR0: DB ' ',ESC,')',' Protocol: ',ESC,'(',0FFH,CRLF,' ',0 IEEE_HDR: DB CRLF,LF PAR3: DB ' ',ESC,')',' IEEE address: ',EB 0 FEDIT_INSTR: DB ESC,'s4',ESC,'=',32+14,32+2,'Enter function key definition:',CRLF DB ' ' FNUM: DB '0',': ' DB ESC,'s7','Z'-40H,ESC,'=',32+1,32+16,'Press ^RETURN to save key definition' DB ESC,'=',32+2,32+16,'Press ^ESC to exit without changing old definition' DB 0 AEDIT_INSTR: DB ESC,'s7','Z'-40H,ESC,'=',32+1,32+16,'Press ^RETURN to save key definition' DB ESC,'=',32+2,32+16,'Press ^ESC to exit without changing old definition' DB ESC,'s4',ESC,'=',32+14,32+2,'Enter arrow key definition:',CRLF DB 0 IEDIT_POS: DB ESC,'s8',0FFH,ESC,'=',32+0,32+0,0 FEDIT_POS: DB ESC,'s9',0FFH,ESC,'=',32+0,32+0,0 AEDIT_POS: DB ESC,'s','9'+1,0FFH,ESC,'=' CROW: DB 32+0,32+0,0 CURROW: = CROW-AEDIT_POS ;Offset to row byte in positioning strings IREMAIN: DB ESC,'s7',ESC,'=',32+0,32+15,0 CLREDIT: DB ESC,'s4',ESC,'=',32+13,32+0,ESC,'Y' DB 0 REVERSE: DB ' Reverse Video',0 NORMAL: DB ' Normal ',0 FIFTYHZ: DB ' 50 Hz (European)',0 SIXTYHZ: DB ' 6: DB ESC,'s1' DB ESC,'=',32+11,32+20,ESC,')','Configuration saved to ',ESC,'(' DB 'DRIVE ' SAVDRV: DB 'A' DB 0 CLRDEST: DB ESC,'s1' DB ESC,'=',32+10,32+0,ESC,'T' DB 0 PAGE NOPROT: DB ' No Protocol ',0 XONPROT: DB ' XON/XOFF ',0 ETXPROT: DB ' ETX/ACK ',0 CENPROT: DB ' CENTRONICS ',0 IEEEPROT: DB ' IEEE ',0 PAGE ;ERROR MESSAGES READERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'READ ERROR' DB ESC,'=',32+1,32+16,'Press ESC key' DB 0 WRTERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'WRITE ERROR' DB ESC,'=',32+1,32+16,'Press ESC key' DB 0 SYSDERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'NOT AN EXECUTIVE SYSTEM DISKETTE' DB ESC,'=',32+1,32+16,'You can only setup diskettes with Executive system tracks.' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 BADDEST: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'INVALID VERSION NUMBER' DB ESC,'=',32+1,32+16,'Destination version is not up to date for this version of setup' DB E0 Hz (American)',0 PRINTER: DB ' Printer (LST:) ',0 TERM: DB ' Terminal (CONIN:/CONOUT:)',0 OTHER: DB ' Other (AUXIN:/AUXOUT:) ',0 NOTASSIGNED: DB ' No Device ',0 PAGE IEEEINST: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Enter IEEE address (between 0 and 30) ' DB 0 IEEEPOS: DB CRLF,' ' IEEEVAL: DS 3 DB 0 TIMEINST: DB ESC,'s7','Z'-40H,ESC,'s4' DB ESC,'=',32+15,32+16,'Enter device timeout in seconds (0-995)' DB ESC,'=',32+16,32+16,'(Value will be rounded to a multiple of 5) ' DB ' ' DB 0 DEVTIM_HDR: DB ESC,'s3','Z'-40H GEN0: DB ' ',ESC,')',' Device Timeout: ',ESC,'(',0FFH DB ESC,'=',32+1,32+9,'seconds','K'-40H TIMEPOS: DB CRLF,' ',0 PAGE GETINSTR: DB ESC,'s1' DB ESC,'=',32+12,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+13,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+14,32+16,'Press ESC to exit from Setup' DB 0 SETINSTR: DB ESC,'s7','Z'-40H DB ESSC,'=',32+2,32+16,'Press ESC key' DB 0 NOTEXEC: DB ESC,'s1','Z'-40H,ESC,'=',32+10,32+5,'ERROR: EXECUTIVE SETUP' DB ESC,'=',32+11,32+5,'This setup program is designed for the Osborne Executive' DB ESC,'=',32+12,32+5,'Your machine is not a valid Executive.' DB ESC,'=',32+13,32+5,'Please use the setup program designed for your machine' DB ESC,'=',32+15,32+5,'Press ESC key' DB 0 BADVER: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'INVALID VERSION NUMBER' DB ESC,'=',32+1,32+16,'Source is not up to date for this version of setup' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 YOUSURE: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'Setup has not been saved yet' DB ESC,'=',32+1,32+16,'Are you sure you want to quit? (Y/N) ' DB 0 NOROOM: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'NOT ENOUGH CHARACTER PLACES REMAINING' DB ESC,'=',32+1,32+16,'To make more room, shorten your function key definitions' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 CLRERR: DB ESC,'s7','Z'-40H,0 PAC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to Save Menu' DB 0 RHT_INSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to menu on left' DB 0 SUBINSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to previous menu' DB 0 SAVEINSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit from Setup' DB 0 PAGE MEMSAVE: DB ESC,'s1' DB ESC,'=',32+11,32+20,ESC,')','Configuration saved to ',ESC,'(' DB 'MEMORY ' DB 0 DRVSAVEGE INIT_STRING: DB ESC,'f' ;Disable function key translation DB ESC,'.2' ;Block cursor DB ESC,'z','1',32+ 2,32+ 0,32+23,32+79 ;Full screen except header area DB ESC,'z','2',32+ 3,32 ,32+19,32+39 ;Left half of screen DB ESC,'z','3',32+ 4,32+40,32+20,32+79 ;Right half of screen DB ESC,'z','4',32+ 3,32 ,32+20,32+79 ;Editing area DB ESC,'z','5',32+ 4,32+49,32+20,32+79 ;Data area of current function key settings D ESC,'z','6',32 3,32+16,32+19,32+7 ;Center screen DB ESC,'z','7',32+21,32+ 0,32+23,32+79 ;Bottom portion of screen DB ESC,'z','8',32+19,32+ 4,32+20,32+79 ;Editing window for initialization strings DB ESC,'z','9',32+18,32+ 6,32+21,32+79 ;Editing window for function keys DB ESC,'z','9'+1,32+18,32+12,32+21,32+79 ;Editing window for arrow keys DB ESC,'s','0','Z'-040h D 0 INITROW: = 20 - 19 ;Last row number INITLEN: = 79 - 4 + 1 ;Length of line in editing window for ; initialization strings FUNROW: = 21 - 18 ;Last row number FUNointer NUM_BLANKS: DS 1 ;Holds number of blanks left in function key table SOURCE: DS 1 ;Holds configuration source code ; 0 = Memory ; 1 = Drive A ; 2 = Drive B DIGFLAG: DS 1 ;Flag for BIN_ASC to indicate if hundreds digit has been displayed PPROT: DS 1 ;Flag to indicate Centronics or IEEE protocol fro parallel port MEMCUR: DS 1 ;Cursor type to be saved to memory on exiting setup MEMESC: DS 1 ;^ESC key translation before replaced by special setup definition MEMRET: DS 1 ;^RET key translation before replaced by special setup definition ESCLOC: DS 2 ;Holds location in buffer of ^ESC key RETLOC: DS 2 ;Holds location in buffer of ^RET key HIFLAG: DS 1 ;Flag to indicate whether highlighting should be turned on or off CURCOUNT: DS 2 ;Holds count for positioning cursor for editing string ROWLEN: DS 1 ;Holds length of row for editing string ROWMAX: DS 1 ;Holds last row number for editing string LENGTH: DS 1 ;Holds meximum display length forLEN: = 79 - 6 + 1 ;Length of line in editing window for ; function keys ARRROW: = 21 - 18 ;Last row number ARRLEN: = 79 - 12 + 1 ;Length of line in editing window for ; arrow keys BIOS_ADDR: DB 00H ;BIOS jump table address DS 1 RJ_ADDR: DB 5AH ;ROM jump address (high byte set on initialization) DS 1 ;High byte SET_CTYPE: DB ESC,'.' CUR: DB '2' DB 0 CUROFF: DB ESC,'.0',0 CURON: DB ESC,'.2',0 HIGHON: DB ESC,'j',0 ;Highlight on HIGHOFF: DB ESC,'k',0 ;Highlight off HALFON: DB ESC,')',0 HALFOFF: DB ESC,'(',0 BACKONE: DB BKS,' ',BKS,0 SWIND: DB ESC,'s' ;Set window WINDOW: DB '0' DB 0 PAGE ;FLAGS SAVEFLAG: DB 0 ;Indicates whether or not setup has been saved ; 0 = Not saved yet DINITFLAG: DB 0 ;Indicates if device initialization should be done on exit ; 0 = No CURSET: DB ESC,'s3','Z'-40H DB 0 PAGE ;***** VARIABLES SCBPB: ;System control block parameter table (us PRINTFKEY LIMFLAG DS 1 ;Holds limit flag for SHOW_KEY (0FFH = No display length limit) TEMP: DS 1 NUMBUFF: DS 6 ;Buffer for ASCII strings PAGE ;***** SETUP PARAMETERS SETUP_TABLE: FUN_TABLE: DS LEN_FKEY ;Function key table END_FUN: = FUN_TABLE+255 ; Last byte of function key table HERTZ: DS 1 ;50/60 Hertz CURSOR_ATTRIB: DS 1 ;Cursor type BACK_ATTRIB: DS 1 ;Background type KEYCLICK: DS 1 ;Key click on/off DEVTBL: ;I/O Character device table (physical devices) DS DTBLLEN ;Each entry in the table consists of: ; Device name: 6 bytes ; Mode byte: 1 byte ; Baud rate: 1 byte SHAD_TBL: DS STBLLEN ;Device shadow table ;Each entry in the table consists of: ; Routine address: 2 bytes ; Flag byte: 1 byte ; IEEE device number 1 byte IEEEADDR: = SHAD_TBL + (IEEENUM * 4) + 3 ;IEEE device address byte of ; IEEE shadow table entry DEVFLGS: ;I/O Device flags (logical devices) DS 2 * NUM_LDEV ;ed in BDOS function 49) SCBOFF: DS 1 ;SCB offset SCBSET: DS 1 ;Set flag: FFh if setting a byte, FEh if setting a word, otherwise get SCBVAL: DS 2 ;Value to set BIOSPB: ;BIOS parameter block (used in BDOS function 50) BIOSFUNC: DS 1 ;BIOS function number BIOSAREG: DS 1 ;A Register value to pass BIOSBCREG: DS 2 ;BC Register BIOSDEREG: DS 2 ;DE Register BIOSHLREG: DS 2 ;HL Register ;String editing variables KEYNUM: DS 1 ;Function key number being edited NUMENT: DS 1 ;Number of entries in string editing area CUR_POINTER: DS 2 ;POINTER TO START OF KEY POSITION KEY_TABLE: DS 2 ;Holds start address of string table END_KEY_TABLE: DS 2 ;Holds end address of string address (last byte) POS_SPACE: DS 2 ;Holds address of positioning string for printing number of spaces remaining BIOSVER: DS 2 ;Source BIOS version number RWFLAG: DS 1 ;Read/Write flag for RWSEC SIDE: DS 1 ;Side flag for read/wr 840928 SAVSTK: DS 2 ;Used by BANKMOVE to save stack pEach entry consists of a 16-bit I/O redirection vector ;Bits 0-B correspond to physical device #'s 0-B ;If a bit is set, I/O to the logical device is redirected ;to the corresponding physical device INIT_TBL: DS ITBLLEN ;Table of initialization strings for devices TIMEOUT: = INIT_TBL+ITBLLEN ;Timeout byte follows initialization table DS 1 PAGE ;***** BUFFER SPACE DISKBUFF: DS 400H ;1K Disk buffer evices) DS DTBLLEN ;Each entry in the table consists of: ; Device name: 6 bytes ; Mode byte: 1 byte ; Baud rate: 1 byte SHAD_TBL: DS STBLLEN ;Device shadow table ;Each entry in the table consists of: ; Routine address: 2 bytes ; Flag byte: 1 byte ; IEEE device number 1 byte IEEEADDR: = SHAD_TBL + (IEEENUM * 4) + 3 ;IEEE device address byte of ; IEEE shadow table entry DEVFLGS: ;I/O Device flags (logical devices) DS 2 * NUM_LDEV ;haracters left to display RET ;CONTROL CHARACTER :CONTROL: LDK HL,RET_EXPANSION ;String to display for RETURN CMP CR ; ? JRZ :1 ;If return LDK HL,ESC_EXPANSION CMP ESC ; ? JRNZ :2 ;If ESC :1: PUSH BC ;Save maximum number of bytes PUSH HL ;Save address of string to display LDK HL,HALFON CALL PRINT ;Turn on half intensity POP HL ;Restore string address POP BC LDK C,5 ;C = Length of string JR :LOOP :2: LDK HL,CTRL_EXPANSION LDK C,2 ADD A,40H ;Convert to ASCII control letter STO A,CTRL_EXPANSION+1 :LOOP: PUSH BC ;Save number of characters left to display PUSH HL ;Save pointer to string to display LD A,[HL] CALL OUTCHAR POP HL POP BC INC HL ;Next position in string DEC B ;Decrement maximum number of characters left to display JRZ :DONE ;Return if maximum reached DEC C ;Decrement count of number of characters left in string JRNZ :LOOP ;If more characters left in strimber of characters to display ; (0FFH implies no maximum) ;C = None flag -- determines if should be displayed when an empty string is found ; 0 = No, 0FFH = Yes ;EXIT ;NONE PROC PUSH AF ;Save key MOV A,C STO A,TEMP ;Save none flag MOV A,B STO A,LIMFLAG ;Save limit flag (0ffh = no limit) POP AF PUSH BC CALL SET_HL ;POINT HL TO # OF BYTES IN KEY POP BC LD A,[HL] ORA A JRZ :NONE ;If length is 0 MOV D,A ;D = Number of characters to expand INC HL ;POINT TO FIRST CHARACTER :LOOP: LD A,[HL] INC HL ;GET CHARACTER AND POINT TO NEXT PUSH DE ;Save number of characters left to expand PUSH HL ;Save position in string CALL DISPLAY ;Display a character POP HL POP DE LD A,LIMFLAG CMP 0FFH JRZ :1 ;If no limit, set B back to 0ffh MOV A,B ;Maximum number of characters left to display ORA A RZ ;If space used up :1: MOV B,A ;Restore maximum number of bytes to display DEC D ;Numbeng :DONE: PUSH BC LDK HL,HALFOFF CALL PRINT ;Turn half intensity off POP BC RET PAGE SET_HL: ;SET HL TO POINT TO THE Nth ENTRY IN THE KEY TABLE ;A = ENTRY # (1 = FUNCTION KEY 1, 0 = F. KEY 0, 11 = UP ARROW) PROC PUSH BC ;SAVE REGISTER LD HL,KEY_TABLE ;POINT TO START OF TABLE ORA A JRZ :1 ;IF DONE LDK B,0 ;Set high byte to 0 for addition :LOOP: LD C,[HL] ;GET # OF ENTRIES FOR THIS KEY INC C ;Count length byte ADD HL,BC ;Add length of this to address so far DEC A JRNZ :LOOP ;IF NOT DONE, ADD NEXT LENGTH :1: POP BC ;RESTORE REGISTER RET SPACE_LEFT: LD A,NUMENT ;A = Number of entries (strings) CALL SET_HL ;Get address of first free position DEC HL ;HL = Last used position EX HL,DE ;DE = Last used position LD HL,END_KEY_TABLE ;HL = Last available position used ORA A ;Clear carry flag SBC HL,DE ;L = Number of spaces left MOV A,L STO A,NUM_BLANKS ;Save new number of spaces left r of characters left to expand JRNZ :LOOP ;If more JR :DONE ;If all characters expanded :NONE: LD A,TEMP LDK HL,CEOL_STR ORA A JRZ :2 ;If don't display none message LDK HL,NONE_STR :2: CALL PRINT ;Display message :DONE: LK HL,CEOL_STR ;Clear to end of line CALL PRINT RET RET_EXPANSION: DB '' ESC_EXPANSION: DB '' CTRL_EXPANSION: DB '^' DB 'A' ;Spot for control character CEOL_STR: DB ESC,'T',0 NONE_STR: DB ESC,')','',ESC,'(',0 PAGE DISPLAY: ;Display character for key definition and intiialization string ;ENTRY ;A = Character ;B = Maximum number of characters to display ;EXIT ;B = Remaining number of characters to display PROC MOV C,A ;Save character MOV A,B ORA A RZ ;Don't display anything if maximum = 0 MOV A,C ;A = Character CMP 20H JRC :CONTROL ;If control character PUSH BC CALL OUTCHAR ;Display character POP BC DEC B ;Decrement maximum number of c LD HL,POS_SPACE CALL PRINT ;POSITION CURSOR LD A,NUM_BLANKS ;GET NUMBER OF SPACES LEFT LDK DE,NUMBUFF CALL BIN_ASC XRA A STO A,[DE] LDK HL,NUMBUFF CALL PRINT RET PAGE PRINTFKEY: ;Display function key (or arrow key) setting ;ENTRY ;HL = Table of positioning string addresses ;A = Maximum line length to display ;B = Number of keys to display ;C = First key number to display PROC STO A,LENGTH ;Save maximum length to display :LOOP: LD E,[HL] INC HL LD D,[HL] ;DE = Positioning string address INC HL PUSH HL ;Save next positioning string address PUSH BC ;Save current key number and number of keys left EX HL,DE ;HL = Positioning string address CALL PRINT ;Position cursor POP BC PUSH BC LD A,LENGTH MOV B,A ;B = maximum number of characters to display MOV A,C ;A = Current key to display LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display key settings POP BC POP 0000B ;Device 2 DB 0001_0000B ;Device 3 DB 0000_1000B ;Device 4 DB 0000_0100B ;Device 5 DB 0000_0010B ;Device 6 DB 0000_0001B ;Device 7 PAGE BAUDTBL: ;Baud rate table DW BAUD0 DW BAUD1 DW BAUD2 DW BAUD3 DW BAUD4 DW BAUD5 DW BAUD6 DW BAUD7 DW BAUD8 DW BAUD9 DW BAUD10 DW BAUD11 DW BAUD12 DW BAUD13 DW BAUD14 DW BAUD15 BAUD0: DB ' NONE ',0FFH,0 PAGE FINDPHYS: ;Find physical device table entry ;ENTRY ;A = Device number ;EXIT ;HL ==> Device table entry PROC ;Get offset into device table LDK B,DNTRYLEN-1 ;Length of entry MOV C,A :LOOP: ADD C DJNZ :LOOP ;A = Device number * Entry length ;Get HL ==> Entry MOV C,A LDK B,0 ;BC = Table offset LDK HL,DEVTBL ADD HL,BC ;HL ==> Device table entry RET FINDSHAD: ;Find shadow table entry ;ENTRY ;A = Device number ;EXIT ;HL ==> Shadow table entry PROC ;Get offset into shadow table LDK B,SHADLEN-1 ;Length ofHL INC C ;Next key DJNZ :LOOP ;If more keys to print RET PAGE DEVASGN: ;Check if logical device is assigned to physical device ;ENTRY ;A = Physical device number ;C = Logical device number ;EXIT ;C bit set if assigned PROC ;Get logical device flags SLA C ;Length of each logical entry is 2 LDK B,0 ;BC = Table offset LDK HL,DEVFLGS ;Logical device assignment table ADD HL,BC ;Logical device entry SUB 8 ;Check if high or low byte of flags JRNC :1 ;If low byte INC HL ;Set HL to high byte ADD A,8 ;Get high bit number :1: LD C,[HL] ;Get flag byte INC A ;A = Physical device number + 1 :2: RLC# C ;Get bit in carry DEC A JRNZ :2 ;If not at right bit RET ;If right bit ;Carry flag = 1 if device assigned PAGE SETLOG: ;Set or clear physical device bit in logical device flag ;ENTRY ;A = Physical device number ;C = Logical device number ;B = Set/Clear flag (0 = Clear, 0FFH = Set) ;EXIT ;NONE  shadow table entry (-1) MOV C,A ;C = device number :LOOP: ADD A,C ;A + Device number DJNZ :LOOP ;Get SHADLEN * Device number ;Get HL ==> Entry MOV C,A LDK B,0 LDK HL,SHADTBL ADD HL,BC ;HL ==> Entry RET PAGE FUNINIT: ;Initialize variables for displaying function and arrow keys ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,FUNENT STO A,NUMENT ;Set number of entries LDK HL,FUN_TABLE STO HL,KEY_TABLE ;Set start of key table LDK HL,END_FUN STO HL,END_KEY_TABLE ;Set end of key table LDK HL,FREMAIN STO HL,POS_SPACE ;Set place to display number of bytes remaining RET INIT_INIT: ;Initialize variables to edit initialization strings ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,INITENT STO A,NUMENT ;Set number of entries (strings) in table LDK HL,INIT_TBL STO HL,KEY_TABLE ;Set start address of table LDK HL,INIT_TBL+255 STO HL,END_KEY_TABLE ;Set end address of table LDK HL,IREMAIN STO HL,POS_SPACE ;Set address o PROC PUSH BC ;Save flag ;Get logical device flags SLA C ;Length of each logical entry is 2 LDK B,0 ;BC = Table offset LDK HL,DEVFLGS ;Logical device assignment table ADD HL,BC ;Logical device entry SUB 8 ;Check if high or low byte of flags JRNC :1 ;If low byte INC HL ;Set HL to high byte ADD A,8 ;Get high bit number ;Get mask A = Bit in logical device table :1: PUSH HL ;Save flag byte location LDK HL,DMASKTBL ;Table of masks MOV E,A LDK D,0 ADD HL,DE LD A,[HL] ;A = Mask POP HL ;Set or clear bit POP BC MOV C,A ;Save mask MOV A,B ;A = Set/Clear flag ORA A ;Z bit set if "clear bit" selected MOV A,C ;Restore mask JRNZ :2 ;If "set bit" XOR 0FFH ;If "clear bit" AND [HL] ;Clear bit JR :3 :2: OR [HL] ;Set bit :3: STO A,[HL] RET ;If right bit DMASKTBL: ;Device mask table of bit masks DB 1000_0000B ;Physical device 0 mask DB 0100_0000B ;Device 1 DB 0010_f positioning string for printing space remaining RET PAGE GETBAUD: ;Point to baud rate byte in device table ;ENTRY ;NONE ;EXIT ;HL ==> Baud rate byte for currently selected device PROC CALL GETDEV ;Get device number of currently selected port CALL FINDPHYS ;Get HL ==> Device table entry LDK BC,DNAMELEN+1 ADD HL,BC ;HL ==> Baud rate byte RET GETMODE: ;Point to mode byte in device table ;ENTRY ;NONE ;EXIT ;HL ==> Mode byte for currently selected device PROC CALL GETDEV ;Get device number CALL FINDPHYS ;Get HL ==> Device table entry LDK BC,DNAMELEN ADD HL,BC RET ;HL ==> Mode byte GETSFLAG: ;Point to flag byte in shadow table ;ENTRY ;NONE ;EXIT ;HL ==> Flag byte for shadow table PROC CALL GETDEV ;GET DEVICE NUMBER CALL FINDSHAD ;Point to shadow table LDK BC,SFLAG_OFF ADD HL,BC RET ;HL ==> Flag byte in shadow table PAGE GETDEV: ;Get device number of currently selected PORT ;ENTRY ;NONE ;EXIT ;caldevice is assigned to this logical device POP BC JRC :SET ;If assigned, print message INC C ;Check next logical device MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more logical devices to check :SET: MOV A,C ;A = Logical device number LDK HL,DMESS_TBL ;Look up device assignment message in table CALL LOOKUP CALL PRINT ;Display device assignment message RET DMESS_TBL: ;Device assignment message table DW TERM ;CONIN ==> Terminal message DW TERM ;CONOUT ==> Terminal message DW OTHER ;AUXIN: ==> Other message DW OTHER ;AUXOUT: ==> Other message DW PRINTER ;LST: ==> Printer message DW NOTASSIGNED ;Not assigned PAGE PR_PROT: ;Print protocol for currently selected port PROC CALL GETMODE LD A,[HL] ANI XON_MASK ;Set Z bit if No protocol LDK HL,NOPROT JRZ :DONE ;If no protocol CALL GETSFLAG LD A,[HL] ANI ETX_MASK ;Set Z flag if XON/XOFF protcol LDK HL,XONPROT JRZ :DONE ;If XON/XOFF protocol A = Device PROC LD A,SETPARM ;Check which row was selected ANI ROW CMP MODROW ;Set Z flag if modem port JRZ :MOD ;If modem CMP PRNTROW JRZ :PRNT ;If printer port CMP CONROW LDK A,CRTNUM RZ ;If CRT device LD A,PPROT ORA A LDK A,CENNUM RZ ;If Centronics device LDK A,IEEENUM RET ;If IEEE device :MOD: LDK A,MODNUM RZ ;If modem device :PRNT: LDK A,PRNTNUM ;If printer device RET PAGE Y_BASE EQU 32 X_BASE EQU 32 CUR_POS: DB ESC,'s3',ESC,'=',32+1,32+0,0 ;Current cursor type display position SHOW_CURSOR: LK HL,CUR_POS CALL PRINT ;POSITION CURSOR AT TOP LD A,CURSOR_ATTRIB SUB '0' LDK HL,CURTBL CALL LOOKUP ;Look up address of current cursor type ASCII string CALL PRLINE RET PAGE SHOW_BAUD: ;Display current baud rate setting PROC LDK HL,BAUD_POS CALL PRINT ;Position cursor CALL PR_BAUD ;Print baud rate RET SHOW_PROT: ;Display current protocol settings  LDK HL,ETXPROT ;If ETX/ACK protocol :DONE: CALL PRINT ;Print protocol message RET PAGE INIT_PPROT: ;Initialize parallel protocol flag ;If the IEEE device is assigned to any logical device, then come up ;with that IEEE protocol, otherwise start by displaying Centronics protocol ;ENTRY ;NONE ;EXIT ;NONE PROC LDK C,0 ;First logical device to check LDK B,IEEENUM ;Check for IEEE assignments :LOOP: PUSH BC MOV A,B CALL DEVASGN ;Check if IEEE device assigned to this physical device POP BC JRC :IEEE ;If IEEE device assigned INC C MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more devices to check XRA A ;If IEEE not assigned, show CEN LDK B,NUMCEN ;Maximum row number for Centronics menu JR :1 :IEEE: ORI 0FFH ;If IEEE assigned, show IEEE LDK B,NUMIEEE ;Maximum row number for IEEE menu :1: STO A,PPROT MOV A,B STO A,PARPARM+1 ;Set maximum row number RET PAGE PR_TIME: ;Print device timeout in seconds  PROC LDK HL,PROT_POS CALL PRINT ;Position cursor CALL PR_PROT ;Print protocol LDK HL,HALFOFF CALL PRINT ;Turn off half intensity RET PAGE SHOW_DEV: ;Display current device assignment settings ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,DEV_POS CALL PRINT CALL PR_DEV RET PAGE PR_BAUD: ;Print baud rate of currently selected port ;ENTRY ;Cursor postitioned ;EXIT ;NONE PROC CALL GETBAUD ;Get HL ==> Current device baud rate byte LD A,[HL] ;A = Baud rate value LDK HL,BAUDTBL CALL LOOKUP ;Get HL ==> ASCII baud rate string CALL PRLINE ;Display current baud rate RET PAGE PR_DEV: ;Print device assignment for currently selected port ;ENTRY ;NONE ;EXIT ;NONE PROC CALL GETDEV ;A = Physical device number LDK C,0 ;C = Logical device number to check MOV B,A :LOOP: PUSH BC ;Save physical and logical device numbers MOV A,B ;A = Physical device number CALL DEVASGN ;Check if physi(at current cursor position) ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,TIMEOUT ;Get timeout in units of 5 seconds SRL A ;Get timeout in units of 10 seconds PUSH AF ;Save carry flag (set if there is an odd 5 sec unit) ; and Z flag (set if no tens) LDK DE,NUMBUFF ;ASCII string buffer CALL BIN_ASC ;Get ASCII value for number 10 sec units in timeout POP AF JRNZ :1 ;If 10 or more seconds LDK A,' ' ;If less than 10 seconds DEC DE ; replace 0 left by BIN_ASC STO A,[DE] ; with a space INC DE :1: ;Carry flag preserved (set if there is an odd 5 sec unit) LDK A,'0' ;"Guess" one's digit is 0 JRNC :2 ;If one's digit is 0 LDK A,'5' ;If one's digit is 5 :2: STO A,[DE] ;Put one's digit in string INC DE XRA A STO A,[DE] ;Mark end of string LDK HL,NUMBUFF CALL PRINT ;Display ASCII value for timeout (except one's digit) RET PAGE CONSET: ;Convert console values from ROM encoded form to SETUP form ntensity Blinking block ; Underline, Blink LOOK_BA: ;Background attribute look up table DB NORMBACK ;0 = No special background (amber characters on black background) DB NORMBACK ;1 = Blinking DB NORMBACK ;2 = Underline DB NORMBACK ;3 = Blinking, underline DB NORMBACK ;4 = Half intensity DB NORMBACK ;5 = Half intensity, blink DB NORMBACK ;6 = Half intensity, underline DB NORMBACK ;7 = Half intensity, underline, blink DB REVBACK ;8 = Reverse video DB REVBACK ;9 = Reverse video, blink DB REVBACK ;10 = Reverse video, underline DB REVBACK ;11 = Reverse video, underline, blink DB REVBACK ;12 = Reverse video, half intensity DB REVBACK ;13 = Reverse video, half intensity, blink DB REVBACK ;14 = Reverse video, half intensity, underline DB REVBACK ;15 = Reverse video, half intensity, underline, blink PAGE VERIFY: ;Verify that version is valid for this verison of setup ;ENTRY ;HL = Version number ;EXIT ;C bit set ;ENTRY ;CURSOR_ATTRIB, BACK_ATTRIB, KEY_CLICK set to ROM form ;EXIT ;CURSOR_ATTRIB, BACK_ATTRIB KEY_CLICK set to SETUP form PROC ;Get cursor attributes XRA A ;Clear high nibble of A LDK HL,CURSOR_ATTRIB RLD ;Lower nibble of A gets high nibble of CURSOR_ATTRIB MOV C,A LDK B,0 ;BC = Look up table offset LDK HL,LOOK_CA ;Look up cursor attribute table ADD HL,BC LD A,[HL] STO A,CURSOR_ATTRIB ;Save SETUP form of cursor attributes ;Get background attributes XRA A LDK HL,BACK_ATTRIB RLD ;lower nibble of A gets higher nibble of BTYPE MOV C,A LDK B,0 LDK HL,LOOK_BA ADD HL,BC LD A,[HL] STO A,BACK_ATTRIB ;Save SETUP form of background attributes ;Get key click value LDK HL,KEYCLICK LD A,[HL] ORA A ;Set Z flag if key click off LDK A,KCOFF ;A = Off character JRZ :DONE ;If off LDK A,KCON ;A = On character :DONE: STO A,[HL] ;Save key click value RET PAGE LOOK_CA: ;Look up table for CURSOR_ATTRif error PROC LDK DE,VALVER ;Lowest valid version number ORA A ;Clear carry SBC HL,DE ;Set C bit if source too old RET PAGE COMPARE: ;Compare two strings ;ENTRY ;HL ==> First string ;DE ==> Second string ;B = Length to compare ;EXIT ;Z bit set iff strings match PROC MOV A,B ORA A RZ ;Return match if length = 0 :LOOP: LD A,[DE] CMP [HL] RNZ ;Done if no match INC DE INC HL DJNZ :LOOP ;If more bytes to check RET ;Return Z bit set if strings match PAGE INITDEV: ;Initializes all physical devices changable from setup ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,DEVINI STO A,BIOSFUNC ;Set function number LDK B,NUMSDEV ;Number of devices changeable from setup :LOOP: PUSH BC ;Save device number MOV C,B DEC C STO BC,BIOSBCREG ;Set device number LDK C,DIRBIOS LDK DE,BIOSPB ;BIOS parameter block CALL BDOS ;"Direct" BIOS call POP BC DJNZ :LOOP RET PAGE GETDTBL: ;Get addresIB ;Invalid cursor attributes (eg half intensity) are ignored ;If no valid cursor attributes are assigned, the default value is steady block ; ROM SETTING SETUP SETTING DB '0' ;0 = Invisible Invisible DB '1' ;1 = Blink Blinking block DB '4' ;2 = Underline Steady underline DB '3' ;3 = Underline, Blink Blinking underline DB '2' ;4 = Half intensity Steady block DB '1' ;5 = Half intensity, Blink Blinking block DB '4' ;6 = Hf intensity,Underline Steady underline DB '3' ;7 = Hf intensity,Underline Blinking underline ; Blink DB '2' ;8 = Block Steady block DB '1' ;9 = Block, Blink Blinking block DB '2' ;10 = Block, Underline Steady block DB '1' ;11 = Block, Underline,Blink Blinking block DB '2' ;12 = Block, Half intensity Steady block DB '1' ;13 = Block, Half intenisty Blinking block ; Blink DB '2' ;14 = Block, Half intensity Steady block ; Underline DB '1' ;15 = Block, Half is of BIOS device table ;ENTRY ;NONE ;EXIT ;HL = Device table address PROC LDK A,CHRTBL ;BIOS Device table function number STO A,BIOSFUNC ;Set function number LDK C,DIRBIOS ;Direct BIOS call LDK DE,BIOSPB ;BIOS Parameter block CALL BDOS RET GETSTBL: ;Get address of BIOS shadow table (in bank 0) ;ENTRY ;NONE ;EXIT ;HL = Shadow table address PROC CALL GETDTBL ;Get address of device table DEC HL ;Back up to look up address of shadow table LD A,[HL] ;Get high byte DEC HL LD L,[HL] ;Get low byte MOV H,A ;HL = Address RET PAGE LOOKUP: ;Look up address in table ;ENTRY ;HL = Table address ;A = Item number ;EXIT ;HL = Address stored in table PROC ADD A,A ;A = Offset in bytes MOV C,A LDK B,0 ;BC = Offset ADD HL,BC LD A,[HL] INC HL LD H,[HL] MOV L,A ;HL = Contents of table RET PAGE CURTBL: ;Table of addresses of cursor type ASCII strings DW CTYPE0 DW CTYPE1 DW CTYiply ;EXIT ;A = A * 10 ;Registers preserved PROC PUSH BC ;Save LDK B,9 MOV C,A :LOOP: ADD A,C DJNZ :LOOP POP BC ;Restore RET ;A * 10 PAGE GET_DIGIT: ;Input a digit ;ENTRY ;A = Highest digit to input ;EXIT ;A = Digit, ENTER character, or LEFT character ; If character is a digit, it is displayed, otherwise it is just returned PROC INC C ;C = 1 more than maximum allowable :LOOP: PUSH BC ;Save maximum digit CALL GET_CHAR POP BC ;Restore maximum digit CPI ENTER RZ ;Return if ENTER CPI LEFT RZ ;If backspace CPI '0' JRC :LOOP ;If not a digits CMP C JRNC :LOOP ;If not an allowable digit PUSH AF CALL OUTCHAR ;Display digit POP AF RET ;Return A = character PAGE BANKMOVE: ;Move data between any two banks ;ENTRY ;HL = Source address ;DE = Destination address ;BC = Length ;SRCBANK = Source bank mask ;DESTBANK = Destination bank mask ;EXIT ;HL = Next source adPE2 DW CTYPE3 DW CTYPE4 PAGE BIN_ASC: ;Convert a 1-byte binary number to a base-10 ASCII number ;Inserts leading spaces ;ENTRY ;A = Number ;DE ==> Location to store number ;EXIT ;DE ==> Next location (Start location + 3) PROC MOV B,A XRA A STO A,DIGFLAG ;Set to "hundred's digit displayed" MOV A,B LDK C,100 CALL DIVIDE ;Get A/C ;Returns A = quotient, C = remainder ADD A,'0' ;Convert to ASCII digit CPI '0' JRNZ :HUND ;Store digit ORI 0FFH STO A,DIGFLAG ;Indicate no hundreds digit LDK A,' ' :HUND: STO A,[DE] ;Store hundreds digit INC DE MOV A,C ;Get remainder from divide by 100 LDK C,10 CALL DIVIDE ;Divide by 10 ADD A,'0' ;Convert to ASCII digit CMP '0' JRNZ :TENS ;Store digit LD A,DIGFLAG ORA A LDK A,'0' JRZ :TENS ;If there was a hundred's digit, display ten's 0 LDK A,' ' ;If no hundred's digit, insert a space for ten's 0 :TENS: STO A,[DE] ;Save tens digit Idress ;DE = Next destination address PROC ;Switch stacks to a high memory stack STO SP,SAVSTK ;Save current stack pointer LDK SP,BIOSTK ;Set high memory stack ;Call high memory bank move routine BMOVE: CALL 0000 ;Address filled in during initialization ;Restore stack LD SP,SAVSTK RET PAGE READSEC: ;Read a sector from disk ;ENTRY ;SDISK set (0 for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector ;EXIT ;Sector read to DISKBUFF ;Z bit set if no error PROC PUSH AF ;Save # sides 840928 XRA A STO A,RWFLAG ;Indicate read POP AF ;Restore # sides 840928 JMP RWSEC ;"Call" Read/Write Sector ;RET PAGE WRITESEC: ;Write a sector to disk ;ENTRY ;SDISK set (O for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector PROC PUSH AF ;Save # sides 840928 LDK A,0FFH STO A,RWFLAG ;Indicate write POP AF ;Restore # sides NC DE :ONES: MOV A,C ADD A,'0' STO A,[DE] INC DE RET PAGE DIVIDE: ;Divide A/C ;ENTRY ;A = Dividend ;C = Divisor ;EXIT ;A = Quotient ;C = Remainder PROC LDK B,-1 ;Initialize count :LOOP: INC B ;Count SUB C JRNC :LOOP ;Loop until too many subtracted ADD A,C ;Restore remainder MOV C,A ;C = Remainder MOV A,B ;A = Quotient RET PAGE ASC_BIN: ;Convert an ASCII string to a binary number (number must be less than 256) ;ENTRY ;HL => String ;A = String length ;EXIT ;A = Binary value ;HL => Next position in string PROC ORA A RZ ;Done if string length = 0 MOV B,A ;B = String length XRA A ;Start with 0 :LOOP: CALL XTEN ;Multiply A * 10 MOV C,A ;C = Number so far LD A,[HL] SUB '0' ;Get next digit ADD A,C ;Add new digit to sum so far INC HL ;Point to next digit DJNZ :LOOP ;Get next digit RET PAGE XTEN: ;Multiply A * 10 ;ENTRY ;A = Number to mult840928 JMP RWSEC ;"Call" Read/Write Sector ;RET PAGE RWSEC: ;Read or Write a sector to disk ;ENTRY ;RWSEC set (0 for read, 0FFH for write) ;SDISK set (0 for drive A, 1 for drive B) ;A = # sides: 0 if zero, not zero if 1 840928 ;B = Track ;C = Sector PROC STO A,:LSIDE ;Save side flag locally 840928 PUSH BC ;Save track and sector CALL SENDEN ;Check density POP BC ;Restore track and sector JNZ :RERR ;Read error LD A,SAVTYP ;Check for double density RRC A JRC :SERR ;If single density, then not system tracks LD A,:LSIDE ;Load side flag 840928 OR A ; 840928 LD A,SAVTYP ;Load savtyp 840928 JRZ :SS ;It's ssdd 840928 ; SBIT 1,A ;Set side bit 840928 JR :GO ;Go for it 840928 ; :SS: CBIT 1,A ;Reset side bit 840928 :GO: STO A,SAVTYP ;Save savtyp it back 840928 MOV A,C STO A,SAVSEC ;Set sector MOV A,B STO A,SAVTRK ;Set track IN BANK_PORT STO A,DMABANK ;Set DMA bank LDK HL,DISKBUFF ;SPRINT PRLINE: ;Output a string (end marker = 0FFH) ;ENTRY ;HL ==> String ;EXIT ;NONE PROC LD A,[HL] CMP 0FFH RZ ;0FFH ends string INC HL ORA A JRZ PRLINE ;Ignore 0 PUSH HL CALL OUTCHAR POP HL JR PRLINE PAGE ROMJUMP: ;Jump to ROM ;ENTRY ;E = Jump table offset ;HL,BC,A = ROM parameters PROC LD IX,RJ_ADDR ;IX = BIOS jump to ROM jump JMP [IX] ;RET RETPROC: RET PAGE ;***** MENU PARAMETER TABLES ;GET CONFIGURATION MENU GETPARM: DB 00 ;Flags = OK to move left DB 3 ;Maximum row number DB '6' ;Window number DW GETDIS ;Get configuration menu display DW RETPROC ;Display current settings routine DB 04 ;Start row of menu DB 01 ;Step size between menu selections DW GETLINES ;Table of addresses of menu line strings DW EXITPARM ;Previous menu = Main menu DW GETMPARM ;Get configuration from memory DW GETDPARM ;Get from drive A DW GETDPARM ;Get from drive Bet DMA address STO HL,DMADR LDK B,1 ;Read 1 sector LD A,RWFLAG ORA A JRZ :READ ;If read CALL WRITE JRNZ :WERR ;Operation complete RET :READ: CALL READ ;Call ROM's read routine RZ ;If no error ;Error reporting :RERR: LDK HL,READERR CALL ERROR ;Display Read error message JR :ERR :WERR: LDK HL,WRTERR CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR ;Display not a system disk CALL ERROR :ERR: ORI 0FFH ;Set error flag RET :LSIDE: DS 1 ;Local side flag stg 840928 PAGE ERROR: ;Display error message and prompt for ESC ;ENTRY ;HL = Error message address ;EXIT ;NONE PROC CALL PRINT ;Display error message :LOOP: CALL GET_CHAR CMP ESC JRNZ :LOOP ;Wait for ESC RET PAGE READ: ;Call ROM routine to read a sector ;ENTRY ;B = Number of sectors to read ;SDISK, SAVSEC, SAVTRK, DMABANK, DMADR set PROC LDK E,ROMREAD JMP ROMJUMP ;RET WRITE: ;Call ROM routine to write a sector  DW EXITPARM ;Exit to CP/M PAGE ;SET CONFIGURATION MENU SETPARM: DB RHT_ON ;Flags = Can't move left or right DB 6 ;Maximum row number DB '2' ;Window number DW SETDIS ;Set configuration menu display DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW SETLINES ;Table of addresses of menu line strings DW SAVEPARM ;Previous menu = Main menu DW KEYPARM ;Key definition menu DW CONPARM ;Console parameters menu DW MODPARM ;Modem port parameters DW PNTRPARM ;Printer port parameters DW PARPARM ;Parallel port parameters DW GENPARM ;General parameters DW SAVEPARM ;Exit to save menu ;SAVE CONFIGURATION MENU SAVEPARM: DB 00 ;Flags = OK to move left DB 4 ;Maximum row number DB '6' ;Window number DW SAVEDIS ;Save configuration menu display DW DISCLR ;Display current settings routine DB 04 ;Start row of menu DB 01 ;Step size betw;ENTRY ;B = Number of sectors to read ;SDISK, SAVSEC, SAVTRK, DMABANK, DMADR set PROC LDK E,ROMWRITE JMP ROMJUMP ;RET SENDEN: ;Call ROM sense density routine PROC LDK E,ROMSENDEN JMP ROMJUMP ;RET PAGE BEEP: ;Saves HL PUSH HL LK A,'G'-040h CALL OUTCHAR POP HL RET CLS: ;Clear screen LK A,'Z'-040h CALL OUTCHAR RET CLRALL: ;Clear full display screen PUSH HL ;Save HL LDK A,'1' CALL SETWIND ;Set window to full display screen CALL CLS POP HL ;Restore HL RET PAGE GET_CHAR: ;Input a character ;EXIT ;A = Character LK E,0FFh LK C,6 CALL BDOS CMP 0 JRZ GET_CHAR RET OUTCHAR: ;Output a character ;ENTRY ;A = Character MOV E,A LD C,2 CALL BDOS RET PAGE PRINT: ;Output a string (end marker = 0) ;ENTRY ;HL ==> String LD A,[HL] ORA A RZ ;0 ends string INC HL CMP 0FFH JRZ PRINT ;Ignore 0FFH PUSH HL CALL OUTCHAR POP HL JR een menu selections DW SAVELINES ;Table of addresses of menu line strings DW SAVEEPARM ;Previous menu is main menu DW SAVEMPARM ;Save configuration in memory DW SAVEDPARM ;Save on drive A DW SAVEDPARM ;Save on drive B DW SETPARM ;Go back to edit menu DW EXITPARM ;Exit to CP/M PAGE EXITPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 0 ;Not used DW 00 ;Table of addresses of menu line strings DW EXITCPM ;Get configuration from memory PAGE ;GET CONFIGURATION CHOICES GETMPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size betw ;CONSOLE MENU CHOICES CONPARM: DB LEFT_OK + LEFT_ON ;Can move down DB 4 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISCON ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW CONLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW CURPARM ;Cursor type selection parameter table DW BACKPARM DW CLICKPARM DW HZPARM DW INITPARM ;Device initialization string CURPARM: DB LEFT_OK ;Can move down DB 4 ;Maximum row number DB '2' ;Window number DW CURDIS ;Message address DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW CURLINES ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW CTYPEPARM ;Cursor type selection parameter table DW CTYPEPARM DW CTYPEPARM DW CTYPEPARM DW CTYPEPARM BACKPARM: DB LEFT_OK ;Can een menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW GETMEM ;Get configuration from memory GETDPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW GETDRV ;Get configuration from drive A PAGE ;KEY DEFINITION CHOICES KEYPARM: DB LEFT_OK + LEFT_ON ;OK to move down DB 1 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISKEY ;Display current settings routine DB 00 ;Start row of menu DB 12 ;Step size between menu selections DW KEYLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu is save setup menu DW FUNPARM ;Edit key parameter table DW ARRPARM FUNPARM: DB LEFT_OK move up DB 0FFH ;Maximum row number DB '2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 01 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Exit menu DW BACKTYPE ;Define background type (selection 0) PAGE CLICKPARM: DB LEFT_OK ;Can move up DB 0FFH ;Maximum row number DB '2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 14 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW TOGCLICK ;Select click HZPARM: DB LEFT_OK ;Can move up DB 0FFH ;Maximum row number DB '2' ;Window number DW 00 ;Display menu message address DW RETPROC ;Display current settings routine DB 14 ;Start row of menu DB 01 ;Step size between menu selections  ;OK to move left or right DB 9 ;Maximum row number DB '1' ;Window number DW FUNDIS ;Message address DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW FUNLINES ;Table of addresses of menu line strings DW KEYPARM ;Exit menu is key definitions menu DW EDKEYPARM ;Edit key parameter table DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM DW EDKEYPARM ARRPARM: DB LEFT_OK ;Not used DB 5 ;Maximum row number DB '1' ;Window number DW ARRDIS ;Display menu DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW ARRLINES ;Table of addresses of menu line strings DW KEYPARM ;Exit menu DW CPMPARM ;Set to CP/M DW WSPARM ;Set to WS DW EDARRPARM ;Edit arrow key table DW EDARRPARM DW EDARRPARM DW EDARRPARM PAGE   DW 00 ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW TOGHERTZ ;Select click DEVPARM: DB LEFT_OK ;Can move down DB 3 ;Maximum row number DB '2' ;Window number DW DEVDIS ;Message address DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW DEVLINES ;Table of addresses of menu line strings DW MODPARM ;Previous menu DW DTYPEPARM ;Device type selection parameter table DW DTYPEPARM DW DTYPEPARM DW DTYPEPARM DW DTYPEPARM PAGE MODPARM: DB LEFT_OK + LEFT_ON ;OK to move left DB 03 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISMOD ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW MODLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW BAUDPARM ;Miscellaneous stuff menu DW PROTPARM ;Set protocol DW DEVPA 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SAVEDRV ;Get configuration from drive A SAVEEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 0 ;Not used DW 00 ;Table of addresses of menu line strings DW SAVEEXIT ;Exit to CP/M if configuration has been saved ;or user wants to exit anyway (ask) PAGE ;I/O DEVICE CHOICES PROTPARM: DB LEFT_OK ;Can't move to another menu on same screen DB 2 ;Maximum row number DB '2' ;Not used DW PROTDIS ;Prepare message routine DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW PROTLINES ;Table of addresses of menu line strings DW MODPARM ;PrevioRM DW INITPARM PNTRPARM: DB LEFT_OK + LEFT_ON ;OK to move left DB 03 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISPNTR ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW PNTRLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW BAUDPARM ;Baud rate menu DW PROTPARM ;Protocol parameter DW DEVPARM DW INITPARM PARPARM: DB LEFT_OK + LEFT_ON ;OK to move left DB 02 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISPAR ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW PARLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW PPROTPARM ;Set parallel protocol DW DEVPARM ;Device assignment DW INITPARM DW IADDRPARM ;Set IEEE address GENPARM: DB LEFT_OK + LEFT_ON ;OK to move left and left menu is on same screen us menu DW SETPPARM ;No Protocol DW SETPPARM ;XON/XOFF Protocol DW SETPPARM ;ETX/ACK Protocol BAUDPARM: DB LEFT_OK ;Can move left DB 14 ;Maximum row number DB '2' ;Window number DW BAUDDIS ;Not used DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW BAUDLINES ;Table of addresses of menu line strings DW MODPARM ;Previous menu DW SETBPARM ; 50 Baud DW SETBPARM ; 75 Baud DW SETBPARM ; 110 Baud DW SETBPARM ;134.5 Baud DW SETBPARM ; 150 Baud DW SETBPARM ; 300 Baud DW SETBPARM ; 600 Baud DW SETBPARM ; 1200 Baud DW SETBPARM ; 1800 Baud DW SETBPARM ; 2400 Baud DW SETBPARM ; 3600 Baud DW SETBPARM ; 4800 Baud DW SETBPARM ; 7200 Baud DW SETBPARM ; 9600 Baud DW SETBPARM ;19200 Baud PAGE PPROTPARM: DB LEFT_OK ;Can't move to another menu on same screen DB 0FFH ;Maximum row number DB '2' ;Not used DW 0 ;Prepare mess DB 00 ;Maximum row number DB '3' ;Window number DW SETDIS ;Message address DW DISGEN ;Display current settings DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW GENLINES ;Table of addresses of menu line strings DW SETPARM ;Exit menu DW TIMPARM ;Set device timeout parameters PAGE ;SAVE CONFIGURATION CHOICES SAVEMPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SAVEMEM ;Get configuration from memory SAVEDPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB age routine DW RETPROC ;Display current settings routine DB 02 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 00 ;Previous menu DW PARPROT ;Set parallel protocol PAGE IADDRPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Maximum row number DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 00 ;Previous menu DW SETIADDR ;Set IEEE address TIMPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Indicate this is a function selection DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu lines DW 00 ;Previous menu DW SETTI0 ;Not used DW CURTYPE ;Set cursor type PAGE INITPARM: DB LEFT_OK ;No other menu on same screen DB 0FFH ;Maximum row number DB '1' ;Not used DW 00 ;Prepare menu display DW RETPROC ;Display current settings routine DB 03 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW CONPARM ;Previous menu DW EDIT_INIT ;Edit initialization string PAGE SETPPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SETPROT ;Set protocol SETBPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;DisplaME ;Set device timeout PAGE ;KEY DEFINITION CHOICES ;Edit function keys EDKEYPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW EDIT_FUN ;Edit function keys EDARRPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 03 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW EDIT_ARR ;Edit arrow keys CPMPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used Dy current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SETBAUD ;Set protocol DTYPEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW DEVASSIGN ;Set cursor type PAGE ;***** MENU ROW ADDRESS TABLES ;Tables of addresses of strings to display individual menu rows ;(Used in highlighting selected row) GETLINES: ;Get configuration menu lines DW GET0 DW GET1 DW GET2 DW GET3 SETLINES: ;Set configuration menu lines DW SET0 DW SET1 DW SET2 DW SET3 DW SET4 DW SET5 DW SET6 SAVELINES: ;Save configuration menu lines DW SAVE0 W 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SET_TO_CPM ;Set arrow keys to CP/M WSPARM: DB LEFT_OK ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW 0 ;Not used DW SET_TO_WS ;Terminal emulation PAGE ;CONSOLE CHOICES CTYPEPARM: DB 0 ;Not used DB 0FFH ;Indicate this is a function selection, ;not a menu selection DB '1' ;Not used DW 0 ;Not used DW RETPROC ;Display current settings routine DB 00 ;Start row of menu DB 01 ;Step size between menu selections DW 00 ;Table of addresses of menu line strings DW !DW SAVE1 DW SAVE2 DW SAVE3 DW SAVE4 KEYLINES: ;Key definition menu lines DW KEY0 DW KEY1 FUNLINES: ;Function key menu lines DW FUN0 DW FUN1 DW FUN2 DW FUN3 DW FUN4 DW FUN5 DW FUN6 DW FUN7 DW FUN8 DW FUN9 ARRLINES: ;Arrow key menu lines DW ARR0 DW ARR1 DW ARR2 DW ARR3 DW ARR4 DW ARR5 PAGE CONLINES: ;Console menu lines DW CON0 DW CON1 DW CON2 DW CON3 DW MOD3 CURLINES: ;Cursor menu lines DW CTYPE0 DW CTYPE1 DW CTYPE2 DW CTYPE3 DW CTYPE4 MODLINES: ;Modem menu lines DW MOD0 DW MOD1 DW MOD2 DW MOD3 PNTRLINES: ;Printer port menu lines DW MOD0 DW MOD1 DW MOD2 DW MOD3 PARLINES: ;Parallel port menu lines DW PAR0 DW MOD2 DW MOD3 DW PAR3 GENLINES: ;General menu lines DW GEN0 PROTLINES: ;Serial port protocol menu lines DW PROT0 DW PROT1 DW PROT2 BAUDLINES: ;Baud rate menu lines DW BAUD1 DW BAUD2 DW BAUD3 'Z'-040h DB ESC,'=',32+13,32+20,'character places remaining',HOME DB 'Select the function keys you want to change',CRLF,LF FUN0: DB ' 1 - ',0FFH,CRLF FUN1: DB ' 2 - ',0FFH,CRLF FUN2: DB ' 3 - ',0FFH,CRLF FUN3: DB ' 4 - ',0FFH,CRLF FUN4: DB ' 5 - ',0FFH,CRLF FUN5: DB ' 6 - ',0FFH,CRLF FUN6: DB ' 7 - ',0FFH,CRLF FUN7: DB ' 8 - ',0FFH,CRLF FUN8: DB ' 9 - ',0FFH,CRLF FUN9: DB ' 0 - ',0FFH,CRLF DB 0 ARR_PLATE: DB ESC,'=',32+13,32+20,'character places remaining',HOME DB 'Select a standard arrow key definition',CRLF DB 'or select individual arrow keys to define any way you like', ESC,'(',CRLF,LF ARR0: DB ' CP/M standard ',0FFH,CRLF ARR1: DB ' WordStar standard ',0FFH,CRLF ARR2: DB ' UP - ',0FFH,CRLF ARR3: DB ' RIGHT - ',0FFH,CRLF ARR4: DB ' DOWN - ',0FFH,CRLF ARR5: DB ' LEFT - ',0FFH DB ESC,'s3',LF DB ESC,'l','Current Arrow Key Settings',ESC,'m' DB 0 PAGE POS_1: DB ESC,'s1',ESC,'=',Y_BASE+2,X_BASE+8,0 POS_2:  DW BAUD4 DW BAUD5 DW BAUD6 DW BAUD7 DW BAUD8 DW BAUD9 DW BAUD10 DW BAUD11 DW BAUD12 DW BAUD13 DW BAUD14 DW BAUD15 DEVLINES: ;Device assignment menu lines DW DEV0 DW DEV1 DW DEV2 DW DEV3 PAGE ;***** SYSTEM MESSAGES ;Menu messages HEADER: DB ESC,'s','0','Z'-040h DB ' *** Osborne Executive Configuration Program *** V1.3' DB 0 GETMESS: DB ESC,'=',32+2,32+0,'Select source for configuration',CRLF,LF ;Get configuration menu display GET0: DB ' FROM MEMORY ',0FFH,CRLF GET1: DB ' FROM DRIVE A ',0FFH,CRLF GET2: DB ' FROM DRIVE B ',0FFH,CRLF GET3: DB ' EXIT TO CP/M ',0FFH DB 0 SETMESS: DB 'Z'-40h ;Set parameters menu display DB 'Select the items you want to change:',CRLF,LF SET0: DB ' KEY DEFINITIONS ',0FFH,CRLF SET1: DB ' CONSOLE PARAMETERS ',0FFH,CRLF SET2: DB ' MODEM PORT ',0FFH,CRLF SET3: DB ' PRINTER PORT ',0FFH,CRLF SET4: DB ' PARALLEL PORT ',0FFH,CRLF SET5: DB ' GENERA DB ESC,'s1',ESC,'=',Y_BASE+3,X_BASE+8,0 POS_3: DB ESC,'s1',ESC,'=',Y_BASE+4,X_BASE+8,0 POS_4: DB ESC,'s1',ESC,'=',Y_BASE+5,X_BASE+8,0 POS_5: DB ESC,'s1',ESC,'=',Y_BASE+6,X_BASE+8,0 POS_6: DB ESC,'s1',ESC,'=',Y_BASE+7,X_BASE+8,0 POS_7: DB ESC,'s1',ESC,'=',Y_BASE+8,X_BASE+8,0 POS_8: DB ESC,'s1',ESC,'=',Y_BASE+9,X_BASE+8,0 POS_9: DB ESC,'s1',ESC,'=',Y_BASE+10,X_BASE+8,0 POS_0: DB ESC,'s1',ESC,'=',Y_BASE+11,X_BASE+8,0 POS_UP: DB ESC,'s1',ESC,'=',Y_BASE+5,X_BASE+12,0 POS_DOWN: DB ESC,'s1',ESC,'=',Y_BASE+6,X_BASE+12,0 POS_RIGHT: DB ESC,'s1',ESC,'=',Y_BASE+7,X_BASE+12,0 POS_LEFT: DB ESC,'s1',ESC,'=',Y_BASE+8,X_BASE+12,0 FREMAIN: DB ESC,'s1',ESC,'=',Y_BASE+13,X_BASE+16,0 FSETWIND: ;Set up window for displaying current settings ;of key definitions DB ESC,'s5' DB 0 ;Cursor positioning strings for displaying keys FKEY1: DB ESC,'=',32+1,32+0,ESC,'T',0 FKEY2: DB ESC,'=',32+2,32+0,ESC,'T',0 FKEY3: DB ESC,'=',32+3,32+0,ESC,'T',0 FKEY4: DB ESC,'=',32+4,32+0,ESC,L ',0FFH,CRLF SET6: DB ' EXIT TO SAVE MENU ',0FFH DB ESC,'s1',ESC,'=',32+1,32+45,ESC,'l','Current Settings',ESC,'m' DB 0 SAVMESS: DB ESC,'=',32+2,32+0,'Select destination for configuration',CRLF,LF ;Save configuration menu display SAVE0: DB ' TO MEMORY ',0FFH,CRLF SAVE1: DB ' TO DRIVE A ',0FFH,CRLF SAVE2: DB ' TO DRIVE B ',0FFH,CRLF SAVE3: DB ' RETURN TO EDIT MENU ',0FFH,CRLF SAVE4: DB ' EXIT TO CP/M ',0FFH DB 0 PAGE ;KEY DEFINITION DISPLAYS FUN_FRAME: DB ESC,'s3','Z'-40H KEY0 D ',ESC,')', Functio Keys ',ESC,'(',0FFH,CRLF DB ' 1 -',CRLF DB ' 2 -',CRLF DB ' 3 -',CRLF DB ' 4 -',CRLF DB ' 5 -',CRLF DB ' 6 -',CRLF DB ' 7 -',CRLF DB ' 8 -',CRLF DB ' 9 -',CRLF DB ' 0 -',CRLF DB CRLF KEY1: DB ' ',ESC,')',' Arrow keys: ',ESC,'(',0FFH,CRLF DB 0 ARR_TYPES: DB ' UP -',CRLF DB ' RIGHT -',CRLF DB ' DOWN -',CRLF DB ' LEFT -' DB 0 FUN_PLATE: DB !'T',0 FKEY5: DB ESC,'=',32+5,32+0,ESC,'T',0 FKEY6: DB ESC,'=',32+6,32+0,ESC,'T',0 FKEY7: DB ESC,'=',32+7,32+0,ESC,'T',0 FKEY8: DB ESC,'=',32+8,32+0,ESC,'T',0 FKEY9: DB ESC,'=',32+9,32+0,ESC,'T',0 FKEY0: DB ESC,'=',32+10,32+0,ESC,'T',0 UPKEY: DB ESC,'=',32+13,32+5,ESC,'T',0 DOWNKEY: DB ESC,'=',32+14,32+5,ESC,'T',0 RIGHTKEY: DB ESC,'=',32+15,32+5,ESC,'T',0 LEFTKEY DB ESC,'=',32+16,32+5,ESC,'T',0 CARR_POS: DB ESC,'s3',LF,LF,0 ARR_POS: DB ESC,'s3',ESC,'=',32+13,32+0,0 CPM: DB ' CP/M',ESC,'T',0FFH,0 WS: DB ' WordStar',ESC,'T',0FFH,0 SPECIAL: DB ' Special',ESC,'T',0FFH,0 PAGE ;CONSOLE DISPLAYS CUR_HDR: DB ESC,'s3','Z'-40h CON0: DB ' ',ESC,')',' Cursor type: ',ESC,'(',0FFH,CRLF,' ',0 ;Cursor type device header message BACK_HDR: DB CRLF,LF CON1: DB ' ',ESC,')',' Background attributes: ',ESC,'(',0FFH,CRLF,0 CLIC_HDR: DB CRLF,LF CON2: DB ' ',ESC,')',' Key Click: ',ESC,'(',0FFH,CRLF,0 HZ_HDR: DB CRLF,LF CON3: DB ' ',ESC,')',' Monitor Frequency,0FFH,CRLF BAUD13: DB ' 7200 ',ESC,'T',0FFH,CRLF BAUD14: DB ' 9600 ',ESC,'T',0FFH,CRLF BAUD15: DB ' 19200 ',ESC,'T',0FFH DB ESC,'s3',ESC,'l','Current Baud Rate',ESC,'m' DB 0 DEVMENU: DB ESC,'s1',LF,'Select the type of device you plan to attach to this port' DB ESC,'s2',CRLF,LF,LF DEV0: DB ' PRINTER (LST:) ',ESC,'T',0FFH,CRLF DEV1: DB ' TERMINAL (CONIN:/CONOUT:) ',ESC,'T',0FFH,CRLF DEV2: DB ' OTHER DEVICE (AUXIN:/AUXOUT:) ',ESC,'T',0FFH,CRLF DEV3: DB ' NO DEVICE ',ESC,'T',0FFH DB ESC,'s3',CRLF,ESC,'l','Current Device Selection',ESC,'m' DB 0 PAGE DCONINIT: DB ESC,'s3',ESC,'=',32+13,32+5,ESC,'T',0 DMODINIT: DB ESC,'s3',ESC,'=',32+10,32+5,ESC,'T,0 DPRINIT: DB ESC,'s3',ESC,'=',32+10,32+5,ESC,'T',0 DPARINIT: DB ESC,'s3',ESC,'=',32+ 7,32+5,ESC,'T',0 IEDIT_INSTR: DB ESC,'s4',ESC,'=',32+15,32+2,'Enter initialization string: ' DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+19,'character places remaining' DB ESC,'s7',ESC,'=',32+2,32+15,'Press ^RETURN to s: ',ESC,'(',0FFH,CRLF,0 CURMENU: DB ESC,'s1',LF,'Select cursor type:' DB ESC,'s2',CRLF,LF CTYPE0: DB ' Invisible ',ESC,'T',0FFH,CRLF CTYPE1: DB ' Blinking Block ',ESC,'T',0FFH,CRLF CTYPE2: DB ' Steady Block ',ESC,'T',0FFH,CRLF CTYPE3: DB ' Blinking Underline ',ESC,'T',0FFH,CRLF CTYPE4: DB ' Steady Underline ',ESC,'T',0FFH DB ESC,'s3' DB ESC,'l','Current Cursor Type',ESC,'m' DB 0 ON: DB ' On',ESC,'T',0 OFF: DB ' Off',ESC,'T',0 PAGE ;I/O DEVICE DISPLAYS BAUD_HDR: DB ESC,'s3','Z'-40H MOD0: DB ' ',ESC,')',' Baud Rate: ',ESC,'(',0FFH,CRLF,' ',0 PROT_HDR: DB ESC,'s3',CRLF,LF,LF MOD1: DB ' ',ESC,')',' Protocol: ',ESC,'(',0FFH,CRLF,' ',0 DEV_HDR: DB CRLF,LF MOD2: DB ' ',ESC,')',' Device Selection: ',ESC,'(',0FFH,CRLF,0 INIT_HDR: DB CRLF,LF MOD3: DB ' ',ESC,')',' Initialization String: ',ESC,'(',0FFH,CRLF,' ',0 PPROT_HDR: DB ESC,'s3','Z'-40H PAR0: DB ' ',ESC,')',' Protocol: ',ESC,'(',0FFH,CRLF,' ',0 IEEE_HDR: DB CRLave string, ^ESC to exit without changing' DB 0 FEDIT_INSTR: DB ESC,'s4',ESC,'=',32+14,32+2,'Enter function key definition:',CRLF DB ' ' FNUM: DB '0',': ' DB ESC,'s7','Z'-40H,ESC,'=',32+1,32+16,'Press ^RETURN to save key definition' DB ESC,'=',32+2,32+16,'Press ^ESC to exit without changing old definition' DB 0 AEDIT_INSTR: DB ESC,'s7','Z'-40H,ESC,'=',32+1,32+16,'Press ^RETURN to save key definition' DB ESC,'=',32+2,32+16,'Press ^ESC to exit without changing old definition' DB ESC,'s4',ESC,'=',32+14,32+2,'Enter arrow key definition:',CRLF DB 0 IEDIT_POS: DB ESC,'s8',0FFH,ESC,'=',32+0,32+0,0 FEDIT_POS: DB ESC,'s9',0FFH,ESC,'=',32+0,32+0,0 AEDIT_POS: DB ESC,'s','9'+1,0FFH,ESC,'=' CROW: DB 32+0,32+0,0 CURROW: = CROW-AEDIT_POS ;Offset to row byte in positioning strings IREMAIN: DB ESC,'s7',ESC,'=',32+0,32+15,0 CLREDIT: DB ESC,'s4',ESC,'=',32+13,32+0,ESC,'Y' DB 0 REVERSE: DB ' Reverse Video',0 NORMAL: DB ' Normal ',0 FIFTYHZ: DF,LF PAR3: DB ' ',ESC,')',' IEEE address: ',ESC,'(',0FFH,CR,0 BAUD_POS: DB ESC,'s3',CRLF,0 PROT_POS: DB ESC,'s3',CRLF,0 DEV_POS: DB ESC,'s3',CRLF,LF,0 PAGE PROTMENU: ;Serial protocol display DB ESC,'s1',LF,'Select Protocol:' DB ESC,'s2',CRLF,LF PROT0: DB ' No Protocol ',ESC,'T',0FFH,CRLF PROT1: DB ' XON/XOFF ',ESC,'T',0FFH,CRLF PROT2: DB ' ETX/ACK ',ESC,'T',0FFH DB ESC,'s3',ESC,'l','Current Protocol',ESC,'m' DB 0 BAUDMENU: DB ESC,'s1',LF,'Select Baud Rate:' DB ESC,'s2',CRLF,LF BAUD1: DB ' 50 ',ESC,'T',0FFH,CRLF BAUD2: DB ' 75 ',ESC,'T',0FFH,CRLF BAUD3: DB ' 110 ',ESC,'T',0FFH,CRLF BAUD4: DB ' 134.5 ',ESC,'T',0FFH,CRLF BAUD5: DB ' 150 ',ESC,'T',0FFH,CRLF BAUD6: DB ' 300 ',ESC,'T',0FFH,CRLF BAUD7: DB ' 600 ',ESC,'T',0FFH,CRLF BAUD8: DB ' 1200 ',ESC,'T',0FFH,CRLF BAUD9: DB ' 1800 ',ESC,'T',0FFH,CRLF BAUD10: DB ' 2400 ',ESC,'T',0FFH,CRLF BAUD11: DB ' 3600 ',ESC,'T',0FFH,CRLF BAUD12: DB ' 4800 ',ESC,'T'"B ' 50 Hz (European)',0 SIXTYHZ: DB ' 60 Hz (American)',0 PRINTER: DB ' Printer (LST:) ',0 TERM: DB ' Terminal (CONIN:/CONOUT:)',0 OTHER: DB ' Other (AUXIN:/AUXOUT:) ',0 NOTASSIGNED: DB ' No Device ',0 PAGE IEEEINST: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Enter IEEE address (between 0 and 30) ' DB 0 IEEEPOS: DB CRLF,' ' IEEEVAL: DS 3 DB 0 TIMEINST: DB ESC,'s7','Z'-40H,ESC,'s4' DB ESC,'=',32+15,32+16,'Enter device timeout in seconds (0-995)' DB ESC,'=',32+16,32+16,'(Value will be rounded to a multiple of 5) ' DB ' ' DB 0 DEVTIM_HDR: DB ESC,'s3','Z'-40H GEN0: DB ' ',ESC,')',' Device Timeout: ',ESC,'(',0FFH DB ESC,'=',32+1,32+9,'seconds','K'-40H TIMEPOS: DB CRLF,' ',0 PAGE GETINSTR: DB ESC,'s1' DB ESC,'=',32+12,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+13,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+14,32+16,'Press ESC to exit from Setup' ot up to date for this version of setup' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 NOTEXEC: DB ESC,'s1','Z'-40H,ESC,'=',32+10,32+5,'ERROR: EXECUTIVE SETUP' DB ESC,'=',32+11,32+5,'This setup program is designed for the Osborne Executive' DB ESC,'=',32+12,32+5,'Your machine is not a valid Executive.' DB ESC,'=',32+13,32+5,'Please use the setup program designed for your machine' DB ESC,'=',32+15,32+5,'Press ESC key' DB 0 BADVER: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'INVALID VERSION NUMBER' DB ESC,'=',32+1,32+16,'Source is not up to date for this version of setup' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 YOUSURE: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'Setup has not been saved yet' DB ESC,'=',32+1,32+16,'Are you sure you want to quit? (Y/N) ' DB 0 NOROOM: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'NOT ENOUGH CHARACTER PLACES REMAINING' DB ESC,'=',32+1,32+16,'To make more room, shorten your function key definitions' DB ESC,'=',32+2,32+16,'Press ESC key'  DB 0 SETINSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to Save Menu' DB 0 RHT_INSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to menu on left' DB 0 SUBINSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit to previous menu' DB 0 SAVEINSTR: DB ESC,'s7','Z'-40H DB ESC,'=',32+0,32+16,'Use arrow keys to position cursor',CRLF DB ESC,'=',32+1,32+16,'Press RETURN to make a selection',CRLF DB ESC,'=',32+2,32+16,'Press ESC to exit from Setup' DB 0 PAGE MEMSAVE: DB ESC,'s1' DB ESC,'=',32+11,32+20,ESC,')','Configuration saved  DB 0 CLRERR: DB ESC,'s7','Z'-40H,0 PAGE INIT_STRING: DB ESC,'f' ;Disable function key translation DB ESC,'.2' ;Block cursor DB ESC,'z','1',32+ 2,32+ 0,32+23,32+79 ;Full screen except header area DB ESC,'z','2',32+ 3,32 ,32+19,32+39 ;Left half of screen DB ESC,'z','3',32+ 4,32+40,32+20,32+79 ;Right half of screen DB ESC,'z','4',32+ 3,32 ,32+20,32+79 ;Editing area DB ESC,'z','5',32+ 4,32+49,32+20,32+79 ;Data area of current function key settings D ESC,'z','6',32 3,32+16,32+19,32+7 ;Center screen DB ESC,'z','7',32+21,32+ 0,32+23,32+79 ;Bottom portion of screen DB ESC,'z','8',32+19,32+ 4,32+20,32+79 ;Editing window for initialization strings DB ESC,'z','9',32+18,32+ 6,32+21,32+79 ;Editing window for function keys DB ESC,'z','9'+1,32+18,32+12,32+21,32+79 ;Editing window for arrow keys DB ESC,'s','0','Z'-040h D 0 INITROW: = 20 - 19 ;Last row number INITLEN: = 79 - 4 + 1 ;Length of line in editing window for ; initialization stringto ',ESC,'(' DB 'MEMORY ' DB 0 DRVSAVE: DB ESC,'s1' DB ESC,'=',32+11,32+20,ESC,')','Configuration saved to ',ESC,'(' DB 'DRIVE ' SAVDRV: DB 'A' DB 0 CLRDEST: DB ESC,'s1' DB ESC,'=',32+10,32+0,ESC,'T' DB 0 PAGE NOPROT: DB ' No Protocol ',0 XONPROT: DB ' XON/XOFF ',0 ETXPROT: DB ' ETX/ACK ',0 CENPROT: DB ' CENTRONICS ',0 IEEEPROT: DB ' IEEE ',0 PAGE ;ERROR MESSAGES READERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'READ ERROR' DB ESC,'=',32+1,32+16,'Press ESC key' DB 0 WRTERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'WRITE ERROR' DB ESC,'=',32+1,32+16,'Press ESC key' DB 0 SYSDERR: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'NOT AN EXECUTIVE SYSTEM DISKETTE' DB ESC,'=',32+1,32+16,'You can only setup diskettes with Executive system tracks.' DB ESC,'=',32+2,32+16,'Press ESC key' DB 0 BADDEST: DB ESC,'s7','Z'-40H,ESC,'=',32+0,32+16,'INVALID VERSION NUMBER' DB ESC,'=',32+1,32+16,'Destination version is n"s FUNROW: = 21 - 18 ;Last row number FUNLEN: = 79 - 6 + 1 ;Length of line in editing window for ; function keys ARRROW: = 21 - 18 ;Last row number ARRLEN: = 79 - 12 + 1 ;Length of line in editing window for ; arrow keys BIOS_ADDR: DB 00H ;BIOS jump table address DS 1 RJ_ADDR: DB 5AH ;ROM jump address (high byte set on initialization) DS 1 ;High byte SET_CTYPE: DB ESC,'.' CUR: DB '2' DB 0 CUROFF: DB ESC,'.0',0 CURON: DB ESC,'.2',0 HIGHON: DB ESC,'j',0 ;Highlight on HIGHOFF: DB ESC,'k',0 ;Highlight off HALFON: DB ESC,')',0 HALFOFF: DB ESC,'(',0 BACKONE: DB BKS,' ',BKS,0 SWIND: DB ESC,'s' ;Set window WINDOW: DB '0' DB 0 PAGE ;FLAGS SAVEFLAG: DB 0 ;Indicates whether or not setup has been saved ; 0 = Not saved yet DINITFLAG: DB 0 ;Indicates if device initialization should be done on exit ; 0 = No CURSET: DB ESC,'s3','Z'-40H DB 0 PAGE ;***** VARIABLES SCBPBENGTH: DS 1 ;Holds meximum display length for PRINTFKEY LIMFLAG DS 1 ;Holds limit flag for SHOW_KEY (0FFH = No display length limit) TEMP: DS 1 NUMBUFF: DS 6 ;Buffer for ASCII strings PAGE ;***** SETUP PARAMETERS SETUP_TABLE: FUN_TABLE: DS LEN_FKEY ;Function key table END_FUN: = FUN_TABLE+255 ; Last byte of function key table HERTZ: DS 1 ;50/60 Hertz CURSOR_ATTRIB: DS 1 ;Cursor type BACK_ATTRIB: DS 1 ;Background type KEYCLICK: DS 1 ;Key click on/off DEVTBL: ;I/O Character device table (physical devices) DS DTBLLEN ;Each entry in the table consists of: ; Device name: 6 bytes ; Mode byte: 1 byte ; Baud rate: 1 byte SHAD_TBL: DS STBLLEN ;Device shadow table ;Each entry in the table consists of: ; Routine address: 2 bytes ; Flag byte: 1 byte ; IEEE device number 1 byte IEEEADDR: = SHAD_TBL + (IEEENUM * 4) + 3 ;IEEE device address byte of ; IEEE shadow table entry DEVFLGS: ;I/O Devi: ;System control block parameter table (used in BDOS function 49) SCBOFF: DS 1 ;SCB offset SCBSET: DS 1 ;Set flag: FFh if setting a byte, FEh if setting a word, otherwise get SCBVAL: DS 2 ;Value to set BIOSPB: ;BIOS parameter block (used in BDOS function 50) BIOSFUNC: DS 1 ;BIOS function number BIOSAREG: DS 1 ;A Register value to pass BIOSBCREG: DS 2 ;BC Register BIOSDEREG: DS 2 ;DE Register BIOSHLREG: DS 2 ;HL Register ;String editing variables KEYNUM: DS 1 ;Function key number being edited NUMENT: DS 1 ;Number of entries in string editing area CUR_POINTER: DS 2 ;POINTER TO START OF KEY POSITION KEY_TABLE: DS 2 ;Holds start address of string table END_KEY_TABLE: DS 2 ;Holds end address of string address (last byte) POS_SPACE: DS 2 ;Holds address of positioning string for printing number of spaces remaining BIOSVER: DS 2 ;Source BIOS version number RWFLAG: DS 1 ;Read/Write flag for RWSEC SIDE: DS 1 ;Side flag for read/wr 840928 Sce flags (logical devices) DS 2 * NUM_LDEV ;Each entry consists of a 16-bit I/O redirection vector ;Bits 0-B correspond to physical device #'s 0-B ;If a bit is set, I/O to the logical device is redirected ;to the corresponding physical device INIT_TBL: DS ITBLLEN ;Table of initialization strings for devices TIMEOUT: = INIT_TBL+ITBLLEN ;Timeout byte follows initialization table DS 1 PAGE ;***** BUFFER SPACE DISKBUFF: DS 400H ;1K Disk buffer BL: ;I/O Character device table (physical devices) DS DTBLLEN ;Each entry in the table consists of: ; Device name: 6 bytes ; Mode byte: 1 byte ; Baud rate: 1 byte SHAD_TBL: DS STBLLEN ;Device shadow table ;Each entry in the table consists of: ; Routine address: 2 bytes ; Flag byte: 1 byte ; IEEE device number 1 byte IEEEADDR: = SHAD_TBL + (IEEENUM * 4) + 3 ;IEEE device address byte of ; IEEE shadow table entry DEVFLGS: ;I/O DeviAVSTK: DS 2 ;Used by BANKMOVE to save stack pointer NUM_BLANKS: DS 1 ;Holds number of blanks left in function key table SOURCE: DS 1 ;Holds configuration source code ; 0 = Memory ; 1 = Drive A ; 2 = Drive B DIGFLAG: DS 1 ;Flag for BIN_ASC to indicate if hundreds digit has been displayed PPROT: DS 1 ;Flag to indicate Centronics or IEEE protocol fro parallel port MEMCUR: DS 1 ;Cursor type to be saved to memory on exiting setup MEMESC: DS 1 ;^ESC key translation before replaced by special setup definition MEMRET: DS 1 ;^RET key translation before replaced by special setup definition ESCLOC: DS 2 ;Holds location in buffer of ^ESC key RETLOC: DS 2 ;Holds location in buffer of ^RET key HIFLAG: DS 1 ;Flag to indicate whether highlighting should be turned on or off CURCOUNT: DS 2 ;Holds count for positioning cursor for editing string ROWLEN: DS 1 ;Holds length of row for editing string ROWMAX: DS 1 ;Holds last row number for editing string L#ble address CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITPREV: ;Exit to previous menu ;ENTRY ;HL ==> Current menu parameter table ;EXIT ;HL ==> New menu parameter table PROC PUSH HL ;Save current parameter address XRA A STO A,HIFLAG CALL HIGHLIGHT ;Turn off highlighting on previous selection ;GET PREVIOUS MENU'S PARAMETER TABLE LDK DE,EXITOFF CALL GETVAL INC HL ;HL ==> Maximum row number LD A,[HL] DEC HL ;Restore HL to beginning of table CMP 0FFH JRZ :SEL ;If this is a selection POP DE ;Restore stack ;DISPLAY NEW SCREEN LD A,[HL] ANI RHT_ON ;Check if new display JRZ :NEW ;If new display PUSH HL LDK HL,SET_INSTR CALL PRINT POP HL CALL SETCUR ;Position cursor RET :NEW: CALL DISP_SCR ;If new display LD A,[HL] Anormally in memory ; not the cursor type set specifically for setup LDK B,0 ;Go to Row 1 of main menu display JMP FAKERET ;"Fake out" GOSEL and "return" with main menu display instead ;RET :ERR: LDK HL,BADVER CALL ERROR ;Display invalid version number message LDK HL,CLRERR CALL PRINT ;Clear error message RET PAGE FROMMEM: ;Get configuration from memory ;ENTRY ;NONE ;EXIT ;Z bit set if no error PROC ;Save source version number LD HL,VERSION ;Get memory BIOS version STO HL,BIOSVER ;Save source BIOS version number ;Save configuration source flag XRA A STO A,SOURCE ;GET I/O VALUES ;Get Physical Devices CALL GETDTBL ;Get HL = address of BIOS device table LDK DE,DEVTBL ;DE = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table (in bank 0) PUSH HL ;Save start address of bank 0 tables LDK DE,SHAD_TBL ;DE = SeNI LEFT_ON RZ ;Done if not a right hand screen PUSH HL LDK HL,RHT_INSTR CALL PRINT POP HL CALL SETCUR RET ;IF SELECTION, CALL ROUTINE :SEL: CALL SELTBL ;Get jump address LDK DE,:RET PUSH DE ;Set up return address JMP [HL] ;"Call" routine :RET: POP HL ;Restore menu parameter table pointer CALL SETCUR ;Reposition cursor RET PAGE EXITCPM: ;Exit to CP/M ;ENTRY ;NONE ;EXIT ;NONE PROC LK HL,GOOD_BYE ;Restore window to full screen and clear screen CALL PRINT LD A,MEMCUR ;Get selected cursor type STO A,CUR LDK HL,SET_CTYPE CALL PRINT IN BANK_PORT STO A,DESTBANK ;Read ROM's key translation tables to this bank LDK A,ROM_BANK STO A,SRCBANK LDK HL,KEYROM ;ROM Key tables LDK DE,DISKBUFF ;Temporary buffer LDK BC,KEYLEN ;Length to move CALL BANKMOVE LD HL,ESCLOC ;Location of ^ESC Character LD A,MEMESC STO A,[HL] ;Restore ^ESC character LDK HL,RETLOC ;Location of ^RET Chatup shadow table XRA A STO A,SRCBANK ;From bank 0 IN BANK_PORT STO A,DESTBANK ;Current bank is destination bank LDK BC,STBLLEN CALL BANKMOVE ;Move shadow table into setup area POP HL ;Restore start address of bank 0 tables LDK DE,ITBL_OFF ;Offset from start of bank 0 tables to initialization strings ADD HL,DE ;HL ==> Initialization strings LDK DE,INIT_TBL LDK BC,ITBLLEN + 1 CALL BANKMOVE ;Move Initialization tables and device timeout into setup area PAGE ;Get Logical Devices XRA A STO A,SCBSET ;Indicate SCB "get" operation LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = SCB offset to first logical device redirection flag LDK HL,DEVFLGS ;HL ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = SCB offset STO A,SCBOFF ;Set offset to redirection flag LDK C,GS_SCB CALL BDOS ;Get HL = value from SCB EX HL,DE racter LD A,MEMRET STO A,[HL] ;Restore ^RET character IN BANK_PORT ;Move old table back into ROM STO A,SRCBANK LDK A,ROM_BANK STO A,DESTBANK LDK HL,DISKBUFF LDK DE,KEYROM LDK BC,KEYLEN CALL BANKMOVE LD A,DINIT_FLAG ORA A JRZ :1 ;If devices don't need to be initialized CALL INITDEV ;Initialize physical devices :1: JMP 0000h ;Jump to CP/M GOOD_BYE: DB ESC,'e' ;Enable function key translation DB ESC,'s','0','Z'-040h DB 0 PAGE GETMEM: ;Get configuration from memory ;*NOTE* -- fakes out return to GOSEL and goes to main menu display instead ; Only call this routine from GOSEL ;ENTRY ;NONE ;EXIT ;NONE PROC CALL FROMMEM ;Get configuration from memory LD HL,BIOSVER ;Get version number CALL VERIFY ;Make sure source is a valid version number JRC :ERR ;Error if invalid version number CALL INIT_PPROT ;Initialize parallel protocol LD A,MEMCUR STO A,CURSOR_ATTRIB ;Set cursor type to what is #;DE = value from SCB POP HL ;HL ==> Current redirection flag STO E,[HL] INC HL STO D,[HL] ;Save redirection flags INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;GET VALUES FROM ROM'S RAM IN BANK_PORT ;Get current bank setting STO A,DESTBANK ;Set destination bank mask to current setting LDK A,ROMBANK STO A,SRCBANK ;Set source bank to ROM bank LDK DE,SETUP_TABLE ;Destination address LDK HL,ROM_TABLE ;Source address LDK BC,LEN_RTBL ;Length of ROM table CALL BANKMOVE ;Move table from ROM'S RAM to setup area CALL CONSET ;Convert cursor and background type from ROM format ; to SETUP format RET PAGE GETDRV: ;Get configuration from drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Get drive LD A,GETPARM ANI ROW ;Get selected row STO A,SOURCE ;Save configuration source flag SUB 1 ;Get drive number STO A,LDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: ;A=0 if ssdd, else A nz 840928 CALL READSEC ;Read from disk into DISKBUFF JRNZ :ERR ;If error LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values in this track ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table location in memory LDK BC,LEN_RTBL ;Length of table LDIR ;Move table into setup area LD A,CURSOR_ATTRIB CMP '5' ;Check if blinking only JRNZ :1 ;If not blinking only LDK A,'1' ;If blinking only, display as blinking block STO A,CURSOR_ATTRIB :1: CALL INIT_PPROT ;Initialize parallel protocol LDK B,0 ;Return to row 1 of main menu JMP FAKERET ;Fake return (go to main menu instead of get menu) ;RET ;Error exits :VERR: LDK HL,BADVER CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,CLRERR CALL PRINT ;Clear error message RET PAGE FAKERET:SDISK ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error 840928 LD A,DISKBUFF+4 CMP EXECUTIVE ;Check product code JNZ :SERR ;No Executive system 840928 ;tracks 840928 CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928  ;Return to specified row of main menu ;instead of returning to GOSEL ;"Fakes out" GOSEL routine ;*NOTE* THIS ROUTINE MUST ONLY BE USED TO FAKE A RETURN TO GOSEL ;ENTRY ;B = Row to return to in previous menu ;EXIT ;NONE PROC ;Set row to specified row LD A,SETPARM ANI NOT ROW ;Clear row bits OR B ;Set to specified STO A,SETPARM ;"Fake out" GOSEL and go to main menu POP HL ;Pop off return address to GOSEL POP HL ;Pop off HL ==> current parameter table LDK HL,SETPARM CALL DISP_SCR ;Display main menu RET ;Return to SELECT routine PAGE SAVEMEM: ;Save configuration to memory ;ENTRY ;None ;EXIT ;None PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Verify that BIOS version is compatible with this version of setup LD HL,VERSION STO HL,BIOSVER CALL VERIFY ;Check if compatible with this setup version JC :VERR ;If not OK ;Save I/O values ;PHYSICAL DEVICES CALL GETDTBL ;Get HL = addres JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values ;A=0 if ssdd, else A nz 840928 :IORD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;If error ;Save source version number LD HL,DISKBUFF STO HL,BIOSVER ;Save BIOS source version number ;Verify source version number is OK CALL VERIFY JRC :VERR ;If invalid version number ;Move I/O values to setup area LDK HL,DISKBUFF LDK DE,DTBLOFF ;Offset to I/O values ADD HL,DE ;HL ==> Device tables in buffer LDK DE,DEVTBL ;DE ==> Setup's device table LDK BC,DTBLLEN+STBLLEN + ITBLLEN + REDIRLEN + 1 LDIR ;Move device table into setup area ;Get function keys, cursor type, background type ;First check # sides to get correct trk/sec values 840928 LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 $s of BIOS device table EX HL,DE ;DE = address of BIOS device table LDK HL,DEVTBL ;HL = Setup device table LDK BC,DTBLLEN ;Length of device table LDIR ;Save device table values CALL GETSTBL ;Get HL = address of BIOS shadow table PUSH HL ;Save start address of bank 0 tables EX HL,DE ;DE = address of BIOS shadow table IN BANK_PORT STO A,SRCBANK ;Source in current bank XRA A STO A,DESTBANK ;Destination bank = 0 LDK HL,SHAD_TBL ;HL = Setup shadow table LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 CALL BANKMOVE ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 POP HL LDK DE,ITBL_OFF ;Offset to initialization strings table ADD HL,DE EX HL,DE ;DE = Initialization strings table LDK HL,INIT_TBL ;HL = Setup's copy of initialization strings LDK BC,ITBLLEN+1 ;Move iniK B,NOT HZ_MASK AND B :2: OUT SYS_CNB EI ;Done with this port now LDK HL,MEMSAVE CALL PRINT ;Print "saved to memory" message ORI 0FFH STO A,SAVEFLAG ;Set flag to show configuation has been saved RET :VERR: LDK HL,BADVER CALL ERROR ;Display invalid version LDK HL,SAVEINST JMP PRINT ;RET :SAVE_ATTRIBS: DB ESC,'s0',ESC,'x' :BACK: DB 0 DB ESC :CLICK: DB 0,0 PAGE SAVEDRV: ;Save system on drive ;ENTRY ;NONE ;EXIT ;NONE PROC ;Clear old "saved to" message LDK HL,CLRDEST CALL PRINT ;Get drive LD A,SAVEPARM ANI ROW ;Get selected row SUB 1 ;Get drive number STO A,SDISK ;Save destination drive ;Verify diskette has Executive system tracks XOR A ;Clear side: boot is 840928 ;always on side 0 840928 LDK B,BOOTTRK ;Boot track LDK C,BOOTSEC ;Boot sector CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;If error LD A,DISKBUFF+4 CMP EXECUTIVE ;Check product code JNZ :SERR ;Ntialization string + device timeout CALL BANKMOVE ORI 0FFH STO A,DINIT_FLAG ;Indicate devices should be initialized on exit PAGE ;LOGICAL DEVICES LDK A,0FEH STO A,SCBSET ;Indicate set word value in SCB LDK B,NUM_LDEV ;B = Number of logical devices LDK C,LDEVOFF ;C = Offset to first logical device redirection flag LDK HL,DEVFLGS ;DE ==> Setup's copy of logical device redirection flags :LOOP: PUSH BC PUSH HL LDK DE,SCBPB ;SCB Parameter block MOV A,C ;A = Offset STO A,SCBOFF ;Store offset to redirection flag LD A,[HL] STO A,SCBVAL ;Store word value to set INC HL LD A,[HL] STO A,SCBVAL+1 LDK C,GS_SCB CALL BDOS ;Get HL = value from SCB POP HL ;HL ==> Current redirection flag INC HL INC HL ;Point to next device's flag POP BC INC C INC C ;C = Offset to next device redirection flag DJNZ :LOOP ;If more devices PAGE ;Save console attributes :S1: LD A,BACK_ATTRIBS STO A,:BACo Executive system tracks CALL SENDEN ;Check # sides 840928 LD A,SAVTYP ; 840928 BIT 1,A ; 840928 JRNZ :DSDD ;Side bit set, must 840928 ;be dsdd 840928 ; XOR A ;No side bit, ssdd 840928 STO A,SIDE ;Set SIDE 0 840928 JR :GOIO ; 840928 ; :DSDD: LDK A,0FFH ;Set SIDE nz 840928 STO A,SIDE ; 840928 ;Get I/O values from destination drive ;First check # sides to get correct trk/sec values 840928 :GOIO: LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO0 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IORD ; 840928 :IO0: LDK B,IOTRK ;Track which holds I/O values LDK C,IOSEC ;Sector which holds I/O values :IORD: CALL READSEC ;Read sector into DISKBUFF JNZ :ERR ;Return if error ;Make sure destination version is compatible with this version of setup LD HL,DISKBUFF CALL VERIFY JC :VERR ;If destiK ;Save background CMP REVBACK ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB JRNZ :1 ;If not reverse video background CMP '1' JRNZ :1 ;If not blinking block cursor LDK A,'5' ;If reverse video background and blinking block cursor ;Actually set blinking only cursor :1: STO A,MEMCUR LD A,KEYCLICK STO A,:CLICK LK HL,:SAVE_ATTRIBS CALL PRINT ;Save function keys and external monitor frequency IN BANK_PORT ;Get current bank STO A,SRCBANK ;Source bank = current bank LDK HL,FUN_TABLE ;Source address LDK A,ROMBANK ;Destination bank STO A,DESTBANK LDK DE,ROM_TABLE ;Destination address LDK BC,LEN_FKEY+1 CALL BANKMOVE ;Move function keys into ROM's RAM ;Actually set monitor frequency LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz DI ;Just in case an interrupt routine changes this IN SYS_CNB JRNZ :60 ;If 60 Hertz LDK B,HZ_MASK OR B ;Set 50 Hz JR :2 :60: LD$nation version number isn't compatible ;Insert new I/O assignments into buffer ;Insert device table LDK DE,DISKBUFF+DTBLOFF ;Offset to I/O values LDK HL,DEVTBL ;HL ==> Setup's device table LDK BC,DTBLLEN LDIR ;Move device table from setup area to buffer ;Insert shadow table (except for routine address bytes) ;(Routine addresses aren't inserted since destination BIOS ;version might be different from source) LDK B,NUMSDEV ;Number of physical devices changable in setup :LOOP1: PUSH BC ;Save count INC HL INC HL ;Skip routine address field INC DE INC DE LDK BC,2 LDIR ;Move flag and IEEE addr bytes from setup area to BIOS area POP BC DJNZ :LOOP1 PAGE ;Insert initialization strings, redirection vectors, and device timeout LDK DE,DISKBUFF+REDIR_OFF ;Redirection vectors and init strings in disk buffer LDK HL,DEVFLGS ;Location in setup area LDK BC,ITBLLEN+REDIRLEN+1 LDIR ;Move to disk buffer ;Write neL PRINT ;Print "saved on drive" message ORI 0FFH STO A,SAVEFLAG ;Indicate configuration has been saved RET ;Error reporting :VERR: LDK HL,BADDEST ;Destination version isn't compatible with this version of setup CALL ERROR JR :ERR :SERR: LDK HL,SYSDERR CALL ERROR :ERR: LDK HL,SAVEINST ;Display instructions after displaying error message JMP PRINT ;RET PAGE SAVEEXIT: ;Exit to CP/M from save menu ;ENTRY ;SAVEFLAG set if configuration has been saved ;EXIT ;NONE PROC LD A,SAVEFLAG ORA A JNZ EXITCPM ;If configuration has been saved then exit to CP/M LDK HL,YOUSURE CALL PRINT ;Ask if user is sure he wants to exit CALL GETCHAR ANI 5FH ;Make upper case CMP 'Y' JZ EXITCPM ;Override RET ;Return to menu if they don't really want to exit PAGE ; ***************************************** ; * FUNCTION KEYS * ; ***************************************** ; EDIT_FUN: ;Edit functw I/O assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :IO1 ;Single sided... 840928 ; LDK B,DSIOTRK ;Double sided 840928 LDK C,DSIOSEC ; 840928 JR :IOWR ; 840928 :IO1: LDK B,IOTRK LDK C,IOSEC :IOWR: CALL WRITESEC JRNZ :ERR ;If write error ;Save function keys, cursor type, background type ;Get sector from destination drive LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST0 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STRD ; 840928 :ST0: LDK B,STUPTRK LDK C,STUPSEC :STRD: CALL READSEC ;Read sector into DISKBUFF JRNZ :ERR ;Check for reverse video background and blinking block cursor LD A,CURSOR_ATTRIB PUSH AF ;Save current cursor attributes CMP '1' JRNZ :1 ;If not blinking block cursor LD A,BACK_ATTRIB CMP REVBACK JRNZ :1 ion key PROC LDK HL,FUNPARM LD A,[HL] ANI ROW ;Get current row INC A CMP 10 JRNZ :1 ;If 1-9 XRA A ;If 0 (0 comes after 9 in display to match keyboard) :1: STO A,KEYNUM ;Set key being edited ADD A,'0' STO A,FNUM ;Put key number into message LDK HL,FEDIT_INSTR CALL PRINT ;Display instructions LDK HL,FEDIT_POS STO HL,CUR_POINTER ;Set cursor position for start of editing area LDK A,FUNLEN ;Maximum number of characters to display per line LDK B,FUNROW ;Last row number CALL EDIT_KEY ;Edit the key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,70 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET PAGE ; ***************************************** ; * ARROW KEYS * ; ;If not reverse video background LDK A,'5' ;If blinking block cursor on reverse video background STO A,CURSOR_ATTRIB ;Set to blink only cursor ;Insert new assignments into buffer :1: LDK HL,DISKBUFF LDK DE,SETOFF ;Offset to setup values ADD HL,DE ;HL ==> Setup table in buffer LDK DE,SETUP_TABLE ;DE ==> Setup table in setup area EX HL,DE LDK BC,LEN_RTBL ;Length LDIR ;Move table from setup area to buffer POP AF STO A,CURSOR_ATTRIB ;Restore cursor type ;Write new assignments to disk LD A,SIDE ;SIDE set previously 840928 ;in this routine 840928 OR A ; 840928 JRZ :ST1 ;Single sided... 840928 ; LDK B,DSSTPTRK ;Double sided 840928 LDK C,DSSTPSEC ; 840928 JR :STWR ; 840928 :ST1: LDK B,STUPTRK LDK C,STUPSEC :STWR: CALL WRITESEC JRNZ :ERR ;If write error ;Return from successful save LD A,SAVEPARM ANI ROW ADD A,'A'-1 STO A,SAVDRV ;Insert drive letter in message LDK HL,DRVSAVE CAL% ***************************************** ; SET_TO_CPM: ;Set arrow key definition to CP/M default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK BC,8 SBC HL,BC ;Carry flag if not enought room for default definition JRC :ERR ;If not enough room LK HL,CPM_ARROWS LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET SET_TO_WS: ;Set arrow key definition to WordStar default PROC LK A,10 CALL SET_HL EX HL,DE LDK HL,END_FUN+1 ORA A SBC HL,DE ;HL = Number of bytes remaining to store arrow key definitions LK BC,8 SBC HL,BC ;Carry flag if not enought;The following parameters must be set up: ; CUR_POINTER holds Address of positioning string for displaying key ; KEY_TABLE holds Address of table of keys ; keys are stored contiguously ; with each key consisting of a length byte followed by the string ; END_KEY_TABLE holds Address of the last available position in the key table ; KEYNUM holds Number of the key within the table (starting counting with 0) ;EXIT ;NONE PROC STO A,ROWLEN ;Save maximum number of characters per row MOV A,B STO A,ROWMAX ;Save maximum number of rows LDK HL,0 STO HL,CURCOUNT ;Initialize cursor count (length of display string) LD HL,KEY_TABLE LDK DE,DISKBUFF LDK BC,100H LDIR ;Save current key setting in case user wants to quit ;without changing CAL CLRKE ;Clea ou ol ke definition LD HL,CUR_POINTER ;Initialize row and column settings LDK DE,CURROW ADD HL,DE ;HL ==> Row number in positioning string LDK A,OFFSET ;Cursor positioning offset  room for default definition JRC :ERR ;If not enough room LK HL,WS_ARROWS LK BC,8 LDIR CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT RET :ERR: LDK HL,NOROOM CALL ERROR ;Display no room message LDK HL,SUBINSTR CALL PRINT RET CPM_ARROWS: DB 1,'K'-040h,1,'L'-040h,1,'J'-040h,1,'H'-040h WS_ARROWS: DB 1,'E'-040h,1,'D'-040h,1,'X'-040h,1,'S'-040h PAGE EDIT_ARR: ;Edit arrow key individually PROC LDK HL,AEDIT_INSTR CALL PRINT ;Display instructions LDK HL,ARRPARM LD A,[HL] ANI ROW ;Get current row ADD A,8 ;Get row number counting function keys STO A,KEYNUM ;Set key being edited SUB 10 ;Get key number in ATYPE_TBL LDK HL,ATYPE_TBL CALL LOOKUP CALL PRLINE ;Display which arrow key is being edited LDK HL,AEDIT_POS STO HL,CUR_POINTER + 0 STO A,[HL] ;Row 0 INC HL STO A,[HL] ;Column = 0 :LOOP: CALL SPACE_LEFT ;Display number of bytes remaining LD HL,CUR_POINTER CALL PRINT ;Position cursor to beginning of string :1: LDK HL,CURON CALL PRINT ;Turn on cursor CALL GET_CHAR PUSH AF ;Save character LDK HL,CUROFF CALL PRINT ;Turn off cursor POP AF ;Restore character CMP LEFT JRZ :ERASE ;ERASE LAST ENTRY CMP EDDONE JRZ :EXIT ;If done editting CMP EDQUIT JRZ :QUIT ;Quit without changing CMP 80H JRNC :ERR ;If invalid MOV B,A ;Save character LD A,NUM_BLANKS ORA A JRZ :ERR ;If no space left MOV A,B ;A = Character CALL ADDCHAR ;Add a character to key definition JR :LOOP ;Get next character :ERASE: LD A,KEYNUM CALL SET_HL LD A,[HL] ORA A JRZ :ERR ;If nothing to erase CALL DELETE ;Delete character JR :LOOP ;Next character :ERR: CALL BEEP ;Indicate error JRZ :LOOP :QUIT: LDK HL, ;Set up editing position LDK A,ARRLEN ;Maximum number of characters to display per line LDK B,ARRROW ;Last row number CALL EDIT_KEY ;Edit key LD A,KEYNUM LDK HL,FPOSTBL CALL LOOKUP ;Get address to display new function key definition CALL PRINT ;Position cursor LD A,KEYNUM LDK B,66 ;Show up to 72 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new setting LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions RET ATYPE_TBL: ;Table of addresses of strings to display arrow type ;(ie UP, DOWN, RIGHT, or LEFT) DW ARR2 DW ARR3 DW ARR4 DW ARR5 PAGE EDIT_KEY: ;Edit function key, arrow key, or initialization string ;ENTRY ;A = Maximum number of characters to display per row ;B = Maximum number of rows %DISKBUFF LD DE,KEY_TABLE LDK BC,100H LDIR ;Restore old key definitions :EXIT: CALL SPACE_LEFT ;Display amount of space left LDK HL,CLREDIT CALL PRINT ;Clear editing lines LDK HL,CURON CALL PRINT ;Make sure cursor is on RET PAGE ADDCHAR: ;Add a character to the end of the currently selected string ;ENTRY ; A = Character to add ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC PUSH AF ;Save character ;Move table down to make room for new character LD A,KEYNUM INC A CALL SET_HL ;Get start address of next key PUSH HL ;Save location to store byte CALL DIST2END ;Get distance to end of table ;BC = Distance to end of table LD HL,END_KEY_TABLE PUSH HL POP DE ;DE = Last byte in buffer area DEC HL ;HL = 2nd to last position LDDR ;Shift table to insert character ;Insert byte POP HL ;Get location to store character POPo to display window LD A,KEYNUM LDK B,0FFH ;No maximum length LDK C,0 ;Don't display the word NONE if length = 0 CALL SHOW_KEY ;Display key RET :1: MOV B,E ;B = Length of string :LOOP: PUSH BC ;Save count LDK HL,BACKONE CALL PRINT ;Backspace one position POP BC DJNZ :LOOP ;If more places to backspace RET PAGE CLRKEY: ;Clear old key definition out of key table ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,KEYNUM CALL SET_HL ;HL ==> Key definition LD A,[HL] ;Get length ORA A RZ ;Done if key already empty STO 0,[HL] ;Set length to 0 PUSH HL ;Save address of this key's length byte MOV E,A LDK D,0 ;DE = Distance to next key def ADD HL,DE ;HL = Last address of key CALL DIST2END ;BC = Distance from next key to end of table INC HL ;HL = Start address of next key POP DE ;DE = Start address of the key we're clearing INC DE ;DE = New position to store next key LDIR RET PAGE  AF ;Get character STO A,[HL] ;Update counters PUSH AF ;Save character LD A,KEYNUM CALL SET_HL INC [HL] ;BUMP KEY COUNTER LK HL,NUM_BLANKS DEC [HL] ;1 LESS SPACE POP AF ;Restore chartacter PUSH AF ;Save CALL EXPANLEN ;Get length of expansion of character CALL POSCUR ;Figure out new cursor position POP AF ;Restore ;Display character LDK B,5 ;Longest possible expansion CALL DISPLAY RET PAGE DELETE: ;Delete last character from specified key definition ;ENTRY ; KEYNUM = Key number within table ; KEY_TABLE = Table address ; END_KEY_TABLE = End address of table ;EXIT ;NONE PROC LD A,KEYNUM INC A CALL SET_HL ;HL = First position of next key DEC HL ;HL = Position of character to be erased LD A,[HL] PUSH AF ;Save character to be deleted ;Clear character from table CALL DIST2END ;BC = Distance to end of table ;HL = Position of character to be erased (unchanged) PUSH HL POP DE ; DIST2END: ;Distance from selected start position to end of table ;ENTRY ;HL = Start location ;EXIT ;BC = Distance ;HL unchanged PROC EX HL,DE ;DE = Position to insert new key LD HL,END_KEY_TABLE ;HL = End byte of function keys OR A SBC HL,DE PUSH HL POP BC ;BC = Distance between end of edit area and new key spot EX HL,DE ;Restore HL RET PAGE EXPANLEN: ;Get length of expansion string for character ;ENTRY ;A = Character ;EXIT ;DE = Length of expansion string PROC LDK D,0 CMP 20H LDK E,1 ;Length of normal character expansion RNC ;Done if normal character LDK E,5 ;Length of ESC and RETURN expansions CMP ESC RZ ;Done if ESC CMP CR RZ ;Done if CR LDK E,2 ;Length of ordinary control character expansions RET PAGE POSCUR: ;Set up new cursor position for editing string ;ENTRY ;DE = Amount to move cursor ; (This number will be negative if deleting a character) ;EXIT ;Z flag = set if sameDE = Position of character to be deleted INC HL ;HL = Next position in table LDIR ;Move table up and erase character ;Update counters LD A,KEYNUM CALL SET_HL DEC [HL] ;One less character in this key definition LK HL,NUM_BLANKS INC [HL] ;1 MORE AVAILABLE SPACE ;Delete character from screen POP AF ;Get deleted character CALL EXPANLEN ;Get length of character expansion PUSH DE ;DE = Length of expansion string ORA A ;Clear carry LDK HL,0 SBC HL,DE ;Get -(length) EX HL,DE CALL POSCUR ;Calculate new cursor position ;Returns A = row number + offset, Z flag set if same row as last time POP DE ;Restore JRZ :1 ;If same row, then no need to re-display key definition LDK HL,ROWMAX SUB OFFSET ;Get row number CMP [HL] ;Check if on last row JRC :1 ;If not on last row, then no need to re-display ;Re-display key to show line which used to be scrolled off screen LD HL,CUR_POINTER CALL PRLINE ;G& row as before ;A = Row number PROC LD HL,CURCOUNT ;Get number of characters previously displayed ADD HL,DE ;Add number of new characters displayed STO HL,CURCOUNT ;Save new number of characters displayed ;Calculate row and column LD A,ROWLEN MOV E,A LDK D,0 ;DE = Number of characters per row LDK C,-1 ;C will hold row number :LOOP: INC C ;Next row ORA A SBC HL,DE ;Subtract 1 row's worth from number of character positions JRNC :LOOP ;If haven't gone over the number of rows ADD HL,DE ;Add back to get the number of columns MOV A,L ;Now C = Number of rows ; A = Number of columns ;Store row and column values in cursor positioning string LD HL,CUR_POINTER LDK DE,CURROW ;Offset to row byte ADD HL,DE INC HL ;HL ==> Column byte ADD A,OFFSET STO A,[HL] ;Store column value DEC HL MOV A,C ADD A,OFFSET CMP [HL] ;Set Z flag if same row STO A,[HL] ;Store row value RET PAGE ; ********************** EDIT_INIT: ;Edit initialization string ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IEDIT_INSTR CALL PRINT ;Display initialization instructions LDK HL,IEDIT_POS ;Position to edit initialization string STO HL,CUR_POINTER CALL GETDEV ;Get device number STO A,KEYNUM ;Set key number to be editted LDK A,INITLEN ;Maximum number of characters to be displayed per line LDK B,INITROW ;Last row number in display CALL EDIT_KEY ;Edit string LDK HL,SUBINSTR CALL PRINT ;Redisplay instructions LD A,KEYNUM ;Get device number LDK HL,DINIT_TBL ;Table of addresses of positioning strings CALL LOOKUP ;Look up string for this device CALL PRINT ;Position cursor LD A,KEYNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display new initialization string RET DINIT_TBL: ;Table of addresses of positioning strings for device initialization strings  ***************************************** ; * CURSOR ATTRIBUTES * ; ***************************************** CURTYPE: ;Set cursor type PROC LDK HL,CURPARM LD A,[HL] ANI ROW ;Get selection number ADD A,'0' ;Convert to ASCII number STO A,CURSOR_ATTRIB ;Set cursor attribute CALL SHOW_CURSOR RET PAGE ; ***************************************** ; * BACKKGROUND ATTRIBUTES * ; ***************************************** BACKTYPE: ;Set background type PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,BACK_ATTRIB CMP REVBACK JRZ :REV ;If Reverse video background ;If Normal background LDK A,REVBACK ;Toggle to reverse video LDK HL,REVERSE JR :SAVE :REV: LDK A,NORMBACK ;Toggle to normal background LDK HL,NORMAL :SAVE: STO A,BACK_ATTRIB CALL PRINT RET PAGE ; ***************************************** ; * KEY CLICK * ; ************************ DW DCONINIT ;CRT device DW DPARINIT ;CEN device DW DMODINIT ;MODEM device DW DPRINIT ;PRNTR device DW DPARINIT ;IEEE device PAGE ; ***************************************** ; * DEVICE ASSIGNMENT * ; ***************************************** DEVASSIGN: ;Logical device assignment ;ENTRY ;NONE ;EXIT ;NONE PROC CALL GETDEV ;Get physical device number MOV E,A ;Save LD A,DEVPARM ANI ROW ;A = Selected device assignment LDK HL,LOGTBL ;HL = Table of assignments corresponding to selection MOV C,A LDK B,0 ADD HL,BC LD B,[HL] ;B = Selected assignment mask LDK C,0 ;First logical device to set or clear :LOOP: SRL B ;Carry bit = Mask for logical device ; (0 = unassign the physical device, 1 = assign it) PUSH BC ;Save mask and number of logical devices left LDK B,0 ;Guess unassign this physical device JRNC :1 ;If unassign LDK B,0FFH ;If assign this physical device :1: MOV A,E ;***************** TOGCLICK: ;Toggle key click status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to OFF/ON line LD A,KEYCLICK CMP KCOFF ;Set Z flag if off LDK A,KCON ;Toggle to on LDK HL,ON JRZ :SAVE ;If off ;If on LDK A,KCOFF ;Toggle to off LDK HL,OFF :SAVE: STO A,KEYCLICK CALL PRINT RET PAGE ; ***************************************** ; * MONITOR FREQUENCY * ; ***************************************** TOGHERTZ: ;Toggle Hertz status ;ENTRY ;NONE ;EXIT ;NONE PROC LDK A,MCDOWN CALL OUTCHAR ;Move cursor down to 50/60 Hertz line LD A,HERTZ CMP 50 ;Set Z flag if 50 Hz LDK HL,SIXTYHZ LDK A,60 JRZ :SAVE ;If 50Hz, toggle to 60 LDK HL,FIFTYHZ LDK A,50 ;If 60Hz, toggle to 50 :SAVE: STO A,HERTZ CALL PRINT RET PAGE ; ***************************************** ; * INITIALIZATION STRING * ; *******************&A = Physical device PUSH DE ;Save physical device number CALL SETLOG ;Set or clear logical assignment POP DE ;Restore POP BC INC C ;Next logical device MOV A,C CMP NUM_LDEV JRNZ :LOOP ;If more logical devices CALL SHOW_DEV ;Display current device assignment RET LOGTBL: ;Table of logical device assignments for selected choice ;Bit 0 = CONIN: ;Bit 1 = CONOUT: ;Bit 2 = AUXIN: ;Bit 3 = AUXOUT: ;Bit 4 = LST: ;A 1 indicates assign device, 0 indicates unassign device DB 0001_0000B ;LST: DB 0000_0011B ;CONIN:/CONOUT: DB 0000_1100B ;AUXIN:/AUXOUT: DB 0000_0000B ;None PAGE ; ***************************************** ; * SERIAL PROTOCOL * ; ***************************************** SETPROT: ;Set or clear XON/XOFF protocol ;ENTRY ;NONE ;EXIT ;NONE PROC ;Set or clear protocol bit in device table CALL GETMODE ;Get HL ==> Mode byte LD A,PROTPARM ;Get selected row ANI ROW ;Set Z flag if no protay instructions :1: LDK C,'9' CALL GET_DIGIT ;Get digit <= 9 CPI LEFT JRZ :1 ;If backspace, get character over again CPI ENTER JRZ :EXIT ;Quit if nothing entered :DIG: SUB '0' STO A,IEEEADDR ;Save new IEEE address ;DECIDE MAXIMUM VALUE FOR NEXT DIGIT (Maximum IEEE address = 31) CPI 3 ;Set flags LDK C,'9' JRC :2 ;If first digit < 2, then any second digit is OK LDK C,'0' ;Maximum if first digit = 3 JRNZ :DONE ;If first digit > 3, then can only be 1 digit long :2: CALL GET_DIGIT CPI ENTER JRZ :DONE ;If done CPI LEFT JRNZ :DIG2 ;If a digit LDK HL,BACKONE CALL PRINT JR :1 ;If backspace :DIG2: SUB '0' MOV E,A ;Save 2nd digit LD A,IEEEADDR ;Get first digit LDK B,9 ;Get first digit * 10 MOV C,A :LOOP: ADD A,C DJNZ :LOOP ;A * 10 ADD A,E STO A,IEEEADDR :DONE: LD A,IEEEADDR LDK DE,IEEEVAL CALL BIN_ASC ;Save ASCII value of IEEE address :3: LDK HL,PARPARM CALocol LD A,[HL] ;Get mode byte JRNZ :XON ;If XON/XOFF protocol ANI NOT XON_MASK ;Set to no protocol STO A,[HL] JR :DONE :XON: ORI XON_MASK ;Set XON/XOFF or ETX/ACK protocol :1: STO A,[HL] ;Set or clear ETX bit in shadow table CALL GETSFLAG ;Get HL ==> Shadow table flag byte LD A,PROTPARM ;Get selected row ANI ROW CMP ETXROW ;Set Z flag if ETX/ACK LD A,[HL] ;Get current flag byte JRZ :ETX ;If ETX ANI NOT ETX_MASK ;Clear ETX/ACK protocol bit JR :2 :ETX: ORI ETX_MASK ;Set ETX protocol :2: STO A,[HL] :DONE: CALL SHOW_PROT ;Display current protocol setting RET PAGE ; ***************************************** ; * BAUD RATE * ; ***************************************** SETBAUD: ;Set baud rate parameter PROC CALL GETBAUD ;Get HL ==> Baud rate byte for currently selected device LD A,BAUDPARM ;Get selected row ANI ROW ;Set Z flag if no protocol INC A ;Get baud rate number STO AL SETCUR ;Put cursor back to menu LDK HL,IEEEPOS CALL PRINT ;Display new setting :EXIT: LDK HL,SUBINSTR CALL PRINT ;Re-display instructions RET PAGE ; *********************************** ; * DEVICE TIMEOUT * ; *********************************** SETTIME: ;Set device timeout ;(Value entered in seconds, saved in units of 5 seconds) ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display instructions LDK HL,TIMEINST CALL PRINT ;Input timeout in seconds LDK HL,NUMBUFF ;Buffer to hold number string LDK B,MAXTIM ;Maximum number of characters to enter :LOOP: PUSH HL ;Save PUSH BC LDK C,'9' ;Indicate largest allowable digit is 9 CALL GET_DIGIT ;Get digit <= 9 POP BC POP HL ;Restore CPI ENTER JRZ :DONE ;If done entering digits CPI LEFT JRNZ :DIGIT ;If not backspace, then digit :ERASE: MOV A,B CPI MAXTIM JRZ :LOOP ;If no characters entered yet, ignore backspace DEC HL ;Backspace in num,[HL] ;Set baud rate CALL SHOW_BAUD ;Display current baud rate setting RET PAGE ; ***************************************** ; * PARALLEL PROTOCOL * ; ***************************************** PARPROT: ;Select parallel protocol ;ENTRY ;NONE ;EXIT ;NONE PROC LD A,PPROT XOR 0FFH ;Toggle and set Z flag if Centronics STO A,PPROT ;Save toggled protocol setting LDK HL,PARPARM+1 ;HL ==> Number of choices in menu JRZ :1 ;If Centronics INC [HL] ;If toggled to IEEE, add 1 to number of items in list JR :DONE :1: DEC [HL] ;If toggled to Centronics, subtract 1 from number of items :DONE: CALL DISPAR ;Display settings for this protocol LDK HL,RHT_INSTR CALL PRINT RET PAGE ; ***************************************** ; * IEEE ADDRESS * ; ***************************************** SETIADDR: ;Set IEEE device address ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,IEEEINST CALL PRINT ;Displ'ber buffer INC B ;Increment maximum number of digits remaining PUSH HL ;Save buffer pointer PUSH BC LDK HL,BACKONE CALL PRINT ;Print backspace POP BC POP HL JRZ :LOOP ;Input next character :DIGIT: STO A,[HL] ;Store number entered INC HL ;Move pointer to next digit position DJNZ :LOOP ;Get next character PAGE ;Get number of 5 second chunks :DONE: MOV A,B ;Check if anything was entered CMP MAXTIM JRZ :EXIT ;Quit, if nothing entered LDK HL,NUMBUFF ;HL => Start of number LDK A,MAXTIM ;Maximum number of digits to enter for timeout SUB B ;A = Number of digits entered DEC A ;A = Number of digits above one's place CALL ASC_BIN ;Get binary number for number of 10's ADD A,A ;A = Number of 5's in positions above one's place MOV D,A ;Save in D ;Check for number too larger ( < 995) CMP 99*2 ;Set Z flag if number entered is <= 990 LD A,[HL] ;Get one's digit JRNZ :ROUND ;If number can't be too large ( >TR CALL PRINT RET ARRDIS: ;Display arrow key menu PROC LDK HL,ARR_PLATE CALL PRINT CALL SHOW_A_KEYS LDK HL,CARR_POS CALL PRINT ;Position cursor to display current arrow key definitions CALL ARRDEF ;Find out which type of arrow keys CALL PRINT ;Display current setting CALL SPACE_LEFT LDK HL,SUBINSTR CALL PRINT RET CURDIS: ;Display cursor menu PROC LDK HL,CURMENU CALL PRINT CALL SHOW_CURSOR LDK HL,SUBINSTR CALL PRINT ;Display instructions RET PAGE BAUDDIS: ;Display baud rate menu PROC LDK HL,BAUDMENU CALL PRINT CALL SHOW_BAUD ;Display current baud rate LDK HL,SUBINSTR CALL PRINT RET PROTDIS: ;Display protocol menu PROC LDK HL,PROTMENU CALL PRINT CALL SHOW_PROT LDK HL,SUBINSTR CALL PRINT RET PAGE DEVDIS: ;Display device assignment menu ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,DEVMENU CALL PRINT CALL SHOW_DEV ;Display current device settings LDK HL,S 990) ;Number >= 990 CMP '6' ;Check if one's digit is > 5 JRC :ROUND ;If number is small enough ( <=5 ) CALL BEEP ;Indicate number is out of range INC HL ;Set up pointer to next character position LDK B,0 ;Set maximum number of additional characters which can be entered JR :ERASE ;Erase invalid one's character ; and get new input ;"Round off" one's position :ROUND: CPI '3' JRC :1 ;If less than 3, round to 0 INC D ;If >= 3, then count at least one 5 CMP '8' JRC :1 ;If less than 8 then no more one's INC D ;If >= 8, count another 5 :1: MOV A,D ;A = Number of 5's in entered number STO A,TIMEOUT ;Store new timeout ;Display new setting LDK HL,GENPARM CALL SETCUR ;Put cursor back to menu LDK HL,TIMEPOS CALL PRINT ;Position cursor to display new setting CALL PR_TIME ;Display new settings :EXIT: LDK HL,CLREDIT CALL PRINT ;Clear edit instructions LDK HL,SUBINSTR CALL PRINT ;Re-disUBINSTR CALL PRINT RET PAGE DISKEY: ;Display current function keys and arrow keys ;ENTRY ;NONE ;EXIT ;NONE PROC ;Display template LDK HL,FUN_FRAME CALL PRINT ;Display function key header ;Display current function key settings CALL FUNINIT ;Initialize variables for displaying function keys LDK HL,FSETWIND CALL PRINT ;Set window for displaying current function keys LDK HL,CURFUNTBL ;Table of addresses of positioning strings LDK B,10 ;Display 10 key definitions LDK C,0 ;Start with key 1 LDK A,30 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments ;Display current arrow key settings LDK HL,ARR_POS CALL PRINT ;Position cursor CALL ARRDEF ;Check if WS,CP/M, or special definition JRNZ :1 ;If special CALL PRINT ;If WS or CP/M RET :1: LDK HL,ARR_TYPES CALL PRINT ;Display arrow key template LDK HL,FSETWIND CALL PRINT LDK HL,CURARRTBL ;Table of addresses of pplay instructions RET PAGE ; +-----------------------------------------------+ ; | DISPLAY MENU ROUTINES | ; +-----------------------------------------------+ GETDIS: ;Display get configuration menu PROC LDK HL,GETMESS CALL PRINT ;Display menu LDK HL,GETINSTR ;Instructions CALL PRINT ;"Call" PRINT LDK HL,COPYRIGHT JMP PRINT ;Display copyright message ;RET SETDIS: ;Display set configuration menu PROC LDK HL,SETMESS CALL PRINT ;"Call" PRINT LDK HL,SET_INSTR CALL PRINT RET SAVEDIS: ;Display save configuration menu PROC LDK HL,SAVEPARM LD A,[HL] ANI NOT ROW ;Set to row 0 STO A,[HL] ;Always start save menu on row 0 LDK HL,SAVMESS CALL PRINT ;Display menu LDK HL,SAVEINST ;Instructions JMP PRINT ;"Call" PRINT ;RET PAGE FUNDIS: ;Display function key menu PROC LDK HL,FUN_PLATE CALL PRINT CALL SHOW_F_KEYS CALL SPACE_LEFT LDK HL,SUBINS'ositioning strings LDK B,4 ;Display 4 key definitions LDK C,10 ;Start with function key 11 LDK A,25 ;Maximum display length CALL PRINTFKEY ;Display current function key assignments RET PAGE ARRDEF: ;Check for WS, CP/M or special arrow key definition ;ENTRY ;NONE ;EXIT ;HL ==> ASCII string for type of definition (WS, CP/M, or Special) ;A = 0 if CP/M or WS ;Z bit set if CP/M or WS PROC LDK A,10 CALL SET_HL ;Get HL = Start of arrow keys in table PUSH HL LDK DE,CPM_ARROWS LDK B,8 CALL COMPARE POP HL JRZ :CPM ;If CP/M arrow key definition LDK DE,WS_ARROWS LDK B,8 CALL COMPARE LDK HL,WS JRZ :WSORCPM ;If WordStar arrow key definition LDK HL,SPECIAL ORI 0FFH ;Indicate special definition RET :CPM: LDK HL,CPM :WSORCPM: XRA A ;Indicate WS or CP/M RET PAGE CURFUNTBL: ;Table of addresses of positioning strings for function key current settings display DW FKEY0 DW FKEY1 DW FKEY2 DW FK CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,MODNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPNTR: ;Display printer port parameters PROC LDK HL,PNTRPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate will return to printer menu STO HL,PROTPARM+EXITOFF ;Make sure protocol routine returns to printer menu STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display current protocol setting LDK HL,DEV_HDR CALL PRINT ;PrinEY3 DW FKEY4 DW FKEY5 DW FKEY6 DW FKEY7 DW FKEY8 DW FKEY9 CURARRTBL: ;Table of addresses of positioning strings for arrow key current settings DW UPKEY DW DOWNKEY DW RIGHTKEY DW LEFTKEY PAGE DISCON: ;Display console values ;ENTRY ;NONE ;EXIT ;NONE PROC LDK HL,CUR_HDR CALL PRINT LD A,CURSOR_ATTRIB ;Get cursor attribute assignment SUB '0' LDK HL,CURTBL CALL LOOKUP ;Look up address of current cursor type ASCII string CALL PRLINE LDK HL,BACK_HDR CALL PRINT LDK HL,REVERSE ;Guess reverse video background LD A,BACK_ATTRIB CMP REVBACK JRZ :1 ;If it really is reverse video LDK HL,NORMAL ;If normal background :1: CALL PRINT LDK HL,CLIC_HDR ;Insert Key Click header CALL PRINT LD A,KEYCLICK CMP KCOFF ;Check for key click off LDK HL,OFF JRZ :2 ;If off LDK HL,ON :2: CALL PRINT LDK HL,HZ_HDR ;Move "External Monitor Frequency" into message CALL PRINT LD At "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,PRNTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISPAR: ;Display current parallel port settings PROC LDK HL,PARPARM STO HL,DEVPARM+EXITOFF ;Make sure device selection routine returns to parallel menu STO HL,INITPARM+EXITOFF ;and initialization string routine LDK HL,PPROT_HDR CALL PRINT ;Print "Protocol:" LD A,PPROT ORA A ;Set Z flag if Centronics protocol LDK HL,CENPROT JRZ :1 LDK HL,IEEEPROT :1: CALL PRINT LDK HL,DEV_HDR CALL PRINT ;Print "Device Assignment:" CALL PR_DEV ;Print current device assignment LDK HL,INIT_HDR CALL PRINT ;Display initialization string header C,HERTZ CMP 50 ;Set Z flag if 50Hz LDK HL,FIFTYHZ JRZ :3 ;If 50 Hz LDK HL,SIXTYHZ :3: CALL PRINT LDK HL,INIT_HDR CALL PRINT ;Display initialization string header CALL INIT_INIT ;Initialize initialization string display variables LDK A,CRTNUM LDK B,35 ;Display up to 35 characters LDK C,0FFH ;Display the word if empty string CALL SHOW_KEY ;Display current initialization string RET PAGE DISMOD: ;Display modem port parameters PROC LDK HL,MODPARM STO HL,BAUDPARM+EXITOFF ;Make sure baud rate routine will return to modem menu STO HL,PROTPARM+EXITOFF ;Make sure protocol returns to modem port STO HL,DEVPARM+EXITOFF ;and device selection STO HL,INITPARM+EXITOFF ;and initialization string LDK HL,BAUD_HDR CALL PRINT ;Print "Baud Rate:" CALL PR_BAUD ;Display current baud rate setting LDK HL,PROT_HDR CALL PRINT ;Print "Protocol:" CALL PR_PROT ;Display current protocol setting LDK HL,DEV_HDR