IMD 1.16: 31/05/2007 20:33:51 FOGCPM.142 ååååååååååååååå--FOGCPM142AUTOMOD COM AUTOMOD DOC! AUTOMOD ASM- AUTOMODDCOM AUTOMODDASM/SETAUTO COMSETAUTO DOCAUTOST COMAUTOST AQMAUTOST ASM% !"#BAUTOST DOCC$%&'()*+,FSTART COM-FSTART DOC.MAKEAUTOCOM /0MAKEAUTODOC1MAKEAUTOASM 2345MAKAUTO2COM 67MAKAUTO2ASM"89:;<STARTER COM=>STARTER DOC?@STARTER ASMEABCDEFGHITO COMJTO ASMKLMTO80 ASMNTO80 DOC OPWID COMQWID DOC RSWID ASM(TUVWXWIDTH COMYZ[WIDTH DOC \]WIDTH C ^OSCHG COM_SCREEN COM`SCREEN DOCaFUNC COM bcFUNCTDD COMdFUNCTIONCOMeFUNCTIONDOC fgOSBKYBD ASMhijDISKEYS BAS#klmnoOSARROW COMEpqrstuvwxOSARROW DOCyz{OSARROW PAS|}~CLOCK BAS€OCLOCK COM�OCLOCK DOC‚ƒDMPSCR BAS„…DMPSCR DOC$†‡ˆ‰ŠGRAPH BAS‹Œ�OSCREEN BASŽOSPATCH1COM:��‘’“”•–-09-00 86 —-CPM142 DOC)˜™š›œ�ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååThis is the disk name. ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃ~ AUTOMOD REV. 1.1 PROGRAM TO INSERT A USER SELECTABLE COMMAND LINE INTO CP/M ON DISK, TO BE EXECUTED ON ALL COLD STARTS FOR OSBORNE CP/M 2.2A-00F ENTER CP/M SOURCE DRIVE (A or B): ?$ ENTER COMMAND LINE TO BE INSERTED, (36 CHARACTERS MAXIMUM) OR FOR NO COMMAND. If COMMAND LINE has N characters, where N > 6, first use SETUP.COM to establish (N - 6) dummy characters in FUNCTION KEY 0 (zero). This will avoid disastrous overlay of FUNCTION and ARROW KEY information but, also, will render FUNCTION KEY 0 unusable. COMMAND ?: $ **** COMMAND INSERTION COMPLETE **** $1¼ ÍÍþÊ:þ`úšÖ ÖAú¤þú¯ ÍÉOÅ*Åí°ÁÍÅ ^#Vë^#V{=2×>2ØÍ=:€ þÃÊï 2ÍÃ: âÍ ßÍ:àÆ2 ÖÂ2 Ã*O !á~þ`ú!Ö # ¯>2ØÍ= RÍÃ!"Ù!"Û!€ "Ý*ÝDMÍÎ*ÛDMÍÈ*ÙDMÍË:ط€ÍÑ·Ê’ ÍÃ:ÍÔ·Ê’ bÍÃ::×*ٽ¦*Û#"Û!ÿÿ#"Ù*Ý€€'z¼Â¾{½ÊÄ"ÝÃOÉ ^#Vë^#V{=2×>2$Êï 2ÍÃ: âÍ ßÍ:àÆ2 WRONG!$ lDISK READ ERRORm $ lERROR: CP/M NOT PRESENT ON SOURCE DISKm $ lDISK WRITE ERRORm $LL COLD STARTS FOR OSBORNE CP/M 2.2A-00F ENTER CP/M SOURCE DRIVE (A or B): ?$ ENTER COMMAND LINE TO BE INSERTED, (36 CHARACTERS MAXIMUM) OR FOR NO COMMAND. If COMMAND LINE has N characters, where N > 6, first use SETUP.COM to establish (N - 6) dummy characters in FUNCTION KEY 0 (zero). This will avoid disastrous overlay of FUNCTION and ARROW KEY information but, also, will render FUNCTION KEY 0 unusable. COMMAND ?: $ **** COMMAND INSERTION COMPLETE **** $1¼ ÍÍþÊ:þ`úšÖ ÖAú¤þú¯ ÍÉOÅ*Åí°ÁÍÅ ^#Vë^#V{=2×>2ØÍ=:€ þÃÊï 2ÍÃ: âÍ ßÍ:àÆ2 ÖÂ2 Ã*O !á~þ`ú!Ö # ¯>2ØÍ= RÍÃ!"Ù!"Û!€ "Ý*ÝDMÍÎ*ÛDMÍÈ*ÙDMÍË:ط€ÍÑ·Ê’ ÍÃ:ÍÔ·Ê’ bÍÃ::×*ٽ¦*Û#"Û!ÿÿ#"Ù*Ý€€'z¼Â¾{½ÊÄ"ÝÃOÉ ^#Vë^#V{=2×>2$Êï 2ÍÃ: âÍ ßÍ:.pì 90 AUTOMOD.DOC CP/Í COMMANÄ LINÅ INSERTIOÎ PROGRAM DOCUMENTATION Thå CP/Í commanä linå insertioî prograí 'AUTOMOD.COM§ changeó thå � booô  copù oæ CP/Í oî trackó ± - ³ oæ thå diskettå iî thå  speci� fieä  drive®  Thió changå consistó oæ insertinç á 'commanä  line§ � intï  á  buffeò  areá oæ CP/Í provideä  foò  thió  purpose®  Thió � 'commanä  line§  ió reaä bù CP/Í immediatelù followinç  á  'cold-� start§ (reseô buttoî )¬  thió commanä ió theî executeä aó � iæ  iô wherå anù otheò commanä entereä oî thå keyboard®  Alì  thå � disketteó  supplieä bù Osbornå havå thå commanä lineº  AUTOSÔ  iî � thió buffeò initially¬  thió commanä causeó thå AUTOSÔ prograí tï � bå  loadeä intï memorù anä run¬  thå AUTOSÔ prograí merelù  drawó � thå 'BIÇ O§ oî thå screeî theî loadó thå maiî prograí supplieä oî � thå disë (MBASIC¬ WORDSTAR¬ SUPERCALà etc.© oò iî thå caså oæ thå � systeí disk¬  thå HELÐ program®  Bù usinç thå commanä linå inser� tioî  program¬  thió commanä caî bå changeä tï anythinç yoõ want¬ � oò  maù  bå deleteä altogether¬  iî whicè caså  CP/Í  loadó  verù � quicklù anä startó uð cleanlù (thå waù iô waó originallù intendeä � to)®  Somå  exampleó oæ commandó whicè caî bå inserteä  areº  DIR„ � whicè wilì causå thå 'A§ disë directorù tï bå displayeä oî start-� up¬  XDIR„ printó thå extendeä directorù (samå aó thå utilitù disë � does¬ buô faster)¬ MBASIC„ oî thå 'BASIC§ disë wilì loaä anä start MBASIà immediately¬ MBASIà NAME.BAS„ wilì causå MBASIà tï loaä anä � automaticallù  loaä  thå  'Basic§ languagå prograí  NAME.BAÓ  anä � starô runninç iô ('turnkey§ systeí )®  Thå samå maù bå donå  witè � Wordstar¬ Supercalã oò anù otheò useò program. Tï  uså thå insertioî prograí AUTOMOD.COÍ simplù puô thå diskettå � containinç  thió prograí intï eitheò drive¬  placå thå disë  witè � thå CP/Í copù yoõ desirå tï modifù intï thå otheò  drive¬  unpro� tected®  (neveò  uså  thå  originaì disketteó supplieä  witè  thå � Osborne© Witè CP/Í running¬ issuå thå command: AUTOMOD„ (assuminç iô ió iî thå selecteä drive) Wheî thå 'CP/Í sourcå drive§ ió requested¬  responä appropriatelù � (thå  sourcå  drivå wilì alsï bå  thå  destinatioî  drive)®  Wheî � AUTOMOÄ requestó thå desireä 'command§ tï insert¬  typå iô iî (uð � tï 3¶ characters© anä terminatå iô witè á carriagå return®  Iæ nï � commanä  ió tï bå entereä (quick-start)¬  simplù typå á  carriagå � return¬  thió wilì eraså anù previouó commanä iî thå CP/Í buffer® � Thå  ne÷  commanä wilì bå inserteä ontï thå disë anä thå  messagå � ***ª COMMANÄ INSERTIOÎ COMPLETÅ ***ª shoulä appear®  Iæ aî  erroò � occurs¬  thå  sourcå oæ thå erroò shoulä bå correcteä anä AUTOMOÄ � re-run. AUTOMOÄ  caî bå useä tï changå thå commanä buffeò anù  numbeò  oæ � timeó oî thå samå copù oæ CP/M. Thå AUTOMOÄ prograí ió addresó dependant¬  anä futurå releaseó oæ � CP/Í maù requirå á ne÷ versioî oæ AUTOMOÄ bå obtained. ADDENDUM by Jim Woolley, FOG Disk Librarian, 8/82 Thå Osbornå implementatioî oæ CP/Í makeó uså oæ thå 'commanä � line§ buffeò areá iî thå firsô threå diskettå trackó tï storå � functioî anä arro÷ keù information® Usinç AUTOMOÄ tï enteò á � commanä linå havinç morå thaî siø characteró (thå amounô alloweä � foò AUTOST© wilì overlaù thió information® Therefore¬ iô ió � necessarù tï firsô assigî enougè dummù spacå tï functioî keù ° � (zero)¬ sï thaô onlù thå dummù spacå wilì bå overlayed® Thió � actioî will¬ however¬ rendeò functioî keù ° unusable. Assuminç thaô thå commanä linå tï bå inserteä haó Î characters¬ � iæ Î ió lesó thaî 7¬ theî therå ió nï speciaì concern® Iæ Î ió � greateò thaî 6¬ theî firsô ruî SETUÐ tï alteò thå functioî keù � definitioî oî thå diskettå tï bå configureä bù AUTOMOD® Seô � functioî keù ° tï bå (Î - 6© blankó oò otheò dummù characters® � Thió wilì seô asidå enougè spacå foò thå commanä linå tï bå � inserteä bù AUTOMOD® Buô remembeò thaô functioî keù ° wilì nï � longeò bå meaningful® Instead¬ iô wilì bå overlayeä bù thå � inserteä commanä line. arro÷ keù information® Usinç AUTOMOÄ tï enteò á � commanä linå havinç morå thaî siø characteró (thå amounô alloweä � foò AUTOST© wilì overlaù thió information® Therefore¬ iô ió � necessarù tï firsô assigî enougè dummù spacå tï functioî keù ° � (zero)¬ sï thaô onlù thå dummù spacå wilì bå overlayed® Thió � actioî will¬ however¬ rendeò functioî keù ° unusable. Assuminç thaô thå commanä linå tï bå inserteä haó Î characters¬ � iæ Î ió lesó thaî 7¬ theî therå ió nï speciaì concern® Iæ Î ió � greateò thaî 6¬ theî firsô ruî SETUÐ tï alteò thå functioî keù � definitioî oî thå diskettå tï bå configureä bù AUTOMOD® Seô � functioî keù ° tï bå (Î - 6© blankó oò otheò dummù characters® � Thió wilì seô asidå enougè spacå foò thå commanä linå tï bå � inserteä bù AUTOMOD® Buô remembeò thaô functioî keù ° wilì nï � longeò bå meaningful® Instead¬ iô wilì bå overlayeä bù thå � inserteä comm ;************************************* ;* * ;* "AUTOMOD" * ;* * ;* LEE SWORDY 14/5/82 * ;* * ;* Revision 1.1 by Jim Woolley, FOG * ;* Disk Librarian, 8/82. * ;************************************* ; AUXBUF EQU 200AH ; CP/M AUX CMND BFR ST ADR (BYTE CNT = 1st) ; ORG 100H JMP START ; MSG1 DB 1AH,' AUTOMOD REV. 1.1',0DH,0AH DB ' PROGRAM TO INSERT A USER SELECTABLE COMMAND LINE',0DH,0AH DB 'INTO CP/M ON DISK, TO BE EXECUTED ON ALL COLD STARTS',0DH,0AH,0AH DB ' FOR OSBORNE CP/M 2.2A-00F',0DH,0AH,0AH,0AH DB 'ENTER CP/M SOURCE DRIVE (A or B): ?',8,8,8,'$' MSG2 DB 0DH,0AH,0AH,'ENTER COMMAND LINE TO BE INSERTED,',0DH,0AH DB '(36 CHARACTERS MAXIMUM) OR FOR NO COMMAND.',0DH,0AH,0AH ; db 'If COMMAND LINE has N characters, where N > 6,',0dh,0ah db 'first use"SETUP.COM to establish (N - 6) dummy',0dh,0ah db 'characters in FUNCTION KEY 0 (zero). This will',0dh,0ah db 'avoid disastrous overlay of FUNCTION and ARROW',0dh,0ah db 'KEY information but, also, will render FUNCTION',0dh,0ah db 'KEY 0 unusable.',0dh,0ah,0ah ; DB ' COMMAND ?: $' MSG3 DB 0DH,0AH,0AH,0AH,'**** COMMAND INSERTION COMPLETE ****',0DH,0AH,0AH DB '$' ; ;**** PRINT HEADER AND REQUEST DRIVE ID START LXI SP,STACK ; LOCAL STACK ; MVI C,9 LXI D,MSG1 ; HEADER MSG/DRIVE ID REQ TO CONS CALL 0005 ; RETRY1 MVI C,1 ; INPUT 'DRIVE ID' CALL 0005 CPI 03 ; ^C ? JZ EXIT ; YES: ABORT CPI 60H JM UPPER SUI 20H ; MAKE UPPER CASE UPPER SUI 41H ; CONV A or B TO 0 or 1 JM CHERROR ; IF NOT 0 or 1 CPI 2 JM DRIVEOK ; CHERROR MVI C,9 LXI D,ERR1 ; 'WRONG' MSG TO CONS CALL 0005 JMP RETRY1 ; DRIVEOK MOV C,A PUSH B ; SAVE DRIVE # ; ;**** MOVE PART OF BIOS VECTOR TABLE INTO LOCAL CORE FOR CALLS LHLD 0001 ; GET WARM ST VCTR ADRS LXI D,24 ; INDEX INTO VCTR TBLE DAD D ; HL + INDEX = SOURCE LXI D,VECTBL ; DESTINATION LXI B,18 ; BYTE COUNT (6 JUMP INSTR'S) DB 0EDH,0B0H ; Z80 'LDIR' INST (BLOCK MOVE) ; ;**** GET 'SECTORS PER TRACK' FROM 'DISK PARAM BLOCK' POP B ; GET DRIVE # CALL SELDSK ; SELECT DISK DRIVE ; LXI D,10 ; INDEX INTO DP HEADER DAD D ; +DPH BASE ADRS ; MOV E,M INX H MOV D,M ; GET DPB ADRS ; XCHG ; MOV E,M INX H MOV D,M ; GET 'SPT' ; MOV A,E DCR A ; -1 STA SPT ; SAVE SECTRS/TRACK ; ;**** READ CP/M FROM DISK INTO CORE STARTING AT 980H (NO BOOT LOADER) MVI A,0 STA FLAG ; RD/WRT FLAG TO READ (0) CALL RDWRT ; DISK READ/WRITE ROUTINE ; ;**** CHECK IF CP/M IS VALID (1st BYTE OK ?) LDA 980H ; GET BYTE 1 OF CPM CPI 0C3H ; SHOULD BE 'JMP' OP CODE JZ REQUEST ; YES: CPM OK ; MVI C,9 LXI D,ERR3 ; 'CPM BAD' MSG TO CONS CALL 0005 JMP EXIT ; ;**** REQUEST COMMAND STRING AND INPUT THE STRING REQUEST MVI C,9 LXI D,MSG2 ; 'CMND REQ' MSG TO CONS CALL 0005 ; MVI C,10 LXI D,INBUFF ; INPUT 'CMND STRING' CALL 0005 ; ;**** TRANSFER 'CMND STRING' FROM IP BUFF TO AUX CMND BUFF LDA INBUFF+1 ; GET INPUT BYTE CNT ADI 2 ; +2 FOR CCP STA AUXBUF ; SAVE AS AUX CMD BFR BYTE CNT SUI 2 ; = 0 ? JNZ JUMP1 ; NO STA AUXBUF ; YES: MAKE AUX BYTE CNT = 0 JMP JUMP4 ; JUMP1 MOV C,A ; BYTE CNT LXI D,AUXBUF+1 ; DESTINATION LXI H,INBUFF+2 ; SOURCE LOOP1 MOV A,M ; GET A SOURCE BYTE CPI 60H ; MAKE UPPER CASE JM JUMP5 SUI 20H ; JUMP5 STAX D ; BYTE TO DEST. INX D ; DEST. + 1 INX H ; SOURCE + 1 DCR C ; BYTE CNT - 1 JNZ LOOP1 ; IF NOT DONE ; XRA A ; A = 0 STAX D ; LINE TERMINATOR ; ;**** WRITE CP/M BACK TO SOURCE DISK JUMP4 MVI A,01 ; RD/WRT FLAG TO WRITE STA FLAG CALL RDWRT ; DISK READ/WRITE ROUTINE ; MVI C,9 LXI D,MSG3 ; 'ALL DONE' MESSAGE CALL 0005 ; EXIT JMP 0000 ; CPM WARM ST ENTRY ; ;******* READ/WRITE CPM TO/FROM DISK SUBROUTINE: ; 'FLAG' = 0 FOR READ, = 1 FOR WRITE ; RDWRT LXI H,0 ; INIT SECTOR = 0 SHLD SECTOR LXI H,0 ; INIT TRACK = 0 SHLD TRACK LXI H,980H ; INIT DMA ADRS = 980H SHLD DMAADR ; LOOP2 LHLD DMAADR MOV B,H MOV C,L CALL SETDMA ; SET DMA ADRS ; LHLD TRACK MOV B,H MOV C,L CALL SETTRK ; SET TRACK # ; LHLD SECTOR MOV B,H MOV C,L CALL SETSEC ; SET SECTOR # ; LDA FLAG ; READ ? (=0) ORA A JNZ DSKWRT ; NO: WRITE ; CALL READ ; READ A RECORD ORA A ; READ ERROR ? JZ GOODRD ; NO ; MVI C,9 LXI D,ERR2 ; 'SOURCE READ' ERR MSG TO CONS CALL 0005 JMP EXIT ; DSKWRT CALL WRITE ; WRITE A RECORD ORA A ; WRITE ERROR ? JZ GOODRD ; NO ; MVI C,9 LXI D,ERR4 ; 'DEST WRITE' ERR MSG TO CONS CALL 0005 JMP EXIT ; GOODRD LDA SPT LHLD SECTOR CMP L ; END OF TRACK ? JNZ JUMP3 ; NO ; LHLD TRACK INX H SHLD TRACK ; TRACK # +1 ; LXI H,0FFFFH ; SECTOR # = -1 JUMP3 INX H ; +1 SHLD SECTOR ; RE-SAVE SECTOR # ; LHLD DMAADR ; DMA ADRS + 128 LXI D,128 DAD D LXI D,2780H ; END OF CPM ? MOV A,D CMP H JNZ NOTEND ; NO MOV A,E CMP L JZ ENDCPM ; NOTEND SHLD DMAADR JMP LOOP2 ; DO NEXT SECTOR ENDCPM RET ; ;**** BUFFERS, STORAGE AND MESSAGES: ; VECTBL ; PORTION OF BIOS VECTOR TABLE SELDSK DS 3 SETTRK DS 3 SETSEC DS 3 SETDMA DS 3 READ DS 3 WRITE DS 3 ; SPT DB 0 ; 'SECTORS PER TRACK -1' FLAG DB 0 ; CPM RD/WRT FLAG; ; SECTOR DW 0 TRACK DW 0 DMAADR DW 0 ; INBUFF DB 36,0 DS 36 ; ERR1 DB 12,12,12,'WRONG!',8,8,8,8,8,8,8,8,8,8,'$' ERR2 DB 0DH,0AH,0AH,1BH,6CH,'DISK READ ERROR',1BH,6DH,0DH,0AH,'$' ERR3 DB 0DH,0AH,0AH,1BH,6CH,'ERROR: CP/M NOT PRESENT ON SOURCE' DB ' DISK',1BH,6DH,0DH,0AH,'$' ERR4 DB 0DH,0AH,0AH,1BH,6CH,'DISK WRITE ERROR',1BH,6DH,0DH,0AH,'$' ; DS 64 STACK END D OF TRACK ? JNZ JUMP3 ; NO ; LHLD TRACK INX H SHLD TRACK ; TRACK # +1 ; LXI H,0FFFFH ; SECTOR # = -1 JUMP3 INX H ; +1 SHLD SECTOR ; RE-SAVE SECTOR # ; LHLD DMAADR ; DMA ADRS + 128 LXI D,128 DAD D LXI D,2780H ; END OF CPM ? MOV A,D CMP H JNZ NOTEND ; NO MOV A,E CMP L JZ ENDCPM ; NOTEND SHLD DMAADR JMP LOOP2 ; DO NEXT SECTOR ENDCPM RET ; ;Ã~ AUTOMOD REV. 1.1 PROGRAM TO INSERT A USER SELECTABLE COMMAND LINE INTO CP/M ON DISK, TO BE EXECUTED ON ALL COLD STARTS FOR OSBORNE CP/M 2.2A-00F ENTER CP/M SOURCE DRIVE (A or B): ?$ ENTER COMMAND LINE TO BE INSERTED, (36 CHARACTERS MAXIMUM) OR FOR NO COMMAND. If COMMAND LINE has N characters, where N > 6, first use SETUP.COM to establish (N - 6) dummy characters in FUNCTION KEY 0 (zero). This will avoid disastrous overlay of FUNCTION and ARROW KEY information but, also, will render FUNCTION KEY 0 unusable. COMMAND ?: $ **** COMMAND INSERTION COMPLETE **** $1¼ ÍÍþÊ:þ`úšÖ ÖAú¤þú¯ ÍÉOÅ*Åí°ÁÍÅ ^#Vë^#V{=2×>2ØÍ=:€ þÃÊï 2ÍÃ: âÍ ßÍ:àÆ2 ÖÂ2 Ã*O !á~þ`ú!Ö # ¯>2ØÍ= RÍÃ!"Ù!"Û!€ "Ý*ÝDMÍÎ*ÛDMÍÈ*ÙDMÍË:ط€ÍÑ·Ê’ ÍÃ:ÍÔ·Ê’ bÍÃ::×*ٽ¦*Û#"Û!ÿÿ#"Ù*Ý€€'z¼Â¾{½ÊÄ"ÝÃOÉ ^#Vë^#V{=2×>2$Êï 2ÍÃ: âÍ ßÍ:àÆ2 WRONG!$ lDISK READ ERRORm $ lERROR: CP/M NOT PRESENT ON SOURCE DISKm $ lDISK WRITE ERRORm $LL COLD STARTS FOR OSBORNE CP/M 2.2A-00F ENTER CP/M SOURCE DRIVE (A or B): ?$ ENTER COMMAND LINE TO BE INSERTED, (36 CHARACTERS MAXIMUM) OR FOR NO COMMAND. If COMMAND LINE has N characters, where N > 6, first use SETUP.COM to establish (N - 6) dummy characters in FUNCTION KEY 0 (zero). This will avoid disastrous overlay of FUNCTION and ARROW KEY information but, also, will render FUNCTION KEY 0 unusable. COMMAND ?: $ **** COMMAND INSERTION COMPLETE **** $1¼ ÍÍþÊ:þ`úšÖ ÖAú¤þú¯ ÍÉOÅ*Åí°ÁÍÅ ^#Vë^#V{=2×>2ØÍ=:€ þÃÊï 2ÍÃ: âÍ ßÍ:àÆ2 ÖÂ2 Ã*O !á~þ`ú!Ö # ¯>2ØÍ= RÍÃ!"Ù!"Û!€ "Ý*ÝDMÍÎ*ÛDMÍÈ*ÙDMÍË:ط€ÍÑ·Ê’ ÍÃ:ÍÔ·Ê’ bÍÃ::×*ٽ¦*Û#"Û!ÿÿ#"Ù*Ý€€'z¼Â¾{½ÊÄ"ÝÃOÉ ^#Vë^#V{=2×>2$Êï 2ÍÃ: âÍ ßÍ: ;************************************* ;* * ;* "AUTOMODD" * ;* * ;* LEE SWORDY 14/5/82 * ;* * ;* Revision 1.1 by Jim Woolley, FOG * ;* Disk Librarian, 8/82. * ;* * ;* Modified for double density 2/2/83* ;* By Mike Schwab, Denver Osborne * ;* Librarian. * ;************************************* ; AUXBUF EQU 201DH ; CP/M AUX CMND BFR ST ADR (BYTE CNT = 1st) ; ORG 100H JMP START ; MSG1 DB 1AH,' AUTOMOD REV. 1.1',0DH,0AH DB ' PROGRAM TO INSERT A USER SELECTABLE COMMAND LINE',0DH,0AH DB 'INTO CP/M ON DISK, TO BE EXECUTED ON ALL COLD STARTS',0DH,0AH,0AH DB ' FOR OSBORNE CP/M 2.2A-00F',0DH,0AH,0AH,0AH DB 'ENTER CP/M SOURCE DRIVE (A or B): ?',8,8,8,'$' MSG2 DB 0DH,0AH,0AH,'ENTER COMMAND LINE TO BE INSERTED,',0DH,0AH DB '(36 CHARACTERS MAXIMUM) OR FOR NO COMMAND.',0DH,0AH,0AH ; db 'If COMMAND LINE has N characters, where N > 6,',0dh,0ah db 'first use SETUP.COM to establish (N - 6) dummy',0dh,0ah db 'characters in FUNCTION KEY 0 (zero). This will',0dh,0ah db 'avoid disastrous overlay of FUNCTION and ARROW',0dh,0ah db 'KEY information but, also, will render FUNCTION',0dh,0ah db 'KEY 0 unusable.',0dh,0ah,0ah ; DB ' COMMAND ?: $' MSG3 DB 0DH,0AH,0AH,0AH,'**** COMMAND INSERTION COMPLETE ****',0DH,0AH,0AH DB '$' ; ;**** PRINT HEADER AND REQUEST DRIVE ID START LXI SP,STACK ; LOCAL STACK ; MVI C,9 LXI D,MSG1 ; HEADER MSG/DRIVE ID REQ TO CONS CALL 0005 ; RETRY1 MVI C,1 ; INPUT 'DRIVE ID' CALL 0005 CPI 03 ; ^C ? JZ EXIT ; YES: ABORT CPI 60H JM UPPER SUI 20H ; MAKE UPPER CASE UPPER SUI 41H ; CONV A or B TO 0 or 1 JM CHERROR ; IF NOT 0 or 1 CPI 2 JM DRIVEOK ; CHERROR MVI C,9 LXI D,ERR1 ; 'WRONG' MSG TO CONS CALL 0005 JMP RETRY1 ; DRIVEOK MOV C,A PUSH B ; SAVE DRIVE # ; ;**** MOVE PART OF BIOS VECTOR TABLE INTO LOCAL CORE FOR CALLS LHLD 0001 ; GET WARM ST VCTR ADRS LXI D,24 ; INDEX INTO VCTR TBLE DAD D ; HL + INDEX = SOURCE LXI D,VECTBL ; DESTINATION LXI B,18 ; BYTE COUNT (6 JUMP INSTR'S) DB 0EDH,0B0H ; Z80 'LDIR' INST (BLOCK MOVE) ; ;**** GET 'SECTORS PER TRACK' FROM 'DISK PARAM BLOCK' POP B ; GET DRIVE # CALL SELDSK ; SELECT DISK DRIVE ; LXI D,10 ; INDEX INTO DP HEADER DAD D ; +DPH BASE ADRS ; MOV E,M INX H MOV D,M ; GET DPB ADRS ; XCHG ; MOV E,M INX H MOV D,M ; GET 'SPT' ; MOV A,E DCR A ; -1 STA SPT ; SAVE SECTRS/TRACK ; ;**** READ CP/M FROM DISK INTO CORE STARTING AT 980H (NO BOOT LOADER) MVI A,0 STA FLAG ; RD/WRT FLAG TO READ (0) CALL RDWRT ; DISK READ/WRITE ROUTINE ; ;**** CHECK IF CP/M IS VALID (1st BYTE OK ?) LDA 980H ; GET BYTE 1 OF CPM CPI 0C3H ; SHOULD BE 'JMP' OP CODE JZ REQUEST ; YES: CPM OK ; MVI C,9 LXI D,ERR3 ; 'CPM BAD' MSG TO CONS CALL 0005 JMP EXIT ; ;**** REQUEST COMMAND STRING AND INPUT THE STRING REQUEST MVI C,9 LXI D,MSG2 ; 'CMND REQ' MSG TO CONS CALL 0005 ; MVI C,10 LXI D,INBUFF ; INPUT 'CMND STRING' CALL 0005 ; ;**** TRANSFER 'CMND STRING' FROM IP BUFF TO AUX CMND BUFF LDA INBUFF+1 ; GET INPUT BYTE CNT ADI 2 ; +2 FOR CCP STA AUXBUF ; SAVE AS AUX CMD BFR BYTE CNT SUI 2 ; = 0 ? JNZ JUMP1 ; NO STA AUXBUF ; YES: MAKE AUX BYTE CNT = 0 JMP JUMP4 ; JUMP1 MOV C,A ; BYTE CNT LXI D,AUXBUF+1 ; DESTINATION LXI H,INBUFF+2 ; SOURCE LOOP1 MOV A,M ; GET A SOURCE BYTE CPI 60H ; MAKE UPPER CASE JM JUMP5 SUI 20H ; JUMP5 STAX D ; BYTE TO DEST. INX D ; DEST. + 1 INX H ; SOURCE + 1 DCR C ; BYTE CNT - 1 JNZ LOOP1 ; IF NOT DONE ; XRA A ; A = 0 STAX D ; LINE TERMINATOR ; ;**** WRITE CP/M BACK TO SOURCE DISK JUMP4 MVI A,01 ; RD/WRT FLAG TO WRITE STA FLAG CALL RDWRT ; DISK READ/WRITE ROUTINE ; MVI C,9 LXI D,MSG3 ; 'ALL DONE' MESSAGE CALL 0005 ; EXIT JMP 0000 ; CPM WARM ST ENTRY ; ;******* READ/WRITE CPM TO/FROM DISK SUBROUTINE: ; 'FLAG' = 0 FOR READ, = 1 FOR WRITE ; RDWRT LXI H,0 ; INIT SECTOR = 0 SHLD SECTOR LXI H,0 ; INIT TRACK = 0 SHLD TRACK LXI H,980H ; INIT DMA ADRS = 980H SHLD DMAADR ; LOOP2 LHLD DMAADR MOV B,H MOV C,L CALL SETDMA ; SET DMA ADRS ; LHLD TRACK MOV B,H MOV C,L CALL SETTRK ; SET TRACK # ; LHLD SECTOR MOV B,H MOV C,L CALL SETSEC ; SET SECTOR # ; LDA FLAG ; READ ? (=0) ORA A JNZ DSKWRT ; NO: WRITE ; CALL READ ; READ A RECORD ORA A ; READ ERROR ? JZ GOODRD ; NO ; MVI C,9 LXI D,ERR2 ; 'SOURCE READ' ERR MSG TO CONS CALL 0005 JMP EXIT ; DSKWRT CALL WRITE ; WRITE A RECORD ORA A ; WRITE ERROR ? JZ GOODRD ; NO ; MVI C,9 LXI D,ERR4 ; 'DEST WRITE' ERR MSG TO CONS CALL 0005 JMP EXIT ; GOODRD LDA SPT LHLD SECTOR CMP L ; END OF TRACK ? JNZ JUMP3 ; NO ; LHLD TRACK INX H SHLD TRACK ; TRACK # +1 ; LXI H,0FFFFH ; SECTOR # = -1 JUMP3 INX H ; +1 SHLD SECTOR ; RE-SAVE SECTOR # ; LHLD DMAADR ; DMA ADRS + 128 LXI D,128 DAD D LXI D,2780H ; END OF CPM ? MOV A,D CMP H JNZ NOTEND ; NO MOV A,E CMP L JZ ENDCPM ; NOTEND SHLD DMAADR JMP LOOP2 ; DO NEXT SECTOR ENDCPM RET ; ;**** BUFFERS, STORAGE AND MESSAGES: ; VECTBL ; PORTION OF BIOS VECTOR TABLE SELDSK DS 3 SETTRK DS 3 SETSEC DS 3 SETDMA DS 3 READ DS 3 WRITE DS 3 ; SPT DB 0 ; 'SECTORS PER TRACK -1' FLAG DB 0 ; CPM RD/WRT FLAG; ; SECTOR DW 0 TRACK DW 0 DMAADR DW 0 ; INBUFF DB 36,0 DS 36 ; ERR1 DB 12,12,12,'WRONG!',8,8,8,8,8,8,8,8,8,8,'$' ERR2 DB 0DH,0AH,0AH,1BH,6CH,'DISK READ ERROR',1BH,6DH,0DH,0AH,'$' ERR3 DB 0DH,0AH,0AH,1BH,6CH,'ERROR: CP/M NOT PRESENT ON SOURCE' DB ' DISK',1BH,6DH,0DH,0AH,'$' ERR4 DB 0DH,0AH,0AH,1BH,6CH,'DISK WRITE ERROR',1BH,6DH,0DH,0AH,'$' ; DS 64 STACK END FFH ; SECTOR # = -1 JUMP3 INX H ; +1 SHLD SECTOR ; RE-SAVE SECTOR # ; LHLD DMAADR ; DMA ADRS + 128 LXI D,128 DAD D ÃFSETAUTO version 1.0 (23 Apr 82)copyright 1982 Michael M Rubenstein!91@"¨:\· :<=!@Í$Í?Í|>¹ õ:]þNÊ× þCÊ× þWÊ× þBÊ×è Í:Éæ‡_!^#V Íô Í!Ë~·(þ ( åÅ_ÍÁá#ë Í1!Éqmþ (##þ (w#ö6!@Í Í\Í|>¹ õíKÍ£€!Í£í{¨ÉåÕåÕÅOÍ£|µÊ˜ÁÅÍ£ÁÑáÉåÕÅBKåÍ£Á!Í£$Í£ÁÑáÉåÕÅBKåÍ£Á!Í£'Í£ÁÑáÉÕ€Ñ{þØ à !ª!¿!Õ ÍÃ*é DISK READ ERROR $ DISK WRITE ERROR $ INVALID DRIVE $ Option: $ Program: $ $ NONE$COLD$WARM$BOTH$Ã*é DISK READ ERROR $ DISK WRITE ERROR $ INVALID DRIVE $ Option: $ Program: $åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.he setauto.doc page # Copyright 1982 Michael M Rubenstein Description: Setautï  á setó autostarô optionó foò á disë oî  thå � Osbornå 1® Possiblå optionó are: 1. No autostart 2. Autostart on cold boot 3. Autostarô  oî  warí booô (leô må  kno÷  iæ �           anyone finds a use for this one.) 4. Autostart on warm or cold boot Additionally¬  thå  disë caî bå seô tï autostarô anù � commanä witè thå restrictioî thaô thå commanä cannoô � bå morå thaî ¶ characteró long. Setautï  haó beeî testeä undeò Osbornå Reö 1.3®  Iô � shoulä alsï worë undeò Reö 1.2. Syntax: General form: setauto [d:][opt] [cmd] where ä ió thå drivå specifier®  Iæ omitted¬  thå defaulô � drive will be used. opt one of the options none -- no autostart will be performed cold -- autostart on cold boot warm -- autostart on warm boot both -- autostart on cold or warm boot Onlù thå firsô letteò oæ opô ió significant® Iæ opô � ió  omitteä  oò  invalid¬  thå  currenô  optioî  anä � command for the disk will be displayed. cmä  ió  anù commanä lesó thaî  ¶  characteró  long® � Operandó oò drivå specifieró arå noô permitted®  Nï � checking for validity is performed. Warning¬  iæ  botè  ió  specifieä  anä  thå  commanä � terminateó  witè  á warí boot¬  thå commanä wilì  bå � reissued when the program terminates. Š Examples: Set no autostart: setauto none Seô autostarô tï supercalã oî colä boot®  Uså  disë � on drive b: setauto b:cold sc Don'ô   changå  thå  autostarô  command¬   buô   seô � autostart on cold or warm boot: setauto both Display the selected autostart: setauto End of document e will be used. opt one of the options none -- no autostart will be performed cold -- autostart on cold boot warm -- autostart on warm boot both -- autostart on cold or warm boot Onlù thå firsô letteò oæ opô ió sig*.|Ög"f˜ÿÖA x·ÂtÍa˜ÍaxÍa{Íah *f.ÍV*f.ˆ>w*f.‰|w*féw# x±ÂVÉ Ã4SCg$G$ Loading SUPERCALC... $YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKWWWWWWWWWWWWWWWWWWWWIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKWWWWWWZaaaaaaaaaaVWWWWWWIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVWWWWWWIaaaaaaaaaaKWWWWWWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaVWWWWWWWWWWWWWWWWWWWWZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa$vÿ¬}AUTOST.ASMYöÿ õÿòÿžÿØÿßÿ›ÿoÿ�ÿ“ÿšÿ�ÿ !"#$Óÿœÿ–ÿ�ÿ‘ÿÏÿ—ÿŒÿ‹ÿ�ÿÄÿ’ÿ˜ÿ¨ÿ%&'()*+,-./0™ÿ‰ÿ‡ÿÅÿŠÿãÿÎÿ¦ÿÍÿ¶ÿ123456789:;<=>úÿ¬ÿ»ÿÑÿ°ÿ­ÿŽÿ÷ÿÇÿºÿ«ÿåÿ¾ÿ©ÿ½ÿ?@ABCDEFGHIJKÝÿÛÿÈÿ¼ÿ´ÿ²ÿ±ÿ¥ÿ•ÿøÿóÿÒÿÐÿËÿÉÿÆÿ¹ÿ”ÿÌÿLMNOPQRÊÿ¸ÿ³ÿ¯ÿªÿ§ÿ†ÿ…ÿSTUVWXùÿôÿïÿìÿëÿâÿÙÿÔÿ·ÿµÿ®ÿÿþÃGwÆ4cîþs<5ÇSóíøË­yøíîâôîüáôµq×�·—§Ç‹7k³3îúòöñxz¼x³6o^2 Ƙ³‡»[³;|zñéæ³q;+Úïkóñìé¼®0 Æÿ‡ù¯äßÍ“|�Éà镹”*o2ó2Ŷ+«Ì¼”P,ΙcÌ·r2oÊs³«_ìn˜†�îŒi`Œ¹ýßow·§LS¢$Ä« _€!Q’iócÅÛ\úˆxµÁÎ7ÀÛ\úhòF’ä]LLS’¾A¼Úw¢“Ô¤oмeªÊ)Iß ^mŒ;ÑŸªrJÒ7EÞ2õ~³X ^mðžÎ.NMŸŠªKÆo‹˜˜¼-[Ä« ~†PæÒeeÊ…y:»8eÊ“1ˆWÔ¶†\R*dŠ&Ån“*¦°@¼Ú –BQE³ˆÑ2 Lƒ9½{¸¼3ß̯—?_>¼f˜P¦ õ®®&ãNš`Qï˜0. „¬®™0–KHÖ0¡ÝØ}i˜0–K4™0¡m‚Ež÷LaUÀf¡œJ&ƒ°*à³CýùS¹Œi�`eË„vSàËOLh;YÁ2¡¨V°L6_Á3a,—�Ì3¡La»êO”˘˜ÚNR·FX°YÛIê¦Ä„\B@ŸŠªcBX°Y(§’ ¹„`Ч¢ê˜VlÖve?%&äúTT“q×aUÀf±²cl™�KèSQu`BX°Ù¢±’12wV|¶«™Ær×M°Èóž ã²@ÈêLÈ%È$EńЋ<ï™0. „ìæ¦a¸, Y}Ó0a,—3aBh‚Ež÷L—BvóµaÂX.!Yı\bÌ„ ¡ yÞ3w�Khû- ú¼ L2IQ­¬¬`™0–KŒ™0¡¨Vh˜PT+XL°ù ž c¹„dž eäLxWý ™¤¨˜�bÇÔö1Úµ1ã²0îD²ÚNPÇÅîGÄ;¦>U·Æ¸,�g½ß,Lx7öð¶l™¦Á˜¶+“LÑHŠÂ40åy¿†mq`Z!V2Ƶ±õçL?;^jVguVguVg5Ó` Ó`LUvqmŽ “—ã(•5m—Šj2EkBYM1™®‘Êܘ¼‘$ySË4wýG¹1ã¦íLÞH5Eó,¬ ã³]ý̼۴�ñqQ¦h^_<Þ®MW2 0Ϫ0> ±šºæß‡gçLm'©›ÒÚX�fU9%é›LŸ+S¬ìÛ5¬Gž²°ÈÂ" ‹ìk¦¿”b‹j2¿Ÿ/Í¿ÌË_?½>??×,OYXda‘ése˜B9•kXÝ»�(¬‡Š;(¬‡ŠÛ*¬‡ŠÛ¾šÝ?ŽÊë¡âÊë¡â¶Êë¡{wP&X=ŠÛ)¬‡ŠÛ*¬‡Š»5»“·âþú8»e‚õÐù(®V&X·U&XÝ»ƒ2Ázè~/®V&X·U&Xw?»÷â>ÌîD™`=tžÅÕÊë¡â¶Êd ¬‡îÝA™Œ»¶ºß‹«• ÖCÅm• ÖCÅÝÏ³;Q&X�gqµ2Áz¨¸­2ÁzèÞ” ÖC÷{qµ2Áz¨¸­2Áz¨¸ûÙ½÷av'Êë¡ó,®V&X·U&XÝ»ƒ2Ázè~/®V&X·U&Xwÿ8»¿ÅÑ«Ù�(¬‡ÎoÅÕÊë¡â¶Êë¡{wP&X}+n§L°*n«L°*îŸ�³ûû[e‚õPqe‚õPqÛçÊ+{ï†ÿ!� 9¹õ8ÙÿhŠ\Tk�ó¨ŒX™t 4M!‡à¤¢5Ê�Æo „I$·Q+û Ôä<„©y‚–cãчhIÝ€ßDÒø-šBVK3ê‡4.¡œJ&ƒ°*à³CýùS¹Œi�`eË„vSàËOLh;YÁ2¡¨V°L6_Á3a,—�Ì3¡La»êO”˘˜ÚNR·FX°YÛIê¦Ä„\B@ŸŠªcBX°Y(§’ ¹„`Ч¢ê˜VlÖve?%&äúTT“q×aUÀf±²cl™�KèSQu`BX°Ù¢±’12wV|¶«™Ær×M°Èóž ã²@ÈêLÈ%È$EńЋ<ï™0. „ìæ¦a¸, Y}Ó0a,—3aBh‚Ež÷L—BvóµaÂX.!Yı\bÌ„ ¡ yÞ3w�Khû- ;------------------------------------------------ ; AUTOCPM.ASM version 1.0 10/12/81 ; ; copyright 1981 by Thom Hogan ; Basically Speaking Press ; Palo Alto, CA ; ; This program loads and executes MBASIC.COM ; ;------------------------------------------------ ; ; EQUATES ; clear equ 26 ;clear screen escape equ 1bh ;escape character graph equ 'g' ;graphics nograph equ 'G' ;nographics pbuff equ 9 ;BDOS print buffer bdos equ 5 ;location of BDOS cr equ 0dh ;carriage return lf equ 0ah ;line feed ; ; START OF PROGRAM ; org 0100h ; lhld 01 ;get warm start address mvi l,00 ;zero L register mov a,h ;get page boundary in A sui 16h ;subtract 16 to find CCP mov h,a ;put back new page boundary shld ccp ;store it lxi d,logo ;point to logo lxi b,2047 ;number of characters in logo over: ldax d ;get byte of logo sui 65 ;convert to graphics stax d ;store it inx d ;new address dcx b ;decrement byte counter mov a,b ;ggt in A ora a ;are we done? jnz over ;if no, back again start: lxi d,startgr ;point to startgraphics call print lxi d,logo ;point to logo message call print ;display it lxi d,stopgr ;point to end of graphics call print ;display it lxi d,endmes ;point to load message call print lxi d,filename ;point to file name lxi b,10 ;set counter move: lhld ccp ;get CCP back mvi l,07 ;bias by 7 bytes call again ;move file name to CCP lhld ccp ;get CCP back mvi l,88h ;offset to counter mvi a,08h ;lsb of ccp pointer mov m,a ;put it in place lhld ccp ;get CCP one more time mvi l,89h ;offset to counter mov a,h ;put it in place mov m,a ;counter restored lhld ccp ;get CCP last time pchl ;execute cold start again: ldax d ;get byte to move mov m,a ;move it inx h ;increment location inx d ;increment location dcx b ;decrement counter mov a,b ;get counter in a ora c ;check if done jnz again ;...not done ret ;...done print: mvi c,pbuff ;get proper call in c jmp bdos ;do it ; ;STORAGE AREA ; ccp: ds 2 ;temp storage of CCP filename: db 06,'SC',0,0,0,0,0,0,0,0,0 ; / \ ; length / command must be followed by at ; of command string least one zero to work properly ; ; note: if command string is longer than 8 characters, ; you must change "lxe b,10" just before MOVE: to ; "lxi b,length+2" ; startgr: db clear db escape,graph,'$' stopgr: db escape,nograph,'$' endmes: db cr,lf,lf,lf,9,'Loading SUPERCALC...',cr,lf,lf,'$' ; / ; message to print under logo ; logo: db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaKWWWWWWWWWWWWWWWWWWWWI' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'Iaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaKWWWWWWZaaaaaaaaaaVWWWWW' db 'WIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'YYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWW' db 'WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'YYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWW' db 'WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'YYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWW' db 'WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db  'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'YYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaVWWWWWWIaaaaaaaaaaKWWWWW' db 'WZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'Zaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaVWWWWWWWWWWWWWWWWWWWWZ' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa$' end aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' db 'YYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaWWWWWWWaaaaaaaaaaaaWWWWW' db 'WWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' db 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa' db An Autost That Logs To Drive B Before Initializing Wordstar Have you developed a subliminal routine of setting the help level to 1 and logging to disk drive B every time you start editing with Wordstar? Well, you can change Wordstar's default help level by referring to WSBIBLE.DOC in the FOG library and I've written a version of AUTOST.COM (the program that loads Wordstar automaticly when you press return) for the Osborne that will log to any drive and any user number you want before running Wordstar or any other program you desire. This version doesn't have that time consuming Osborne logo in it but you can put in a welcome message of any length. What follows is the most novice oriented explanation I could come up with on how to modify this program to your liking. You must have ASM.COM and LOAD.COM. Programmers will want to skip to the source code listing itself. A byte is of course a number made up of ones and zeros (called bits). This program uses something I call the DRIVE/USER byte to set the logged drive and user number simultaneously. In the program below, this DRIVE/USER byte is written in a much easier form to read than binary (ones and zeros). It's written in something called hexadecimal form (hex for short). In hex, instead of counting from one to ten like humans do, we count from one to sixteen before adding another digit. Thus counting from zero to sixteen in hex looks like this: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10 It's important for you to know this when setting the DRIVE/USER byte because, in hex, the first digit in the DRIVE/USER byte is the user number and the second digit is the logged disk drive (0 = disk A, 1 = disk B). For example, if the DRIVE/USER byte is 51 in hex, then the user number is 5 and the logged disk drive is B. In the program below, the DRIVE/USER byte is set at 01 hex so the user number is 0 and the logged drive is B. When the program is run, it will log to drive B before running Wordstar in drive A. You can change the DRIVE/USER byte in the program below to any number you want. First, copy the program exactly as you see it below into a file called AUTOST.ASM using Wordstar's non document mode (or use VDE). Then find the DRIVE/USER byte. I've left comments in the program explaining where it is (all comments have a semicolon in front of them so the computer will ignore them) but look for the following line: MVI C,01H ;GET LOGGED DRIVE/USER CODE INTO C This line instructs the computer to use DRIVE/USER byte 01 in hex (the "H" stands for hex). Ignore the "MVI C," (and my comments) and change the DRIVE/USER byte to anything you want. If you want user number ten and disk drive C, change the byte to 0A2H. (The "A" means user ten and the "2" means disk drive C. You have to put a "0" in front of the "A" so the computer knows it's a number.) Now look for the welcome message at the end of the program. It looks like this: MESSGE: DB CLEAR,CR,LF,'Hello, (put your name here),' DB 'great to see you again!' DB CR,LF,'Loading WordStar...',CR,LF,'$' but the computer will print it out like this: Hello, (put your name here), great to see you again! Loading Wordstar... You can change this message to anything you want. Make sure all text is between apostrophes. CR moves the cursor to the left side of the screen. LF moves the cursor down one line. (CR and LF must be outside the apostrophes.) There must be a DB at the begining of each line in the program. If you're not a programmer, you may just want to Replace "(put your name here)" with your name. After making these modifications to suit your needs, save the file AUTOST.ASM onto a disk that also contains LOAD.COM and ASM.COM. (LOAD.COM and ASM.COM should have been on your util ity disk when you got your computer.) Put the disk with LOAD.COM, ASM.COM, and AUTOST.COM in disk drive B and put your Wordstar disk in drive A. Make sure this isn't the only copy of your Wordstar disk. (You should have a back-up copy somewhere safe.) If you're in Wordstar, exit to CP/M (type X). You're now ready to "assemble" the program AUTOST.COM. First re-name your original AUTOST.COM by typing the following: REN A:OLDSTART.COM=A:AUTOST.COM and hit the "return" button. Now type: B:ASM AUTOST.BAZ and hit the "return" button. Wait for the computer to type the following: CP/M ASSEMBLER - VER 2.0 019D 000H USE FACTOR END OF ASSEMBLY If the computer types anything else besides the above, you copied or edited part of AUTOST.ASM incorrectly or you didn't use the NON-document mode when editing with Wordstar. The computer will display the lines you copied incorrectly so you can go back and check them. Do not try to load or run this program without doing so. If the computer typed exactly what you see above, you may continue. Type the following: B:LOAD A:AUTOST and hit the "return" key. Wait for the computer to type the following: FIRST ADDRESS 0100 LAST ADDRESS 019C BYTES READ 009D RECORDS WRITTEN 02 Again, if the computer typed anything other than the above, AUTOST.ASM was not copied correctly. If all went well you should now have the new AUTOST.COM on your Wordstar disk in drive A. Type the following to get rid of a file called a "hex file" which has served it's purpose and is no longer needed: ERA A:AUTOST.HEX and hit the "return" key. To try out your new Autost, hit the reset button and then hit the "return" button. (If you've set the DRIVE/USER byte to log to drive B, make sure you've got a disk in drive B before you hit "return".) Autost should display the welcome message while logging to the disk drive and user number you specified and loading Wordstar from drive A. NOTE: I have done my best but I cannot guarantee that I have explained the above perfectly. Therefore, I cannot guarantee that this program will work for everybody. I have tested it thoroughly and it works for me on my Osborne 1. The program is as follows: ; AUTOST AUTOMATIC PROGRAM INITIALIZER FOR THE OSBORNE 1 ; COMES UP LOGGED TO PRESET DRIVE AND USER NUMBER ; EQUATES BDOS EQU 05H CLEAR EQU 1AH CR EQU 0DH ESCAPE EQU 1BH LF EQU 0AH ; START OF PROGRAM, FIND CCP AND STORE ADDRESS, SEND LOAD MESSAGE ORG 0100H LHLD 1 ;get warm start address MVI L,0 ;zero l register MOV A,H ;get page offset SUI 16H ;find CCP address MOV H,A ;set HL to CCP address SHLD CCP ;store CCP address LXI D,MESSGE ;point to load message CALL PRINT ;print it LXI D,FILENAME ;point to file name LXI B,LF ;set counter ; THIS ONE DOES THE ACTUAL JOB AT HAND: ; GETS FILENAME INTO CCP AND INITIALIZES THE COLD START MOVE: LHLD CCP ;get CCP address MVI L,7 ;add 7 bytes CALL MOVE1 ;move file name to CCP+7 LHLD CCP ;get CCP MVI L,88H ;add 88h bytes MVI A,8 ;CCP+88h = CCP command pointer MOV M,A ;put location in place INR L ;point to next part of location MOV A,H ;put it in place MOV M,A ;command string location in place ;(PUT DRIVE/USER CODE HERE) ; / MVI C,01H ;GET LOGGED DRIVE/USER CODE INTO C ;(NOW SET TO DRIVE B, USER 0) ;DRIVE SPECIFICATION IS NEEDED WITH ;PROGRAM NAME (BELOW) IF PROGRAM TO ;RUN IS ON DIFFERENT DRIVE THAN THIS ;(In drive user code, 1st 4 bits = drive, last 4 bits = user) LHLD CCP ;get CCP last time PCHL ;do a cold start ; THIS ONE ACTUALLY DOES THE MOVING JOB FOR MOVE MOVE1: LDAX D ;get byte to move MOV M,A ;move it INX H ;increment locations INX D DCX B ;decrement counter MOV A,B ;check counter ORA C JNZ MOVE1 ;continue if not done RET ;else return ; PRINT TO CONSOLE PRINT: MVI C,9 JMP BDOS ;STORAGE AREA CCP: DB 34H,2 FILENAME: DB 4,'A:WS',0,0,0,0,0,0,0 ;(command length),(command string),(followed by at least 1 zero) MESSGE: DB CLEAR,CR,LF,'Hello, (put your name here),' DB 'great to see you again!',CR,LF,'Loading ' DB 'WordStar...',CR,LF,'$' END EAR,CR,LF,'Hello, (put your name ;(PUT DRIVE/USER CODE HERE) ; / MVI C,01H ;GET LOGGED DRIVE/USER CODE INTO C ;(NOW SET TO DRIVE B, USER 0) ;DRIVE SPECIFICATION IS NEEDED WITH ;PROGRAM NAME (BELOW) IF PROGRAM TO ;RUN IS ON DIFFERENT DRIVE THAN THIS ;(In drive user code, 1st 4 bits = drive, last 4 bits = user) LHLD CCP ;get CCP last time PCHL ;do a cold start ; THIS ONE ACTUALLY DOES THE MOVING JOB FOR MOVE MOVE1: LDAX D ;get byte to move MOV M,A ;move it INX H ;increment locations INX D DCX B ;decrement counter MOV A,B ;check counter ORA C JNZ MOVE1 ;continue if not done RET ; ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ}ÿÿAUTOMODDCOM AUTOMODDASM/SETAUTO COMSETAUTO DOCAUTOST COMAUTOST AQMAUTOST ASM% !"#BAUTOST DOCC$%&'()*+,FSTART $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå FSTART.DOC by Ken Moon Col. Springs Osborne Group FSTART.COÍ  ió  aî  AUTOSÔ  generatoò whicè noô  onlù  createó  á � customizeä  starteò prograí buô combineó iî onå placå alì oæ  thå � patcheó  foò  speedinç  uð  disk-drivå  accesó  timå  whicè  havå � appeareä iî thå FOGHORÎ oveò thå lasô yeaò oò so® Iô shoulä worë � oî mosô SÄ oò DÄ Osbornå 1's®  Thå prograí haó á built-iî  menu® � The only restriction is that it MUST be run A: Drive to B: Drive. Please send comments to: 12 Heather Dr, Col Springs, CO 80906ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃ.|Ög"Ã" Ãw# x±ÂÉjÍJ*.Í*.ˆ>w*.‰|w*é 4 $þÿÀ!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í!6*,6,6¼ÍI ÍÛÍu Í:J<<2,> 2u2vé͘͘Í<ʆ͘ͷÂ�€Í˜Í˜Í ÍÃüÍÃ?ÍÃAUTOST COM THE AUTOST.COM MAKER Version 1.0 This program takes your inputs and creates an "AUTOST.COM" file on the B: drive. For this reason, please put the disk you want to autostart in the B: drive. (It is assumed that this program was loaded from the A: drive.) Type in the name of the program as if you were going to run it under CP/M. (You MUST use CAPITAL LETTERS here.) Examples: (not more than 24 characters) A>MBASIC PROGRAM for a MBASIC program; or A>SORT for Supersort (tm) by MicroPro. A>$ Now, type a one-line message for the sign-on display. You can have up to 52 characters on the line (a TAB counts as one character). I recommend a TAB for the first character. You can edit the line, but hitting the carriage return key will enter the line. $ NOW SAVING B:AUTOST.COM... $ (The disk should be ready for self-starting when the light goes off on the drive. Press RESET and put the disk in the left drive, hit the return key, and watch what happens.) BE SURE THE CP/M SYSTEM IS ON THE DISK. $ Sorry, but there is no directory space left on your B: disk. $ Sorry, but there is no room left on your disk. $the B: drive. (It is assumed that this program was loaded from the A: drive.) Type in the name of the program as if you were going to run it under CP/M. (You MUST use CAPITAL LETTERS here.) Examples: (not more than 24 characters) A>MBASIC PROGRAM for a MBASIC program; or A>SORT for Supersort (tm) by MicroPro. A>$ Now, type a one-line message forMAKEAUTO and MAKAUTO2 MAKEAUTO ió aî Osborne-specifiã prograí thaô wilì � generatå á customizeä AUTOST.COÍ filå oî thå Bº � drive® Iô allowó yoõ tï creatå á onå linå sign-oî � message¬ anä designatå thå prograí tï bå run® Iô � will work on single and double density drives. MAKAUTO² ió slightlù modifieä tï changå thå drivå � speedó foò Osborneó witè thå MPÉ drives® Toí Vyse§ � prograí FASÔ haó beeî incorporateä sï thå thå drivå � speed is automatically speeded up. Tï ruî MAKEAUTÏ oò MAKAUTO2¬ puô thå prograí iî thå � Aº drivå anä thå diskettå thaô yoõ wanô tï havå � customizeä iî thå Bº drive® Typå MAKEAUTOMBASIC PROGRAM for a MBASIC program; or',cr,lf db 'A>SORT for Supersort (tm) by MicroPro.',cr,lf,lf db 'A>$' msg2: db clr,cr,lf,lf,lf db 'Now, type a one-line message for the sign-on',cr,lf db 'display. You can have up to 52 characters on',cr,lf db 'the line (a TAB counts as one character).',cr,lf db lf,'I recommend a TAB for the first character.',cr,lf db 'You can edit the line, but hitting the carriage',cr,lf db 'return key will enter the line.',cr,lf,lf,lf,'$' msg3: db cr,lf,lf,lf,' NOW SAVING B:AUTOST.COM...',cr,lf,'$' msg6: db lf,' (The disk should be ready for self-starting',cr,lf db ' when the light goes off on the drive. Press',cr,lf db ' RESET and put the disk in the left drive,',cr,lf db ' hit the return key, and watch what happens.)',cr,lf db lf,' BE SURE THE CP/M SYSTEM IS ON THE DISK.',cr,lf db '$' msg4: db cr,lf,lf,'Sorry, but there is no directory space left',cr,lf db 'on your B: disk.',cr,lf,'$' msg5: db cr,lf,lf,'Sorry, but there is no room left on your disk.' db cr,lf,'$' Ã.|Ög"Ã" Ãw# x±ÂÉ>2ïoÍO*.Í*.ˆ>w*.‰|w*é 4 $!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í!6*,6,6¼ÍN ÍÛÍz Í:O<<21> 2z2{é͘͘Í<ʆ͘ͷÂ�€Í˜Í˜Í ÍÃüÍÃ?ÍÃAUTOST COM THE AUTOST.COM MAKER Version 1.0 This program takes your inputs and creates an "AUTOST.COM" file on the B: drive. For this reason, please put the disk you want to autostart in the B: drive. (It is assumed that this program was loaded from the A: drive.) Type in the name of the program as if you were going to run it under CP/M. (You MUST use CAPITAL LETTERS here.) Examples: (not more than 24 characters) A>MBASIC PROGRAM for a MBASIC program; or A>SORT for Supersort (tm) by MicroPro. A>$ Now, type a one-line message for the sign-on display. You can have up to 52 characters on the line (a TAB counts as one character). I recommend a TAB for the first character. You can edit the line, but hitting the carriage return key will enter the line. $ NOW SAVING B:AUTOST.COM... $ (The disk should be ready for self-starting when the light goes off on the drive. Press RESET and put the disk in the left drive, hit the return key, and watch what happens.) BE SURE THE CP/M SYSTEM IS ON THE DISK. $ Sorry, but there is no directory space left on your B: disk. $ Sorry, but there is no room left on your disk. $the B: drive. (It is assumed that this program was loaded from the A: drive.) Type in the name of the program as if you were going to run it under CP/M. (You MUST use CAPITAL LETTERS here.) Examples: (not more than 24 characters) A>MBASIC PROGRAM for a MBASIC program; or A>SORT for Supersort (tm) by MicroPro. A>$ Now, type a one-line message for;************************************************** ;MAKEAUTO.ASM version 1.0 9/10/82 ; ;copyright 1982 by M. Joel Guerra ;portions copyright 1981 by Thom Hogan ;modified 10/23/83 by Steven Dyk to speed up the ;drives. ; ;This program creates a new AUTOST.COM file on disk ;for use with the Osborne 1 computer ;************************************************** ; ; cr equ 0dh ;carriage return lf equ 0ah ;line feed clr equ 26 ;clear Osborne screen ; ; org 100h jmp 200h mvi l,00h mov a,h sui 16h mov h,a shld 0110h jmp main nop nop nop print: mvi c,09 jmp 0005h rpt: ldax d mov m,a inx h inx d dcx b mov a,b ora c jnz rpt ret main: mvi a,0 ;these 2 lines speed up the drives sta 0ef13h ;for 01's with MPI drives - S. Dyk lxi d,signon call print lxi d,prgm cntr: lxi b,0 lhld 0110h mvi l,07 call rpt lhld 0110h mvi l,88h mvi a,08h mov m,a lhld 0110h mvi l,89h mov a,h mov m,a lhld 0110h pchl pprgm: db 018h prgm: db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 signon: db clr,cr,lf,lf,lf db lf,lf,lf,lf,lf,lf,52,0 smesg: db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,0,0,0 db 0,0,0,0,0,cr,lf,lf,'$' ds 87 ; ; org 200h ; lxi h,0100h mvi m,02ah inr l mvi m,01 inr l mvi m,00 ; lxi d,msg1 call print ; ; fetch the name of the program to autostart ; lxi d,pprgm mvi c,0ah call 0005h ; ; fetch the autostart message to be displayed ; lxi d,msg2 call print ; lxi d,smesg-2 mvi c,0ah call 0005h ; lda prgm inr a inr a sta cntr+1 ; mvi a,lf sta smesg-2 sta smesg-1 ; ; Save the new AUTOST.COM program on the b: disk ; lxi d,msg3 call print lxi d,bsave ;delete any previous file mvi c,013h call 0005h lxi d,bsave ;open new AUTOST.COM file mvi c,016h call 0005h inr a jz fuldir lxi d,0100h ;set DMA address mvi c,01ah call 0005h lxi d,bsave ;start writing to disk mvi c,015h call 0005h ora a jnz fuldsk lxi d,0180h ;set DMA address AGAIN! mvi c,01ah call 0005h lxi d,bsave ;finish writing to disk mvi c,015h call 0005h lxi d,bsave ;close file, write FCB to disk mvi c,010h call 0005h lxi d,msg6 call print jmp 0000h ; fuldir: lxi d,msg4 call print jmp 0000h fuldsk: lxi d,msg5 call print jmp 0000h ; bsave: db 2,'AUTOST COM',0,0,0,0 db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 db 0,0,0,0 ; msg1: db clr,cr,lf,lf,lf db 9,'THE AUTOST.COM MAKER' db cr,lf,9,' Version 1.0' db cr,lf,lf,lf db 'This program takes your inputs and creates',cr,lf db 'an "AUTOST.COM" file on the B: drive.',cr,lf db lf,'For this reason, please put the disk you',cr,lf db 'want to autostart in the B: drive.',cr,lf db '(It is assumed that this program was loaded',cr,lf db 'from the A: drive.)',cr,lf,lf db 'Type in the name of the program as if you',cr,lf db 'were going to run it under CP/M.',cr,lf db '(You MUST use CAPITAL LETTERS here.)',cr,lf,lf db ' Examples: (not more than 24 characters)',cr,lf db 'A>MBASIC PROGRAM for a MBASIC program; or',cr,lf db 'A>SORT for Supersort (tm) by MicroPro.',cr,lf,lf db 'A>$' msg2: db clr,cr,lf,lf,lf db 'Now, type a one-line message for the sign-on',cr,lf db 'display. You can have up to 52 characters on',cr,lf db 'the line (a TAB counts as one character).',cr,lf db lf,'I recommend a TAB for the first character.',cr,lf db 'You can edit the line, but hitting the carriage',cr,lf db 'return key will enter the line.',cr,lf,lf,lf,'$' msg3: db cr,lf,lf,lf,' NOW SAVING B:AUTOST.COM...',cr,lf,'$' msg6: db lf,' (The disk should be ready for self-starting',cr,lf db ' when the light goes off on the drive. Press',cr,lf db ' RESET and put the disk in the left drive,',cr,lf db ' hit the return key, and watch what happens.)',cr,lf db lf,' BE SURE THE CP/M SYSTEM IS ON THE DISK.',cr,lf db '$' msg4: db cr,lf,lf,'Sorry, but there is no directory space left',cr,lf db 'on your B: disk.',cr,lf,'$' msg5: db cr,lf,lf,'Sorry, but there is no room left on your disk.' db cr,lf,'$' db 'Now, type a one-line message for the sign-on',cr,lf db 'display. You can have up to 52 characters on',cr,lf db 'the line (a TAB counts as one character).',cr,lf db lf,'I recommend a TAB for the first character.',cr,lf db 'You can edit the line, but hitting the carriage',cr,lf db 'return key will enter the line.',cr,lf,lf,lf,'$' msg3: db cr,lf,lf,lf,' NOW SAVING B:AUTOST.COM...',cr,lf,'$' msg6: db lf,' (The disk should be ready for self-starting',cr,lf db ' when the light goes off on the drive. Press',cr,lf db ' RESET and put the disk in the left drive,',cr,lf db ' hit the return key, and watch what happens.)',cr,lf db lf,' BE SURE THE CP/M SYSTEM IS ON THE DISK.',cr,lf db '$' msg4: db cr,lf,lf,'Sorry, but there is no dÃö*.|Ög"FžÍAH**F.Í6*F.ˆ>w*F.‰|w*Féw# x±Â6É Ã Ø#Ãz ë !9"û<ÅÕ!È Íh%Ú¾ ʾ ü° ͯ Í*û<ùëÉé:ÿ7·Ê¾ Ã"E:ÿ7·Ä%EÃ¥ LH SR# UJÑ BPê PL+ MT7 MB= HMC FMI CWO PC` POW PAu CPo PN€ OPz HE  FOš !=>õÍwÍŸ ñnÃÚ!*=>à !=ÍÍ1â:2�¯222Í  STARTER) Version 1.3 Copyright 1983 Claude Ostyn (>!ŽwÍ This program will create another program called AUTOST.COM and put it on a diskette in drive B. Ozzie looks for AUTOST.COM when it is booted. If it finds it, it then executes the command requested by AUTOST.COM. Press to proceed, or CONTROL-Z to exit. ÍöþÊŽÍoÍ  Enter the command to be executed by AUTOST.COM, (up to 80 characters). Example: MBASIC ZAPGAME ________________________________________ !î6Pî Í!ï~þÊŽÍBÍ  Enter the message to be displayed while AUTOST.COM is executing (up to 80 characters). ___________________________________________________ œ ÍÍ·Í,Í  Put the disk on which you want to create AUTOST.COM in drive B, and press any key, or CTRL-Z to make changes. ÍöþÊlÍ  <<< WAIT >>>ÍÍÍ Copy this AUTOST.COM on another disk? ÍöþYÊÀÍ  Returning to CP/M... :�2Ã!�#~þ$º6 #6 #6 #6$É!"�:Ž2� ͯ2|!"h"j\ÍþÿÊ6Í  OK to erase existing AUTOST.COM? ÍöþY¤Í R \Í\ÍþÿÂIÍÍä*�ëÍ*�€"�\ÍþÊoÍ®ä:Ž=2ŽÂIÍí\Í:�2ŽÍ  <<< DONE! >>> Í  ÍíÉÍ  Permanent write error ÉÍ  Cannot open for write É€ÍÉÅÕåÿÍþÊùæÍ]ÍáÑÁÉÅÕåõ_ÍñáÑÁÉ㯆#ãÈÍà >2\ã!] w#Â9É!HïwG#xþÈÍ]w#ÂQÉþ:Èþ{Èþ}Èþ~ÈþaØæ_É!HR6#Ât!œ6P#6R#6$Â…É <<< DONE! >>> Í  ÍíÉÍ  Permanent write error ÉÍ  Cannot open forAUTOST COM____ !î6Pî Í!ï~þÊŽÍBÍ  Enter the message to be displayed while AUTOST.COM is executing (up to 80 characters). ___________________________________________________ œ ÍÍ·Í,Í  Put the disk on which you want to create AUTOST.COM in.op STARTER.DOC STARTER.COÍ createó á prograí calleä AUTOST.COM¬ containinç thå � command and sign-on message of your choice. Wheî yoõ booô á disë witè thå Osbornå 1¬ iô lookó foò á filå � calleä AUTOST.COM® Iæ iô findó it¬ thå commanä specifieä iî thå � filå wilì bå executed® Thió caî bå á compounä command¬ includinç � parameters¬ sucè as MBASIC MENU or PIP B:=A:*.*[VO] or SUBMIT EXECUTE PIP.COM XDIR.COM or, simply, DIR To run the program: at the A> prompt, type A> STARTER Thå prograí wilì theî prompô yoõ foò á command anä foò á messagå � tï displaù oî thå screeî whilå thå commanä ió beinç loaded® Thå � commanä linå and the message can each be up to 80 characters long. Yoõ wilì theî bå askeä tï puô á disë iî drivå B® Iæ AUTOST.COÍ � alreadù existó oî thå disk¬ yoõ wilì bå giveî thå choicå tï � overwritå iô oò trù anotheò disk® Thió prograí alsï allowó yoõ tï copù thå samå AUTOST.COÍ prograí � oî anù numbeò oæ disks. Unlikå thå Osbornå AUTOST.COM¬ thió versioî doeó noô contaiî � graphicó anä thereforå thå AUTOST.COÍ createä wilì fiô intï thå � minimuí sizå filå (1Ë iî doublå density¬ 2Ë iî single). Thió prograí workó foò rev® 1.³ oò higheò Osbornå 1¬ anä maybå � (untested© foò rev® 1.² aó well® Iô wilì noô worë witè thå � Executive (which has its own similar utility). Therå ió á copyrighô noticå iî thå program® É dï noô authorizå � anù profit-making¬ resalå oò commerciaì uså oæ thió program® � However¬ É dï granô licenså foò personaì uså tï alì Osbornå � owners. I also authorize FOG to distribute it. Claude Ostyn Sitka, Alaska September 26, 1983 Yoõ wilì theî bå askeä tï puô á disë iî drivå B® Iæ AUTOST.COÍ � alreadù existó oî thå disk¬ yoõ wilì bå giveî thå choicå tï � overwritå iô oò trù anotheò disk® Thió prograí alsï allowó yoõ tï copù thå samå AUTOST.COÍ prograí � oî anù numbeò oæ disks;==================================================== ; STARTER A.K.A. START MAKER by Claude Ostyn : ; Version 3 9/27/83 : ; : ; This is a self-modifying program with hooks into : ; CCP and BDOS. Use extreme caution. : ;==================================================== ;EQUATES ; ASCII cr equ 0dh lf equ 0ah ctrlz equ 1ah escape equ 27 half equ ')' full equ '(' ; BDOS functions rconf equ 1 ;read CON: into A wconf equ 2 ;write A to CON: rbuff equ 10 ;read a console line ; CP/M disk access functions initf equ 13 ;initialize BDOS openf equ 15 ;open file closf equ 16 ;close file findf equ 17 ;find file delef equ 19 ;delete file readf equ 20 ;read one record writf equ 21 ;write one record makef equ 22 ;create file sdmaf equ 26 ;set DMA function ; CP/M addresses rboot equ 0 ;cold boot drive equ 4 ;current drive bdos equ 5 ;BDOS entry for calls memax equ 7 ;MSB of top memory tfcb equ 5ch ;transient file control block fcbex equ tfcb+12 ;file extent fcbs2 equ tfcb+14 ;system use in FCB fcbrc equ tfcb+15 ;record count in FCB fcbcr equ tfcb+32 ;current record in FCB tbuff equ 80h ;transient buffer tpa equ 100h ;TPA ; CP/M flags bdaok equ 0 ;BDOS return for all OK bder1 equ 1 ;BDOS return 1 bder2 equ 2 ;BDOS return 2 bderr equ 255 ;BDOS return error flag ; special values for this program imagelen equ 4 ;number of records in AUTOST ;START org tpa tempjmp: jmp maker ;this jump will be changed to nop ;by program ;AUTOSTART PROGRAM PART lhld 01 mvi l,0 mov a,h sui 16h mov h,a shld ccp lxi d,message2 call print lxi d,command lxi b,42 automove: lhld ccp mvi l,07 call again lhld ccp mvi l,88h mvi a,08h mov m,a lhld ccp mvi l,89h mov a,h mov m,a lhld ccp pchl again: ldax d mov m,a inx h inx d dcx b mov a,b ora c jnz again ret print: mvi c,9 jmp bdos ;AUTOSTART STORAGE AREA ccp: ds 2 command:  ds 84 message: ds 2 message2: ds 88 ;END OF AUTOST PROGRAM maker: start: lxi sp,stak ;set up user's stack lda drive ;save initial drive selected sta drsav xra a sta tempjmp ;cancel the jump to here sta tempjmp+1 sta tempjmp+2 start1: call showmsg db 26,9,9,'STARTER',escape, half,' Version 1.3',cr,lf,lf db 9,9,'Copyright 1983 Claude Ostyn',cr,lf,lf,lf db escape,full,0 mvi a,imagelen ;length of AUTOST image lxi h,recct ;in number of 128 byte records mov m,a ;store it at recct call showmsg sinon: db 'This program will create another program called',cr,lf db 'AUTOST.COM and put it on a diskette in drive B.',cr,lf,lf db 'Ozzie looks for AUTOST.COM when it is booted.',cr,lf db 'If it finds it, it then executes the command',cr,lf db 'requested by AUTOST.COM.',cr,lf,lf,lf,lf contline: db 'Press to proceed, or CONTROL-Z to exit. ',0 call chrin ;get answer cpi ctrlz ;control-z? jz exit ;if yes, exit start2: call blank ;blank input areas call showmsg promptfile: db 26,cr,lf,lf db 'Enter the command to be executed by AUTOST.COM,' db cr,lf,'(up to 80 characters).',cr,lf db 'Example: MBASIC ZAPGAME',cr,lf,lf,lf db '________________________________________',cr,0 lxi h,inbuff ;set maximum input length mvi m,80 ;at 80 lxi d,inbuff mvi c,rbuff call bdos lxi h,inbuff+1 ;point to char. counter mov a,m cpi 0 ;if zero, then jz exit ;exit call movcommand ;move command line into AUTOST call showmsg promptmessage: db cr,lf,lf,'Enter the message to be displayed while',cr,lf db 'AUTOST.COM is executing (up to 80 characters).',cr,lf,lf,lf db '__________________________' db '_________________________',cr,0 lxi d,message ;point to message area mvi c,rbuff call bdos ;and enter the message call setend ;put cr/lf at end copyit: call putname ;put B:AUTOST.COM into FCB call showmsg db cr,lf,lf db 'Put the disk on which you want to create',cr,lf db 'AUTOST.COM in drive B, and press any key,',cr,lf db 'or CTRL-Z to make changes.',cr,lf db cr,lf,0 call chrin cpi ctrlz jz start2 call showmsg db lf,lf,9,9,'<<< WAIT >>>',0 call put call showmsg db 'Copy this AUTOST.COM on another disk? ',0 call chrin cpi 'Y' jz copyit exit: call showmsg db 26,cr,lf,lf,9,'Returning to CP/M...',cr,lf,lf,0 lda drsav ;restore initial drive sta drive jmp rboot ;make changes at end of message setend: lxi h,message+1 ;point to 1 before 1st chr lookforend: inx h mov a,m cpi '$' ;look for terminator jnz lookforend mvi m,cr ;and replace with cr/lf sequence inx h mvi m,lf inx h mvi m,lf inx h mvi m,'$' ret ; Write a file from "buffer" to disk put: lxi h,tpa ;set up buffer start shld next lda recct ;save record count sta ctsav put1: mvi c,initf ;enable write on any disk call bdos xra a ;initialize FCB sta fcbcr ;current record lxi h,0 shld fcbex ;extent and s1 shld fcbs2 ;s2 and record count lxi d,tfcb ;see if file exists mvi c,findf ;find function call bdos cpi bderr ;is it there? jz put2 call showmsg db cr,lf,'OK to erase existing AUTOST.COM? ' ,0 call chrin cpi 'Y' jnz putex ;if no, try again call showmsg db escape,'R',0bh,0 lxi d,tfcb ;if yes, erase it mvi c,delef call bdos put2: lxi d,tfcb mvi c,makef call bdos cpi bderr jnz put3 call wropn jmp putex put3: lhld next xchg mvi c,sdmaf call bdos lhld next lxi d,128 dad d shld next lxi d,tfcb mvi c,writf call bdos cpi bdaok jz put4 call wemsg jmp putex put4: lda recct dcr a sta recct jnz put3 call cpdma lxi d,tfcb mvi c,closf call bdos lda ctsav sta recct call showmsg db cr,9,9,'<<< DONE! >>>',9,9,cr,lf,lf,9,0 putex: call showmsg db cr,lf,0 call cpdma ret ; display write error message wemsg: call showmsg db cr,lf,lf,'Permanent write error',cr,lf,0 ret ; display write open message wropn: call showmsg db cr,lf,lf,'Cannot open for write ',cr,lf,0 ret ;restore CP/M DMA address to the transient buffer cpdma: lxi d,tbuff mvi c,sdmaf call bdos ret ;console character into register a, masked to 7 bits chrin: push b push d push h readit: mvi e,0ffh mvi c,6 call bdos cpi 0 jz readit ani 7fh call ucase call cout pop h pop d pop b ret ;character in register A output to console cout: push b push d push h push psw mvi c,wconf mov e,a call bdos pop psw pop h pop d pop b ret ;message pointed to by stack out to console showmsg: xthl xra a add m inx h xthl rz call cout jmp showmsg ;put name of new file into FCB putname: mvi a,2 sta tfcb ;force drive b designator lxi d,filename lxi h,tfcb+1 ;point to name area mvi b,11 movname: ldax d mov m,a inx h inx d dcr b jnz movname ret ; move the command line into AUTOST image movcommand: lxi h,command ;length of command in image lxi d,inbuff+1 ;point to character counter ldax d ;get it into a mov m,a ;and put it in command mov b,a ;also copy it into b inx d ;point to command itself inx h ;do same in image mov a,b ;put counter into a cpi 0 ;check if zero rz ;if zero, return moveit: ldax d ;get byte to move call ucase ;convert to upper-case if necessary mov m,a ;move it inx h ;increment destination inx d ;increment source loc. dcr b ;decrement counter jnz moveit ;repeat ret ;convert to uppercase if letter ucase: cpi ':' ;first check that it is not rz ;one of the ASCII codes cpi '{' ;larger than lower case rz ;and, if it is, just return cpi '}' rz cpi '~' rz cpi 'Z'+7 ;lowercase? rc ;if not, don't convert ani 5fh ;convert to uppercase ret ;initialize input areas blank:  lxi h,command ;command area mvi b,82 ;put zero in 82 bytes movzero: mvi m,0 inx h dcr b jnz movzero lxi h,message mvi m,80 inx h mvi m,0 ;zero counter mvi b,82 movterm: ;put terminator in 82 bytes inx h mvi m,'$' dcr b jnz movterm ret ;RAM variables and buffers drsav: ds 1 recct: ds 1 ctsav: ds 1 next: ds 2 ;set up stack space ds 80 stak db 0 ;for filename, format is XXXXXXXXTYP to fit FCB image filename: db 'AUTOST COM' inbuff: end nz moveit ;repeat ret ;convert to uppercase if letter ucase: cpi ':' ;first check that it is not rz ;one of the ASCII codes cpi '{' ;larger than lower case rz ;and, if it is, just return cpi '}' rz cpi '~' rz cpi 'Z'+7 ;lowercase? rc ;if not, don't convert ani 5fh ;convert to uppercase ret ;initialize input areas blank: !9@ ~# ÂÍ@æÊC  ÃSCREEN-PAC not installed$óÓ:$ÓûÉ:]Ö0úŽÍÈO:^Ö0úŽ�O:_þ yÊ€ÍÈO:_Ö0úŽ�O:`þ ÂŽyþhÊÁþ4ÊÁþPÊÁ– ÃUsage: TO arg, where arg = 52, 80, or 104$!¥áqÃåä‡G‡‡€ÉAUTOST COMAUTOST AQMAUTOST ASM% !"#BAUTOST DOCC$%&'()*+,FSTART COM-FSTART DOC.MAKEAUTOCOM /0MAKEAUTODOC1MAKEAUTOASM 2345MAKAUTO2COM 67MAKAUTO2ASM"89:;<STARTER COM=>STARTER DOC?@STARTER ASMEABCDEFGHITO $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå; Program to switch to 52, 80, or 104 column screen ; if SCREEN-PAC is installed. ; ; Original by Chris Hill, July 1983 ; Modified by Jim Woolley, 11/83 ; ; Usage: ; A>TO arg ; where arg is 52, 80, or 104 ; LADR EQU 0E1A5H BIOS EQU 0E4E5H ;location to call ;in BIOS bdos equ 5 arg equ 5ch + 1 ;pointer to argument offset equ 4000h ;shadow RAM offset scrnpac equ 2400h ;pointer to screen-pac test value ; SETSC EQU 03H ;for 80 columns ; SETSC EQU 00H ;remove leading ; ;semicolon for 52 columns ; SETSC EQU O1H ;remove leading ;semicolon for 104 columns ORG 0100H ; lxi h,start ;move code at start to lxi d,offset ; offset above shadow RAM mvi c,finish-start ;length of code to move movit mov a,m ;from stax d ;to inx h inx d dcr c jnz movit ;continue move call offset ;check if screen-pac ani 2 jz argval ;jump if yes lxi d,msg1 ;else display msg mvi c,9 jmp bdos ;done ; msg1 db 'SCREEN-PAC not installed$' ; start di ;code to check if out 0 ; screen-pac installed lda scrnpac ; must run above shadow RAM out 1 ei ret finish equ $ ; argval lda arg ;get 1st digit sui 30h ;convert from ASCII jm quit call x10 ;multiply by 10 mov c,a ;save it lda arg + 1 ;get 2nd digit sui 30h ;convert from ASCII jm quit add c ;get whole number mov c,a ;save it lda arg + 2 ;see if 3rd digit cpi 20h mov a,c ;get back whole number jz check ;jump if no 3rd digit call x10 ;else multiply by 10 mov c,a ;save it lda arg + 2 ;get 3rd digit sui 30h ;convert from ASCII jm quit add c ;get whole number mov c,a ;save it lda arg + 3 ;see if 4th digit cpi 20h jnz quit ;4th digit not allowed mov a,c ;get back whole number cpi 104 mvi c,1 jz ok check cpi 52 ;verify appropriate value mvi c,0 jz ok cpi 80 mvi c,3 jz ok ; quit lxi d,msg2 ;tell how to use mvi c,9 jmp bdos ;done ; msg2 db 'Usage: TO arg, where arg = 52, 80, or 104$' ; ok LXI H,LADR ;get address of loc-GET ;ation to change mov m,c ;put appropriate value ; into that loc. jmp BIOS ;call to extended BIOS ;and done ; x10 ;get 10*a add a ;2*a mov b,a ;save it add a ;4*a add a ;8*a add b ;10*a ret get 2nd digit sui 30h ;convert from ASCII jm quit add c ;get whole number mov c,a ;save it lda arg + 2 ;see if 3rd digit cpi 20h mov a,c ;get back whole number jz check ;jump if no 3rd digit call x10 ;else multiply by 10 mov c,a ;save it lda arg + 2 ;get 3rd digit sui 30h ;convert from ASCII jm quit add c ;get whole number mov c,a ;save it lda arg + 3 ;see if 4th digit cpi 20h jnz quit ;4th digit not allowed mov a,c ;get back whole number cpi 104 mvi c,1 jz ok check cpi 52 ;verify appropriate value mvi c,0 jz ok cpi 80 mvi c,3 jz ok ; quit lxi d,msg2 ;tell how to use mvi c,9 jmp bdos ;done ; msg2 db 'Usage: TO arg, where arg = 52, 80, or 104$' ; ok LXI H,LADR ;get address ; ; routine to switch screen to 80 col ; or 52 or 104 columns ; ; Coded by Chris Hill, July 1983 ; ; LADR EQU 0E1A5H BIOS EQU 0E4E5H ;location to call ;in BIOS SETSC EQU 03H ;for 80 columns ; SETSC EQU 00H ;remove leading ;semicolon for 52 columns ; SETSC EQU O1H ;remove leading ;semicolon for 104 columns ORG 0100H ; LXI H,LADR ;get address of loc-GET ;ation to change MVI M,SETSC ;put appropriate value ; into that loc. CALL BIOS ;call to extended BIOS ; ; LHLD 01H ;get warm start loc. PCHL ;do it STARTER DOC?@STARTER ASMEABCDEFGHITO COMJTO ASMKLMTO80 $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå TO80.DOC TO80 is a utility program that uses the scanty documentation in the Osborne Screen-Pac User's Guide to switch from 54 columns to 80 or 104 columns, and back, as desired. The program is very simplistic -- only one screen may be selected by the program, depending on which option is chosen during editing. It would probably be easy to make the program prompt for desired screen width, but I wanted to keep my involvement in assembly language programming to the barest minimum. I have three programs set up, called to80.com, to52.com, and to104.com which change the screen dimension as the names of the programs imply. Others have used the routines with ZCPR modifications to CP/M so that the programs are invoked via function keys. Whatever. The assembly language version of the program is called to80.asm, but the appropriate lines to invoke to modify the program for to104 or to52 are labelled. To make the programs into .com files, use the ASeMmbler and the LOADer provided with your Osborne. Note that the program will not work unless you have the Screen-Pac hardware and software modifications. Chris J. Hill Santa Clara FOG July 1983ake the program prompt for desired screen width, but I wanted to keep my involvement in assembly language programming to the barest minimum. I have three programs set up, called to80.com, to52.com, and to104.com which change the screen dimension as the names of the programs imply. Others have used the routines with ZCPR modifications to CP/M so that the programs are invoked via function keys. Whatever. The assembly language version of the program is called to80.asm, but the appropriate lines to invoke to modify the program for to104 or to52 are labelled. To make the programs into .com files, use the ASGÍ)ÍÍGþAÊGxþaÊGxþ5ÊGxþBÊjxþbÊjxþ8ÊjxþCʇxþcʇxþ1ʇÃ!¥á6ÍåäÍ.XÍ)cÍ)BÍ)Í6á!¥á6ÍåäÍ.XÍ)fÍ)Í<á!¥á6ÍåäÍ.XÍ)iÍ)Í<“Í)ÍÍGþYÊîxþyÊîxþNÊ÷xþnÊ÷xþ ÊýÍ.êCopyright 1983 Claude OstynÍ6Í.ÃýÍ<Í.XÍ)!há~þÿÊÍ)Ã’mÍ)Ã’ ÍþÊÉ ÃÍÉ!há6ÿÉ!há6ÉS $ New screen width: A. 52 columns B. 80 columns C. 104 columns $=( Automatic scrolling? )(Note: Normally ON for 52 column display, except with Supercalc, and normally OFF with 80 or 104 column display.)( Enter for autoscroll ON, for OFF: $Selected: $52$80$104$Autoscroll ON $Autoscroll OFF $ÉTO80 ASMNTO80 DOC OPWID $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.OP WID.COM Á PROGRAÍ TÏ CHANGÅ SCREEÎ WIDTH OÎ THÅ OSBORNÅ ± WITÈ SCREEN-PAC Iæ yoõ havå thå Screen-Paã upgradå oî youò Osborne 1¬ thió � prograí wilì allo÷ yoõ tï changå thå displaù formaô withouô � havinç tï rebooô witè á differentlù setuð diskette® Thió meanó � yoõ caî uså thå samå prograí diskettes¬ whetheò yoõ uså thå tinù � built-iî screeî oî whicè yoõ caî onlù reaä fifty-twï characteò � lineó withouô losinç youò eyesight¬ oò á largeò videï monitoò � whicè caî displaù thå eightù oò onå hundreä anä fouò columnó witè � nï strain. WID.COÍ ió verù easù tï use® Aô thå CP/Í A¾ prompt¬ jusô � typå "WID¢ (insteaä oæ Widtè Adjustmenô Prograí -- É hatå � unnecessarù typing© anä "RETURN"® Iæ yoõ arå usinç WordStar¬ yoõ � caî calì WID.COÍ froí thå no-filå menu¬ bù typinç thå commanä "R¢ � first. Thå prograí wilì prompô yoõ foò screeî width¬ anä alsï allo÷ � yoõ tï switcè thå auto-scrollinç featurå oî oò off¬ sincå iô doeó � noô worë welì aô alì witè thå eighty-columî screen® Iî caså yoõ � don'ô kno÷ whicè onå ió appropriate¬ thå prompô wilì explaiî whaô � thå normaì settinç woulä be® Enterinç jusô á carriagå returî � insteaä oæ á morå specifiã responså wilì turî thå auto-scrollinç � featurå oî iæ thå screeî ió seô tï fifty-twï columns¬ anä turî iô � ofæ otherwise® Impropeò entrieó wilì bå ignored. byº Claudå Ostyn P.O® Boø 2035 Sitka¬ Alaská 99835 Phonå (907© 747-5372 e® Aô thå CP/Í A¾ prompt¬ jusô � typå "WID¢ (insteaä oæ Widtè Adjustmenô Prograí -- É hatå � unnecessarù typing© anä "RETURN"® Iæ yoõ arå usinç WordStar¬ yoõ � caî calì WID.COÍ froí thå no-filå menu¬ bù typinç thå commanä "R¢ � first. Thå prograí wilì prompô yoõ foò screeî width¬ anä alsï allo÷ � yoõ tï switcè thå auto-scrollinç featurå oî oò off¬ sincå iô doeó � noô w; ;-------------------------------------------------------------------------- ; W.ASM by Claude Ostyn May 2, 1983 ; rev 5/23/83 ; This program sets the Osborne 1 screen width to 52, 80 or 104 columns and ; switches the auto scrolling feature on or off. ; This program will work only if the Screen-Pac modification is installed. ;-------------------------------------------------------------------------- ; EQUATES clear equ 26 ;clear screen cr equ 0dh ;carriage return lf equ 0ah ;line feed esc equ 1bh ;escape phalf equ ')' ;begin dim display pfull equ '(' ;end dim display pcall equ 9 ;BDOS print call concall equ 0bh ;BDOS check console status call kcall equ 01h ;BDOS read character call bdos equ 5 ;BDOS call address widthflag equ 0e1a5h ;screen width flag byte adjust equ 0e4e5h ;BIOS routine to set width scrollctl equ 0e168h ;scroll control byte widfiftytwo equ 0 wideighty equ 3 widoneohfour equ 1 doscroll equ 0ffh noscroll equ 00h ; ; START org 0100h beginhere: lxi d,promptwidth ;print prompt for new width call print call whatsnew ;go check keyboard whatwasit: mvi c,kcall ;now, what was that character? call bdos mov b,a ;copy the character into register B cpi 'A' jz fiftytwo ;and do the appropriate thing mov a,b cpi 'a' jz fiftytwo ;etc. mov a,b cpi '5' ;accept digits from distracted jz fiftytwo ; or tired users... mov a,b cpi 'B' jz eighty mov a,b cpi 'b' jz eighty mov a,b cpi '8' jz eighty mov a,b Š cpi 'C' jz oneohfour mov a,b cpi 'c' jz oneohfour mov a,b cpi '1' jz oneohfour jmp beginhere ;character not acceptable... ;so try again ; fiftytwo: lxi h,widthflag ;point to the flagbyte mvi m,widfiftytwo ;set the flagbyte call adjust ;and adjust the width call backspace ;erase answer lxi d,selected ;and show selected call print lxi d,showfiftytwo ;width call print lxi d,screenhome ;(reset screen home, call print ; just in case) call makitscroll ;enable autoscrolling jmp autoscrollset eighty: lxi h,widthflag mvi m,wideighty call adjust call backspace lxi d,selected call print lxi d,showeighty call print call nomorescroll ;disable auto scrolling jmp autoscrollset oneohfour: lxi h,widthflag mvi m,widoneohfour call adjust call backspace ;erase answer lxi d,selected ;show selected width call print lxi d,showoneohfour call print call nomorescroll ;disable auto scrolling ; autoscrollset: lxi d,promptscroll call print call whatsnew whatwasitagain: mvi c,kcall ;now, what was this character? call bdos mov b,a ;copy the character into register B cpi 'Y' Š jz scrollyes ;and do the appropriate thing mov a,b cpi 'y' jz scrollyes mov a,b cpi 'N' jz scrollnoway mov a,b cpi 'n' jz scrollnoway mov a,b cpi cr ;if then leave it as it is jz scrollstatus call backspace jmp whatwasitagain db 'Copyright 1983 Claude Ostyn' scrollyes: call makitscroll ;enable auto scrolling call backspace jmp scrollstatus scrollnoway: call nomorescroll ;disable auto scrolling call backspace scrollstatus: lxi d,selected ;print "selected" call print lxi h,scrollctl ; point to scroll control byte mov a,m ; read it cpi doscroll ; on or off? jz yes ; if on, go print "ON" lxi d,shownoscroll ; else print "OFF" call print jmp fini yes: lxi d,showscroll call print jmp fini ;go to exit point ; ; SUBROUTINES ; whatsnew: mvi c,concall ;go check for console status call bdos ; cpi 00h ;if no character ready, jz whatsnew ; keep going back ret ;if ready, go on with the program print: mvi c,pcall ;get call into C jmp bdos ;and get BDOS to do it backspace: mvi e,08h ;backspace character mvi c,02 ;is being output to console call bdos ;to erase wrong entry ret makitscroll: lxi h,scrollctl ;point to scroll control byte mvi m,doscroll ;set it to FFh Š ret nomorescroll: lxi h,scrollctl ;point to scroll control byte mvi m,noscroll ;set it to 00 ret ; ; STORAGE AREA ; screenhome: db esc,'S',20h,20h,'$' promptwidth: db clear,lf db 'New screen width:',cr,lf,lf db 9,'A. 52 columns',cr,lf db 9,'B. 80 columns',cr,lf db 9,'C. 104 columns',cr,lf db 9,9,9,9,'$' promptscroll: db esc,'=',28h,20h db 'Automatic scrolling?',cr,lf,esc,phalf db '(Note: Normally ON for 52 column display,',cr,lf db ' except with Supercalc, and normally OFF',cr,lf db ' with 80 or 104 column display.)',esc,pfull,cr,lf,lf db 'Enter for autoscroll ON, for OFF: ',cr,lf,lf db '$' selected: db 'Selected: $' showfiftytwo: db '52$' showeighty: db '80$' showoneohfour: db '104$' showscroll: db 'Autoscroll ON',cr,lf,lf,lf,'$' shownoscroll: db 'Autoscroll OFF',cr,lf,lf,lf,'$' ; fini: ret end *ùà ÃÍb͸Ã{ ¸  ÃwÃ{ÖÃàÃÅüÃHÃÃ!ÃKÃ]ÃjÃUø Í2͵ Ãá^#V#å*~#foÉá^#å*~#foÉá^#V#å*nÉá^#å*nÉá^#V#åë ~#foÉá^#åë& ~#foÉ!È+É!È#É!Ø+É!Ø#É!ð+É!ø+ÉÈÉÈÉØÉØÉðÉøÉ}»À|ºÉëz¼À{½Éë|ºÀ}»Éë|ªòìz·ð7Éë|ªòó|·ð7ÉzõÍZëÍZëÍ)ñ·ð|/g}/o#É|µÈÕå͉ÑÍk|/g}/o#Ñɯ2hÍZëÍZÍk:hÐ|/g}/o#É|·ð/g}/o#:h<2hÉÅÍqÁÉDM!x±ÈxGyOÒƒë)ëÃv|µÈÅÍ”`iÁÉ|·ú )ÖëxõÍÝÚ·Õz/W{/_ѯzW{_ñ=ÈõyOxGæ¯2hÍZëÍZë͉ÃM|ºØÀ}»Éëȯ|g}oÃæëÈ)Ãô|/g}/o#Éz/W{/_É!9~#foÉ!à !à ! à ! à !à !à P!9Å~#ÂAÁÉ!9"w*Ì÷ùÃ*wùÉá"j!zå*"d!è"f!ÜY"H>Û2^>Ó2a>É2`2cÍ>¯2s2t>2r>2v!Ì"@!"D!@"B!"F Í·ÊÉÍ!€ùF#x·ÂÜÃ:~#Âܯ!ù|¯2i~#þ Êó·Ê:þ" 2ià +}|~#·Ê:ÅG:i·xÁÊ.þ"¯2i+w#þ Â+6#ÃóÕ!Þ6#Â@ÍA¯2n2?*jé*ë*Íú|µÈ+¯Ã`É"d!è"f!!ÿÿÉ>õÍÅÚŒo&åÍ–áñ=þÂ}à Í ÍÅÚw~Í2æʸåÍÅͼëÍÁáÍ56þÿ!À+ÉWÖØþ ?ØÕ_!Þ~æ7ÑzÈ?ÉÅͧåþ:>Â÷ÍžÖ@w#ÍÍ5þ.Âͯww#w#w#wÑÁÉÅþ*>?Ê@ÍŒÚ>w#ÂÁÍŒØÃ5> w#Â@ÁÉÅåͧ͵ÒgÕ ÿÍÑ2qáÁÃ&ÕÖ0Ox‡‡‡€€�G͵Òjþ/ʆÑÃSáxÃ\Ížþ.7Èþ:7Èþ7Èþ!ÉþaØþ{ÐÖ Éþ ʨþ ʨÉþ0Øþ:?ÉÅ·OÂæ Þ!šæyÂÕÁÉÕ$Ñ ÂÌ7ÁÉÍÅÚãÖo&))T])))ë!šyÁÉÅåÕõ ÿÍ2pñõæ_ ÍñÑáÁÉÅåÕõ:pÃ6ÉÅåë)))®Y~õæþŠ0Ì¿7ñæ‡G~õæ`°2Ž@ñæ2“@#~æ2�@~æ?>Êâ&=2†@#^#V#Õ^#V#ë"�@ë^#Vë"‘@Ñ:“@·Ê '*{@ë!:Ž@æ@Ê'"‘@áÁÉå*¥@#w"¥@áÉå*¥@~þÿÊ9'·ÂD'Ü/Í¿7͈?áÉ+"¥@áÉå*¥@+"¥@áÉå!6D"¥@6ÿ!^D"§@áÉå*¥@~·áÈþÿÉåõ*�@ë*§@s#r#ë*�@ës#r#ë*‘@ës#r#ë*‰@ës#r#ë*‹@ës#r#:“@w#"§@Íî'ñáÉåõ*˜@ë*§@s#r#ë*š@ës#r#ë*œ@ës#r#ë*”@ës#r#ë*–@ës#r#:ž@w#"§@Íî'ñáÉ|þEØÂù'}þXØÎ2Ãê7åõ*§@+~2“@+V+^+ë"‹@ëV+^+ë"‰@ëV+^+ë"‘@ëV+^+ë"�@ëV+^"§@ë"�@ñáÉåõ*§@+~2ž@+V+^+ë"–@ëV+^+ë"”@ëV+^+ë"œ@ëV+^+ë"š@ëV+^"§@ë"˜@ñáÉÍp'Í;(Éͯ'Íÿ'ÉåÍ‹(áÉ!"Ÿ@"K@¯2¤@<2£@2¢@2¡@Í¥)Êè(ÍÚ)Êè(Í*¾(¯2¢@2¡@Ãã(ÍS*ÂÏ(Í#)¯2¢@2£@ÉÍÆ)ÈÍl*ÊÃÍï ÃÐ Ãá ÃÓ ÃÚ Ã Å!9ùDMÍ�++|µÊë!O åÍ»Ñ;! ~#fo##~#foåÍÁÑå*Ñs#r!ÿÿÒ Í\ÿÒ# !x åÍ»Ñ;Í\å!lïåÍÄÑÑÍìÒ? !åÍÇÑÍ\å!lïåÍÊÑÑÁÉ usage is: A> WIDTH newline-length newline-length must be between 1 and 128 inclusive. õ ÃÚ Å!9ùDMÍ�n}·Êß ! ^#Vr+sën&åͲ Ñý ÁÉÃç á Å!ûÿ9ùDM`i¯w#w! 6#6Í� në! s{þ Ê ! n}þ Â( ! ^#Vr+sÃþ ! n}þ-ÂG ! 6ÿ#6ÿ! ^#Vr+s! ^#Vr+sënë! sÕÍä Ñ|µÊˆ Í� Í?å! nѯgÐÿë`is#rÃG Í�åÍ�ÑÍ?Ø ë!9ùëÁÉÅ!9ùDM! n&Ðÿ|ͯÚÌ ! n&Æÿ|Í©ÁÉÁÉà Í n&ÉÍ Åþ Âî  Í> _Í Í·Âý ÁÉÍþÊ ÁÉÍ7*P:RwÉÍr#:“@w#"§@Íî'ñáÉåõ*˜@ë*§@s#r#ë*š@ës#r#ë*œ@ës#r#ë*”@ës#r#ë*–@ës#r#:ž@w#"§@Íî'ñáÉ|þEØÂù'}þXØÎ2Ãê7åõ*§@+~2“@+V+^+ë"‹@ëV+^+ë"‰@ëV+^+ë"‘@ëV+^+ë"�@ëV+^"§@ë"�@ñáÉåõ*§@+~2ž@+V+^+ë"–@ëV+^+ë"”@ëV+^+ë"œ@ëV+^+ë"š@ëV+^"§@ë"˜@ñáÉÍp'Í;(Éͯ'Íÿ'ÉåÍ‹(áÉ!"Ÿ@"K@¯2¤@<2£@2¢@2¡@Í¥)Êè(ÍÚ)Êè(Í*¾(¯2¢@2¡@Ãã(ÍS*ÂÏ(Í#)¯2¢@2£@ÉÍÆ)ÈÍl*ÊÃÍï ÃÐ Ãá ÃÓ ÃÚ Ã Å!9ùDMÍ�++|µÊë!O åÍ»Ñ;! ~#fo##~#foåÍÁÑå* WIDTH.COM (for Osborne 1) copyright 1983 Dave Cairns Visalia, CA WIDTH.COM is a Public Domain program and NOT for sale or resale. Give it to someone for free. WIDTH.COM allows Oborne 1 users with 52 column displays to change screen width without rebooting. WIDTH.COM has not been tested on double-density machines. I use the program to quickly and easily read data and text which has been formated for standard 80 column displays (ie documentation listings from RCP/Ms, 80 col. directories,etc.) To use WIDTH.COM use the following format: A>WIDTH newline-length (newline length can be any integer from 1 to 128) EXAMPLE: WIDTH 128 (sets a 128 character line) WIDTH 52 (sets a 52 character line) WIDTH 40 (cuts an 80 col directory down to size) When WIDTH is used to go from a larger line  length to a smaller length (ie length was 128 and you want a 52 char line) it clears the screen and homes the cursor. This is done in order to remove garbage which might remain to the right of the margin. If WIDTH is executed going from shorter length to longer length no clear screen occurs. WIDTH was written in BDS-C (great language) Source code is in WIDTH.C.  formated for standard 80 column displays (ie documentation listings from RCP/Ms, 80 col. directories,etc.) To use WIDTH.COM use the following format: A>WIDTH newline-length (newline length can be any integer from 1 to 128) EXAMPLE: WIDTH 128 (sets a 128 character line) WIDTH 52 (sets a 52 character line) WIDTH 40 (cuts an 80 col directory down to size) When WIDTH is used to go from a larger line  /* WIDTH.C for OSBORNE 1 */ /* changes screen width setting */ /* without rebooting disks */ /* written in BDS-C */ /* for the PUBLIC DOMAIN */ /* c. 1983 by Dave Cairns */ /* not tested on double density */ #define LWIDTH 0xEF6C /* SD address of line width */ #define CLSCR 0x1A /* clear screen char */ unsigned nwidth; main(argc,argv) char *argv[]; { if(argc != 2) { puts("\nusage is:\nA> WIDTH newline-length \n"); exit(); } if((nwidth= atoi(argv[1])) < 1 || nwidth > 128) { puts("\n newline-length must be between 1 and 128 inclusive.\n"); exit(); } /* to clear screen if going to smaller size */ if(nwidth < peek(LWIDTH)) putchar(CLSCR); /* clear screen */ /* FINALLY WE DO IT */ poke(LWIDTH,nwidth); /* change width */ } WID ASM(TUVWXWIDTH COMYZ[WIDTH DOC \]WIDTH $$$!]~æþWÊdþCÊNþ1Ê2þ5Ê(þ8Ê- ʉÃŽ>ÃD>ÃD>ÃD>!¥áwÍåä ÃN!¥áwÍåäÃw!á^#Vbk6 #6 #6 #6Ãw!á^#Vbk6#6#6#6 ʉ!m~æþ ʉÃÍͤ!»ÍšÃ7~·ÈÍ®#Ú> Í®> îÅÕå_ÍáÑÁÉFormat OSCHG x1 (x2) ---------------------- Where x1 = 1 104 column 5 52 column 8 80 column (x2 =) W wordstar keys C CPM keys åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå:€·ÊP:`þ ÂP:]þ5Â":^þ2Â"Êà:]þ8Â5:^þ0Â5Êå:]þ1ÂP:^þ0ÂP:_þ4ÂPÊêÍÙ SCREEN 1.1 (for the Osborne 1 with Screen-Pac) Copyright (c) 1984, Loren Cook Use: SCREEN [size] where size is 52, 80, or 104. $Ñ ÍÉ>Ãï>Ãï>Ãï!¥áwÍåäÉåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå SCREEN version 1.1 02/12/84 This program is written to be used with the Osborne 1 and the Screen-Pac option. It allows you to change the screen size without having to use the cumbersome Osborne utility (SETUP.COM). This program also takes the place of a public domain set of programs that indiviually set the screen size. With the old programs (called 52.COM, 80.COM, 104.COM) you had to have each one on the diskette you were using to change and then change back. Additionally they each took up 1K of memory. By combining the power of all three programs into one you get a program that will set any of the legal screen sizes and is still only 1K in length. Usage is as follows: type SCREEN [size] where size is either 52, 80, or 104. If an incorrect size is chosen the program will repond with a help message. Enjoy....... Loren Cook Press ENTER to continue: m will repond with a help1ÀÍm wÍmÍm~ Ím!ká> Í7ª ÍÍÃ2ÄF##"Â~�hGÍ]^Ím#ÂG*Â:Ä=Â7É:§ <2§¥ÍmÉåÕÅÍÁÑáÉ \\\\\\\\\\\\\\\\\\\\\\\\////////////////////// | | | | | | | | | | | | | FUNCTION KEY DISPLAY | | FOR | | THE OSBORNE 1 | | DOUBLE DENSITY | | ONLY | | | | by James Gangwer | | | | | | | | | | press any key to continue | | | ////////////////////////\\\\\\\\\\\\\\\\\\\\\\$ ********** Osborne Function keys ******* 0) 1) 2) 3) 4) 5) 6) 7) 8) 9) press any key to exit *****************************************$=%+$ $ | FOR | | THE OSBORNE 1 | | DOUBLE DENSITY | | ONLY | | | | by James Gangwer | | | | | | | | | | press a*.|Ög"í! "ëÍÂ!ká"éÍÏ*é^##"é~“Gk^{Þò8Í„Ã;Í®#Â+*é:ë=2ë ͮ Í®ó *í.Íy*í.ˆ>w*í.‰|*íÃw# x±ÂyÉK—°Æ¹Ê¤2ï{Æ_ÒžzÆW:ïÊÅÕåͽáÑÁÉÅÕå͸áÑÁÉà Ãÿͽ!8"ñÉ*ñT]ͽ*ñ}Æ oÒå|Æg"ñÉ¡ É:6þÈþ )- - - - F U N C T I O N K E Y M E N U - - - - -($ ) 0: ($ ) 1: ($ ) 2: ($ ) 3: ($ ) 4: ($ ) 5: ($ ) 6: ($ ) 7: ($ ) 8: ($ ) 9: ($@$000000000000^A$00000000000^B$00000000000^C$00000000000^D$00000000000^E$00000000000^F$00000000000^G$00000000000^H$00000000000^I$00000000000^J$00000000000^K$00000000000^L$00000000000)($00000^N$00000000000^O$00000000000^P$00000000000^Q$00000000000^R$00000000000^S$00000000000^T$00000000000^U$00000000000^V$00000000000^W$00000000000^X$00000000000^Y$00000000000^Z$00000000000)($0000þC–ÍEöÍQyÍQxÃQþRÂÍöÀÃQ*Õë* {•zœÒ·*ùÉÑ~#" É<æþÚÈÆþÚÏÆÆAOÃGæðÆ�'Î@'OÍxæÆ�'Î@'OÃNÍ#Âõ *.|Ög"í! "ëÍÂ!kå"éÍÏ*é^##"é~“Gk^{Þò8Í„Ã;Í®#Â+*é:ë=2ë ͮ Í®ó *í.Íy*í.ˆ>w*í.‰|*íÃw# x±ÂyÉK—°Æ¹Ê¤2ï{Æ_ÒžzÆW:ïÊÅÕåͽáÑÁÉÅÕå͸áÑÁÉà Ãÿͽ!8"ñÉ*ñT]ͽ*ñ}Æ oÒå|Æg"ñÉ¡ É:6þÈþ )- - - - F U N C T I O N K E Y M E N U - - - - -($ ) 0: ($ ) 1: ($ ) 2: ($ ) 3: ($ ) 4: ($ ) 5: ($ ) 6: ($ ) 7: ($ ) 8: ($ ) 9: ($@$000000000000^A$00000000000^B$00000000000^C$00000000000^D$00000000000^E$00000000000^F$00000000000^G$00000000000^H$00000000000^I$00000000000^J$00000000000^K$00000000000^L$00000000000)($00000^N$00000000000^O$00000000000^P$00000000000^Q$00000000000^R$00000000000^S$00000000000^T$00000000000^U$00000000000^V$00000000000^W$00000000000^X$00000000000^Y$00000000000^Z$00000000000)($0000ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååFUNCTION.DOà John S. Florent Thå  capabilitù  oæ  programminç functioî keyó  ió  verù  useful® � However¬  É  havå founä thaô therå arå timeó wheî iô woulä bå nicå  tï � displaù thoså keyó oî thå screen®  Thå FUNCTION.COÍ prograí doeó jusô � that®  Wheî  useä  iî conjunctioî witè AUTOST.COM¬  thå "big-O¢ ió  dis� playeä  anä ió cleareä sooî thereafter¬  replaceä bù á menõ  oæ  func-� ctioî keù valueó currentlù loadeä intï thå system®  Wheî FUNCTION.COÍ � ió  renameä  aó AUTOST.COM¬  thå "big-O¢ (whicè ió  pretty¬  buô  non-� functional©  ió replaceä bù thå menõ (noô aó prettù buô verù function� al!) Whaô arå thå uses¿ Well¬ É havå severaì disketteó containinç jusô � games® Witè sucè á diskette¬ iô ió verù nicå tï seô eacè functioî keù � tï contaiî thå commanä tï executå á specifiã gamå program®  Wheî  thå � diskettå ió booted¬ thå menõ appearó immediately¬ showinç alì gameó oî � thå  diskettå (iæ 1° oò fewer)»  witè onå (two-finger© keystroke¬  anù � game can be started! Anotheò  use¿  Iæ  yoõ havå seô variouó functioî  keyó  oî  youò � WordStaò  diskette¬  yoõ  maù noô remembeò exactlù whicè ió  whicè  (É � can't)¬  oò yoõ maù noô eveî remembeò theí all® Usinç thå "R¢ commanä � aô  thå  "editinç  nï file¢ menu¬  yoõ caî  executå  thå  FUNCTION.COÍ � program, which will display all the WordStar function keys. Onå  functioî  keù caî bå seô uð whicè woulä executå thå  prograí � and print the function key values on your printer: ^PFUNCTION^P However¬  thió maù noô worë oî alì printeró (É havå aî Epsoî MX-8° IIÉ � F/T). tù buô verù function� al!) Whaô arå thå uses¿ Well¬ É havå severaì disketteó containinç jusô � games® Witè sucè á diskette¬ iô ió verù nicå tï seô eacè functioî keù � tï contaiî thå commanä tï executå á specifiã gamå program®  Wheî  thå � diskettå ió booted¬ thå menõ appearó immediately¬ showinç alì gameó oî � thå  diskettå (iæ 1° oò fewer)»  witè onå (two-finger© keystrok;=====OSBKYBD.ASM======================8301191400=========== ; COPYRIGHT 1983 HOWARD WEINSTEIN ; SAN DIEGO CA 92128 ; Reproduction in any form for other than ; personal, non-commercial use is prohibited. ; ; Program to replace user-key definitions ; of Osborne 1 (ROM v1.3 or v1.4) with that ; set on diskette selected at keyboard. ; ; CAUTION: The disk system is reset by this ; program. Any temporary R/O status will be ; cancelled. If R/O is essential to you, ; either re-establish it or don't use this ; program. ; ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; org 100h ; ; Equates ; jmp$2$bdos equ 5 select$dsk equ 001Bh select$trk equ 001Eh select$sect equ 0021h set$dma$adr equ 0024h read$sect equ 0027h first equ 300h second equ 380h local$bfr equ first+006Bh destination equ 006Bh size equ 0E600h-0E56Bh ldir equ 0B0EDh prnt$strg equ 9 console$in equ 1 ret$cur$dsk equ 25 sel$drive equ 14 reset$dsk$sys equ 13 ; ; Prepare return to BDOS ; lxi h,0 dad sp lxi sp,oldstack shld oldstack ; ; Save current disk ; mvi c,ret$cur$dsk call jmp$2$bdos sta cur$dr ; ; Prepare for ROM v1.3 or v1.4 ; lda 2 sta a1+2 ! sta a2+2 ! sta a3+2 sta a4+2 ! sta a5+2 ! sta a6+2 sta a7+2 ! sta a8+2 ! sta a9+2 ; ; Get diskette selection ; openers call get$dsk db 13,10,10,'Select user keys from drive A or B: ',36 ds 16 oldstack ds 2 cur$dr ds 1 ; get$dsk pop d mvi c,prnt$strg call jmp$2$bdos mvi c,console$in call jmp$2$bdos ani 5fh cpi 'A' jz okay cpi 'B' jz okay jmp openers okay sui 41h sta a1-1 ; ; Make the switch ; mvi c,0 a1 call select$dsk ; mvi c,2 a2 call select$trk ; mvi c,4 a3 call select$sect ; lxi b, first a4 call set$dma$adr ; a5 call read$sect ; mvi c,5 a6 call select$sect ; lxi b,second a7 call set$dma$adr ; a8 call read$sect ; ; Move the selected user keys into place ; lxi h,local$bfr a9 lxi d,destination lxi b,size dw ldir ; ; Restore default drive ; lda cur$dr mov e,a mvi c,sel$drive call jmp$2$bdos ; ; Reset disk system ; mvi c,reset$dsk$sys call jmp$2$bdos ; ; Go back to BDOS ; lhld oldstack sphl ret ; end 100h o back to BDOS ; lhld oldstack sphl ret ; end 100h ds 16 oldstack ds 2 cur$dr ds 1 ; get$dsk pop d mvi c,prnt$strg call jmp$2$bdos mvi c,console$in call jmp$2$bdos ani 5fh cpi 'A' jz okay cpi 'B' jz okay jmp openers okay sui 41h sta a1-1 ; ; Make the switch ; mvi c,0 a1 call select$dsk ; mvi c,2 a2 call select$trk ; mvi c,4 a3 call select$sect ; lxi b, first a4 call set$dma$adr ; a5 call read$sect ; mvi c,5 a6 call select$sect ; lxi b,second a7 call set$dma$adr ; a8 call read$sect ; ; Move the selected user keys into place ; lxi h,local$bfr a9 lxi d,destination lxi b,size dw ldir ; ; Restore default drive ; ld100 '******************************************* 105 ' 110 ' DISKEYS.BAS 115 ' 120 '******************************************* 125 ' 130 'An MBASIC program for the Osborne 1 135 'to print out the current definitions of the 140 'arrow and function keys - works with 145 'monitor ROM revisions 1.3 to 1.44 150 ' 155 '******************************************* 160 ' 165 ' Copyright (c) 1983 CompuMagic, Inc. 170 ' Modified by Daybreak Productions, Canada. 175 ' Permission granted for personal use only! 180 ' 185 '******************************************* 190 ' 195 'Note: this program will not run properly if 200 'MBASIC is run under the R command of Word- 205 'Star, nor if MBASIC has been modified by 210 ' the program MANYKEYS. 215 ' 220 '******************************************** 225 ' 230 DIM ADR(14),LNG(14),AKS(4),CPM(4),WS(4) 235 'Store code for CP/M and WordStar arrow keys 240 FOR I=1 TO 4:READ CPM(I):NEXT I 245 FOR I=1 TO 4:READ WS(I):NEXT I 250 DATA &H0B,&H0C,&H0A,&H08,&H05,&H04,&H18,&H13 255 FOR CLS=1 TO 12:PRINT:NEXT CLS 260 PRINT "***************************************************":PRINT 265 PRINT "*** DISKEYS Copyright (C) 1983 Compumagic, Inc. ***":PRINT 270 PRINT "***************************************************":PRINT 275 PRINT "Modified by Daybreak Productions, Vancouver, Canada":PRINT 280 PRINT "This program prints the definitions of the FUNCTION" 285 PRINT "and ARROW KEYS of the disk from which you booted." 290 PRINT "Please re-boot from the disk of interest, then exit" 295 PRINT "to the system and reload MBASIC and this program.":PRINT 300 PRINT "If you have already done this, please ensure that" 305 PRINT "the printer is ON, then press any key to continue.":PRINT 310 A$=INPUT$(1) 315 'Store function key "names" for printing. 320 CK$="0123456789^>v<" 325 'Function to get f.key characters from BIOS. 330 DEF FNA(I)=PEEK(I)+256*PEEK(I+1) 335 'Get pointers to location & length of f.keys 340 A0=256*PEEK(2)+&H6B 345 AOLD=FNA(A0) 350 'Get address & length of each f.key definit. 355 FOR I=1 TO 14 360 ADR(I)=AOLD:A0=A0+2 365 AOLD=FNA(A0) 370 LNG(I)=AOLD-ADR(I) 375 NEXT I 380 'Begin printout with heading and disk name. 385 LINE INPUT "Enter your name for the boot disk: ",TITLE$ 390 IF TITLE$="" THEN TITLE$="boot" 395 LPRINT TAB(11);"***** DISKEYS.BAS *****":LPRINT 400 LPRINT TAB(11);"Function and arrow keys for "; 405 LPRINT TITLE$;" disk:":LPRINT 410 'Make next loop 1 - 14 if printout of each 415 'arrow key is desired, otherwise use 1 - 10. 420 FOR IKEY=1 TO 14 425 LPRINT TAB(11);MID$(CK$,IKEY,1);": "; 430 CK=ADR(IKEY) 435 FOR ICH=1 TO LNG(IKEY) 440 CH=PEEK(CK):CK=CK+1 445 'Character codes past 127 are not pure ASCII 450 'so strip the 8th. bit to get valid ASCII. 455 IF CH>127 THEN CH=CH-127 460 IF CH=0 THEN C$="":GOTO 515 465 IF CH>&H21 THEN C$=CHR$(CH):GOTO 515 470 IF CH<>&H20 THEN 485 ELSE C$="":GOTO 515 475 'For control characters,print appropriately. 480 'Print , and as shown here. 485 IF CH<>&HD THEN 490 ELSE C$="":GOTO 515 490 IF CH<>&HA THEN 495 ELSE C$="":GOTO 515 495 IF CH<>&H1B THEN 500 ELSE C$="":GOTO 515 500 IF CH<>&HC THEN 510 ELSE C$="":GOTO 515 505 'Print other controls CP/M style: "^letter". 510 C$="^"+CHR$(CH+&H40) 515 LPRINT C$; 520 NEXT ICH 525 LPRINT 530 NEXT IKEY 535 'Check definition of arrow keys; first check 540 'whether they are > 1 byte (non-standard!). 545 FOR IKEY=11 TO 14:IF LNG(IKEY)<>1 THEN 605 550 NEXT IKEY: 'if loop ends, all are 1 byte. 555 'Get each arrow-key byte, and examine it. 560 FOR AK=1 TO 4:AD=ADR(11)+AK-1 565 AKS(AK)=PEEK(AD):NEXT AK 570 'Are they CP/M arrow keys? 575 FOR I=1 TO 4:IF AKS(I)<>CPM(I) THEN 590 580 NEXT I:AK$="CP/M":GOTO 610 585 'If not CP/M, are they WordStar arrow keys? 590 FOR I=1 TO 4:IF AKS(I)<>WS(I) THEN 605 595 NEXT I:AK$="WordStar":GOTO 610 600 'Arrow keys definit'ns must be non-standard! 605 AK$="Non-standard" 610 LPRINT:LPRINT TAB(11);"ARROW KEYS: ";AK$ 615 LPRINT CHR$(&HC) 620 PRINT:PRINT "***************************************************" 625 PRINT:PRINT "Printout is completed. You may wish to print these" 630 PRINT "definitions again, or print those of another disk.":GOTO 290 rintout is completed. You may wish to print t LPRINT C$; 520 NEXT ICH 525 LPRINT 530 NEXT IKEY 535 'Check definition of arrow keys; first check 540 'whether they are > 1 byte (non-standard!). 545 FOR IKEY=11 TO 14:IF LNG(IKEY)<>1 THEN 605 550 NEXT IKEY: 'if loop ends, all are 1 byte. 555 'Get each arrow-key byte, and examine it. 560 FOR AK=1 TO 4:AD=ADR(11)+AK-1 565 AKS(AK)=PEEK(AD):NEXT AK 570 'Are they CP/M arrow keys? 575 FOR I=1 TO 4:IF AKS(I)<>CPM(I) THEN 590 580 NEXT I:AK$="CP/M":GOTO 610 585 'If not CP/M, are they WordStar arrow keys? 590 FOR I=1 TO 4:IF AKS(I)<>WS(I) THEN 605 595 NEXT I:AK$="WordStar":GOTO 610 600 'Arrow keys definÃv4Copyright (C) 1983 BORLAND Inc Osborne 01= ()RPœ<~·7È#õå~ÍÕáñ=ÈóÍø ÉÅÕåÝåýåõo&åͦñýáÝááÑÁÉoåͦÉþ€ÜcÔ|æîÅÕåÝåÍ£}Ýå!Ûå!Õ" áãõÅÕ~#·(åÍÕáôÑÁñãÉ}´È:8‡‡‡ããããÅÒÁ= ô+èÍ¥Ø*ŠßõÅÕå!vÍ-!pÍ¥*|ÔáÑÁñÉõÅÕå!˜éõÅÕå!’àõ:�·(ÅÕå=2�!„Í-áÑÁñÉõ:�· ÷ÅÕå<2�!~åõÅÕå!ŒÛõÅÕååð!Yí°Ñ:jO:l‚ÕÍÓÑ:kO:mƒÍÓ!ðÍ¥*nÍáÑÁñÉ!ð ë!i45(É!+/ –0ü†õyþ0(ñíÉ d!9Ã-!IÃ-Í[æÍ[o&Éô  áÁå:á·(yþ ÕÅÍ |µ(Íçþ ÍçþÊrÁÑ*é"ÛÕx2áy·( >Ã28!ì"9!œ í°!´¸í°áí°>2Ú¯Ãßà ÃÃ0Ã&Ã+Ã!Ã0Ãÿ í[Ûþ (ú!eÍPÍWþA8þQ0Gþ: xÖ@¯!\w# ( þ  ÍLÍ)þ. Í)!h6#ûÉ (þ*(þ.(þ!8þ}(þ*(ÍWw#ßÉ>?> w#üÉþaØþ{ÐÖ É|Íe}õÍnñæÆ�'Î@'ý¯7Ë|À|·}È>ÿÉ"ÍíCßëÑùü "Ïë"Õéå*Ï·íB"Ïí[Í·íRëáÚöí°É*Ïí°"ÏÙÉ^#V#Õ^#V#N#FáÉÝáëO/o&ÿ9ùëí°ÝéÑO/o&ÿ9ùëí°éÝáë!àÿ9ùëÅ(¯üí°Á> �‘(G¯üÝéÝá!àÿ9ù ¯w#üÝéÝáEÍM¶wÝéÝáÑ}“8÷�Ã"·íR·íB0 É>‘î·íRëêðøÉÕë·íRëáë·íR!È+ÉÍk õÍ= ð·íR!À+ÉÍk õÍ= ðÍÿ!Ð+ÉÍk õÍ= ðÍÿ!ÈØ+ÉÍk ôÍ= ïÍÿ!ÈØ#ÉÍk ôÍ= ïÍÿ!Ø+ÉÍk õÍ= ðT]KBë!z·> S>)ë)ë0 = öÉ|ªõÍ ëÍ ëDM¯go>íjíB0 7?ËË= ðëñðHåÍË<ËÑëÍ¡ëËzÈ5ÍîÈ)ýÉÍîÈË<ËúÉëz· {þ0G·É¯goÉë|ª|ú ºÀ}»ÉÉË|È|/g}/o#É}æo&ÉíKÓí[ÑÅÕxAJSËËËËáëáíJDM!éb"Ñë!6íJ"ÓDMÉ'ÍoèÍodÍo Ío} ¯<íR0û= ÈÆ0ÝwÝ#ÉÝ~Ö$O! Ý#Ý~ÍWÖ08)þ 8 !Öþ 8þ0T])Ø)Ø T]Ø)Ø_ØËy·È|‡ÉÝááå}&#9N�8wë!DíB9ùëåí°ëá+Oí¸ë#ùÝé>Ã$ÝáÍyWáÍj _áå}“8(º8J`9{‚T]=o`9yí¸ë ¯Ã$Í™ Ð>Ã"Í õÍ8Í# íÙ}·Ù>(èÍ� àÙËxÙ Ù}·ÙÈÙÅÕåÙ}· Ù˸TÅËø¯ÙËø}Ù•(0íD=ÙÍ ,= ù(Ùñæ€ Í 0%Í ·, 7 ÍR ?õ(8ÙÍ8 Ëx Í - öÍþ ñ8˸·ÙáÑÁÙÉÙËxÙ  Í Í  Ø,-Èxî€GÉÙ}·ÙÊþ }·ÈÙ…ÙÍÙ ÅÕåÝ9Íþ Ù.Ù>Ý#ÝnË0Í Í = ñÙ-Ù åÝnûËx Í ,-(-ñññ·ñÙÁáÙÝá˸°G,-Ìþ É}·ÈÙ•Ù?ÍÙ åååÝ9Ù.Ù>ÍR 8Í8 ?Ë= ÝuÝ+Ù-Ù(>Í 0ßÍ8 ·áÍ 8ÍR ?áÑÁËx Í š, —7•8Æ€8Æ€8oÝãÙåÅxËøÙ¨æ€õËøÝåÝ!ÉáØ¯oGOW_gÉ·ËËËËËÉ·ËËËËËÉ|Ù„Ùg{Ù‹Ù_zÙŠÙWyÙ‰ÙOxÙˆÙGÉ|Ù”Ùg{Ù›Ù_zÙšÙWyÙ™ÙOxÙ˜ÙGÉxÙ¸ÙÀyÙ¹ÙÀzÙºÙÀ{Ù»ÙÀ|Ù¼ÙÉÙxÙ¨òu xÉËx(Í È?É}Ù½ÙÀ·ÈÃR }Ö�Úþ <þ(ÐÙÅÕåÍþ 7Í = ùÙ|Ù¤Ùg{Ù£Ù_zÙ¢ÙWyÙ¡ÙOxÙ ÙGà ÙÅÕåÙÍ8Ù͉ ÙÍ ë}·ÈËx>Â"Í8}Æ€Ë/Æ€oÖõÙÅÕåÍ� Í™ -ÅÕåÍ }áÑÁÙáÑÁã¼ã0ãñÙÉÙÍ-Í ÙÍ,Ù}þlØÅ˸Ík Á8 Í� ÍÀ Í# Ëx(Í™ Ù-ÙÍk õ8Í Ù-ÙÍk 8Ù,Í }þl8;Ùª*ªª!ªÍ# ÝåÝ!“ >ÍÀÝáÍ8Í# Í# ÅÕåÙÍ8--Ù-Í™ ÙáÑÁÙÍ ,,ñ,-ÈØxî€GÉgª?+2×n¶*ï8t Ð Ðzˆˆˆˆ~«ªªªª,->Ê"ËxÂ"ÙÍ$Ù}.�•õÍ� ÙÍÙÍ ÅÕåÙ,Í™ ÙáÑÁÍ� ÝåÝ! >ÍÀÝá,ÙÍ.-ÙÍ™ ñÅÕåo&0%Í”Ù,Í# ÙáÑÁÍ™ }þgÚþ É}Š�؉}颋.:}Žã8Žc~I’$I~ÍÌÌÌL«ªªª*ÙÍ.Ù·Ëxõ˸Í� }þˆ0GÅÕå,Í\åË<Ë}áõÍ”,-(-ÙñáÑÁõÍ ÝåÝ!œ >ÍÕÝáñ0 õÙÍ$ÙÍ# ñ…o8 ñÈÙÍÃ� á>Ã"m.`1pF,þåt6|‰„!wS<ÿÃ.zÒ}[•|%¸FXc~üïýu€Ò÷r1}·ÈÝåÙÍÙ¯Ëx(<˸õÍk 8ÙÍ� ñËÿõÙÏŽé!~JÙÍk 0ͺOÝ!Z>ÙÝÍÿÙÍk 8 = ìÙ ÝÙÙÍúËøÍ™ ÅÕåÍÿÍ# ÙÍÍ™ ÙáÑÁÍ� ÝåͺÝáÙÍúÍ™ ñ0 õÙÍ-Í ñÝáËOÈËøÉçÏÌTöô¢0 jÁ‘ €µžŠoD€‚,:Í€jÁ‘ �€!¢ÚI}袋.º}Žã8Žc~I’$I’~ÍÌÌÌL«ªªªªÝ!–>ÅÕåõÍ8Í# ñÍÕÙáÑÁÃ# õÙÍúõÙÅÕåÍúÍ™ ÙáÑÁÙÍ# ñ= éÙÍÙ ÝÝnÝfÝ^ÝVÝNÝFÉ!�DLT\ÉI¢Ú!‚!É53ó!�úÉr1÷!€ÒÉÅÕåÙáÑÁÉÍ!€> Ëx Ë#ËËË-= ðo˸ÉËxÙÍ(Ëø-Í™ ·Ë}(ËxËø>�½8(Í ,óÍ `iÈÃ!É>’Ã"|µÊþ Ë|Í >�)=Ë|(úDMboÀ˸ÉÍyë8þ8ÍyÙËxÙ(’0¯þ 8> ÕÍ ÑËx(>-ÍqË{(aËy(ÍoÍe òz·(>.Íq (Ío ÷ú=Íe÷Ë{È>EÍq>+Ë|(|íDg>-Íq|/Ö 0ûÆ:ÝpÝ# ý~ý#· ý+>0ÝwÝ#Éýå,-  ý60ý#ø¯Ã Å˸}ÙÖ€oŸgM͇|þÙ <ýwíDÍÌ}þ�0Í?ý5Ëø>„•.(Í Ë= øý~õ> xæÆ0ýwý#xæGÅÕåË%Í Ë%Í ëãÑãíZëáãíJDMáË%Í = ÈñÁýáÉýåá_~6þ5Øú(+~¨¥Ôh¶¿ÉìÅëx-ÐÍÎÂSÞùx9?ë+¨­ÅøÉ{Η@}·ÈËøÅÕ|Í Í „gãíZëáãíJDMá0Í ,7È}Æo˸ÉÍ˾ #øyîO!@9ùi&ÝéÍË ë¶¾ â#÷ÚÍ˶w#ùëùÝéÍË/¦w#øïÍ˦w#ùãýáÝá!9ë! E9ýéÝá!!9~·(¯+FÍM¦!"9ù!(#Ýé>¯2æýá*ÛÍu¯á"âýå|·>"Êß:æ·( ÍE *â6#wÉÍÊ*â6#6 ë!\$í°É!uÅåí[Ûþ (úÍW–( áÁã·É#ëÁÁþ:À~ÉCONTRMKBDLSTAUXUSR>¯2æÍ­Íã*â#~þ ÍuÍã*â:æ·> >w###6ÀÕþ þ #6++pÉ>¯2æíSäÍìÍãÍu:Ù·À*â6###ww#w$w#wÖÿ:æ· åͳá##N#F*ä·íBÈ>�Ãßå¯w#w#í[äs#ráò>¯2æÍÍãÍuÍã*â6å ë#Íá-¯Nw#FwÖÿq#p#6€#w#w#wÉÍž*â ë:æ·( ÕÍÑñÅÍÁ<ÀxÃß*â6#ûÉ"â#~+þ 2ËN(>ÍQ:Ù· *âË^ îËFÈ*âå ëÍá< >ÿ2Ù6É"â~æÈÍ^*â-¯w#wÕÿw#ͲÍ^À"â~æÈ·ÍÖÀ ëÍ<À@ýá*ÛÍu¯áýåÍÖÀåÍÊáåë!\ í°á åëÍÑ<Êm!\$í°É>Ãß>¯2æÍÖÀ*ß|µ>! ë*â \$í°\Í<(Ï!¼€í°:æ· í[1Ã�ÿÕÍ\ÍÑ!€ë·(éf"âÍ�È> 2ÙÉ:Ù·ÈñÉÝáÝåå!ÊÍûáÉÝáÝå"âËF( #~þÀ#6Ã$>Îå!ÊÍáÉ"âËNÀ>ë!Ú~þ€8>O6*Û"ÝÍçwþ (=þ(&þ("þ(þ :á·(ßÃûþ 8Øyº(Ô~#ͽÌú7+Íø (½ï6Éå*â#~þáÉÍ�ÈÍþÈÅÕå*â#~· *Ý~þ(h#"Ýb= Íçõþ 8ͽþ ̶ñJ= ÍçB== ͯ}8= ͵}/Íl !*â###å~Æ-_~áþ(4ò6*âËÖ>™2Ù>*â##wáÑÁÉ:Ù·>Àå*â##~áÉå*â#~þÿ(EÍ‹Íþ ( þ (þ (þ Í•è!]Íþ (þ (þ (þ(w#(Í•ãÍ�Ì•6áÉÝ!]Ý~·Èþ-ÀÝ#É8Ý~·È>7ÃßëÍ� ÍÕÍ•É>¯OÅÍ*ÁÍ{ÈÅåÍ„ÑÁÍ�ØÌës #rëÉÍ*Í{ÈÅåÍ/ÙáÁÍ�ØÙÌ ÙÃdåÍ‹Íþ Í•ôÍþ (þ( #w(Í•êÍ�Ì•áqÉ*â#~þʶÍþ (þÈÍ•ñÍ� Í•þ ÀÕ*â##~þÈ6ÉÅÕåÍ[áÑÁÉOÍã*â#~þ(08áÅå·Ê¦=ʦ==Ê©=ʬò+ËÞ###å~Æ-_qá4ð6Í`È>ðÃß*æ:è¾È4^qÉ}ÃQÁÑÅÝ*ÛË|(ÍëëË|( ÍÝ6-Ý#ÕÍSáÍyí[ÛÝåá·íRë“8 (G> ÍQùCÈ~ÍQ#÷ÁÑÙáÑÁÙÅÝ*ÛÕͳÇÁÑÅÍyËC!' Ç!+ÀTRUEFALSEÍy!9^#ÍçÑùÕÉá~#·(G~ÍQ#ùé> ÍQ> ÃQ "âËF!È͸(þÀ#ÉåÍë·íRá0ͳ*â4À#4É>™ÃßåÍ·íR *â4 #4(áͲÒ>òÜ>¯2çÍãë*âËV(/Ë–:ç·(#~+· x· y·úñÅÕ!ÍtÑÁ( =(þ X:ç·(R*â:ç·(ËÞ###~Æ-Õ_ÑÖ-ÍKí â<ò =<ÍK*â###æw ÅÕåÍ^áÑÁ Õ*Ñ4 #4x±Â»ëÉ>™>ðÃßõ:ç·(ëñÉ"âÍ^Èè"*âËÖË^ÈËž*âËVÈË–åÅ0ëÍÁá ëÍ·ÉÁÑíSâÅåÍÑ·íR8A*â N#F#s#rÍã 0}æ)ëíjëS\*â###w* N#Fë·íB ÈÕåÍ^Ñár+sÉ>‘ÃßÕÙáÙ!T]>)ëíjëÙ)Ù0 0= ïÉÍ·íR!À#ÉÍëÉ*â^#V#ÕN#F#^#VáÉ>">!2çDMÝáÑáÝå"â~æʲx±(LÅÕÍ*â ë:çOÍÑÁ·(o:çþ" C}=(þ ?ÅÕ*â-N#Fp+qÛÿq#pÑÁ!€ë °*â F+N+++V+^ë·íBÐëq#pÉ>™>ð>ÃßÁÑíSâÅåÍÑ·íRÚÞ*â s#r$ s#rÉëáãå*Íå"Íí[Ï·íRÑá0s#rÉ>ÿÃ"í[Íñ^#VíSÍÉ!9í[Ï·íR8ëí[Í·íRÉ>¯O"æ¯w2Ùx2è!—"âá"äá ͵Íÿ*äé>¯2ê"æ!—"âá"äá"è!\Íu¯*è:ê· Í­ÍÑ!Ù~6·go(Ýåá\íRë*æs#r¯ÿí_2ÔÉëÝáÁáx±( s x±(T]í°ÝéDMÝáÑá·íR0ð ë ëí¸ÝéÑÁÕ-a%Ù}ÍWoÉ*é!Ù~6o&ÉÍ |µÈÍ£}þÀÝáÍø^C User break1:Ù·ÈÝáõÍø I/OÝáÍø Run-timeÍø error ÍeÍø, PC=Ýåáí[Õ·íR"×Í`Íø Program aborted*ßé1!ÓϸÿÍ`!#PÏÍ…Ãä!ýáá"€Ïýå*€Ïn&å!å*€Ïå!Ñn&Ñ͇Ñ"‚Ï*‚ÏÉ!�Ïå!+)Ñå! ëás#r!�Ïå!+)Ñå! ëás#r!�Ïå!+)Ñå! ëás#r!�Ïå!+)Ñå!ëás#r!‡Ïå!+)Ñå!ëás#r!‡Ïå!+)Ñå!ëás#r!‡Ïå!+)Ñå!ëás#r!‡Ïå!+)Ñå!ëás#r!å!n&Ñ͇å!kÑ"tÏ*tÏåÍ”"rÏ!å!ÑÍøz³ÊñÕ"vÏ!³Ïå*vÏ+)Ñå*rÏëás#r*tÏå!Ñ"tÏ*tÏåÍ”"rÏ!—Ïå*vÏ+)Ñå*rÏå!³Ïå*vÏ+)Ñ^#VëÑë·íRëás#r*vÏ#ÑÃŒÉ!}2†Ï!}2…Ï!å!ÑÍøz³ÊÌ Õ"lÏ!—Ïå*lÏ+)Ñ^#Vëå!ÑÍËEÊà !å!ÑÍøz³Ê…Õ"jÏ!³Ïå! +)Ñ^#Vëå*jÏÑå!Ñë·íR"hÏ!`Ïå*jÏ+)Ñå*hÏn&ëás#r*jÏ#ÑÃ;!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£o}2…Ï!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£o}2†Ï*lÏ#Ñà *…Ï&ËEÊç ÍÍ@CP/MÍÃ!*†Ï&ËEÊ!ÍÍ@WordStarÍÃ!ÍÍ@ Non-StandardÍÍÍ@ Arrow Keys. ÍOÍÉ!å!ÑÍøz³ÊŽ!Õ"ZÏ!³Ïå! +)Ñ^#Vëå*ZÏÑå!Ñë·íR"XÏ*XÏå!‡Ïå*ZÏ+)Ñ^#Vëëás*ZÏ#ÑÃE!É!å!ÑÍøz³Êã!Õ"RÏ!³Ïå! +)Ñ^#Vëå*RÏÑå!Ñë·íR"PÏ*PÏå!�Ïå*RÏ+)Ñ^#Vëëás*RÏ#ÑÚ!ÉÍ!ͱÍ@+ ArrowKeys [C] 1984 Howard Gerber, WB5YWSÍOÍÍÍ@.Permission granted for non-commercial use onlyÍOÍÍÍOÍÍÍ@Your keyboard is now set to ÍÍÀÍòÍÍ@Change? Í!„ÏÍêÍšÍÍ*„Ï&åÍ!yÍ$!YÍ$ÍÛËEÊ#ÍÍ@ Changed to Í*†Ï&ËEÊõ"Í�!Ãø"Í:!ÍòÍÍOÍÃro ÍÍÀÍòÍÍ@Change? Í!„ÏÍêÍšÍÍ*„Ï&åÍ!yÍ$!YÍ$ÍÛËEÊÛÍÍ@ Changed to Í*†Ï&ËEÊRlÍ�!Ãí"Í:!ÍòÍÍOÑÃ;!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!�Ïå!+)Ñ^#VëÑÍÑ}£o}2…Ï!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£oå!`Ïå!+)Ñ^#Vëå!‡Ïå!+)Ñ^#VëÑÍÑ}£o}2†Ï*lÏ#Ñà *…Ï&ËEÊç ÍÍ@CP/MÍÃ!*†Ï&ËEÊ!ÍÍ@WordStar OSARROW.DOC by Howard Gerber [C] 1984 Thå  Osbornå  0± [TmÝ prograí SETUP.COÍ allowó yoõ  tï  changå � youò  disketteó tï booô uð witè thå arro÷ keyó defineä aó  eitheò � CP/Í  oò WordStar¬  howeveò iô requireó rebootinç thå disë  everù � timå  yoõ wanô tï makå sucè á change®  Thió program¬  writteî iî � Turbï  Pascaì [Tm]¬  wilì displaù anä allo÷ yoõ tï easilù  changå � thå arro÷ keyó oî youò Osbornå 0± computeò withouô re-bootinç thå � disk®  Thió  allowó yoõ tï easilù gï betweeî WordStaò anä normaì � CP/Í systeí activities. Assuminç  yoõ havå á copù oæ OSARROW.COÍ oî youò currenô disk¬ � yoõ  woulä  calì  thió prograí bù  simplù  typinç  OSARROW®  Thå � program will clear your screen and display the following message: _________________________________________________________________ | | | ArrowKeys [C] 1984 Howard Gerber, WB5YWS | | Permission granted for non-commercial use only | | | | Your keyboard is now set to xxxxxxxxx Arrow Keys. Change? _ | |_______________________________________________________________| wherå xxxxxxxxø ió CP/M¬  WordStaò oò Non-Standard®  Iæ yoõ likå � thå currenô settinç jusô presó return¬  buô iæ yoõ wanô tï changå � youò arro÷ keyó enteò 'Y'®  Iæ  yoõ  enteò  'Y§ thió prograí wilì changå  youò  arro÷  keù � settinç  anä  displaù  thå  ne÷ value®  Iæ youò  arro÷  keyó  arå � currentlù WordStaò theî theù wilì becomå CP/Í arro÷ keys¬  other� wiså theù wilì becomå tï WordStaò arro÷ keys. Sincå  thå prograí findó thå locatioî oæ thå arro÷ keyó  baseä � oî  thå  locatioî oæ thå CP/Í BDOÓ warí starô vector¬  iô  shoulä � havå  nï probleí workinç witè Osbornå ROMÓ 1.² - 1.4´ oò versionó � oæ  CP/Í thaô havå beeî modifieä tï uså ZCPR®  Problemó  maù  bå � encountereä wheî youò CP/Í ió modifieä foò á clocë board¬ Drivå à � [TmÝ oò Trantoò [Tm]®  Iî theså caseó yoõ probablù wilì havå  tï � locatå  youò  currenô  arro÷ keù definition¬  modifù  thå  Pascaì � sourcå codå anä recompile. Thió  prograí ió thå solå propertù oæ Howarä  Gerber¬  WB5YWS¬ � anä maù noô bå solä foò commerciaì gaiî iî anù waù shapå oò form® � Permissioî ió herebù granteä foò personaì uså oæ thió program. Anyonå  havinç questionó abouô thió prograí maù contacô Howarä � bù  leavinç á messagå oî thå OZZ-HAÍ RCP/Í aô (713©  893-042´  oò � thå Weekendeò BBÓ aô (713© 492-8700® o÷  keyó  arå � currentlù WordStaò theî theù wilì becomå CP/Í arro÷ keys¬  other� wiså theù wilì becomå tï WordStaò arro÷ keys. Sincå  thå prograí findó thå locatioî oæ thå arro÷ keyó  baseä � oî  thå  locatioî oæ thå CP/Í BDOÓ warí starô vector¬  iô  shoulä � havå  nï probleí workinç witè Osbornå ROMÓ 1.² - 1.4´ oò versionó � oæ  CP/Í thaô havå beeî modifieä tï uså ZCPR®  Problemó  maù  bå � encountereä wheî youò CP/Í ió modifieä foò á clocë board¬ Drivå à � [TmÝ oò Trantoò [Tm]®  Iî theså caseó y{ This program, written in Turbo Pascal [Tm], will display and allow you to easily change the arrow keys on your Osborne 01 computer without re-booting the disk. This program is the sole property of Howard Gerber, WB5YWS, and may not be sold for commercial gain in any way shape or form. Permission is hereby granted for personal use of this program. Anyone having questions about this program may contact Howard by leaving a message on the OZZ-HAM RCP/M at (713) 893-0424 or the Weekender BBS at (713) 492-8700. } program ArrowKeys (input, output); const first_cursor = 11; last_cursor = 14; var adr, lng : array [1 .. last_cursor] of integer; cpm, ws : array[1 .. 4] of integer; wordstar, cp_m : boolean; response : char; function contents( location : integer ) : integer; begin contents := mem[location] + $100 * mem[location+1] end; procedure initialize; const bios_entry = 2; var i, address, last_address : integer; begin cpm[1] := $0B; cpm[2] := $0C; cpm[3] := $0A; cpm[4] := $08; ws[1] := $05; ws[2] := $04; ws[3] := $18; ws[4] := $13; address := $100 * mem[bios_entry] + $6B; last_address := contents(address); for i := 1 to last_cursor do begin adr[i] := last_address; address := address + 2; last_address := contents(address); lng[i] := last_address - adr[i]; end; end; procedure display_keys; var i, j, ad : integer; aks : array [1 .. 4] of integer; begin wordstar := false; cp_m := false; for i := 1 to 4 do if lng[i] = 1 then begin for j := 1 to 4 do begin ad := adr[11] + j - 1; aks[j] := mem[ad] end; cp_m := (aks[1]=cpm[1]) and (aks[2]=cpm[2]) and (aks[3]=cpm[3]) and (aks[4]=cpm[4]); wordstar := (aks[1]=ws[1]) and (aks[2]=ws[2]) and (aks[3]=ws[3]) and (aks[4]=ws[4]); end; if cp_m then write('CP/M') else if wordstar then write('WordStar') else write('Non-Standard'); writeln(' Arrow Keys. '); end; procedure make_ws_keys; var i, ad : integer; begin for i := 1 to 4 do begin ad := adr[11] + i - 1; mem[ad] := ws[i]; end; end; procedure make_cpm_keys; var i, ad : integer; begin for i := 1 to 4 do begin ad := adr[11] + i - 1; mem[ad] := cpm[i]; end; end; begin writeln(^Z,' ArrowKeys [C] 1984 Howard Gerber, WB5YWS'); writeln('Permission granted for non-commercial use only'); writeln; write('Your keyboard is now set to '); initialize; display_keys; write('Change? '); readln( response ); if response in ['y', 'Y'] then begin write('Changed to '); if wordstar then make_cpm_keys else make_ws_keys; display_keys; writeln; end; end.tar := (aks[1]=ws[1]) and (aks[2]=ws[2]) and (aks[3]=ws[3]) and (aks[4]=ws[4]); end; if cp_m then write('CP/M') else if wordstar then write('WordStar') else write('Non-Standard'); writeln(' Arrow Keys. '); end; procedure make_ws_keys;10 REM TIME CLOCK PROGRAM 20 REM JAMES J. BRENNAN 30 REM ADAPTED FOR OSBORNE 1 40 REM BY RAY GORDON JR. 50 REM 60 REM FROM KILOBAUD MICROCOMPUTING 70 REM JANUARY 1979, #25, P.95 80 REM 90 PRINT CHR$(26) 100 LET X=62735! 110 PRINT 120 PRINT 130 PRINT " DIGITAL CLOCK PROGRAM" 140 PRINT:PRINT:PRINT 150 PRINT " THE CLOCK DISPLAY IS THE FOLLOWING:" 160 PRINT 170 PRINT 180 PRINT " HH:MM:SS" 190 PRINT:PRINT:PRINT:PRINT:PRINT 200 PRINT " ENTER THE EXACT TIME YOU WILL HIT RETURN." 210 PRINT:PRINT 220 PRINT " USE THE FORMAT GIVEN ABOVE." 230 PRINT 240 PRINT " "; 250 INPUT"",T$ 260 LET TH=VAL(MID$(T$,1,1))+48 270 LET H=VAL(MID$(T$,2,1))+48 280 LET TM=VAL(MID$(T$,4,1))+48 290 LET M=VAL(MID$(T$,5,1))+48 300 LET TS=VAL(MID$(T$,7,1))+48 310 LET S=VAL(MID$(T$,8,1))+48 320 PRINT CHR$(26) 330 IF ST=58 THEN ST+48:S=S+1 340 IF S=58 THEN S=48:TS=TS+1 350 IF TS=54 THEN TS=48:M=M+1 360 IF M=58 THEN M=48:TM=TM+1 370 IF TM=54 THEN TM=48:H=H+1 380 IF H=58 THEN H=48:TH=TH+1 390 IF TH=49 AND H=>51 THEN TH=48:H=(H-2) 400 IF TH=50 AND H=48 THEN TH=48:H=56 410 IF TH=50 AND H=49 THEN TH=48:H=57 420 IF TH=50 AND H=50 THEN TH=49:H=48 430 IF TH=50 AND H=51 THEN TH=49:H=49 440 IF TH=50 AND H=52 THEN TH=48:H=48 450 IF TH>50 THEN GOTO 650 460 IF H>57 THEN GOTO 650 470 IF TM>54 THEN GOTO 650 480 IF M>57 THEN GOTO 650 490 IF TS>54 THEN GOTO 650 500 IF S>57 THEN GOTO 650 510 IF TH=>50 AND H>3 THEN GOTO 650 520 POKE X,TH 530 POKE X+1,H 540 POKE X+2,58 550 POKE X+3,TM 560 POKE X+4,M 570 POKE X+5,58 580 POKE X+6,TS 590 POKE X+7,S 600 LET S=S+1 610 LET Q=551 620 FOR I=1 TO Q 630 NEXT I 640 GOTO 330 650 PRINT "NOT A POSSIBLE TIME. RERUN PROGRAM" 7,S 600(MID$(T$,4,1))+48 290 LET M=VAL(MID$(T$,5,1))+48 300 LET TS=VAL(MID$(T$,7,1))+48 310 LET S=VAL(MID$(T$,8,1))+48 320 PRINT CHR$(26) 330 IF ST=58 THEN ST+48:S=S+1 340 IF S=58 THEN S=48:TS=TS+1 350 IF TS=54 THEN TS=48:M=M+1 360 IF M=58 THEN M=48:TM=TMÃ>OCLOCK Version 1.0 Copyright 1982 Michael M Rubenstein $!91üå!]äͧÊŠ*øï|þ@0$"â*"°|Ö g.åë!¯5í°á""øï!" áùÉ*øï|þ@8õ.3^#VíSøï.^#VíSáùÉí¡ÀàøÃóÓís1åÕõí[øï*7íR8íS* #" ñÑáí{ÓÃOFF ’þ'Â’Í( þ)Â’Í? :"øDISKEYS BAS#klmnoOSARROW COMEpqrstuvwxOSARROW DOCyz{OSARROW PAS|}~CLOCK BAS€OCLOCK $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååOCLOCK -- a simple clock counter for the Osborne 1 page 1 Copyright 1982 Michael M Rubenstein This document and the accompanying program may be distributed freely provided the copyright notice is retained and no fee is charged. OCLOCK implements a simple counting clock on the Osborne 1. The clock consists of two bytes at location 000BH. Once the command oclock is executed, this location will be incremented every 1/60 second until the system is cold booted or the command oclock off is executed. The clock's accuracy is limited by the operating system disabling interrupts for disk i/o. Errors of 5-10% are typical during normal activity. OCLOCK uses one page in high memory. However, since it locks the ccp into memory, the net effect is to reduce the tpa by 2.25k. OCLOCK may be used with the Software Toolworks C/80 compiler cprof program to give an execution profile of a c program. Make sure TICCNT is defined as 11 in cprof (it is distributed that way, but may have been modified for no clock). Follow the Software Toolworks C/80 instructions for use of cprof with either AS or M80. There is a bug in cprof which causes the profile to omit some functions from the display, but not from the total time. In particular, if exit is called, the main function will not be displayed in the profile. This bug can be fixed by inserting the line if (!q[-1]) q[-1] = 1; after the line for (q = LINKPT; q != -1; q = q[-3]) { in cprof.c. If this patch is made, the number of calls displayed in the profile will be the number of returns that the function made, except that func- tions which had never executed a return when exit was called will have a count of one. t func- tions which had never executed Software Toolworks C/80 compiler cprof program to give an execution profile of a c program. Make sure TICCNT is defined10 '*** 100 '*** Dump Screen routine for the Osborne I 200 '*** by Jerrold Wayne Silverstein 910 '*** 920 '*** PROGRAM DMPSCR (DUMP SCREEN) WILL DUMP THE 930 '*** 32 LINES OF "L" LENGTH OF THE OSBORNE I SCREEN MEMORY 935 '*** TO DISK FILE "DMPSCR.DAT" ON THE CURRENTLY LOGGED DISK DRIVE. 940 '*** THE FILE CAN THEN BE EDITED BY A WORD PROCESSOR. 945 '*** THE PROGRAM CORRECTS FOR SCREEN SCROLLING AND GIVES A CORRECT 946 '*** SCREEN IMAGE. 950 '*** A MOVING CURSOR ALONG THE LEFT SIDE OF THE SCREEN SHOWS THE 955 '*** LINE THAT THE PROGRAM IS CURRENTLY READING FROM. 960 '*** THE PROGRAM CAN PRINT TO A PRINTER WITH THE FOLLOWING CHANGES: 965 '*** a) REMOVE LINES 1040 AND 1150 970 '*** b) CHANGE ALL "PRINT #1" to "LPRINT" 975 '*** c) RENAME THIS PROGRAM TO "PRTSCR.BAS" (PRINT SCREEN) 980 '*** 990 F$="DMPSCR.DAT" 1000 ML = 128:L= 80 'L is number of characters across the screen to save 1010 FOR I = -4096 TO -1 'find cursor (current line) 1020 IF PEEK(I) > 127 THEN GOTO 1040 1030 NEXT I 1040 OPEN "O",#1,F$ 'found cursor, open disk file 1050 A=0 1052 PRINT #1,CHR$(PEEK(I)-128); 'remove cursor 1056 A=1 1057 K=I 1060 FOR J = I+1 TO -1 'dump screen from cursor to bottom of screen 1070 IF A < L+1 THEN PRINT #1,CHR$(PEEK(J)); 1075 IF A=0 THEN K=J:IF PEEK(K)<128 THEN POKE K,PEEK(K)+128 'place moving cursor 1080 A=A+1 1085 IF A=ML THEN A=0:IF PEEK(K)>128 THEN POKE K,PEEK(K)-128:PRINT #1,"" 'remove moving cursor and print end-of-line 1090 NEXT J 1100 FOR J = -4096 TO I-1 'dump screen from top of screen to cursor 1110 IF A < L+1 THEN PRINT #1,CHR$(PEEK(J)); 1115 IF A=0 THEN K=J:IF PEEK(K)<128 THEN POKE K,PEEK(K)+128 'place moving cursor 1120 A=A+1 1125 IF A=ML THEN A=0:IF PEEK(K)>128 THEN POKE K,PEEK(K)-128:PRINT #1,"" 'remove moving cursor and print end-of-line 1130 NEXT J 1140 PRINT F$;" HAS BEEN SAVED TO DISK. 1150 CLOSE #1 'close disk file 1160 SYSTEM 'return to CP/M 1170 END 1130 NEXT J 1140 PRINT F$;" HAS BEEN SAVED TO DI MISSCELLANEOUS part 1 screen copy routine "DMPSCR.BAS" Jerrold Wayne Silverstein (edited by Jim Woolley) After the April meeting of OUCH SIG, where I gave a demonstration of the CP/M STAT command, several members asked me to write to the TRIBUNE to tell all about STAT. Two problems prevented this. One was a lack of free time. And the second was the problem in CP/M of getting program output from my screen into a disk file. True, I could have copied the screen by hand (since I don't have a printer) and typed it manually into WordStar. However, with my typing bordering on lousy, I decided to spare everyone all my typing mistakes and create a screen dump (or copy) routine which will store anything that is on the screen on disk. This will allow me to show you actual output from the CP/M STAT command (or transient program) with no difficulty whatsoever. But that is in part 2. Since the screen dump program was so short and is so usefull I decided to tell everybody about it first. The screen dump program is a short MBASIC program that can be typed into a file by using WordStar. Note that this program will only work on the Osborne I (all revisions). It can be changed to work with other computers. Since it looks directly at the screen memory, it cannot be written to be portable between all CP/M computers (sorry). It can be run by typing at the CP/M promt "A>" the following: "B: A:MBASIC DMPSCR ". This will have MBASIC run the program in the file on disk drive B called DMPSCR.BAS and whatever appears on the screen at that time will be copied into the file on drive B called DMPSCR.DAT. That file can then be edited by WordStar or be typed on the screen with the TYPE command. The reason you should switch the default logged disk drive to B: is that MBASIC is usually in drive A and the program is on drive B and drive B usually has more free space than drive A. If this is not the case for your computer change the command appropriately. Note that the file DMPSCR.DAT will always appear on the default logged disk drive so make sure that there is 4K of space on that disk before you try to copy the screen. (You can use XDIR or SD or STAT to check for free space on the disk. Once executed MBASIC prints about eight lines saying all is well so that you will actually get only 24 lines of good data even though DMPSCR.BAS copies all 32 lines of the Osborne I screen. In the program you will notice the varible "L" for length. Since WordStar performs an automatic word wrap and the usual length of a line in WordStar is 80 characters I set "L" to 80 so that the program only reads 80 characters per line. You can set it to any number you need or want (52 to 128). The program can be changed to print to a line printer instead of a disk by makeing the indicated changes in the program remarks (comments). I suggest you call the printing program PRTSCR.BAS. The reason there are no options in the program is that prompts take up the screen which you want copied. You want a copy of screen data not a copy of this program's prompts. The program takes about 45 seconds to copy the screen. For the first 20 seconds it will appear that nothing is happening. Then the default disk will start spinning and you should see a cursor traveling down the left side of the screen (from top to bottom). This is the exact line that is being copied. When the program is finished it will remind you that you can find your data in file DMPSCR.DAT. Since the top of the screen is not always (not even usually) the top of screen memory the program will assume the top of the screen is the line with the cursor (usually that line is blank except for the cursor). This creates a good formatted file (trust me). However, (there is always a problem) if more than one cursor exists on the screen (any underlined characters are underlined with cursors) then the data file DMPSCR.DAT may look a little funny. This is usually not a problem unless you type a file with type COM on the screen and then try to copy it with DMPSCR.BAS. Some customized versions of WordStar also use underlines. So be careful and have fun. veling down the left side of the screen (from top to bottom). This is the exact line that is being copied. When the program is finished it will remind you that you can find your data in file DMPSCR.DAT. Since the top of the screen is not always (not even usually) the top of screen memory the program will assume the top of the screen is the line with the cursor (usually that line is blank except for the cursor). This creates a good formatted file (10 REM GRAPHICS SCREEN DUMP FROM OSBORNE 1 TO EPSON MX-80 WITH GRAFTRAX 20 REM written by Gobind Singh Khalsa (June 17, 1983) 30 REM 8371 Redwing Drive 40 REM Liverpool, New York 13088 50 CLEAR 2000:DIM A(960), B(400) 60 REM CONSTRUCT DATA ARRAYS 70 FOR N=1 TO 396:READ B(N):NEXT N 80 REM SET UP PRINTER 90 WIDTH LPRINT 255 100 LPRINT CHR$(27)"A"CHR$(8); 110 REM ANALYZE VIDEO MEMORY 120 FOR X=0 TO 4095 130 Q=PEEK(61440!+X) 140 REM CLASSIFY Q 150 IF (Q>32 AND Q<128) THEN Q=32 160 IF Q>160 THEN Q=32 170 IF (Q>127 AND Q<161) THEN Q=Q-95 180 REM LOAD GRAPHIC DATA INTO PRINT ARRAY 190 FOR I=1 TO 6:A(H+I)=B(Q*6+I):NEXT I 200 REM IF ARRAY FOR ONE LINE IS FILLED, PRINT IT, ELSE GOTO NEXT MEMORY POSITION 210 IF (61440!+X+1)/128<>INT((61440!+X+1)/128) THEN H=H+6:NEXT X 220 LPRINT CHR$(27)"L"CHR$(192)CHR$(3); 230 FOR C=1 TO 960:LPRINT CHR$(A(C));:NEXT C 240 LPRINT:H=0:X=X+1:GOTO 130 250 REM END OF PRINT ROUTINE 260 LPRINT CHR$(27)"@" 270 Y$=INPUT$(1) 280 REM GRAPHIC CHARACTER DATA 290 DATA 255,255,195,195,255,255 300 DATA 255,255,255,0,0,0 310 DATA 15,15,15,240,240,240 320 DATA 15,15,15,255,255,255 330 DATA 0,0,0,255,255,255 340 DATA 240,240,240,255,255,255 350 DATA 15,15,15,0,0,0 360 DATA 0,0,0,15,15,15 370 DATA 255,127,31,15,7,1 380 DATA 0,0,31,31,24,24 390 DATA 1,7,15,31,127,255 400 DATA 0,0,255,255,0,0 410 DATA 24,24,255,255,24,24 420 DATA 0,60,126,126,60,0 430 DATA 240,240,240,15,15,15 440 DATA 24,24,31,31,24,24 450 DATA 24,24,31,31,0,0 460 DATA 255,255,255,240,240,240 470 DATA 240,240,240,0,0,0 480 DATA 239,106,4,234,238,239 490 DATA 0,0,0,240,240,240 500 DATA 128,224,240,248,254,255 510 DATA 255,255,255,255,255,255 520 DATA 240,240,240,240,240,240 530 DATA 15,15,15,15,15,15 540 DATA 255,254,248,240,224,128 550 DATA 255,255,255,15,15,15 560 DATA 24,24,24,24,24,24 570 DATA 0,0,248,248,24,24 580 DATA 239,99,11,224,239,239 590 DATA 24,24,248,248,24,24 600 DATA 24,24,248,248,0,0 610 DATA 0,0,0,0,0,0 620 DATA 255,255,195,195,255,255 630 DATA 255,255,255,1,1,1 640 DATA 15,15,15,241,241,241 650 DATA 15,15,15,255,255,255 660 DATA 1,1,1,255,255,255 670 DATA 241,241,241,255,255,255 680 DATA 15,15,15,1,1,1 690 DATA 1,1,1,15,15,15 700 DATA 255,127,31,15,7,1 710 DATA 1,1,31,31,25,25 720 DATA 1,7,15,31,127,255 730 DATA 1,1,255,255,1,1 740 DATA 25,25,255,255,25,25 750 DATA 1,61,127,127,61,1 760 DATA 241,241,241,15,15,15 770 DATA 25,25,31,31,25,25 780 DATA 25,25,31,31,1,1 790 DATA 255,255,255,241,241,241 800 DATA 241,241,241,1,1,1 810 DATA 239,107,5,235,239,239 820 DATA 1,1,1,241,241,241 830 DATA 129,225,241,249,255,255 840 DATA 255,255,255,255,255,255 850 DATA 241,241,241,241,241,241 860 DATA 15,15,15,15,15,15 870 DATA 255,255,249,241,225,129 880 DATA 255,255,255,15,15,15 890 DATA 25,25,25,25,25,25 900 DATA 1,1,249,249,25,25 910 DATA 239,99,11,225,239,239 920 DATA 25,25,249,249,25,25 930 DATA 25,25,249,249,1,1 940 DATA 1,1,1,1,1,1 950 END 5,25 910 DATA 239,99,11,225,239,239 920 DATA 25,25,249,249,25,25 910 REM SCREEN.BAS 20 ESC$ = CHR$(27) 30 DEF FNCURSOR.POS$(X%,Y%)=ESC$+"="+CHR$(Y%+31)+CHR$(X%+31) 40 DEF FNSCREEN.POS$(X%,Y%)=ESC$+"S"+CHR$(Y%+31)+CHR$(X%+31) 50 GRAPHIC$ = ESC$ + "g" 60 NO.GRAPHIC$ = ESC$ + "G" 70 UNDERLINE$ = ESC$ + "l" 80 NO.UNDERLINE$ = ESC$ + "m" 90 INSERT.CHARACTER$ = ESC$ + "Q" 100 DELETE.CHARACTER$ = ESC$ + "W" 110 INSERT.LINE$ = ESC$ + "E" 120 DELETE.LINE$ = ESC$ + "R" 130 CLEAR.LINE$ = ESC$ + "T" 140 HALF.INTENSITY$ = ESC$ + ")" 150 FULL.INTENSITY$ = ESC$ + "(" 160 BELL$ = CHR$(7) 170 LINE.FEED$ = CHR$(10) 180 FORM.FEED$ = CHR$(12) 190 UP.LINE$ = CHR$(11) 200 LEFT.CHAR$ = CHR$(8) 210 RIGHT.CHAR$ = CHR$(12) 220 CARRIAGE.RETURN$ = CHR$(13) 230 CLEAR.SCREEN$ = CHR$(26) 240 HOME$ = FNCURSOR.POS$(1,1) 250 RETURN .CHAR$ = CHR$(12) 220 CARRIAGE.RETURN$ = CHR$(13) 230 CLEAR.SCREEN$ = CHR$(26) 240 HOME$ = FNCURSOR.POS$(1,1) 25ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååVPatch program, (c) 1982, Mechanized Knowledge corp P.O. Box 298, Sta V, Toronto, Ont. *dùåýáÍÍ}Press 'Y' to proceed any other key to cancel ÍØþY§Í ʧ¯22ÍNÍÕÊ(Í} Do you want to patch anyway? Press 'P' to proceed, any other key to abort ÍØþP§Í} OK ... good luck!!! ͸:2· pýåáíK*Í*9}» |º([Í}Consistency error, patched version not as expected Patched version not saved >Í<ÃÓ Í‚à!;�í°ÍÃÓ ÍƒPatching !"0*3N#Fx±(##^#V#åýåáëá~#åfoí°*0ÍL0íS0á#ÖýåÑ*0·íRë*,ÍL0@Í}Consistency error patches extend beyond specified length ë"*É̓Loading ÍRýåá\ëÍ€ ëÍ\ · >€…o0$ëìýåÑ·íR"*É̓Saving ÍR**}|ŒG\ýåáëÍ€ ëÍb <(>€…o0$ëìëÍD ÉÍ} +++ Error on write ÃÓ !Ýå!÷éå*7åz!� ·íRåÁ!†ÿÍáÍLáÄÈ̓Verifying *5N#FÍ-ʤ0>Í<çN#Fx±Ê¤Í-ó#^#V#åýåáÍá~#»~# º(ZåN#F#~#foÍ xº y»(Í} is not as expected ö"Í} has already been patched ö7õ!24ñá####É**í[.ÍL(M8$Í}Program longer than expected #Í}Program shorter than expected !24:2·É͈ ~Í‘ # x± öÍ· ÉÍþÊÓ þ (þ(*ÍCþÊÓ þ (áþ(ÝÍß ÉÅ4õ x± ûñ= óÁÉ|’À}“É!\Õ$í°ÑÍ> <À̓ +++ Cannot open ÃÓ ãÍ ãÉãÍ ãÍ’Í} É!~þ (ͼ!~þ È.Íß ͼÉÍ}SystemÉ~þ È#_Íß õÉ###~·ÌÓ Ë?#ÍóóÍ÷ ·(ú_õÍú Í} ñþaØþ{Ðæ_É_Ãß Ã÷ 4¡ÃéÇÑÓÝÏAáåßÏåÃÛAÑÃçAÅËËÝAéÃÛáËåËÉAïÓéÑYÇÃÝÝßéAÇßÝéÓÝëËBGoodbyeÅÕís;å!ãåÍ„þ('Í÷·(úþ(þ (þ( Oáã|µ(ñÚáy~· Ò#í{;ÑÁÉ>Íó:GÍ£·ÈþÈþ ÈÍ÷þÈí>ÉÅåÕK : Íó> ÍóñáÁÉþ ~þ #> ÑãõÒáÕÅëíRë{ÍÍW͈ͬÃ-ÍW͈ͬÃ0Å Å> -!ð¾ ©ÍËÍÕÍ÷ · 4Áx±( àÁ"y·Ê‚�úþ ( > üÃx!o ~#úAÅÃ4ÁÁõͲñÉ!�å*~·(#ù>*�Ox…ùƒ_0Aá~#úÉ> -> õ>ÿ2=ñÍËÍÕõ>(2=ñÉ!ð4ÍßÉ!1ù0ÍÉBÍ%+CÕ€Í7·íRÑBÍ.#CÕ€ÿÍ@·íRÑÉCÕ€ÿÍ@·íRÑBÍ.#CÕ€Í7·íRÑBÍ%+Éw©#ÍIøÉw©+ÍIøÉ©wÍIøÉ©wÍIøÉõÅ:=GÍVûÁñÉ!d~#·È_Íú ö=&-g    G='-g    G=(-g  G=)-g    G=*-g    G=-) Mechanized PO Box 298=.)Knowledge Station "V"=/)Corp. Toronto, Ont.Press any key to continueå!"?áÉõÅåO*?yO}o|g0|îg}î!o ê"?áÁñÉõ¯Í‘ Í‘ í[?ñÉå*?|µáÈ>ÿÉÃë ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË Ã ÅÃË ÅÃË ÅÃË Å ÃË Õ~#·(_Íß õÑÉÅ ÃË Å ÃË Å ÃÜ Å ÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃË ÅÃÜ ÅÃË ÅÃË ÅÃÜ ÅÃË ÅÃÜ ÅÃË ÅÃÜ Å ÃË Å!ÃË Å"ÃË Å#ÃË Å$ÃË ÅÕÿÅÕåÝåýåÍýáÝááÑÁÉÕÝåýåÍýáÝáÑÁÉõyþ (þ(þ( þ(þ(ñÆñÕ:A·È¯2A! ".! ",!G "3!‘ "5!.}"9!<  í°öÿÉCOPY COMkÐ, <— K3š �Ùå !fi/l¾msy|VŠ “þ.} <O�nŸ5 !O©gt O©gƒ ¾¶p_ ¼ ¶p#Î Vä‹ �ÙÓÿW à �*â ­¬ �s� /J¡© K3¾€ÉH ÞXRõ kÐG Åm Sector image constantProgram version noProgram bannerTrack image building routineFormat routineCopy routineSector numbering routineSector count fieldCopy read routineCopy format routineCopy write routineTrack messageTrack no display routineOverall program(ÿüÿþ÷ ÿûÿåå÷PN öü2N õþ÷N õûÿåå÷6N Formatt$ Read$ Writ$3.1=",OSBORNE DISK UTILITY Rev 3.1=#(Patches by Mechanized Knowledge Corp.Õ!Ð:/þ (!ôÍÕÍíS-ÍëÑÕå·íRåÑ"0:/GýåÁÑáí°Áë·íB"@ÉF#~°#È+x·~#(óüí!:/G:ïw##q øÉÍ1!Í1É!2 ÍF*@ÉÍ,Í, !) ÍF! ÍFÍPing Track $'Patches for COPY.COMThis program patches the Osborne I COPY program, version 3.0, primarily to correct the way it formats disks. The program to be patched must exist on the current disk under the name COPY.COM. It is validated to be the correct version of the program. Discrepancies are identified. The updated version replaces the original one. Press any key for further information, the up-arrow key to go back to a previous pageÂáãëçòïõîä There are several reasons for the somewhat unreliable disk I/O on the Osborne I. One of them is the incorrect way that COPY formats disks. The WD1793 floppy disk controller chip used in the OC 1 computer has certain specific requirements for the way control information is recorded on each track. This is not the actual sector data, but rather the special sequences of characters that surround those sectors. The hardware requires a specific sequence of characters at the begining of every track, the track header, followed by another specific sequence around each of the sectors (10 on the OC 1). That track header gives the hardware time (every disk revolution) to synchronize with the clock and data bits from that header, before sectors of real data arive underneath the read/write head. Version 3.0 of COPY, the Osborne disk formatting program for ROM revision 1.3, only puts out the 10 sector formats, not the track header. (It is actually amazing the disks can be read at all!) The formatting program for ROM revision 1.2 (FORMAT version 1.1), did put out that track header.Ìéíéôáôéïîó While this fix will somewhat improve the reliability of disk I/O, it will not solve all problems. The I/O routines in the ROM part of the OSBORNE BIOS are at best excedingly convoluted, at worst just plain wrong! Unfortunately, those routines cannot be quite as easily patched as this COPY program. The Copy function of the program is changed to show the action it is performing on the current track (Reading, formatting or writing). Now at least when COPY stops on an error (sorry, they will still occur), it shows at least which disk the problem relates to, i.e. source (reading) or destination.Éîóôòõãôéïîó ïî õóå The changes to COPY.COM should be transparent, except for fewer '... Bad Sector ...' errors and the Reading, Formatting and Writing messages. To change existing disks, merely use the Copy function of COPY to transfer the entire disk content to a blank diskette, and back to the original disk again. The Copy function formats each track before writing to it, and will use the same new format. COPY will, of course, still be able to read either format. Éîôåòîáìó ïî ôèå ðáôãèåó Unlike the original program, which used an exact layout of the sector image (304 bytes), this patch uses a table (36 bytes). Actually, there are two tables. Also included is a table to build the format for double density. Changing the byte 62Fh from 0Ah (ten) to 12h (eighteen) sectors per track will cause the program to build the double density track format. This ÷éìì îïô actually cause double density, however! It is merely included for anyone experimenting with double density. Note also that even for DD the character E5h is used as data character, since CP/M uses that to signal unused Directory entries.Ãòåäéôó This patching program is expressly written to provide a general purpose patching facility for proprietary software on CP/M systems. The program validates the program to be patched both before and after patching. The patching program also validates itself. Courtesy of Mechanized Knowledge Corporation, Programming & patches by Frans Van Duinen 18 August 1982, Copyright Mechanized Knowledge Corp� /J¡© K3¾€ÉH !¢4B «Aÿro yþ6‰zS_ÍFè~Í*¨!~æÇþ¨#^+ëÍF*¨!~GæÀþ€Â¿xæþÂkÃìþ@ÂÜxþvÊkæþÊøxæ8þ0ÂkÃøxþ6Êøþ4Êìþ5Âþ>=ÍÑ*¦!~Í*¦!Ãæçctors per track will cause the program to build the double density track format. This ÷éìì îïô actually cause double density, however! It is merely included for anyone experimenting with double density. Note also that even for DD the character E5h is used as data character, since CP/M uses that to signal unused Directory entries.Ãòåäéôó This patching program is expressly written to provide a general purpose patching facility for proprietary software on CP/M systems. The program validates the program to be patched both before and after patching. The patching program also validates itself. Courtesy of Mechanized Knowledge Corporation, Programming & patches by Frans Van Duinen 18 August 1982, Copyright Mechanized Knowledge Corp� /J¡© K3¾€ÉH  This is the release date of the disk. CLAS6 FON ð{4ÍF¹LETTERS êu[š*CFONT EXE °™\)$fÛCONVPRF EXE §“ƒ`$f™DELFONTSHP »Pn Ì$DOWNLOADEXE %t^'¦BDSKSPACEEXE æh²�,l%EFONT EXE ƒ\š,¨JFANCFONTPRO to‘u(óFFCONFIGEXE ˜]e@ as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Osborne 1 Programs. Filename Description -09-00 .86 This is the release date of the disk. -CPM142 .DOC This is the description of the disk contents. AUTOMOD .COM 7247 2K [Auto Start Modify 1 of 5] Single and Double Density Command Line Autostart versions. AUTOMOD .DOC 60BD 5K [Auto Start Modify 2 of 5] AUTOMOD .ASM 38C9 6K [Auto Start Modify 3 of 5] AUTOMODD.COM B10B 2K [Auto Start Modify 4 of 5] AUTOMODD.ASM BBB0 6K [Auto Start Modify 5 of 5] SETAUTO .COM 28CE 1K [SETAUTO 1 of 2] Sets the Automatic boot command. SETAUTO .DOC CF99 2K [SETAUTO 2 of 2] AUTOST .COM B37D 2K [AUTO START 1 of 3] Origional Autostart program for the O-1. Source Code is included. AUTOST .AQM 126E 2K [AUTO START 2 of 3] AUTOST .ASM 61E7 5K [AUTO START 3 of 3] BAUTOST .DOC BDA8 9K Autostart that logs to a specified drive and user. FSTART .COM F8AC 1K [FSTART 1 of 2] Autostart Generator with drive speed patches. FSTART .DOC 253B 1K [FSTART 2 of 2] MAKEAUTO.COM 1517 2K ver. 2 [Make Auto 1 of 5] Allows you to generate a custom autostart file. Second version also includes drive speed patches. MAKEAUTO.DOC FFB8 1K ver. 2 [Make Auto 2 of 5] MAKEAUTO.ASM DC4A 4K ver. 2 [Make Auto 3 of 5] MAKAUTO2.COM B4AA 2K ver. 2 [Make Auto 4 of 5] MAKAUTO2.ASM 0B7A 5K ver. 2 [Make Auto 5 of 5] STARTER .COM C3D2 2K [STARTER 1 of 3] Creates a custom Auto Start program. STARTER .DOC 8A08 2K [STARTER 2 of 3] STARTER .ASM 1780 9K [STARTER 3 of 3] TO .COM 8176 1K [Screen Pack Width 1 of 13] These programs allow you to change the width of your screen if you have Screen-Pac installed. Documentation and Assembler or C source code is included for most. TO .ASM F2A6 3K [Screen Pack Width 2 of 13"] TO80 .ASM E09D 1K [Screen Pack Width 3 of 13] TO80 .DOC AFEE 2K [Screen Pack Width 4 of 13] WID .COM B790 1K [Screen Pack Width 5 of 13] WID .DOC 3E66 2K [Screen Pack Width 6 of 13] WID .ASM 0588 5K [Screen Pack Width 7 of 13] WIDTH .COM C26F 3K [Screen Pack Width 8 of 13] WIDTH .DOC 0F4B 2K [Screen Pack Width 9 of 13] WIDTH .C 901E 1K [Screen Pack Width 10 of 13] OSCHG .COM 16E7 1K [Screen Pack Width 11 of 13] SCREEN .COM F30B 1K [Screen Pack Width 12 of 13] SCREEN .DOC 3BD0 1K [Screen Pack Width 13 of 13] FUNC .COM 0917 2K [Function Key Set 1 of 5] These programs allow you to set the function keys for single and double density machines. FUNCTDD .COM 601C 1K [Function Key Set 2 of 5] FUNCTION.COM 0031 1K [Function Key Set 3 of 5] FUNCTION.DOC 6F07 2K [Function Key Set 4 of 5] OSBKYBD .ASM 368F 3K [Function Key Set 5 of 5] DISKEYS .BAS 3E8D 5K This program allows you to print out the function key settings. OSARROW .COM DB72 9K [OSARROW 1 of 3] This program allows you to toggle between WS and CPM arrow keys. Documentation and Pascal source code are included. OSARROW .DOC 4CC9 3K [OSARROW 2 of 3] OSARROW .PAS CCDB 3K [OSARROW 3 of 3] CLOCK .BAS 2937 2K Digital clock display OCLOCK .COM C5C1 1K [OCLOCK 1 of 2] Set up a simple counter in RAM. OCLOCK .DOC 0E66 2K [OCLOCK 2 of 2] DMPSCR .BAS F9F5 2K [DUMP SCREEN 1 of 2] Screen Dump for the Osborne 1. DMPSCR .DOC 5145 5K [DUMP SCREEN 2 of 2] GRAPH .BAS BC87 3K Graphics screen dump to Epson MX-80 with Graftrax. OSCREEN .BAS A15E 1K Show Screen Characteristics. OSPATCH1.COM 0A1A 8K Patches COPY.COM for more reliable operation. 13] SCREEN .COM F30B 1K [Screen Pack Width 12 of 13] SCREEN .DOC 3BD0 1K [Screen Pack Width 13 of 13] FUNC .COM 0917 2K [Function Key Set 1 of 5] These programs allow you to set the function keys for single and double density machines. FUNCTDD .COM 601C 1K [Function Key Set 2 of 5] FUNCTION.COM 0031 1K [Function Key Set 3 ofåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå#ååååå$ååååå%ååååå&ååååå'ååååå