IMD 1.16: 1/06/2007 13:09:25 FOGCPM.182 --FOGCPM182OXEGE DOCu EGELIB SUBOXASM MACOXEGE CHR.OXEGE H OXEGE RELD !"#$OXEGE1 C %&'OXEGE2 C ()OXEGE3 C *OXEGE4 C +,-OXEGE5 C .OXEGE6 C "/0123OXEGE7 C 456OXEGE8 C 789SAMPLE COMU:;<=>?@ABCDSAMPLE C EFGTEST BAS&HIJKLBANKLOOKCOMMBANKLOOKASMNOPQBANKLOOKDOC RSBCOPY COM TUBCOPY DOC$VWXYZLIST COM[LIST AQMJ\]^_`abcdeLIST DOC4fghijklLISTEX COMmLISTEX AQMJnopqrstuvwLOMEM COMxLOMEM ASM,yz{|}~SETSCB COMSETSCB AQMBSETSCB DOC'SCB TXT6CPMPATCHLTRFINDCHARBAS-09-15 87 -CPM182 DOC&This is the disk name.   n  {  *  %q:ʡ\ ͛ ERROR::o&v~_#~Ẅ́ ͛ [Press ESC to continue]háOut of MemoryInvalid CommandI/O FailureNot FoundDisk Full or R/ONot ChangedCannot Reformat\ ͛ I/O working... please WAITG*~x= x!YXNot FoundDisk Full or R/ONot ChangedCannot Reformat\ ͛ I/O working... p; pointer = GLprinter = malloc( 500 ); counter = 0; /* Get printer name */ fscanf( pdatfile, "%s", GLprname ); while( .hm 1 .op .he OXEGE Documentation, Page # OXEGE.DOC ========= Documentation for the Osborne Executive Enhanced Graphics Environment DEFINITIONS IN OXEGE.H: ======================= Ascii character definitions: note that CR (carriage return) and LF (linefeed) are defined in STDIO.H. ESC Escape character (decimal 27) BLANK Blank character (decimal 32) Definitions for video attributes: The first five definitions apply to the video attribute byte in RAM. These may be added to each other by the C language inclusive or ( | ); thus, if cpoke() is used with the attribute set to ATTDIM | ATTALT, the character poked will be in dim video, and will use the alternate character set. ATTDIM Dim attribute bit ATTBRT Bright attribute bit ATTUND Underline attribute bit ATTBLK Blinking attribute bit ATTALT Alternate character set attribute bit This last definition applies only to the character byte, so that if cpoke() is used, the character 'K' | ATTINV will produce an inverse-video uppercase 'K'. ATTINV Inverse video attribute bit The spoke() command uses a special bit of the attribute byte to assign inverse video: INVATT Inverse video attribute flag Special character definitions: These define characters in the alternate character set OXEGE.CHR, which must be loaded into the alternate character set in RAM before OXEGE will be effective. OUTDIM This defines the initial character in a series of characters which will produce a bordered outline against a 1/4 video background. This may be used with OXEGE routine outline(). If the inverse video bit is set with this character (OUTDIM | ATTINV), the outline will appear in inverse (thus, against a 3/4 video background). .cp 4 OUTBLK This defines the initial character in a series of characters which will produce a bordered outline against a blank video background. This may be used with OXEGE routine outline(). If the inverse video bit is set with this character (OUTBLK | ATTINV), the outline will appear in inverse (thus against a full video background). BLOCK This defines the 1/4 video block, which may be used in the OXEGE fill() routine. If the inverse video attribute bit is set with this character (BLOCK | ATTINV), it will appear in inverse (and thus as a 3/4 video block). ROUTINES IN MODULE OXEGE1: ========================== The first three routines in this module utilize the CP/M Plus AUXILIARY device, which may be assigned to the printer or modem port of your Osborne Executive. The baud rate is set externally. I find that when I first boot up my Executive, the device functions properly, but after any calls to the RS232 ports, it no longer functions (thus after using a MODEM program, the device does not work). AIS - AUXILIARY DEVICE INPUT STATUS ais() This routine checks to see if a character is available in the AUX: device buffer. INPUT: none. RETURNS: AREADY (defined in OXEGE.H) if a character is ready, else NULL. AI - AUXILIARY DEVICE INPUT ai() This routine receives one character from the AUX: device buffer. INPUT: none. RETURNS: the first character in the AUX: buffer. AO - AUXILIARY DEVICE OUTPUT ao( character ) int character; This routine sends one character to the AUX: device. INPUT: the to be sent. RETURNS: none. .cp 4 CIS - CONSOLE DEVICE INPUT STATUS cis() This routine checks to see if a character is ready in the CON: device buffer. INPUT: none. RETURNS: CREADY (defined in OXEGE.H) if a character is ready, else NULL. CI - CONSOLE DEVICE INPUT ci() This routine receives the first character in the CON: device buffer. If a character is not available, it waits. INPUT: none. RETURNS: the character input. CO - CONSOLE DEVICE OUTPUT co( character ) int character; This routine sends a character to the CON: device. It ac- compishes the same thing as the C language putchar() routine, although a little quicker. INPUT: the to be output. RETURNS: none. LO - LIST DEVICE OUTPUT: lo( character ) ROUTINES IN MODULE OXEGE2: ========================= CARRIAGE RETURN AND LINE FEED crl() This function simply issues a carriage-return linefeed com- bination. INPUT: none. RETURNS: none. CURSOR MOVE DOWN dwn( lines ) int lines; This routine moves the cursor down a specified number of lines. INPUT: the number of lines to move down. RETURNS: none. .cp 4 CURSOR MOVE RIGHT rgt( columns ) int columns; This routine moves the cursor right (non-destructive) a specified number of columns. INPUT: the number of columns to move right. RETURNS: none. STRING OF BLANK CHARACTERS blk( length ) int length; This routine outputs a string of blank characters (thus destructive cursor-right movement). INPUT: the length in columns of blank spaces to output. RETURNS: none. CLEAR SCREEN cls() This routine clears the screen and places the cursor in the home position. INPUT: none. RETURNS: none. The next routines send out video control sequences on the Osborne Executive. NOTE that this does not affect characters poked into video RAM (thus using the OXEGE cpoke(), spoke(), and other commands that directly address video RAM). DIM DISPLAY dim() This routine turns on dim video for all subsequent characters output through the BDOS (until a brt() command is issued). INPUT: none. RETURNS: none. BRIGHT DISPLAY brt() This routine turns off dim video for all subsequent characters output through the BDOS (until a dim() command is issued). INPUT: none. RETURNS: none. .cp 6 ENTER GRAPHICS MODE gra() This routine sets the Executive terminal in graphics mode, so that BDOS characters 0-31 will appear as graphics characters rather than as command characters (until a grx() command is issued). INPUT: none. RETURNS: none. EXIT GRAPHICS MODE grx() This routine returns the Executive terminal to text mode, so that BDOS characters 0-31 will be interpreted as command characters rather than graphics characters (until another gra() command is issued). INPUT: none. RETURNS: none. INVERSE VIDEO inv() This routine turns on inverse video for the Executive, so that all subsequent characters output through the BDOS will appear in inverse (until an nnx() command is issued). INPUT: none. RETURNS: none. END INVERSE VIDEO nnv() This routine turns off inverse video for the Executive, so that all subsequent characters output through the BDOS will appear normally (until another inv() command is issued). INPUT: none. RETURNS: none. UNDERLINE unl() This routine turns on underlining, so that all subsequent characters out put through the BDOS CON: device will be underlined (until an nnl() command is issued). INPUT: none. RETURNS: none. END UNDERLINE nnl() This routine turns off underlining, so that all subsequent characters output through the BDOS CON: device will appear normally (until another unl() command is issued). INPUT: none. RETURNS: none. BLINK blink() This routine turns on blinking, so that all subsequent characters output through the BDOS CON: device will blink (until a bloff() command is issued). INPUT: none. RETURNS: none. END BLINK bloff() This routine turns off blinking, so that all subsequent characters output through the BDOS CON: device will not blink (until another blink() command is issued). INPUT: none. RETURNS: none. ROUTINES IN MODULE OXEGE3: ========================== ADDRESS CURSOR: adr( line, column) int line, column; This routine addresses the cursor to a specified line and column. INPUT: (range 0-23); (range 0-79). RETURNS: none. CENTERED TITLE: center( message ) char message[]; This routine prints a title centered on the Executive's 80- column screen. Be sure to address the cursor to the line you want the title to appear on before you call this routine. INPUT: a pointer to the string of characters to be centered. RETURNS: none. DEFINE CURSOR TYPE: defcursor( attribute ) int attribute; This routine defines cursor types for the Executive. Types available are: 0 Invisible 1 Blinking Block 2 Steady Block 3 Blinking Underline 4 Steady Underline INPUT: the cursor type (range 0-4). RETURNS: none. ROUTINES IN MODULE OXEGE4: ========================== POKE CHARACTER AND ATTRIBUTE INTO VIDEO RAM: cpoke( line, column, character, attribute ) int line, column, character, attribute; This routine pokes a character and attribute into video RAM at a specified line and column. ATTINV can be ORed to the character, and attributes can be ORed using the bit definitions in OXEGE.H. INPUT: (range 0-23); (range 0-79); (range 0-255), inverse bit can be set; of which only bits 4, 5, 6, and 7 are significant (defined in OXEGE.H). RETURNS: none. POKE STRING INTO VIDEO RAM: spoke( line, column, string, attribute ) int line, column, attribute; char string[]; This routine pokes a string of characters with a speci- fied attribute into video RAM beginning at a specified line and column. Attributes can be ORed using the bit definitions in OXEGE.H, and inverse can be set by setting the zero bit of the attribute bit, defined as INVATT in OXEGE.H. INPUT: (range 0-23); (range 0-79); a pointer to a null-terminated string to be output; of which only bits 0, 4, 5, 6, and 7 are significant (defined in OXEGE.H).  RETURNS: none. DISPLAY LARGE DIGIT: bigdigit( number, line, column ) int number, line, column; This routine uses alternate character definitions in OXEGE.CHR to produce a large digit on the screen. NOTE that the digit will occupy two spaces across and down. INPUT: to be ouput (range 0-9); (range 0-22); (range 0-78). RETURNS: none. LOGO: logo( line, column ) int line, column; SWITCH TO BANK 7 OR BACK TO 1: bank( number ) int number; This routine switches to bank 7 and back. Code executed after a call to bank( 7 ) must be located below location C000. This is called by cpoke(), spoke(), and bigdigit(). INPUT: of the bank (7 or 1). RETURNS: none. ROUTINES IN MODULE OXEGE5: ========================== DEFINE A WINDOW: defwindow( number, top, left, bottom, right ) int number, top, left, bottom, right; SET A DEFINED WINDOW setwindow( number ) int number; DEFINE BACKGROUND bkgnd( attribute ) int attribute; ROUTINES IN MODULE OXEGE6: ========================== REMEMBER OR RESTORE A WINDOW AREA: savewindow( top, left, bottom, right, function, wnumber ) int top, left, bottom, right, function, wnumber; FILL AN AREA: fill( top, left, bottom, right, character, atttribute ) int top, left, bottom, right, character, attribute; DRAW AN OUTLINE: outline( top, left, bottom, right, character, attribute ) int top, left, bottom, right, character, attribute; .cp 6 ROUTINES IN MODULE OXEGE7: ========================== The routines in module OXEGE7 all have to deal with time and date based on the Executive's system clock/calendar. They rely on the following global integers: year Current year month Current month day Current day of the month hour Current hour (24-hour format) minute Current minute second Current second jdate Relative Julian date GET TIME FROM INTERNAL CLOCK gettime() This routine sets the global integers hour, minute, and second based on the Executive's internal clock. The routine converts the time from BCD to binary format. INPUT: none. RETURNS: hour, minute, and second are set and can be accessed globally. CONVERT FROM BINARY CODED DECIMAL TO BINARY: bcdbin( number ) int number; This routine is called by gettime() to convert the hour, minute, and second from the BCD (binary-coded decimal) format in which it is stored in RAM into ordinary binary format. Users who set the time by gettime do NOT need to call this routine. INPUT: BCD to be converted (integer). RETURNS: the number converted to binary format. CONVERT FROM BINARY TO BINARY CODED DECIMAL: binbcd( number ) int number; GET DATE FROM SYSTEM MEMORY getdate() This routine sets the global integers year, month, and day based on the date stored in the Executive's internal clock. The routine converts the date from the relative julian date that CP/M Plus uses to ordinary integers. INPUT: none. RETURNS: year, month, and day are set, and can be accessed globally. .cp 6 CONVERT CALENDAR DATE TO RELATIVE JULIAN DATE ctoj() This routine can be called in order to convert a year month and day to a relative julian date that can be stored by CP/M Plus. INPUT: the routine takes its input from the global integers year, month, and day. RETURNS: the relative julian date, an integer indicating the number of days elapsed since 31 December 1978, stored as the global integer jdate. CONVERT RELATIVE JULIAN DATE TO CALENDAR DATE jtoc() This routine is called by getdate() to convert the relative julian date used by CP/M Plus to a calendar date (year, month, and day of the month). Users of getdate() do NOT have to call this routine, since it is called by getdate(). INPUT: This routine takes its input from the global integer . RETURNS: Global integers , , and are set and can be accessed globally. RETURN WEEK-DAY NUMBER BASED ON RELATIVE JULIAN DATE: nwkday( jd ) int jd; RETURN WEEK-DAY STRING BASED ON WEEK-DAY NUMBER: swkday( n ) int n; RETURN MONTH STRING BASED ON MONTH NUMBER: smonth( n ) int n; MODULES IN OXEGE8: ================== SET UP MENU FIELD: setmenu( itemnumber, length, title ) int itemnumber, length; EXECUTE A MENU: menu( line, column, across, down, length, draw ) int line, column, across, down, length, draw; .cp 6 MODULES IN OXEGE9: ================== WAIT FOR CONSOLE INPUT: wait( eatit ) int eatit; GELIB SUB `XASM MAC aXEGE CHR cXEGE H iXEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C lib80 2_ΑshJjVCfApE mj `5M/! pG9԰+A:9CRZ#  m39ʹ@nԾ@{f$ʹe+G$j `$Jof`ܱAfVJpGȞp5̛E3V;W+nΐE3VBGH#R]hJh9g!uv UQc˒$> ˫p`ܱ6GH9g5%{\ Az]@G`F2r0huQGϐ:+"\|u<ʹ{T2 9gH$j \.>:zo9 ÞCf {,M Ԃ+BGR#j `Jp7\||tv3__qG43q3+Ȇ,BK; OXASM.MAC ; ; Assembly-language routines for OXEGE .Z80 ext FIch ext FIat ext FIleft ext FItop ext FIright ext FIbot ext FIfc ext FInl ext MMfrom ext MMto ext MMsize fasm:: ld a,65 ; bank 7 reference out (0),a ; enter bank 7 ld hl,FIleft ; hl = pointer to column ld d,(hl) ; now d = column counter ld hl,FItop ; hl = pointer to line ld e,(hl) ; now e = line counter ld ix,0c000h ; video character RAM ld iy,0d000h ; video attribute RAM ld bc,(FIfc) ; bc = first character offset add ix,bc ; add f.c. offest to character pointer add iy,bc ; add f.c. offset to line pointer ld hl,FIch ; hl = pointer to character ld b,(hl) ; now b = character ld hl,FIat ; hl = pointer to attribute ld c,(hl) ; floop: ld (ix),b ; poke character ld (iy),c ; poke attribute inc ix ; increment character pointer inc iy ; increment attribute pointer inc d ; increment column counter ld hl,(FIright) ; right column in l ld a,d ; current column to a register cp l ; is it right column? jp z,nextl ; then next line jp floop ; else loop nextl: inc e ; increment line counter ld hl,(FIbot) ; bottom line in l ld a,e ; load a with line counter cp l ; is it the bottom? jp z,done ; then we're done ld hl,FIleft ; hl = pointer to left column ld d,(hl) ; d = column counter push bc ; save bc for math operation ld bc,(FInl) ; bc = count to next line add ix,bc ; add it to character pointer add iy,bc ; add it to attribute pointer pop bc ; restore bc after math jp floop ; and do the next line done: ld a,1 ; bank 1 reference out (0),a ; enter bank 1 ret ; return bank1:: ld a,1 out (0),a ret bank7:: ld a,65 out (0),a ret mmov:: ld hl,(MMfrom) ld de,(MMto) ld bc,(MMsize) ldir ret  out (0),a ret bank7:: ld a,65 out (0),a ret mmov:: ld hl,(MMfrom) ld de,(MMto) ldXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C :100000000000001F3F3030303030FFFFFFFFFFFFA8 :10001000000000F8FC1C1C1C1C1CFFFFFFFFFFFF66 :1000200000000000010300000000FFFFFFFFFFFFD2 :10003000000000C0E0E0E0E0E0E0FFFFFFFFFFFFC6 :100040000000001F3F300000001FFFFFFFFFFFFF09 :10005000000000F8FC1C1C1C1CFCFFFFFFFFFFFF46 :100060000000001F3F3000000001FFFFFFFFFFFF07 :10007000000000F8FC1C1C1C1CFCFFFFFFFFFFFF26 :100080000000003030303030303FFFFFFFFFFFFF17 :10009000000000707070707070FCFFFFFFFFFFFFCA :1000A0000000001F3F303030303FFFFFFFFFFFFFF9 :1000B000000000F8FC0C000000F8FFFFFFFFFFFF4E :1000C0000000001F3F303030303FFFFFFFFFFFFFD9 :1000D000000000F0F818000000F8FFFFFFFFFFFF2E :1000E0000000001F3F3000000000FFFFFFFFFFFF88 :1000F000000000F8FC1C38387070FFFFFFFFFFFFA6 :100100000000001F3F303030301FFFFFFFFFFFFFB8 :10011000000000F8FC1C1C1C1CF8FFFFFFFFFFFF89 :100120000000001F3F303030303FFFFFFFFFFFFF78 :10013000000000F8FC1C1C1C1CFCFFFFFFFFFFFF65 :1001400000000000003C3C3C0000FFFFFFFFFFFF01 :10015000000000000000007F007FFFFFFFFFFFFFA7 :1001600000000000000000FF00FFFFFFFFFFFFFF97 :100170000000003FFFF0F0FFF0FFFFFFFFFFFFFF79 :10018000000000FFFF0000FF00FFFFFFFFFFFFFF79 :10019000000000E0F87878F878F8FFFFFFFFFFFF35 :1001A00000000000000000000000FFFFFFFFFFFF55 :1001B000000000FF0000FF000000FFFFFFFFFFFF47 :1001C0002424242720203F000000FFFFFFFFFFFF23 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F000242424E40404FC000000FFFFFFFFFFFFB1 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100000183C3C181800180000FFFFFFFFFFFF0C :10022000006C6C6C000000000000FFFFFFFFFFFF90 :100230000024247E247E24240000FFFFFFFFFFFF14 :1002400000183E583C1A7C180000FFFFFFFFFFFF1C :100250000066660C183066660000FFFFFFFFFFFFB8 :1002600000386C6C386D673E0300FFFFFFFFFFFF37 :1002700000181830000000000000FFFFFFFFFFFF24 :1002800000183060606030180000FFFFFFFFFFFFC4 :1002900000180C0606060C180000FFFFFFFFFFFF0A :1002A00000185A3C183C5A180000FFFFFFFFFFFFE0 :1002B000000018187E1818000000FFFFFFFFFFFF66 :1002C00000000000000018183040FFFFFFFFFFFF94 :1002D000000000007E7E00000000FFFFFFFFFFFF28 :1002E00000000000000018180000FFFFFFFFFFFFE4 :1002F0000002060C183060400000FFFFFFFFFFFF08 :10030000003C666E7E76663C0000FFFFFFFFFFFF4D :10031000001838181818183C0000FFFFFFFFFFFFF7 :10032000003C66063C60607E0000FFFFFFFFFFFFB1 :10033000003C66061C06663C0000FFFFFFFFFFFF57 :10034000000C1C2C6C7E0C0C0000FFFFFFFFFFFF5D :10035000007E60607C06663C0000FFFFFFFFFFFF41 :10036000001E30607C66663C0000FFFFFFFFFFFF61 :10037000007E06060C1830600000FFFFFFFFFFFF45 :10038000003C66663C66663C0000FFFFFFFFFFFF27 :10039000003C66663E060C780000FFFFFFFFFFFF93 :1003A00000001818000018180000FFFFFFFFFFFFF3 :1003B00000001818000018183040FFFFFFFFFFFF73 :1003C000000C18306030180C0000FFFFFFFFFFFF2B :1003D0000000007E007E00000000FFFFFFFFFFFF27 :1003E000E6E6E6E6E6E6E6E6E6E6FFFFFFFFFFFF17 :1003F00067676767676767676767FFFFFFFFFFFFFD :1004000030303030303F1F000000FFFFFFFFFFFFA4 :100410001C1C1C1C1CFCF8000000FFFFFFFFFFFF62 :1004200000000000000003000000FFFFFFFFFFFFCF :10043000E0E0E0E0E0E0F8000000FFFFFFFFFFFF8A :100440003F303030303F1F000000FFFFFFFFFFFF55 :10045000F80000000CFCF8000000FFFFFFFFFFFFAA :1004600001000000181F0F000000FFFFFFFFFFFF4B :10047000FC1C1C1C1CFCF8000000FFFFFFFFFFFF22 :100480001F000000000000000000FFFFFFFFFFFF53 :10049000FC7070707070F8000000FFFFFFFFFFFF3E :1004A0001F000000303F1F000000FFFFFFFFFFFFA5 :1004B000FC1C1C1C1CFCF8000000FFFFFFFFFFFFE2 :1004C0003F303030303F1F000000FFFFFFFFFFFFD5 :1004D000FC1C1C1C1CFCF8000000FFFFFFFFFFFFC2 :1004E00000000101030307000000FFFFFFFFFFFF03 :1004F000E0E0C0C0808000000000FFFFFFFFFFFFC2 :100500001F303030303F1F000000FFFFFFFFFFFFB4 :10051000F81C1C1C1CFCF8000000FFFFFFFFFFFF85 :100520001F000000181F0F000000FFFFFFFFFFFF6C :10053000FC1C1C1C1CFCF8000000FFFFFFFFFFFF61 :1005400000003C3C3C0000000000FFFFFFFFFFFFFD :10055000007F007F000000000000FFFFFFFFFFFFA3 :1005600000FF00FF000000000000FFFFFFFFFFFF93 :10057000F0FFF0FFF0FF3F000000FFFFFFFFFFFF75 :1005800000FF00FF00FFFF000000FFFFFFFFFFFF75 :1005900078F878F878F8E0000000FFFFFFFFFFFF31 :1005A000FF00001F3F3030303030FFFFFFFFFFFF04 :1005B000007C60606060607C0000FFFFFFFFFFFF69 :1005C00000406030180C06020000FFFFFFFFFFFF35 :1005D000007C0C0C0C0C0C7C0000FFFFFFFFFFFFED :1005E00000183C66420000000000FFFFFFFFFFFF15 :1005F000000000000000007E0000FFFFFFFFFFFF83 :1006000000303018000000000000FFFFFFFFFFFF78 :100610000000003E6666663E0000FFFFFFFFFFFF32 :100620000060607C6666667C0000FFFFFFFFFFFFE6 :100630000000003E6060603E0000FFFFFFFFFFFF24 :100640000006063E6666663E0000FFFFFFFFFFFFF6 :100650000000003C667E603E0000FFFFFFFFFFFFE2 :10066000001E307C303030300000FFFFFFFFFFFF06 :100670000000003E6666663E067CFFFFFFFFFFFF50 :100680000060607C666666660000FFFFFFFFFFFF9C :1006900000001800181818180000FFFFFFFFFFFFE8 :1006A00000000C000C0C0C0C4C38FFFFFFFFFFFF90 :1006B000AA55AA54A852A8428822FFFFFFFFFFFFB5 :1006C00088218A258A15AA55AA55FFFFFFFFFFFF3B :1006D000C0C0C0C0C0C0C0C0C0C0FFFFFFFFFFFFA0 :1006E00003030303030303030303FFFFFFFFFFFFF2 :1006F000FFFF00FF000000000000FFFFFFFFFFFF03 :10070000000000000000FF00FFFFFFFFFFFFFFFFF2 :10071000FFFFC0FFC0C0C0C0C0C0FFFFFFFFFFFFA2 :10072000FFFF03FF030303030303FFFFFFFFFFFFBD :10073000C0C0C0C0C0C0FFC0FFFFFFFFFFFFFFFF82 :10074000030303030303FF03FFFFFFFFFFFFFFFF9D :10075000C8C2C8C2C8C2C8C2C8C2FFFFFFFFFFFFED :1007600083238323832383238323FFFFFFFFFFFF51 :10077000FFFF00FF002288228822FFFFFFFFFFFF0C :10078000882288228800FF00FFFFFFFFFFFFFFFF96 :10079000FFFFC0FFC0C2C8C2C8C2FFFFFFFFFFFF0C :1007A000FFFF03FF032383238323FFFFFFFFFFFFDD :1007B000C8C2C8C2C8C0FFC0FFFFFFFFFFFFFFFFE6 :1007C000832383238303FF03FFFFFFFFFFFFFFFF5D :1007D00088228822882288228822FFFFFFFFFFFFCD :1007E000AA55AA55AA55AA55AA55FFFFFFFFFFFF14 :1007F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0602 :00000000 XEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C /* OXEGE.H ** ** Definitions for OXEGE. */ #define ESC 27 #define FF 12 #define CREADY 1 #define AREADY 255 #define ATTDIM 0 #define ATTBRT 128 #define ATTUND 64 #define ATTBLK 32 #define ATTALT 16 #define ATTINV 128 #define INVATT 1 #define OUTDIM 117 #define OUTBLK 109 #define BLOCK 125 #define BLANK 32 #define FILL4 127 /* Full block for fill */ #define FILL3 (125 | ATTINV) /* 3/4 block for fill */ #define FILL2 126 /* 1/2 block for fill */ #define FILL1 125 /* 1/4 block for fill */ #define DATELOC 63732 #define HOURLOC 63734 #define MINUTELOC 63735 #define SECONDLOC 63736 #define VIDEO_RAM 49152 #define VIDEO_ATT 53248 #define SMALL /* for compilation with Small-C */ #ifdef SMALL #define DOS Ubdos #else #define DOS _bdos #define CR 13 #define LF 10 #endif lation with Small-C */ #ifdef SMALL #defiXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C QTԠTU%$)@ԨB9D B3@(r!/Xr,ɌdED%%H`CCDSGITU%$(ȰSPOKEEtIUTUD49@*ijsQN`EtI@Ԕ^b.f :pXū*+٠&2ӑc$@ &2T"@QM-N:RU'QN TDT85%9%RSETMENQSe^0BGhPH9D 4u@ h 0!(f`(,HD 6*ñ`"Pr B]bV@ !B]b[ 6:! 63@ՕbD 6À:!@6ʀ3lPjʮ" gbj|eP`Ͷ (ͷ(0f`((fXfPm)h]b0w.Q Q:  Vô r ! !d2 @ P ^ͻ ˔U@M]b`QYrH(b@ru@mAmi 6A@mp  6A (4f(4f(<fP(<fX0f0ˬB3h|f(9|#|f Y^bf ;!.U{4f  ÿB>n B3mD dD 6:!`63n 68\꫁@˭f@7(f'X,f0&hrD!@6:!`63j EmVU[ͪL:n!.Q ͯNͨ Lڈr֏|!. dt B\@h@ 68\QP͹@NXͻ Lf@#Օ~ `rm4@.)pK  U!`C@ .0p@ >hB 9D!69D 6!6@e! \ ! !  Vb\@ٷ rCm{rAmuCmf@6e!T ! ! fbkٵ uCm 69GVmuA@! 6XwB _,BKGND44Dh(CCDSGI€4448CCLT44THp CCNEՁd45EϰCCPINT455T(CCSWITd4EECI48ϸCPOKEDTetFFLUSHTDT8HMALLOCDTXMINITe4UDT SPOKEe5E$5ϸ TASKSQM4D5=9Q"YEARRU`DU(5%9UQSECOND`$DQQ%6BCDBINS dtUDDH)Q=CTOJV`e5tDM5=9Q"P5C`KFp <>>bD !{>T B]bR.VmPP9u_m^pYECT >m(EBT(>m(EBT0>m(EC,KB\0:!4fr`ZQ(@k0s!64YE8\Kb D |f 9D!|f  %!. ͮ +4P`{6Y,Q9r Bo6܀ CC@ d@epXhw!+b@ ˬB3mD2"(D @6bB*@VU@ ;H!VUP`0Y,V+B\ O. ͯ,j!.QUu@mfpXfݰXf`mpB+8dEA @*Qͻ. ͫ .͠A6o`P ͢@NQ uSZ,(|Z8TH @69D48*@͢MK64YhE@T"]bz@]gū C*`Y,Q9r@mKu@mtu 63hʯZ<Yd"3o d\.V+i%G4 ãb\a1 6dXt| CR@,:>!la6hr ] @PILn2O id0@Cd0@s)e9 'Pu9̆r4 'Lt:rXv C{@,;!l6Kh #%{4(ýba1 d`2Xw CG,;! FKi#%{w Y@ WP0 @ @`p,$g@ L Z0`d$Y"TR,  D`A, ERqJ*  TU)2)@E& @D!`6!6kHDfP E >VU(f XfuC@mfڀ9r@muPmX4fPm |Zf'(fа'(f '(Ͱ B3hB 3i@B3ix|f@V !  !jʱB`Q@`U W6X, ͬNQ ͮNQͯ`NQ aX,YrYB\&`\Vm jD! 6: 6! >@r,$͹Gѕ`\SAm^p!(͡ b+!H "DWB3hD hfҀ7XfXfP0Ȋ@mC@ʹ@.(ͩaZ` +o8y!0AKMK!Da '7NDaAU=/YVx bÂ{^]n_ -0$B 3jB 3nD D!6D 6遺 6D 6@@˔B 3o@|f0'X]b`|ܢ@A@CA Pe!P>3@X]b`G e!!! !!H"\`VA36:    .Q ͰQIAb@ruAmrAm@(fڠG(fPGXf԰G(f@ rAmrˬB3n#B 3o@#B3ox D D 69GFmuA!"\`E\`G]bpI\`M\`N\36:  ڄ  ڪ  ڸ .Q ͬ`QA]b@ru@ " bDVrDVU_] % WjH)q\hh10,hi)i1P<hi hj )ʑZhjj*,tj h`((IP((qސ,)(*I(p*HP ɨ\ɩi+HXꪉ)Р J cJQ`gJ擀QM`dDTetMQ]%:BKGNDMl!|f  Y!D` Gm`Am(ͤ@ ͥ 2Y!" \ 60X.+" \ 60Y">k Bs9Gmo`\.V(D` Gmy`D!|f؀r,&`\Pr,:dc*Z:r$e,!)k|t""+GZ2*JtQM T5XMA=-INVERTSDt %%BANK1PSS1 @A`B`D`F@`H34uA`ZQ@gū @m'r, ږ ڰ ھ  Yu@ hQ0ͮQK@b`ru@(͠lͱQ(͵  e!2 ۊY٠@QA@,( 4 ۚpYjʦ`" ~n(e!,pX } @hþ HXf`m@XfmDX*> 6D 6@EX!!!B9GFmuA!f^ N!.Ͱ`,ڤ!. T} @ mrA m@60!T!!(!#6:  B!rFl $B3ox B3iB 3i8B3mB3i( B9GFmuA! !L"\PVbM@ e!@ !#6:  .QͱNQ(ͳ NͭA2 Q@b@ru@m@(fܐ rA@mu@@m@Xf '( r˭hX2> E |Zh2Y# Ld-0%H)q:c4H)f,hhq hhhq,!hh1,hi)i1hi(hj )ʑ@ j hP)ȪJPɨp jIӀQL4E( 9QJDEFCURMc!|f Y!D@ Gm`\.V(D@ Gm"`D |f bGh !|f  r,QO"p>krB#e>kh(QP hhh1 5hʈQjȈjQ`[jHꑔp 8QL45 $ ]:RGTГ448 %6BRT`4u$ IbINVӓ5T 992BLINKPёZ4YB 9Gm`Xr  !  60D pX0XfTB3i86! 60D pXRulb@ˬB3jE!YVUQ\"r`\PͰ@ ;*dC@(͵ H6r,۔@Qu@,lY|! 60Y">o!  60D&p|fР $B9Gm`H(ͣ,H6r,RQMX,lY!5 6Y">j Bl9Gm^`D!|fրr,dC`(ͯ, xY QdX">l I)qؐI0hhh1hj )ʑ hiqphjIh0hK߀-i)BiWjɓQL`48 &AOT$4 >LOU DUE %9BRXU %EQI5%:GLPORTUe\Q 0X, Q B,Hr@hldA`(rL\`D `B9G&m>`Y"0!>3jp@Qͫ`Q X@,HrB(Ͷ ,r,6u@ hWkj´ ;4! 6̀Y"h!6؀X"h>l !\Xf  'fū*ٶeQ 0  ۞@ Hf ;!,4Q l@X,4Q l@X,4Q l@X,4Q l@X,4Q l@X,4@Q l@X,4@Q l@X,4Q l@X,HpXѕِswYh }Y >̀6h2PS#69 M&2,Sc< 1R3S#55 MaR:c` %N:@91Q;2ԕ#`-%9B: 1=UQB;4# IaMQR:@TRS@ Qb;bU#.U =Np1R3S#55 MaR:c`ξEcC6\}B{l/* OXEGE1.C ** ** Single-character inout/output (and status) routines ** NOTE that these routines are specific to CP/M Plus and ** will not function under CP/M 2.2. */ #include "a:stdio.h" #include "b:oxege.h" #define INPUT 253 /* AIS - AUX: INPUT STATUS */ ais() { return DOS ( 7, NULL ); } /* AI - AUX: INPUT */ ai() { return DOS ( 3, NULL ); } /* AO - AUX: OUTPUT */ ao( character ) int character; { DOS ( 4, character ); } /* CIS - CON: INPUT STATUS */ cis() { return DOS ( 11, NULL ); } /* CI - CON: INPUT */ ci() { return DOS ( 6, INPUT ); } /* CO - CON: OUTPUT */ co( character ) int character; { DOS ( 6, character ); } /* LO - LST: OUTPUT */ lo( character ) int character; { Ubdos( 5, character ); } #define MODCTL 13 #define MODDAT 12 /* RXSTAT -- Receive Status */ rxstat() { outp( MODCTL, 16 ); return( inp( MODCTL ) & 1 ); } /* RX - Receive a byte */ rx() { while ( rxstat() == NULL ) { ; } return inp( MODDAT ); } /* TXSTAT - TRANSMIT STATUS */ txstat() { outp( MODCTL, 16 ); return( inp( MODCTL ) & 4 ); } /* TX - Transmit a byte */ tx( data ) int data; { int counter; counter = 0; while( counter < 10000 ) { if ( txstat() != NULL ) { outp( MODDAT, (data & 127) ); return 1; } ++counter; } return 0; } /* TERMINIT -- Initialize RS-232 communications */ terminit() { outp( MODCTL, 0 ); outp( MODCTL, 24 ); outp( MODCTL, 4 ); outp( MODCTL, 68 ); outp( MODCTL, 3 ); outp( MODCTL, 193 ); outp( MODCTL, 5 ); outp( MODCTL, 234 ); } /* PORT I/O FOR SMALL-C COMPILER */ #ifdef SMALL char GLport; char GLdata; inp( port ) int port; { GLport = port; #asm .z80 ld hl,GLport ld c,(hl) in a,(c) ld (hl),a .8080 #endasm return GLport; } outp( port, data ) int port, data; { GLport = port; GLdata = data; #asm .z80 ld hl,GLport ld c,(hl) ld hl,GLdata ld a,(hl) out (c),a  .8080 #endasm } #endif Ldata = data; #asm .z80 ld hl,GLport ld c,(hl) ld hl,GLdata ld a,(hl) out (c),a GELIB SUB `XASM MAC aXEGE CHR cXEGE H iXEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C =BYT,idAџZ )~Y IA^TBrhYfdA /* OXEGE2.C ** ** Video display characteristics routines. ** Note that most of these routines are highly specific to ** the Osborne Executive. */ #include "a:stdio.h" #include "b:oxege.h" /* CARRIAGE RETURN AND LINE FEED */ crl() { co( CR ); co( LF ); } /* CURSOR MOVE DOWN */ dwn( lines ) int lines; { int count; count = 0; while( count < lines ) { co( 22 ); count = count+1; } } /* CURSOR MOVE RIGHT */ rgt(columns) int columns; { int count; count = 0; while(count ) IɲSt"2EqNBDŽJc a)$%˂N?}"2Yf(:qIHH>V`Bl,h3tnmkXymUMYHlpyvU^cB4D 〮X9]Q#bX+LH]4kG5 =X<Ҏ|TꔅpMQ?#2> ) IɲND##Uذ1֙ unmkJk{*dA;n.$}QgD:5p%b= I3a"/* OXEGE3.C ** ** Cursor definition and manipulation routines, ** Center title routine. */ #include "a:stdio.h" #include "b:oxege.h" /* ADDRESS CURSOR */ adr( line, column) int line; int column; { co( ESC ); co( '=' ); co( line+32 ); co( column+32 ); } /* CENTERED TITLE */ center(message) char message[]; { co( CR ); rgt( ( 80 - strlen( message ) ) / 2 ); puts( message ); } /* DEFINE CURSOR TYPE */ defcursor( attribute ) int attribute; { co( ESC ); co( 46 ); co( attribute+48 ); }  /* DEFINE CURSOR TYPE */ defcursor( attribute ) int attribute; { co( ESC ); coGELIB SUB `XASM MAC aXEGE CHR cXEGE H iXEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C /* OXEGE4.C ** ** Direct Video RAM manipulation routines. NOTE that ** these routones are highly specific to the Osborne ** Executive. */ #include "a:stdio.h" #include "b:oxege.h" #ifndef SMALL extern void bank1(), bank7(); #endif /* POKE CHARACTER AND ATTRIBUTE INTO VIDEO RAM */ cpoke( line, column, character, attribute ) int line, column, character, attribute; { fill( line, column, line, column, character, attribute ); } /* POKE STRING INTO VIDEO RAM */ spoke( line, column, string, attribute ) int line, column, attribute; char *string; { /* char *chptr; */ /* int c1, inverse; */ /* c1 = column; */ /* inverse = 0; */ if ( attribute % 16 == NULL ) { invert( string ); } fill( line, column, line, column + strlen( string )-1, ' ', attribute ); bank( 7 ); memmov( string, VIDEO_RAM+(line*128)+column, strlen( string ) ); bank( 1 ); /* chptr = string; while ( *chptr != 0 ) { cpoke( line, c1, *chptr | inverse, attribute ); ++c1; ++chptr; }  */ } /* INVERT STRING (CONVERT TO INVERSE VIDEO) */ invert( string ) char string[]; { int counter; counter = 0; while( string[counter] != NULL ) { string[counter] = string[counter] | ATTINV ; ++counter; } } /* LOGO ** ** Osborne LOGO using OXEGE.CHR */ logo( l, c ) int l, c; { int l1, c1; char ch; l1 = l; c1 = c; ch = 21; while ( c1 < c+5 ) { cpoke( l1, c1, ch, ATTDIM | ATTALT ); ++ch; ++c1; } ++l1; c1 = c; ch = 85; while ( c1 < c+5 ) { cpoke( l1, c1, ch, ATTDIM | ATTALT ); ++ch; ++c1; } } /* DISPLAY LARGE DIGIT */ bigdigit( number, line, column ) int number, line, column; { cpoke( line, column, number*2 | ATTINV, ATTDIM | ATTALT ); cpoke( line, column+1, number*2+1 | ATTINV, ATTDIM | ATTALT ); cpoke( line+1, column, number*2+64 | ATTINV, ATTDIM | ATTALT ); cpoke( line+1, column+1, number*2+65 | ATTINV, ATTDIM | ATTALT ); } /* SWITCH TO BANK 7 OR BACK TO 1 */ bank( number ) i nt number; { if ( number == 1 ) { ; #ifdef SMALL #asm mvi a,1 out 0 ret #endasm #endif #ifndef SMALL bank1(); #endif } if ( number == 7 ) { ; #ifdef SMALL #asm mvi a,65 out 0 ret #endasm #endif #ifndef SMALL bank7(); #endif } } #ifdef SMALL bank1() { ; #asm .z80 ld a,1 out (0),a ret .8080 #endasm ; } bank7() { ; #asm .z80 ld a,65 out (0),a ret .8080 #endasm ; } #endif et .8080/* 1/4 block for fill */ #define DATELOC 63732 #define HOURLOC 63734 #define MINUTELOC 63735 #define SECONDLOC 63736 #define VIDEO_RAM 49152 #define VIDEO_ATT 53248 #define SMALL /* for compilation with Small-C */ #ifdef SMALL #define DOS Ubdos #else #define DOS _bdos #define CR 13 #define LF 10 #endif lation with Small-C */ #ifdef SMALL #defi"NҠ|ʠ"Æ>ª>2 x!y*>O" <ھG*|/ 2) ) { ++jdate; } } jtoc() { int days, pld, y; pld = (jdate + 671) / 1461; /* previous leap days */ y = (jdate - pld - 1) / 365; year = y + 1978; days = jdate - ((y * 365) + pld); month = 0; while ( days > dpm[ month ] ) { ++month; } day = days - dpm[ month - 1 ]; if ( ((jdate + 671) % 1461) == 0) { day = 29; month = 2; } } nwkday( jd ) int jd; { int d; d = (jd % 7) - 1; if (d < 0) { d += 7; } return d; } swkday( n ) int n; { switch( n ) { case 0: return "Sunday"; break; case 1: return "Monday"; break; case 2: return "Tuesday"; break; case 3: return "Wednesday"; break; case 4: return "Thursday"; break; case 5: return "Friday"; break; case 6: return "Saturday"; break; } } smonth( n ) int n; { switch( n ) { case 1: return "JANUARY"; break; case 2: return "FEBRUARY"; break; case 3: return "MARCH"; break; case 4: return "APRIL"; break; case 5: return "MAY"; break; case 6: return "JUNE"; break; case 7: return "JULY"; break; case 8: return "AUGUST"; break; case 9: return "SEPTEMBER"; break; case 10: return "OCTOBER"; break; case 11: return "NOVEMBER"; break; case 12: return "DECEMBER"; break; } }  return "OCTOBER"; break; case 11: return "NOVEMBER"; break; case 12: return "DECEMBER"; break; }GELIB SUB `XASM MAC aXEGE CHR cXEGE H iXEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C /* OXEGE8.C ** ** Menu handler for OXEGE */ #include "a:stdio.h" #include "b:oxege.h" #define KEYUP 11 #define KEYDOWN 10 #define KEYLEFT 8 #define KEYRIGHT 12 char *items; minit() { items = malloc( 256 ); } setmenu( itemnumber, length, title ) int itemnumber, length; char title[]; { strcpy( items+( (itemnumber-1)*length ), title ); } menu( line, column, across, down, length, draw ) int line, column, across, down, length, draw; { int lendown, lenacross, item, count, command, newitem; if ( draw == 0) { goto drawdone; } lendown = 0; item = 0; lenacross = 0; count = 0; while ( lendown < down ) { while ( lenacross < across ) { while ( count < length ) { cpoke( line+lendown, column+(length*lenacross)+count, ' ' | ATTINV, ATTDIM | ATTUND ); count++; } count = 0; spoke( line+lendown, column+(length*lenacross), items+(length*item), ATTDIM | ATTUND ); item++; lenacross++; } lenacross = 0; lendown++; } drawdone: item = 0; defwindow( 9, line, column, line, column+length-1 ); bkgnd( '=' ); fflush( stdin ); while( 1 ) { while( cis() != CREADY ) { tasks(); } command = ci(); switch( command ) { case CR: bkgnd( 0 ); return item+1; break; case KEYUP: case '8': case 5: newitem = item-across; if (newitem >= 0 ) { item = newitem; } break; case KEYDOWN: case '2': case 24: newitem = item+across; if (newitem < down*across) { item = newitem; } break; case KEYLEFT: case '4': case 19: newitem = item-1; if (newitem >= 0 ) { item = newitem; } break; case KEYRIGHT: case '6': case 4: newitem = item+1; if( newitem < down*across) { item = newitem; } break; } bkgnd( 0 ); defwindow( 9, line + (item / across), column + ((item / down )*length), line + (item / across), column + ((item / down )*length)+length-1 ); bkgnd( '=' ); } } own )*length), line + (item / across), column + ((item / down )*length)+length-1 ); bkgnd( '=' ); } } XEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C =**q=ZpjQnQ֬V ALA3i] @J^#ZwgoaoE*9.kJٓ0lNU:3x SP;En6PdRc9l3L Das#ׂ3TˌrPҘ?R֬Vgӌ3׈VI*9Y*^38מ; \Pn6PdrބP 6L~P g4;4%w0f4ٙ~I7΢$^q!9g )z4C;G4š&;sބP vm2:Bl8Si2K:7Ndb3Kn6.3q,(ڶ$Sdr8[m?/+0CPxnil2P!+# F46 6Gt {Is {D6LYrCzD+!>͇͐!!!!O!u!> ! 9!!!!N!}!> ! 9!!!!3!!> ! 9!! !!> !9!!!!3! !> ! 9!! ! !!}!> ! 9!!! !!~!> ! 9!!! !'!!> ! 9!!(! !1!!> ! 9! ! !!!}!> ! 9! !!!!~!> ! 9! !!!'!!> ! 9! !(!!1!!> ! 9!! !!!}!> ! 9!!!!!~!> ! 9!!!!!!> ! 9!!!!!!> ! 9!!!!"!}!> ! 9!!#!!'!~!> ! 9!!(!!,!!> ! 9!!-!!1!!> ! 9!!(!!F!!>2! 9!!(!!F!m!> ! 9!!)!!E! !> ! 9!!+!;!> !9!!+!N!> !9!!+!a!> !9!!+!t!> !9!!(!!F!!>2! 9w!>͐ BACKGROUND COLORS AVAILABLE: OXEGE windows savethe previous envi-ronment so that itcan be restored. !9!9! *!9!'*!9! *!9!(*!;)!!"*|!;)!;)!;)!;)!}!> ! 9!>!)#!)+ø!;)!"*|!;)!;)!;)!;)!}!> ! 9!9!*!"*|!)#!)+!;)!;)!;)!;)!}!> ! 9!>!)+b!>!)#!)#!)+!)+! 9ɯ͒|͢!9!*!;)<*|&!) !9!;)|ʰ!;)Ô!9*(*í!9***í!9*,*í!9*.*í!9*0*íí*+KYguT!9!;)!;)͍*!͠*!;)!;)͍*͠*>')!;);!;)"(T!;)"*T!;)",T!;)".T!;)"0TT*+ ,! 9!;)*!9!;)!;)!;)͍*!;)!;)͍*͠*)!9!;)*!>!9!;)!;)͍*)!;)/*| ! 9!;)!͠*!;))!9!;)!͠*!;))!;)|i ! ;)!;)!;)>ͬ !;)! ;)!;)>ͬ !;)!*|ʵ ! ;)! ;)!;)>ͬ !;)!;)!;)>ͬ ! 9))!9))!)!;)!*| !;)>t'!>!9!;)}2 }2 ! ;)" ! ;)" !;)" !;)" ! ;)!͠*! ;)" !;)͍*! ;)" >A! V! ^!!K ! F! Npq##* z ð * { ! VK ð >! ;)! ;)!;)! ;)!͍*! ;)! ;)> ! 9! ;)!;)!;)!;)> !9! ;)!;)! ;)!͍*! ;)! ;)! ;)> ! 9!;)!;)!;)!;)> !9!;)! ;)! ;)! ;)!͍*! ;)! ;)> ! 9!;)! ;)!;)!;)> !9! ;)! ;)! ;)!͍*!;)! ;)! ;)> ! 9! ;)! ;)!;)!;)> !9!;)" !;)" " * [ K !;)!;)! ;)! ;)! ;)! ;)> ! 9!*|' !;)>ͽ !;)!;)! ;)! ;)! ;)>͟(!͍*! ! ;)> ! 9!>!;)! ;)!͠*!;)!;)>͟(>ͬ !>!9!*!;)ͭ)|!;)!;)ͭ)!*}!) !;)!;)! ;)!͠*!*!> !9!;)!;)! ;)!͠*!*!> !9!;)!;)! ;)!͠*@!*!> !9!;)!;)! ;)!͠*A!*!> !9!*|>!*|>A>>A!>Ͳ!=>Ͳ!;) >Ͳ >Ͳ! >Ͳ>͟(P͍*!*>>"!>Ͳ!.>Ͳ0>Ͳ! >Ͳ! >Ͳ!9!*!;)<*|!>Ͳ!9)!9!*!;)<*|;! >Ͳ!9)!9!*!;)<*|u! >Ͳ!9)I!>Ͳ!>Ͳ!)>Ͳ!>Ͳ!(>Ͳ!>Ͳ!>Ͳ!g>Ͳ!>Ͳ!G>Ͳ!>Ͳ!j>Ͳ!>Ͳ!k>Ͳ!>Ͳ!l>Ͳ!>Ͳ!m>Ͳ!>Ͳ!^>Ͳ!>Ͳ!q>Ͳ!!>"!!>"!!;)>"! !>"!!>"!!;)>"*͢*!!$!9!*!9!9!9)ʹ)!**!}"*!!9)(!!*ʹ)|ʹ)͉'|(!9T])#*ʹ)!9!!C*ʹ)!>*|ʇ!9!!C*ã!9!!C**!<*|!*#"+)*!9**+0<O>ærawʹ)|>ʹ)͉'|.!}!9T])#*!9T])#*!9! 9T])#**!9! 9)*!9)!9)ͥ!*|ʜ!R$!9)!!9)ʹ)'+|!!!!9))!**|*!9)ͬ)!9)!?(|:! !9))!*!!9))!*!9)!9)!?(|! !9))!*!!9))!*!9)!9)!?(|! !9))!*!!9))!*!9)!9)!?(|! !9))!*!!9))!*!9)!9!5!9)))*|A!!$7#ó!9!5!9))!$!}"**!*|¦!I!9))!!}"*!*|¦!é!|ʳ!!I!9)))!!7#!q!9))! !9))!]!9))!***!9)ʹ)!:*|D!9)ʹ)!*|D!G!|!!$7#!?! 7#!9)ʹ)p)!X"*|ʩ! 9)ʹ)p)!@͍*}!]!9))!*! !9))!*!!9))!*!9)!9)Ͱ+| !!9)ʹ)I!"!*|9!!!9))!*!9)!!ͧ!|o!9)/"Y!"!"*|ʚ!"!"!*|ʹ!!!9))!*Y!"!*|Ú!!9))!*!9)!!͜#!9)Y&!"*|2!!9))!*Y*+rrw!9)ʹ)!+*|ʏ!!9)))!**!9)rwaCON:RDR:PUN:LST:!9)! ! 7#!9)ʹ)!:*|!9)!9)ʹ)p)!@͍*}!9!9)*,!9!9)*ʹ)|;!!9!9)!9)!*ʹ)!.*|ʃ!9T])#*Òʹ)|ʒ!!9!9) !9)!*ʹ)|!!!9)ʹ)|!R!9)ʹ)'+|!!|J!9T])+*#|D!9T])#*+!9T])#*+ʹ)p)}GJ!9)<>.,;:=?*[]!9)"Ä!9)c"!Ô*+o!9!!!9)))*!"*|!!!9))!*! !9)))ý!!"*|*!9)))|!!!|9*!9)ͬ)!]!9)))!6*|o!9)g+|o!r!|}!!9!I!9)))!]! 9)))#*+*ʹ)*+!9!!"*+|M!$! ! !9!*! <*|?!^ @ F e*+  ! ))|!9!!"!9! ! 9)))!5!9)))"*!*|! 9)/"!!9! ! 9))!*!9!9)!͆**!9!9)*!9!9) *!9!I! 9)))*!9T])+*! }!9T])+*!9)S*|ʹ)! *|ʖe!9T])+*ʹ)}*|!9T])+*!.}e!]! 9))!9)!I!9)))͍**!!9ͤ%|!h!!!ͧ!|_!I))!!7#/"!!!9)"Ç!9)c"!ß*+s! !9))) !9) ! !9)))!9)" *| *!9)))| ! !|( *!9)!9)ͬ)!]!9)))!6*|^ !9) +|^ !a !|k !!9!I!9)))!]!9)))#*+*!9)}!q!9))!* *+!9)!!9)"ͤ%|!!h!!))!*|@!!!ͧ!|@!!C!!|d!!I))!!7#!!9!5!9)))!*T])#*!]!9))!*!!I!9)))"!9!9)!5! 9)))"*!!"!q!9))!*! Y*|+"!))!!))!**!))!**!))!**!9)!f#Y*|"!9)|ʹ"*!! 9)7#!9***!9)"!&o!#! !&!9)ʹ)|6#!9T])#*+ʹ)!9)&#!9T])+*#|e#!9T])#*+!9)}7#;!9*Y*|ʏ#!;)|ʊ#!M$!3!9*͍*3! ;)"+|#! ;)|'|#! ;)ͤ%|#!#!|#!!9!5! ;))ͺ)!)!9)*!;)V$!#!5! ;))ͺ)")! ;))j$!;)*j$!j$*+$,$?$M$! ;)!!ͧ!|ʎ$*!!]! ;))!*!!! ;))!*! ;)I"!!ͱ)|$!ͱ) !9!*! <*| %%!)+%$$!!""+|-%!|'+|ʂ%ͤ%|v%!!5!;))ͺ)"!*|v%!y%!|ʂ%!!)! !;))!*)"!*|U&*|%*))|%*!9)ͬ)|%!%!|@&|'+|2&!q))|2&!(ͧ!|2&!5&!|@&!C&!|U&c"!!!9!9)^*&!]!9)))â&!]!9)))+*ò&*+&&É&!9)/"!! &*+v&& & r&Z&!9)?'!!9)cO'! !9)c! !9)cO'!9)!9)cO'*+&' ''!))!*|l'!!9)"! )ͺ)! /*|'! *|'! /*|'! 6*|'!'!|'!'!|'!'!!}"!9)ʹ)|;(!9)ʹ)!9ʹ)*|+(!9)!9T])#*'!!9)ʹ)ʹ)*|ʉ(!9)ʹ)|l(!!9T])#*!9T])#*?(!9)ʹ)ʹ)͍*!9!9)!͍**!9T])#*ʹ)|(÷(!9)͍*!9!9)*!9T])+*#`)`)!9T])#*+!9T])#*+ʹ)}|/)(!9T])+*#])])!9T])#*+!}/)(!}!9)!z/*|ʔ)!a6*|ʔ)!×)!|ʧ)! ͍*ô)##9~og)##9~#fo##9T]ʹ)+}##9T]ʹ)#}}##9T])+*##9T])#*}|}o|g}o|g}o|gB*+B*+B*+B*+B*+B*+|gzO*{!m*+m*+m*+m*+zt*{!||g}oy*)Ç*{ozg͙*#|/g}/oDM!yҫ*xGyOȯ{_zWå*DMzz+x +>)+*+*}o{_zW=**++z/W{/_x/Gy/O{_zW{z|&+.!N#F#xC+~#~#,+,+`i*!D+"É)+*+*}o{_zW=**++GELIB SUB `XASM MAC aXEGE CHR cXEGE H iXEGE REL j"XEGE1 C sXEGE2 C vXEGE3 C xXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C  #include "a:stdio.h" #include "b:oxege.h" main() { defcursor( 0 ); build(); outline( 0, 0, 23, 79, OUTDIM, ATTDIM | ATTALT ); fill( 1, 1, 22, 78, FILL1, ATTDIM | ATTALT ); wait(); fill( 2, 8, 2, 51, FILL4, ATTDIM | ATTALT ); spoke( 2, 12, " BACKGROUND COLORS AVAILABLE: ", ATTDIM ); fill( 4, 8, 20, 51, ' ', ATTDIM ); fill( 5, 10, 9, 19, FILL1, ATTDIM | ATTALT ); fill( 5, 20, 9, 29, FILL2, ATTDIM | ATTALT ); fill( 5, 30, 9, 39, FILL3, ATTDIM | ATTALT ); fill( 5, 40, 9, 49, FILL4, ATTDIM | ATTALT ); fill( 10, 10, 14, 19, FILL1, ATTBRT | ATTALT ); fill( 10, 20, 14, 29, FILL2, ATTBRT | ATTALT ); fill( 10, 30, 14, 39, FILL3, ATTBRT | ATTALT ); fill( 10, 40, 14, 49, FILL4, ATTBRT | ATTALT ); fill( 17, 10, 19, 14, FILL1, ATTDIM | ATTALT ); fill( 17, 15, 19, 19, FILL2, ATTDIM | ATTALT ); fill( 17, 20, 19, 24, FILL3, ATTDIM | ATTALT ); fill( 17, 25, 19, 29, FILL4, ATTDIM | ATTALT ); fill( 17, 30, 19, 34, FILL1, ATTBRT | ATTALT ); fill( 17, 35, 19, 39, FILL2, ATTBRT | ATTALT ); fill( 17, 40, 19, 44, FILL3, ATTBRT | ATTALT ); fill( 17, 45, 19, 49, FILL4, ATTBRT | ATTALT ); wait(); savewindow( 3, 40, 15, 70, 0, 1 ); outline( 3, 40, 15, 70, OUTBLK, ATTDIM | ATTALT ); fill( 4, 41, 14, 69, ' ', ATTBRT ); spoke( 5, 43, "OXEGE windows save", ATTBRT | INVATT ); spoke( 6, 43, "the previous envi-", ATTBRT | INVATT ); spoke( 7, 43, "ronment so that it", ATTBRT | INVATT ); spoke( 8, 43, "can be restored. ", ATTBRT | INVATT ); wait(); savewindow( 3, 40, 15, 70, 1, 1 ); wait(); cls(); defcursor( 3 ); } build() { int top, left, bottom, right, counter; top = 11; left = 39; bottom = 12; right = 40; while( left != 33 ) { fill( top, left, bottom, right, FILL1, ATTDIM | ATTALT ); pause( 250 ); left--; right++; } while ( top != 1 ) { fill( top, left, bottom, right, FILL1, ATTDIM | ATTALT ); counter = 0; while( counter != 2 ) { left--; right++; fill( top, left, bottom, right, FILL1, ATTDIM | ATTALT ); pause( 250 ); counter++; } pause( 250 ); top--; left--; bottom++; right++; } } wait() { while( cis() == NULL ) { ; } ci(); } pause( time ) int time; { int counter; counter = 0; while( counter < time ) { ++counter; } } ); } pause( time ) int time; { int coXEGE4 C y XEGE5 C |XEGE6 C }XEGE7 C hear from anyone who has. The offsets listed below are relative to the SCB base page address. Official SCB addresses are 9Chex smaller. OFFSET NAME LENGTH DESCRIPTION ------ ---- ------ ----------- 9C-A0 HASHBYTES These are used by the directory and filename routines. 9C HashChek 1 Hash value for directory check 9D HashDrve 1 Drive being checked 9E HashName 2 File being checked A0 HashExt 1 Extant being checked A1 Version 1 CCP resets to 31h at warm boot 10 PRINT CHR$(26) 20 GOSUB 1000 30 TOP = 0 : BOTTOM = 23 : LEFT = 0 : RIGHT = 79 40 CHARACTER = OXEGE.OUTLINE.DIM : ATTRIBUTE = ATTRIBUTE.BIT.ALTERNATE.FONT 50 GOSUB 2040 60 TOP = 1 : BOTTOM = 22 : LEFT = 1 : RIGHT = 78 70 CHARACTER = OXEGE.FILL.QUARTER 80 GOSUB 1890 90 TOP = 3 : BOTTOM = 9 : LEFT = 40 : RIGHT = 60 100 CHARACTER = 32 110 ATTRIBUTE = 0 120 GOSUB 1890 130 CHARACTER = OXEGE.OUTLINE.FULL : ATTRIBUTE = ATTRIBUTE.BIT.ALTERNATE.FONT 140 GOSUB 2040 150 I$ = INKEY$ : IF I$ = "" THEN 150 160 PRINT CHR$(26) 170 END 1000 REM ============================= 1010 REM OXEGE.ASC 1020 REM 1030 REM The Osborne Executive 1040 REM Enhanced Graphics Environment 1050 REM 1060 REM ============================== 1070 REM 1080 REM by Ted A. Campbell 1090 REM Raleigh Osborne Computer Club 1100 REM Email: tcamp@ecsvax 1110 REM 1120 REM ================================= 1130 REM 1140 REM 1150 REM OXEGE.ASC is a series of BASIC 1160 REM subroutines to handle special graphics 1170 REM for the Osborne Executive (tm) com- 1180 REM puter. These subroutines require 1190 REM that the special character set 1200 REM OXEGE.CHR be loaded into font RAM 1210 REM before the program will execute 1220 REM properly. 1230 REM 1240 REM ================================= 1250 REM 1260 REM Subroutine 1240: INITIALIZE 1270 REM This subroutine sets up variables 1280 REM used in OXEGE. call it first 1290 REM in any program using OXEGE. 1300 REM 1310 VIDEO.RAM.CHARACTER.LOCATION! = &HC000 1320 VIDEO.RAM.ATTRIBUTE.LOCATION! = &HD000 1330 ATTRIBUTE.BIT.INVERSE = 128 1340 ATTRIBUTE.BIT.BRIGHT = 128 1350 ATTRIBUTE.BIT.UNDERLINE = 64 1360 ATTRIBUTE.BIT.BLINK = 32 1370 ATTRIBUTE.BIT.ALTERNATE.FONT = 16 1380 DATE.LOCATION = 63732! 1390 TIME.LOCATION.HOUR = 63734! 1400 TIME.LOCATION.MINUTE = 63735! 1410 TIME.LOCATION.SECOND = 63736! 1420 CONSOLE.READY = 1 1430 AUXILIARY.READY = 255 1440 OXEGE.OUTLINE.DIM = 117 1450 OXEGE.OUTLINE.FULL = 109 1600 OXEGE.FILL.FULL = 127 1610 OXEGE.FILL.THREE.FOURTHS = 125 + ATTRIBUTE.BIT.INVERSE 1620 OXEGE.FILL.HALF = 126 1630 OXEGE.FILL.QUARTER = 125 1640 RETURN 1650 REM ==================================================== 1660 REM 1670 REM Subroutine CPOKE 1680 REM 1690 REM Pokes a chatacter into Video RAM 1700 REM 1710 REM Input: CHARACTER, LINE, COLUMN 1720 REM 1725 LOCATION!=VIDEO.RAM.CHARACTER.LOCATION!+(DISPLAY.LINE*128)+DISPLAY.COLUMN 1730 OUT 0,65 1740 POKE LOCATION!,CHARACTER 1750 OUT 0,1 1760 RETURN 1770 REM ============================================================== 1780 REM 1790 REM Subroutine APOKE 1800 REM 1810 REM Pokes an attribute into Video RAM 1820 REM 1830 REM Input: ATTRIBUTE, LINE, COLUMN 1840 REM 1845 LOCATION!=VIDEO.RAM.ATTRIBUTE.LOCATION!+(DISPLAY.LINE*128)+DISPLAY.COLUMN 1850 OUT 0,65 1860 POKE LOCATION!,ATTRIBUTE 1870 OUT 0,1 1880 RETURN 1890 REM ============================================================== 1900 REM 1910 REM Subroutine FILL 1920 REM 1930 REM Fill a screen area with a specific character and attribute 1940 REM 1950 REM Input: TOP, LEFT, BOTTOM, RIGHT 1960 REM CHARACTER, ATTRIBUTE 1970 FOR DISPLAY.LINE = TOP TO BOTTOM 1980 FOR DISPLAY.COLUMN = LEFT TO RIGHT 1990 GOSUB 1650 2000 GOSUB 1770 2010 NEXT DISPLAY.COLUMN 2020 NEXT DISPLAY.LINE 2030 RETURN 2040 REM ============================================================== 2050 REM 2060 REM Subroutine OUTLINE 2070 REM 2080 REM Draws an outline using OXEGE characters 2090 REM 2100 REM Input: TOP, LEFT, BOTTOM, RIGHT, CHARACTER, ATTRIBUTE 2110 REM 2120 SAVE.CHARACTER = CHARACTER 2130 CHARACTER = SAVE.CHARACTER+2 2140 DISPLAY.LINE = TOP 2150 FOR DISPLAY.COLUMN = LEFT+1 TO RIGHT -1 2160 GOSUB 1650 2170 GOSUB 1770 2180 NEXT DISPLAY.COLUMN 2190 DISPLAY.COLUMN = RIGHT : CHARACTER = SAVE.CHARACTER+5 2200 GOSUB 1650 2210 GOSUB 1770 2220 CHARACTER = SAVE.CHARACTER+1 2230 FOR DISPLAY.LINE = TOP+1 TO BOTTOM-1 2240 GOSUB 1650 2250 GOSUB 1770 2260 NEXT DISPLAY.LINE 2270 DISPLAY.LINE = BOTTOM : CHARACTER = SAVE.CHARACTER+7 2280 GOSUB 1650 2290 GOSUB 1770 2300 CHARACTER = SAVE.CHARACTER+3 2310 FOR DISPLAY.COLUMN = RIGHT-1 TO LEFT+1 STEP -1 2320 GOSUB 1650 2330 GOSUB 1770 2340 NEXT DISPLAY.COLUMN 2350 DISPLAY.COLUMN = LEFT : CHARACTER = SAVE.CHARACTER+6 2360 GOSUB 1650 2370 GOSUB 1770 2380 CHARACTER = SAVE.CHARACTER+0 2390 FOR DISPLAY.LINE = BOTTOM-1 TO TOP+1 STEP -1 2400 GOSUB 1650 2410 GOSUB 1770 2420 NEXT DISPLAY.LINE 2430 CHARACTER = SAVE.CHARACTER+4 : DISPLAY.LINE = TOP 2440 GOSUB 1650 2450 GOSUB 1770 2460 RETURN T DISPLAYOXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*1̓̓x0!oN̓> ͈"̓> ͈"! ̓> ͈"#͊*!DM**#;  :Ƃo`pͥO)))) Õ0  Enter addresses and length in hex $ Source Bank : $ Source Address: $ Length (bytes): $ Dest Address : $ @OXEGE CHR OXEGE H OXEGE REL "OXEGE1 C %OXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*;Moves 1k bytes from any bank to bank 1 for use with SID ; ; BANKLOOK Rev 5.18.86 ; ; (C) Gordon Wilk 6707 Springpark Av ;1986 Los Angeles CA 90056 (213) 645-6419 ; May be used for non-commercial purpoese without fee ; ;======================================================= ; EQUATES ;======================================================= BOOT EQU 00 BDOS EQU 05 CR EQU 0Dh ;Carriage return LF EQU 0Ah ;Line feed DBuff EQU 080h ;Adr of default dma ; BIOS Addresses XMOVE EQU 0FB8Ah ;Set source/dest banks MOVE EQU 0FB3Bh ;cross bank move ;======================================================== ; MACROS ;======================================================== ; Print MACRO ADR ;;print string LXI D,ADR ;; @adr CALL PSTR ENDM ; Reply MACRO BUFF,LEN ;;Get console input LXI D,BUFF ;; to @BUFF MVI A,LEN STAX D MVI C,0AH CALL BDOS ENDM ;======================================================== ; MAIN PROCEDURE ;========================================================= ; ORG 100H LXI SP,STAK PRINT Header MainLoop: ;GET SOURCE BANK. STACK SRC/DEST BANKS PRINT SBankQ ;Source bank? CALL GETC SBI '0' ;to binary LXI H,BnkTbl ;translate to bank byte MOV L,A MOV C,M ;C=Source Bank for XMOVE MVI B,1 ;B=Dest Bank 1 for XMOVE PUSH B ; Save ;GET AND SAVE SOURCE ADDRESS PRINT SAdrQ ;Source address? REPLY DBuff,4 CALL ASCBIN ;returns binary in HL SHLD SAdr ;Save Src Adr ;GET SOURCE LENGTH AND SAVE PRINT SLenQ ;Length(bytes)? REPLY DBuff,4 CALL ASCBIN SHLD SLen ;Save length to copy ;GET AND SAVE DESTINATION ADDRESS PRINT DAdrQ ;Dest. Address? REPLY DBuff,4 CALL ASCBIN SHLD DAdr ; save Dest Adr ;SET SRC/DEST BANKS POP B ;XMOVE must be called CALL XMOVE ; just before MOVE ;SETUP FOR MOVE CALL LHLD SLen MOV B,H MOV C,L ;BC=length for MOVE LHLD SAdr XCHG ;DE->src for MOVE LHLD DAdr ;HL->dest for MOVE CALL MOVE ;move it ;GOTO SID FOR VIEWING RST 7 JMP MainLoop ;======================================================== ; SUBROUTINES ;======================================================== ;SUBROUTINE GETC ;Gets character from console and uppercases it ;Exits to CPM if char is ^C GETC MVI C,01 ;get char into A CALL BDOS CPI 03 ;^C to exit JZ BOOT RET ;Subroutines PSTR -- Print String @(DE) PSTR: MVI C,09 ;display string pointed jmp BDOS ;to by DE ;Subroutine ASCBIN -- Convert ASCII string to binary number ;INPUT ASCII decimal string in DBuff+2. Char count in DBuff+1. ;OUTPUT HL=binary value AscBin: MVI B,0 LDA DBuff+1 ADI 82h MOV L,A ;Terminate string with null MOV H,B MOV M,B LXI D,DBuff+2 ;DE->string ASCB2: LDAX D ;A=digit ORA A ;IF null RZ ; done CALL A2B ;convert to binary MOV C,A ;extend to 16bits in BC DAD H ! DAD H DAD H ! DAD H ;HL=16*HL DAD B ;HL=HL+digit INX D ;next digit jmp ASCB2 ;LOOP A2B: SUI '0' ;Convert CPI 10 ;IF < 11 RC ; done SUI 7 ;ELSE adjust RET ;================================================================= ; DATA ;================================================================== Header DB CR,LF,'Enter addresses and length in hex',CR,LF,'$' SBankQ DB CR,LF,'Source Bank : $' SAdrQ DB CR,LF,'Source Address: $' SLenQ DB CR,LF,'Length (bytes): $' DAdrQ DB CR,LF,'Dest Address : $' SAdr DW 00 ;Source address SLen DW 00 ;Length to copy DAdr DW 00 ;Destination address ;Create alignment on page boundary MEMRY EQU ( $+16+256 ) AND 0FF00h ;Stack is between code and page end ;Guarantee at least 12 bytes STAK EQU MEMRY-4 ORG MEMRY ;Align on page boundary BnkTbl DB 0000$0000B ;Bank 0 DB 0000$0001B ;Bank 1 DB 0000$0010B DB 0000$0100B DB 0000$1000B DB 0001$0000B DB 0010$0000B DB 0100$0000B ;Bank 7 DB 1000$0000B ;Bank 8 END 100h  DB 0000$0100B DB 000OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*..Documentation for BANKLOOK BANKLOOK Gordon Wilk 6707 Springpark Ave Los Angeles 90056 BANKLOOK is a subroutine to be run under SID or ZSID, it is not a stand-alone program. It moves a user specified string of bytes from any address in any bank to anyany address in bank one where it may be viewed with the D or L commands of SID or may be written to a file for later examination. Load with the command SID BANKLOOK then go (G). BANKLOOK will ask for Source Bank : answer 0, 7, or 8. what bank to get the code FROM Source Address: four digit answer in hex where to start copying FROM Length (bytes): four digit answer in hex how many bytes to copy Dest Address: four digit answer in hex where to copy TO Usable addresses are between 300h and CD000h. NOTE: No error checking is done on the input. SID's prompt will appear and the D or L commands may be used. To continue use the command XP to advance the program counter one byte then Go. The bank 7 and 8 maps may be found in the Reference and Technical Manuals. The Technical Manual describes the content of bank 0 but gives no addresses. This is an extension of PEEKBDOS (FOG CPM/048) which can only move blocks from bank 0 to bank 1.ut gives no addresses. This is an extension of PEEKBDOS (FOG CPM/048) which can only movOXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*==================== The first three routines in this module utilize the CP/M Plus AUXILIARY device, which may be assigned to the printer or modem port of your Osborne Executive. The baud rate is set externally. I find that when I first boot up my Executive, the device functions properly, but after any calls to the RS232 ports, it no longer functions (thus after using a MODEM program, the device does not work). AIS - AUXILIARY DEVICE INPUT STATUS ais() This routine checks to ö???????????! BCOPY ver. 1.0 Bill Staley copies files according to their attributes $ the proper format is BCOPY as in jBCOPY M A 1 k For more information see documentation $ -- no disk file found with attribute $ Use any assigned drive A-P$ Use different destination and source drives $ Use attributes 1-4, R, S, A, only $ No files found on $ I/O error aborting $ ERROR--probably a media change $ DESTINATION DIRECTORY FULL $ DESTINATION DISK FULL $ --undiagnosed error -sorry $ DONE $y !9"m*+!~ʁ#"ko+#~ ,  5x5y*kq!k"kxʁ*o62x*q622G:xs*s~Œ#~21ʒ2ʒ3ʒ4ʒRʘSʝAʢs0ä> ä> ä> 2w*"f͇ô*h*f:j<2j "h͗!!!"h:js=2j,:2$:x2E%*h#"h!%F >2e2Q20 !E~w$>2D͏EŽ|€͗ss͗$ʩ-sʹʎýE  ,\ʹýE$Psos-ss!_:w_~|bs~##L~:L+~AYsQsmss *ms:j@--ɡdwn( lines ) int lines; This routine moves the cursor down a specified number of lines. INPUT: the number of lines to move down. RETURNS: none. .cp 4 CURSOR MOVE RIGHT rgt( columns ) int columns; This routine moves the cursor right (non-destructive) a specified number of columns. INPUT: the number of columns to move right. RETURNS: none. STRING OF BLANK CHARACTERS blk( length ) int length; This routine outputs a string of blank chara DOCUMENTATION For BCOPY.COM V1.0 a Batch Copy Utility for CP/M+ Bill Staley Box 172 Ukarumpa via Lae Papua New Guinea Thi progra i full copyrighte b th author Yo ma mak a man copie a yo choose an shar i wit you friends I yo fin i useful yo coul conside sendin littl donatio t th abov addres ($5) An bu report o request fo enchancements could also be sent there. Thi progra i designe t b batc cop utility I allow yo t selectivel cop u t differen set o file fro an on dis t anothe disk I i primaril intende t loa RA disk an use n erro checkin protoco sinc non i neede whe copyin t RA disk I i onl intende t ru unde CP/M+ Tw thing t b awar of BCOP reset th Rea onl attribut whe i copie fil s i ca b easil erase fro th RA disk An BCOP check t se i fil wit th sam nam i o th driv i i copyin to I ther i BCOP doe NO cop th fil th secon time Fo exampl i yo hav NSWP207.CO o tw differen disk an yo loa on ont th RA dis an the tr t loa anothe cop t th RA dis wit BCOP nothin wil happen BCOP doesn' wast tim copyin file tha ar alread o give drive. Befor runnin th progra yo nee t se th attribute o th se o file yo wan t cop a batch Thes ca eithe b 1-4 R, o A Th attribut bit ca b se usin Ne Sweep T us Ne Swee t se attribut bit yo mus firs ta th fil an the us th "Y optio tellin i wha attribute yo wan set on all the tagged files. Th progra i invoke fro th comman lin b specifyin the program name, destination drive, source and attribute. as in BCOPY M A 1 If no command tail is used the following screen greets you: BCOPY ver. 1.0 Bill Staley copies files according to their attributes the proper format is BCOPY as in BCOPY M A 1 For more information see documentation Belo i a exampl o ho differen set ar marke according to the purpose you have. file name attributes set 1. A0: AFFIXTAB.SPL 2K : 1,R 2. A0: BCOPY .COM 2K : 1,2,R 3. A0: CPM3 .SYS 18K : 1,R 4. A0: DATE .COM 4K : R 5. A0: DICTNARY.SPL 30K : 1,R 6. A0: EXECST .COM 2K : 7. A0: FK .COM 4K : 1,2,R 8. A0: HP+ .COM 4K : 1,R 9. A0: INDEX .COM 12K : 1,R 10. A0: MAGE31 .COM 2K : 1,2,R 11. A0: MAILMRGE.OVR 14K : 1,R 12. A0: MFORMAT .COM 4K : R, 13. A0: NS .COM 12K : 1,2,R 14. A0: SAVE .COM 2K : R, 15. A0: SHOW .COM 10K : R, 16. A0: SPELL .COM 14K : 1,R 17. A0: SYSINIT .COM 4K : R 18. A0: VDE .COM 6K : R 19. A0: WS .COM 18K : 1,2,R 20. A0: WS .FK 2K : 1,2,R 21. A0: WSMSGS .OVR 30K : 1,2,R 22. A0: WSOVLY1 .OVR 34K : 1,2,R By invoking the command line: BCOP woul hav th al th file excep EXECST.CO copie fro drive A to drive M. BCOP Woul resul i al th file wit attribut se bein copie t driv fro driv A I yo examin th fil name wit se yo wil notic the ar wor processin file an usefu utilities Sometime yo don' nee al th WordSta file copie becaus yo aren' goin t us them On exampl i whe yo ar writin programs Mailmerg an spellin checke aren' muc goo fo thos purposes Th file wan t cop fo thi typ o wor hav th attribut set Thi wa ca pic an choos wha goe ont RA disk becaus eve wit 1 RA dis th spac isn' unlimited. Whe BCOP ha complete it wor i tell yo DON an returns you to the system prompt.  This routine pokes a string of characters with a speci- fied attribute into video RAM beginning at a specified line and column. Attributes can be ORed using the bit definitions in OXEGE.H, and inverse can be set by setting the zero bit of the attribute bit, defined as INVATT in OXEGE.H. INPUT: (range 0-23); (range 0-79); a pointer to a null-terminated string to be output; of which only bits 0, 4, 5, 6, and 7 are significant (defined in OXEGE.H). 1:2c#!d\$2`2_!m>?52`!e'5ʨ#] M!]>$2:`DI\2|:_̘:a=2a!d\$-LM:c>2a:c  !~*! ~`_w#!mY:mP:\=:] !\dP!e>$2S2_!e†# s=2_ ~mCOMOVRSYS\)!#~Aڧ{ҧT]>#~ 6$ɗ>2b>2a:b A_A2_  :b$_\:\ȇƀo\#!W> w#w#w#":_*} ͯͯͯ}V}o|g{_ ?Ғ_)o{0*w+"|}{_|g}o Filetype: $* $ Drive: $ Print? N$ End of Files. ^C to exit. $ more..$ Files of Type $$$ NAME SIZE DESCRIPTION $)$($ k $??????????????v>LIST.ASMe  !"#$%&'()*+,-./0123456789:;<=>?@ABCDoEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd @#=75Rm#B" \K7U?>|z)d11*OpWMO\Q27} Y~H#^2_ΑshJjVCfApE mj `5M/! pG9԰+A:9CRZ#  m39ʹ@nԾ@{f$ʹe+G$j `$Jof`ܱAfVJpGȞp5̛E3V;W+nΐE3VBGH#R]hJh9g!uv UQc˒$> ˫p`ܱ6GH9g5%{\ Az]@G`F2r0huQGϐ:+"\|u<ʹ{T2 9gH$j \.>:zo9 ÞCf {,M Ԃ+BGR#j `Jp7\||tv3__qG43q3+Ȇ,BKϫ?NhXEF,fVz`*~l}j"ṖsH{ W7ׂ+ߜ]@pusq-˾(~sN ?y_;'_f}Cs$/ oiҗϢ/]9m~!IEsdsRV#ere@ssR6 )cC9m~&sRAmR,B"-<-YEs%)dV2r=c9 3rݽ^ĈߜӐ,?B 0c:9 [Ɍ<-IEsפPeF²Z\WoiH_ Mtkߜe2'umjZlJSߜfN*-\~UH{1ߜ0'Lj6c[jQ6椂)t35ZF n.~h oW7?\WWWti1Hpuu%< z)[&ζfْi0+)Qp%xj1HlIͶ˫Od;)Qp%x+lI8۶iKJ} YO(\WWW$U\ H)Ȫ6:ZXm$"i9 3KHfxj8dPνP8syd' sPYET>ٽ6^S6Dcj*MdHe(D96tXҔYƳvw#RJ2KZq)8Q,Wi9:YҔHFbJSfxApJ0EUSVp^Mwt>< N񔍂+Gw@cT= U?]߆m+anm>z)iنmlI8۶fK ,xF65ARtU>=a<=v66 >mtU>=RmIp sZa<=v[Rgl,MA%8eK6qm7Ӗ6Hy%8S6 .x!1',>*\\\pG:m6[)ϩYM|#R XI_>\pJ0Ǹ˚oDI,B3)ʖ"G(~M u!85]@PToRg1zm2gWJpѬtEk:7{"")ǸkqB^ pd0cS2cyHWy19,eCldپxIjt j?@:X \pN"5 9,¡G`#85]@㪐Cq$RH-/t-´8 NC>euvaG* 3鵉Apz56{$R.qUȡ8)WCᏸԢʧ]ޅ1)6,\wqjNABpZTa'"5Ep)a i);AD #-ׂӫ;63T8`A:0Så( . :7{""5g1Bu)RfBőHU!?Fpꫀ"sf_R_ÌELw40#RFBf B$aZ#$C.&RL›3D Hg Ne'"R[fS'a0 hőHpꫀ"XiᏸFpJhqޅ)ZXm$䜡І . 9ÞT@ɬ/eػ NhڄHhYx1'j:Z}GⰉJKW7/WKs.FpusRp%jVkVRǸkq"J|Q@ΙeC{oj0H U=:[֢;6X9wFd[o_,1E< gYE*:ˌH3Upz5.;._).8lb2+ftH&Dj6cmw%fțfav.()iپ RSxSfِ,Bp G]E*:˹t~oS!1"YW/K6;"R4|aEN;"Mrg&zάQl{|__` N;"\pլ֭6 q*Ej<39gAG(~MBu t,K#h\:̲BGi~*`\IP[89QJB  䜡t75 mׅj͎Dx5+^Kf[xgh%AZ%#x#r375f/Y mkDٌp)䜡fk,ʹ -3) ȹ6Gh9g^@/>3FRp%.%. i>=9 X0so Az]RW9>t3xk1f𨭾eYKgM-ZEt3V2Agqf HpJ9;"`GX-8%w'۞HQ$0 (-Y%8eIEV2D3VTZpJa|&RZfz ƘHpJ9#RgSuGDjg4g1 ɲ͆dٞ^&w i>A:i\pլ֭6 yؽ^_93Ym6Geso <؃jaaM0-:Ew1I$آyݴpY * U>u#ZXm$ z_EO{Ӣʧ:uqO۸*:dqTIpjΗFz+\9qafSH6m2ԑ$ qy_NOD¾_`+AEz# u$>emZÌb\<8HZmSxӲ}AP0ss|Q87~""].n:$۠j0 )#Rϼe`{ {L9neD"iljs}c k9nvӫ&;'=VBfLpʧ{ʈT61H{/˹O%R$(FST)jVZgFt+#W- fD*``F H")85K T>`,3G{Y,( RXCqtZiq\3D,])н^'{-CIJHJ^PGWr".-6ن4gWD*`YjEDH {+!3&8UqGD*ϵc?lZ:OS]ҏYռnv ںԆaqޅ *k9C Ժ=r jrΐjI`},K! .Rg |1{soW9g:3D[ BfVB"ɕ5y[! xA96B,<3W3낡{ 9䜁.3̬66*/7rrJyS$8 UdDP1_#Cji*HBp;"RT;Ym$Ƴ.SH Hp sڶ|NR9C *M<6z aȫC.mP NYRђH3nejFu ~lPνꎈvṖs`S>ӖHa3f({Qp3 ڑHMD9VpJ9`'8J(6Si}DⰉSNpz5%jɀHQ i(kD*[3 NcFq)d{DjsD$+" ~ǐO)C?`ȫCO1 CƂxӲ}yM>=mJso?d;"/*Ա nej0Så(8U@&F>=8W# MMhp+S.E$6G){5Q#8lb(F3~!`OtEa35\HZmx.wDj` itZXm$ mR2Tŝfn%adcdCp0!.nQp%X9wpIrP:l%WO}l{jΗG`#8swyM xl{r ˹  N]^Ss7G;WjmJj0U+p)fg3R|Hpr /SEDb(a(Hf0 (.n(D*O66G $"fS5 N*:Dj,{x 1"Tŝwywќ/˧fn%a8̚o&5=]|\fշ [Fgp`R2K(]WJVdV2LJf!b ®ìDSiT-ҡ(]o0k]? NcFqu xSҞ~)hS!-!Rf)ceͷ'i<)iG&QeF NIFp vH%2+!&sm(-j Sw e՟w1#ʹ"nҙ Xf̖>b\o { breMr-AiᏈNTƳvs":2r-aHˬoHpJ9m^$쭖ӫ;Z}'8S:O|ĈT-a5+}dSRɕ5C$t MY;WjmJjð-puF"{Kɬ*xSnj#Qν6!8~Fˬo\5u+ h WWXXm$i9_7|9H鞠S rhIpZ7[ʈTo"ik+8g9%"UhV"i9b洑aHˬotXłӢ_P&8Y@q9wCq*HrqsT&xHDD*l:DjsfoS N"HʹT&8=eRF"k °[i(ni<)iPν i NMW ںԆE.|N4hS#6HuWOD65 {+ꂑF/˹6G`YTZf5AZO|ZwE3VK$)R25=|mYetf=(n751)p9S6= N}NY;$K"5hSð.4唴OD Y /j\`k>\>%jI`ƳG"HIԗהaHˬoT$Z[0#ApJ9maK܀i0Vp_YT,.Ik#gdU NA!;YdCeA!,ea RM-_[i(l" o;WjmJj04],J~,75fV!\T ZpuU2 /1-WiFa}4Vb s!Yg+ɐ!ߙ4唴/S!-ԢʧChXp sڶrOy 3KWiʬ4;? t- NcFc[ihlC>c+850i&-=*ML-8Y@iD*ކ7t 26 R7k N6(-UEh{] Y$89-?ʭL ,+#) 2ZaHMoC"[pd$Cjx NIT6$ iOA^+)Hz MӢʧ*Mj#Tŝfn%ae>Mrz)JeVF8ZKگt$QR}!z qt(eV4=)KIU2+"fb$ ELbRg/(}Q̧IN/,q4lO/%ZFS_`ޢ_j\^?u*qk-#,8a4gڐޡ B؟!li[Cx?ö ?Cx*c Wy ^Y YJyfFb[{N)ՔR4gKmhMpyM*t $N/2I B"u*QH+'53k-q`$8eAF[ ? ?I2+!&s)rmvҖToj}?H)܆M3iI&bV NcFcr-z›Zpʒ{ڒ홑XҔY̤m4VpZ ڒ,2i(hS_yfF8 W-)hKEַ(8UqGⰉv >ͤOBN,ô\JpE\2B|~{>ǹ k-oxR_NcUP qNc;m 86;TAw3m 8Uq'"\Qt"\puuFu >Fˎ%%Un{NpʖJE$6Gh3[I,q5C߁]le.vw|eKJ6[ lI;e.wrAْ v`a0e.w%uŦK1E  {îM6N1:lIIՆCvw=<\a'ʖTm8v `\0c jNeK]^^ x lIIՆCn w1.dqTi'xReKJ6NL)[imٶ%;jZ_ZIْNm{i.wbS{*M)[_;RU2Y`w&cZcojne$ Hْ6673D͢ҢІ8F > 9GdKڐ8 3/nBY 3 E- PҭdV𸜻8"[҆vf'ʹ#"bXE a= > ő%mHmnR[C{oj0WWIuP:#+.\ ⟂ClI"~UHV2)[H!3~ ʖÎH!?ѦݴvnMi7ݴvnlI>\]]%|ojWioFs|$x\)(~sN>_ NnMi7lZ:OS]ҏYռnv OXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*F27 :10039000003C66663E060C780000FFFFFFFFFFFF93 :1003A00000001818000018180000FFFFFFFFFFFFF3 :1003B00000001818000018183040FFFFFFFFFFFF73 :1003C000000C18306030180C0000FFFFFFFFFFFF2B :1003D0000000007E007E00000000FFFFFFFFFFFF27 :1003E000E6E6E6E6E6E6E6E6E6E6FFFFFFFFFFFF17 :1003F00067676767676767676767FFFFFFFFFFFFFD :1004000030303030303F1F000000FFFFFFFFFFFFA4 :100410001C1C1C1C1CFCF8000000FFFFFFFFFFFF62 :1004200000000000000003000000FFFFFFFFFFFFCF :10043000E0E0E0E0E0E0F8000000FFFFFFFFFFFF8A :100440003F3Documentation for LIST and EXECLIST ************************************************************************* * EXECLIST is Osborne Executive specific * * * * LIST is generic for any CPM system. * ************************************************************************* LIST FILE/DESCRIPTION LISTER Gordon Wilk 6707 Springpark Av Los Angeles CA 90056 I have for a long time been looking for some easy way to give all my files more descriptive titles than is possible within the limits of 8+3 character names. Most cataloging programs seem too much trouble and take up disk space. The program "LIST" was the outcome. Practically all program source files contain a descriptive title as a comment in the first line and WordStar's comment (..) line allows the same sort of thing in ordinary text files. LIST displays for each file: the Filename, type, size, and "first line". For Example: LIST ASM 14k Lists first lines of files LIST DOC 6k Documentation for LIST program LIST COM 1k LIST PRN 24k LISTS FIRST LINES OF FILES This provides a descriptive disk listing with no more effort than it takes to assure good descriptions in the first lines of all your files. USAGE I like programs that will accept either a command line with arguments or ask for the arguments in a friendly way. LIST can be called either with or without arguments. To call it with arguments on the command line: EXECLIST {filespec} {>P} or LIST {filespec} {>P} The filespec is anything that would be accepted by the CPM DIR command: "A:" would list all files on the A: drive. "*.COM" would list all COM files on the default drive. The ">P" option, if present will cause the listing to be echoed to the printer (LST: device). The ">P" argument may be written "[P]" if you like this form. The space between the filename and the ">" is optional. If LIST is called without any arguments on the command line it will ask: Drive : A offering the default drive which may be accepted with a , or a drive letter can be entered. Filetype: * offering the asterisk for all types as a default. This may be accepted with a or a filetype entered. Print? : N offering not to echo to the printer. This may be changed to a "Y" or accepted with a . FUNCTION The form of the listing will vary depending on whether you selected all types or specified a single type. If you chose all file types, the display will include the type of each file but the "first line" will NOT be printed for COM, SYS, and OVR files. These rarely have anything readable in any case and they disturb the display -- the name, type and size are printed for all files. If you select a single type of file, the type of each file will be printed in the heading only, not for each file. You will see the "first line" of each file even if it is CON, SYS, or OVR. Some programmers put a copyright notice here and we assume you want the view since you asked for a single file type. The "first line" begins at the first alpha character in the file, thus omitting leading punctuation used as a comment marker as well as the JMP XXXX code in COM files. The "line" ends either at the first carriage return or the 60th character, whichever comes first. The program will search 40 bytes for the first alpha char and then give up, this prevents time consuming pauses when listing COM files with no text up front. If more than 20 files are on the disk, the program will display a screen at a time, with "more.." at the bottom of each screen. At this point press any key to display the next screen. In interacitver mode (no command line tail) after listing a disk, the program will ask for another drive/type to list, offering your first choices as defaults. The printer echo question will also be asked with the default set to NO. A "Control C" will exit to the CPM prompt. If called with a command line tail, the program will print one listing and return to CPM -- compatible with batch submits. THE EXEC VERSION has the following specific code: 1. Calls to CPM3 Print Block BDOS function. Generic version moves string and uses function 9. 2. Direct writes and reads to the System Control Block. Generic version uses BDOS calls. 3. Direct reference to the BIOS cursor position location. Generic version uses a counter. NOTES Although DRI documentation states that no BDOS disk function may be used between successive calls to the Find Next/ Find First functions, this program shows that you can carefully open the found file and read its first record. NOTES to the EXEC version --- If you list the same group of files twice, one right after the other while still in the program, you will note there is no disk activity during the second listing. This is a good demonstration of the size of the Exec file data buffers. I wrote the Exec version first then converted to generic CPM to see what advantages CPM3 and the EXec provide: 1. The printer echo took 50 extra bytes in generic code. The printer echo function turned out to be the most valuable CPM3 function. 2. The buffers are valuable only if you re-read directories and data. 3. The Print Block BDOS function is a very convenient way of picking a string apart without touching it. MODIFICATIONS I was aiming at a program to fit in a 1k physical sector and the code is about 850 bytes; you have about 175 bytes to go before the program becomes larger than one physical sector. The code is fairly modular and maintainable. If you do change anything please log it in the source code heading. Possible modifactions: 1. The listing is not in alphabetical order; this minimizes disk access time. If you really want ordered lists, SYSLIB is a good starting point. 2. The echo option might be generalized to allow re-direction to a file. This would take at least 1k additional code, however. 3. The R/O, System, and Archive flags might be shown by altering the respective type letters. 4. The program only lists files in the current user area. It could be changed to include all user areas or allow selection of a user area. 5. The program now omits first lines of COM, OVR, and SYS files in multiple type listings. You may wish to omit other types (LBR, REL, OVL ...). Add them to "OmitList", keeping the list in alphabetical order. ay wish to omit other types (LBR, REL, OVL ...). Add theYd"3o d\.V+i%G4 ãb\a1 6dXt| CR@,:>!la6hr ] @PILn2O id0@Cd0@s)e9 'Pu9̆r4 'Lt:rXv C{@,;!l6Kh #%{4(ýba1 d`2Xw CG,;! FKi#%{w Y@ WP0 @ @`p,$g@ L Z0`d$Y"TR,  D`A, ERqJ*  TU)2)@E& ?52/*oʞ#] &o://\2|:.u:T̳!1\$Rͩ:0  !~*!W`~_w#!:Y̭:mP̭:\=:] !\1*o2.!kec# P=2. ~JCOMOVRSYS\)!#~Aڄ{҄T]>#~ ڣ6$ɗï>2:A_:A2_ ͩ \\ȇƀo\#!> w#w#w#"w:_*} yyyG}o|g{_ ?\_)o{0*ww+"w|G{_|g}o Filetype: $* $ Drive: $ Print? N$ End of Files. ^C to exit. $ more..$ Files of Type $ NAME SIZE DESCRIPTION $)$($ k $]e??????????????OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*v"FLISTEX.ASMf  !"#$%&'()*+,-./0123456o789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde@cÆFhk W)pCu2i4=RwP13xed?Y+}!@ξEcC6\}B{lX\t+BŰ7p`0jr1xܭJ'RHssyPY !AH!a){͆B:6$3C&LS!g|#3k r&ޟiW2c2({M>' t?& e̵]2QL?&s2QJ\TllyE3uDw,dl,CL]2}"XȲَ_g_@W,dlGޟKOWd?[%dlgӇ2h޳U8_ Y6۪dύ5WȲ>PLwɜ̃Q6[!i]?fN&=\p*ԇB0fޟinN&ZPՊ=0f!7iSLts2"r+5ZB~pvō.u#d?;2IʡGxf+dLgtD+&;ix22w?ӦGs2QJɄp*^߱/]L3milJ4k; dϴI9 {=1۽b!47 ih% in.RHC6EI5B!h% $m|o͎mE%$e|&2xYT IDW]?Wdm\< I" iLEE(!)h~3]Șo$ˢE>i(VH#kh%@Q^*k{ǂ>+"cBR-۱E>SJ(JȘVaUH  $Aͥ\C[$$$ͮ Jw\HJ )Z!)[3! dūtO(]G c^Xq6v)CZ IcAy?(M4.(7юHHJ M I" in[EI5IcAy%1Ê-G:e!iv]P_5V6+!)4C+$cD]25ȘUqE>V4jǂK&"c*k(煤uAI!26Px\EOm|o0A,*!)[3!47B\~EjH\eB!zf'$˾_L b6B IIy yap*:~<|:w +4pm JHjLjf.=6ccj;BPE["SPs? IέPeE iӲ*#b 2D,ʋŋHIYT$#n<Ut1\ _ӓNyܯ̸_ "(DA@mW,+"i[>V(uPP5sVHLPY&SN8:(5\ԹBv:["2:C^Tc.bH;";{RPnq+lౠ/"eD&Xi*,nP6[!)x,h?<Q͡F9 /*"eU,FtE-Yh-3!iY*脤e5tʋBRG4[KD0[KNSl("2 5g:U^W#vBRx:+"Zym~'Ĭ 4~Y IA^TBrhYfdA9Y_$ K6&DPsSixg"2c#f%$%˂N_ND& ͜W6~^HJ)KvL=bVfl^HwlKhCΦ{Gh 5gPO蘡RX iTShiʡlWO@d=fzh 5gPBҥ{5{h\,4ŖWP[F;Fͱ>P9Bu5C jΨcl-f{Q6ۇ'!/[!)#, :-OD!_gʒ@d(f2 BRGT6ۼ򤢈j]jdIm/DbNQЊ lh IɲND`J ,$UDdvpQL}%SLc ʡ.TeBvnee)I4ol*m88PYگIHڪjbF*2(]bܯ:u 0~i{8zrN- $-b1R^̈k0~Yևt/$-):_QHCDc֎.wYq*#Mb9BHjEDUWxeqaUBR;F HdAqౠ]? tp*бW!sDdaX*dQeX`8hX Icَ3GSVf<4 RG5!sDdaXb0fdU#DGASV&~EAp BR2[Ҍ77Z:VqL 1WLd)ၡ(bH9ɂ6၁ӧ<# >}BRTߧlj.$}\<2un@dRVPc%$""Stg9{ƛ0FC'ED&feХG(1ePG!F! 1WDuH22Cp*бLGG _ajX8۔ iZ}33Jcm+J9)tE!y4E5g=X^Pskj=Y}Ҵf5gXnfa_ymUM ) IɲSt"2EqNBDŽJc a)$%˂N?}"2Yf(:qIHH>V`Bl,h3tnmkXymUMYHlpyvU^cB4D 〮X9]Q#bX+LH]4kG5 =X<Ҏ|TꔅpMQ?#2> ) IɲND##Uذ1֙ unmkJk{*dA;n.$}QgD:5p%b= I3a""m?<1bf`Bvl.?,h3b[Õ($ͮ Yn*$ ZcEd^[T[FֶlRHӮޭ#KvCiZV1}Y])u++ kZ+tix(n:nKnVk$r1dn<ۈȴ!lIYhv]P_6;JHn16;!F!4zZi˘ U{D lkW(Y횅 UHH df("StXzmG!Z<=)ʭ$"m&$-b1Ҭ}@ӓDA@/٘{!) *2zčgBRB i/:EP_Оj8"k/"]o[+m9Fy ͂^1ovVos;&,!\~R YH3j(A#e#LcE^]c%dy[کSt"2wCѸl oyx+$͆kȴrPB캠 $%QД-D=n&!_1oy+$yD9#2/PsS;St"2wC&E!$cD '2r-r(/$U(=OpElL4/b4Їbһgc2B[cZo˜ch%~hC9$tfzi*Vkoc4C[DOQ1+I_q-K6&4.(7W2GVh桇!(hʇdYʁh%$}|khQI3Ic֫&YHJ%X3bV%Ch7셤*|֊(h1dn 2 ny>Ζ4 (]o[+m9FdQ{$)m㙭pJv=^[dQL,hv]P'AKdCVehv]PokCmAHÊ|hҴwk-cَ*k{rَͮ J_LU++BҿV4CKdv<RHӮޭE~E5JcR,!\~v"_Pm ?J2 ihfN5Ǎ[-f{%)HN9^qPlWBPMZ{U~/$%˂6]#2nV=g'"ppQc!X! ><>!߮RH"sD(+설$ ̲*#"ϙ<ӹ>]IR=^7خ˒4.(O8VsīXH 4#|ExĎpM>WG설pM>WG설vXY,w,uYm-$yDeOD&7tʈs Iᚲ>"27kl`T6۪"2 paW IcAS"S^A9|&($ jl\a7(#+"$%QP[eHHJ vDA@S.%PsaMBHZVbt:"*h%$U(]o[+m4M igث!aچ~>lC9DmRч0 5C94ޱWXwdDGle^HCXXa–K6s4a 9M޽feT| 6B캠zGdaU,$ UDIR=[dڹ.~V1R.JH ׈|lFGBlFU+f5v}$$͆kD}_1(j[q88ϰCk4[VߛԞ I,>.n?Iᚲ>r6@3MFdaXBNZس( 2\ i+yf ߛ- (4TBlpMQic6) !) :mNBhG&?l삜˱"Sؘf5 5C[leQRAן:گ-nOBR>ч~CDtjՌ|~j?ݞۜ򉒪 $d)S?$,>.)(O^[S?$,>>P>M)5\N?1?'PCST}ۓ򉒪~tpnOB%UtM)p%q{2Ж((냮?-Y sOy&Uaq2򉒪t{2'_Df⣶A+'÷y=lZ\L벤|.}nOduYGцF[>lcӘѸ!5RmYH!ONʻ5C_EȺK&'\T|Ƞ)B%>|"2(ujb!)mM7~oM72JS':}$X哐 _){OW߄lf6~oM7@(M)۔ byte to print ; NEXT: LHLD PNTR ;Get pointer INX H ;increment to SHLD PNTR ; next byte XCHG LXI H,CODE DAD D ;HL=CodeBase+byte MOV A,M ;Get code char XCHG ;HL->byte to print RET ;Print A as a char if it is ASCII printable ; else print it as a 2 digit hex number dimly ;Uses PDIM2X to print. Returns from BDOS. ; NPUTCH: CALL NEWLINE ;Newline then. . . PUTCHAR: MOV A,M CPI ' ' ;IF < space JC PDIM2X ; print as hex CPI 07Eh ;OR IF > '}' JNC PDIM2X ; print as hex MOV E,A ;ELSE print as char MVI C,2 JMP BDOS ;return from BDOS to mainloop ;Print A as a 2 digit hex number dimly + space ;Calls P2HEX to print the number. Returns from BDOS. ; NPDIM2X: CALL NEWLINE ;Newline then... PDIM2X: PUSH H PRINT DIM ;dim terminal code POP H MOV A,M CALL P2HEX ;print byte and LXI D,BRT ;end dim terminal code MVI C,9 JMP BDOS ;Print A as 2 hex digits + a space ;Calls P2HEX to print. Returns from BDOS ; NPBRT2X: CALL NEWLINE ;Newline then... PBRT2X: MOV A,M CALL P2HEX ;print byte MVI E,' ' ;and space MVI C,2 JMP BDOS ;Print (HL) as a hex word and ;increment the pointer beyond the word ;Calls PUTHLX to print. Returns from BDOS. ; P4HEX: MOV E,M INX H ;skip over 2nd digit SHLD PNTR MOV D,M XCHG CALL PUTHLX ;print hex word MVI E,' ' ;and space MVI C,2 JMP BDOS ;--------------------------------------------------------------- ; UTILITIES ;---------------------------------------------------------------- ;Print CRLF, then bytecount and colon ;Calls PUTHLX to print. Return with HL preserved ; NEWLINE: PUSH H PRINT CRLF POP H PUSH H CALL PUTHLX PRINT COLON POP H RET ;Print HL as a 4 digit hex word ;Calls P2HEX to print. Returns from BDOS ; PUTHLX: PUSH H MOV A,H ;first byte CALL P2HEX POP H MOV A,L ;second byte ;; jmp P2HEX ;Fall through ;Print A as 2 hex digits ; Since most chars are printed from this routine ; it was unrolled from subroutines and done as ; in line code for speed. ;Enter A = binary value to print ;Returns from BDOS ; P2HEX: PUSH A ;Save value ANI 0F0h ;Get high nibble RRC ! RRC ! RRC ! RRC CPI 10 ;IF > 10 JC P2X01 ; ADI 7 ; add 7 P2X01: ADI '0' ;Convert to ASCII hex MOV E,A ; MVI C,2 ; and print it CALL BDOS POP A ;Restore value ANI 0Fh ;Get low nibble CPI 10 JC P2X02 ;Convert ADI 7 ; P2X02: ADI '0' ; MOV E,A ; MVI C,2 ;and print JMP BDOS ;Return from BDOS ;=============================================================== ; DATA ;=============================================================== ;Matrix to tell how to print the char ; 0: dim hex byte 1: newline + dim hex byte ; 2: brt hex byte 3: newline + brt hex byte ; 99: brt hex word ; X: char or dim byte Y: newline + char/dimbyte ; Z: stop printing ; CODE: ;0123456789ABCDEF DB '1990209900000000' ;00 DB '1000000000000000' ;10 DB '1000000000000000' ;20 DB '1000000000000000' ;30 DB '1000000000000000' ;40 DB '3992992000003XXX' ;50 DB 'XXXXXXXX00003XXX' ;60 DB 'XXXXXXXX00002222' ;70 DB 'YXXXXXXXXXXXXXXX' ;80 DB 'YXXXXXXXXXXXXXXX' ;90 DB 'Z' PNTR DW -1 ;Pointer to char to print CRLF DB CR,LF,'$' DIM DB ESC,')$' ;TERMINAL CODE: BEGIN DIM BRT DB ESC,'( $' ;TERMINAL CODE: END DIM + ' ' COLON DB ': $' STAK EQU $+64 END B ESC,')$' ;TERMINAL CODE: BEGIN DIM BRT DB ESC,'( $' ;TERMINAL CODE: END FIat; int FItop, FIleft, FIbot, FIright, FIfc, FInl; fill( top, left, bottom, right, character, attribute ) int top, left, bottom, right, character, attribute; { FIch = character; FIat = attribute; FItop = top; FIleft = left; FIbot = bottom+1; FIright = right+1; FIfc = (top*128)+left; FInl = 128-(right+1)+left; #ifdef SMALL #asm .Z80 ld a,65 ; bank 7 reference out (0),a ; enter bank 7 ld hl,FIleft ; hl = pointer to column ld d,(hl) ; now d = column counter ld 11"ND!p!#*^#V#N#F#"`iE.0R͌ ͌ ͌ Ì͌ ڛ0_ ڭ0_Ϳ  :=2*͆U "Y ~XC7+ D2N? *N͌K D*Nw!">2P !Q~#V#~~GPvGz~GPv0 a_Ʉ\ \EEE)4?JU8`8k8v88 8&1<GR]hs~\  EBDOS Base $HashCheck $HashDrive $HashName $Hash Ext $Version $User Area $Rtn Code $RSX Page $Def Drv $Def User# $Inp Buffr $CCP Flag1 $CCP Flag2 $CCP Flag3 $Con Width $CurColumn $Buff Ptr $Comd Ptr $CIVEC $COVEC $AOVEC $AIVEC $LOVEC $Page Mode $DefPgMode $CtrlH $Rubout $KeybdStat $Con Mode $BankBuff $DelimChar $LstOutFlg $KeybdLock $SCB Addr $Curr DMA $Curr Drv $VINFO $Resel $Media Chg $BDOSFunc# $User Nr $Dir Entry $Saved FCB $Match $MltI/O $Err Mode $Drv Chain $Temp Drv $Err Drv $Media $BDOSflags $Date $Hour $Min $Sec $Common $ErrJmp $MaxTPA $?? $ ==== END of SCB$ T Address: F8__$=7>Value: $$: $ X to exit C to change a byte N for next page ...$ $:00000100000000000000010000000000000003992992000003XXXXXXXXXXX00003XXXXXXXXXXX00002222YXXXXXXXXXXXXXXXYXXXXXXXXXXXXXXXZ $)$( $: $vJ1SETSCB.ASMa  !"#$%&'()*+,-./0123456789:;<=>?@ABoCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`*DD)ѽ&7Hwnv8#ɦF wע&# ғjwvzh3EgِY1Г;EH6E4df$aEAcGEY 8ST#=Ztqi%h׹Y 8S)WP޼T=9t+6m@~fb?9SNǦtqi%h]佤⺰3ř_7-ns3m3g xFId3UO) EAe-g {M+AB t eyz_.whm=6זBp8S_߽8Son~r8Vp3P ]¶8,]sY,m P q3E7=Ϥ%>,L8|Y\Q~qDYu#Jq'#Ž3M8Nk8S|My3k'.q>㈫Pzbg8LəWM8Son~rK A /Ri2K5Mv%!/ iv>r]=B&_Ǚ֏ ȫtJ K5  wP&./Qp]=B&_Ǚl:z_**Ri2Kz_;fh36 "=g ^q ]I3wމ;/3'g ^5/77?9 mp8C0#$r}@ gT",%:[ܳ&#jtqisatn B3xy36vm-5{ΐ{ T",CnHwnvtXg;gBg %:[ܳ ZLHζ Ì#]/),B plUyמ9!.[ + L< e% '1#@a3lvz@͙&26O<33ܷ(#, 1c(3*LܐgĤuv:p=w<@IZa0(8ü<`xa^ ^{v<@P^r =gB# =gHĤU#uf ^{ 9מ;PP !w( 0}@qb2q|L!9A{O8Sonsƙg^)ȺQ`'}LQ5tq*+m\#h玣huM2(Hd4/4m;qƙz}0Sy!Έ35m6LMlAtVU暲e% gզM^q!9ü<@Bu͹յAW}hWa:z_T9NPcHk+8S D{:H3q8SS0/1m35&K[;scid'w\ ΢M_ݾ  nյ;wP|Ya8w+P 6yYt&MB0=$gU# c*2Mf鮰3LX5PEg 3ABe 1Cr]=> ˳VVp}ܝ S;Aryysc {D}Cٮ1 1*@M5T;v 3&D}Cnaiumg)m 9Si2KXszp;E})2Mf9m _q!9ü<@Bu {D}s ƜVVpy;d;g35Sx4_܂ih΍-8S4g&AP 1|L®MV ep3zn'w\ 0=**q=ZpjQnQ֬V ALA3i] @J^#ZwgoaoE*9.kJٓ0lNU:3x SP;En6PdRc9l3L Das#ׂ3TˌrPҘ?R֬Vgӌ3׈VI*9Y*^38מ; \Pn6PdrބP 6L~P g4;4%w0f4ٙ~I7΢$^q!9g )z4C;G4š&;sބP vm2:Bl8Si2K:7Ndb3Kn6.3q,(ڶ$Sdr8[m?/+0CPxnil2P!+# F46 6Gt {Is {D6LYrCzM|Ya8K y?3?%ڞϋg)# aipK|Ya*k,O| 펣huMk] ,?~PFҤ&˚}/1iΔ{o>G3EG1kId*vF&oy9p)^Fˍ8í}PUvM5gU#ΏQ$ gӌԼ ?!lPuc9fԺԼi׹Yp',A!-EYp,^gy`U Et(#d9&3_>a׹YjP[zrfpȚkrnq$Sw0ε"sǿRל;Z][ٮ;#`^bx;r~K gx[ΠG>gyOxt(#du9&3_>aםPғ;6C\{v8C%tkO33Lcw5 ΐ{Is<{8wQ9WW2LH|Yΐ3LXO8Cǜq^e:x^|!Έ3E’}̩ih΍-` G@صɈ*zC&s5=ZpD|Np(%:.`DQPל;Z][Qkq5v;6&8Sdm2A],lAEAȥP qg2(0+1zeA^C!,g x}7_8KeU;8pPumH/8KU_DI8(ˏsUAnd/(eQv>; }_*w%q,?h r /'{!v%q,sU> r /=A2(eYu>An$r%q,A,*rD5ʲz9ʐڊ,8KxѭDI8(JwmH3 y[ATX,+s" Rodpr%q,M c%g[x7$p%q,òsu3-t^q%q,ûAm u3-T$esmg[xӕDI8(Y -; )h7(eD^ew%q,÷(}3-T[DI8([ c. r / )DI8(˰D6Pw3-T$e;Ѷ $ԝ^瓯DI8(;6muu^ۓDI8(K]vM@]= r /ړDI8(K}96mu3-Ov%q,AtowAn}{(evM@]Anӭ'}QRD}C]i0^ r /Ma:8pPE cG DU;8pPm ڶzYqc Aā:Ѷ $K^ N$:QxP/} ӼlZQRh3-4w%q,D}C= r /|$;QxPϮ8K7E;@āA>ԳAn$XQ/;QxPϞqK;8pP] ڶz3-4N:8pPAm g[xWz JAY/:QxP>rz}<$s r /O$s, r /IQ9P4g[xi{ N$;QxP/J R?Aāe cgqI;@TX,}s=fzqEWu93 Rϗs JAYnA>ԋgax%Qrs9s3@xAWu93 p&$e -ԋoAnᥲ}8pPgh; }{  JAYnv>^T r /$[ cE^$] c r /խ絋(e9m ^H R?xM$FwmH%g[xO(e;Ѷ $+ R%q@Cl3'gyiXT_~% z}oμTIX%>d:mB[JkRlZ w( KU_!C{t'v)I 1PBf׉3/'{ C{i5) ™Ry>dz^QZ/y>1dz-QZ/y] C'a&ψ(9cT_A0TRZqAV!fA5)'2 SIhvdMvKan}u<QZGۼ嗋 46[ܳK 2D-Ły"&%]< ֗0y7$ QKqc!̿(IIqpף(l}Y Ù7D`(I`(?e=.\l&֖&y2DD=QZZbNd&k3ٜ\嗋 ydZ6{&eD!, M񹠛/y!j'ڌ%51wv3rY{@uѶlGi͙?z dZ%Kfu>h(IEyYadj}8Ù֛2D@5DiM*ʛ C6Y嗋 yOdZ'_͗Ku{5 CԺ=n5g^Z'_2D]'_͗Kk@k֜yiߞ| uߞ|M7_Қ3/n=2D=gA^>JkμT֓!j)AiMVה7y~f͗Kccu^kK75g^տOb@ՐXRZsk3A5)gE> 䃠j,F Qn9\Di͙J=@\CiMJ뉌(-4*sƙxB¶kϔ֜yir {2DU\>}&U\r 4bamLzuil&:2D萪a0DiMClVc̙c 2DƐ*&DFds]8R} dp Q1$QZz"# a 9 G˙e2D}MK7_Қa"w( μ4d:KZli^6-=c3p楞/2D퉡qIwgJkμts\4 Cԡl:Қ3/=&2D},QZz"# a 9 G˙K2D-C~f55)5ה/+a(?nm,QpIu2DOb)IYq#mtșzU Q{ut%I 1Pf^$m 16yVp^- Ch翶tGZz"# a 9q~I!jA5g^*/!jiHwnQZs楱M28AcqH'K@'@}cH'"Jkμ\2D퉡qKZsᦿMeF\PZs楲}a2D-]+oi͙c>_s޼2D5#9׀ Q'bG7HkμT.!j_.yF75q~ޛy援KxTiM]B;GZs"BN"I5g7?9d5g^!tv=s*k$M&8d#mۿN8amBy;2h~S;/^8oצ ˒3@O(9'wd0q (7ʲ,\2ĕS:S:%g7?9LcA_5g^F@Ёo lNyck'Bdsunvڊډ3BP&[ܳ>5g:7!ton B jr{VZ3rCi#gA 䏴יICn!]*2ٸ Ù,3/6t A2˪sJ5EXah5t %:;#d+(?._gV& Lcw5 g^h3+ g$qD8&#w:)]Gc 8S?`DQP~] k;#4ٙ"dVOXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*!9!*!;)<*|&!) !9!;)|ʰ!;)Ô!9*(*í!9***í!9*,*í!9*.*í!9*0*íí*+KYguT!9!;)!;)͍*!͠*!;)!;)͍*͠*>')!;);!;)"(T!;)"*T!;)",T!;)".T!;)"0TT*+ ,! 9!;)*!9!;)!;)!;)͍*!;)!;)͍*͠*)!9!;)*!>!9!;)!;)͍*)!;)/*| ! 9!;)!͠*!; S E T S C B View and set System Control Block Values (C) 1986 Gordon Wilk 6707 Springpark Ave Los Angeles CA 90056 CPM3's System Control Block has been described in Osborne and DRI documentation as well as in FOGHORN articles. There remain numerous undocumented locations in the Block. SETSCB is a tool for experimenting with with the SCB. It displays all the values in the Block, including the undocumented locations, and allows any of them to be changed in memory. The command SETSCB will display the SCB in a paged display that rolls back to the top after the last value is displayed. At any time, any byte can be changed by pressing "C", then, at the prompts, entering the address and new byte in hex. Remember that values displayed as words are actually stored backwards in memory. SETSCB alters only the memory image. It does not alter the SCB image in the CPM3.SYS file on disk. Although it is easy enough to write the SCB block from memory back to disk, it is not appropriate to do so. The memory image is not the same as the disk file. Various locations are altered during the boot routines. SETSCB can serve in place of SETDEF, USER, DEVICE etc. Some of the undocumented locations have been labeled based on their use as I discovered them from experimenting with SETSCB. Some of these are described below. All are commented in the program listing. Locations of undiscovered significance remain. Users who discover the function of these locations or correct labeled locations are requested to modify the code and comments accordingly. The code is table driven and all locations can be modified by changes to D$Tble and M$LABELS in the data section. I would be interested to hear of any discoveries. The comments in the listing should be used to help interpret values. Uncommented locations are described in the DRI documentation. The approved method of accessing the SCB is through a BDOS call. The SCB, however contains its own address (at offset 3A). This can be obtained by a BDOS call and all subsequent references made by absolute address. This is the way the CPM3 Loader and Console Command Processor do it. And it is the way SETSCB does it. The Console Command Processor (CCP) and the Loader can get input from five different sources: the console, a BDOS chain command, a GET file SUB file, or a multiple command line. The later three are saved in an RSX format in high memory. The locations labeled Inp Buffer, CCP Flags 1-3, RSX Page, Command Pointer and Buffer Pointer are used to keep track of where the next command is coming from and how it should be processed. The CCP Flags also record certain features entered with the SETDEF system transient. CCP Flag1 (F8B3) bit 0 SUB active 1 Do not remove RSX's 6 Do not reset User # 7 RSX's present Flag2 (F8B4) bit 0&1 Display program name on call 3 search order = COM,SUB 4 search order = SUB,COM 5 reset disks 6 SUB input available 7 chained input available Flag3 (F8B5) bit 1 Load PROFILE.SUB if bit=0 A transient program can change the current drive and/or user but the CCP will reset it to the difault value on warm boot. The default drive and user are stored at locations F8AE and F8AF for such restorations. only the CCP normally accesses these locations. Some system transients allow temporary setting of the page mode; the default page mode is stored so that the CCP can reset it. Some of the unlabeled locations may be used by SUBMIT.COM or other system transients for similar temporary changes to SCB values. Remember that GENCOM can add an RSX header to any com file which will set ANY byte in the SCB. This allows you to set a custom environment for any program. The Load Profile flag is interesting. CPM3 tries to load PROFILE.SUB on each cold boot if bit 1 of CCP flag 3 is 0. If the disk search order includes drive B:, the seach for this file will be made on that dirve as well as A:.  If there is no disk in drive B:, a BDOS error message results. Setting the drive search order to *, A:, B: should be combined with setting the Load Profile flag to 1. This can be done with SID or DU. The SCB is the tenth record in CPM3.SYS. The code as written is specific to a CPM3 system using Televideo 9xx terminal codes (the Osborne Executive is one such). Changing the codes for "clear screen" and "cursor at x,y" will enable the program to run on any CPM3 system. RELATED PROGRAMS: SEESCB (SIG/M 236.1) displays the SCB in the same format at SID without labels or explanation; it is 8k. SETDEFLT (FOG CPM/047) displays and sets a few SCB values on DISK. It is 20K. REFERENCES: Osborne Executive Technical Manual. Volume B, Appendix A. DRI. CPM Plus Programmer's Guide. Appendix A. DRI. CPM Plus System Guide. Page 28. chnical MaOXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :* MORE ON THE SCB Gordon Wilk 6707 Springpark Ave Los Angeles CA 90056 213 645-6419 A number of execellent articles on the System Control Block of CPM Plus have been published in FOGHORN, yet there is more to tell. The DRI Programmer's Guide insists that we use BDOS function 49 to get or set values in the SCB, yet the CCP does not do it this way. It turns out that a particular location in the SCB (offset of CDh) contains the address of the SCB. We can get this address with function 49 once and then use it to read and write the SCB directly. This location contains the address but it is easier to just use the high byte and refer to all locations by their low byte address on this page. Any SCB value can be easily located by placing the high byte in H and the offset in L. The CCP does it this way. To find the SCB base: LXI D,SCBPB MVI C,49 CALL 05 SHLD SCBBase RET SCPBP DB 03Ah,00 There is no easy way to make a DOS call in BASIC so use this code once or you can assume that SCBBS% = &HF800 (probably). Now we have the base page address stored in SCBBase. To access any value in the SCB LHLD SCBBase ;Get the page address MVI L,offset ;Move an offset into L ;We are now pointing to the value MOV A,M ;Load it into register A RET in BASIC: scbname% = PEEK(SCBBS% + offset) e.g. VERSION% = PEEK(SCBBS% + &HA0) To set any value in the SCB LHLD SCBBase MVI L,Offset MOV M,A RET in BASIC: POKE SCBPG% + offset, value e.g. LISTFLG% = &HD4 POKE SCBPG% + LISTFLG%, 1 This is the way the CCP does it; the BDOS have direct access since BDOS was told the base address by GENCPM when the system was generated. In the list below are the values in the SCB with their addresses expressed as offsets from the base page. On my system this is F800h, it probably is on most Osborne Execs -- you can address the SCB directly without this procedure, but using the procedure allows your code to run on any CPM Plus  system. A number of the values in the SCB are listed only as "reserved for system use" in the documentation. I have attempted to describe these based on their use by the CCP and BDOS using the dissassembled code produced by Clark Calkins' SCG31 (see end of article for acknowledgement and more information). Some of them may have multiple uses and I have only listed those I am sure of. Most variables documented by DRI, I have left without comments. A few, I have not figured out and would like to hear from anyone who has. The offsets listed below are relative to the SCB base page address. Official SCB addresses are 9Chex smaller. OFFSET NAME LENGTH DESCRIPTION ------ ---- ------ ----------- 9C-A0 HASHBYTES These are used by the directory and filename routines. 9C HashChek 1 Hash value for directory check 9D HashDrve 1 Drive being checked 9E HashName 2 File being checked A0 HashExt 1 Extant being checked A1 Version 1 CCP resets to 31h at warm boot A2 Users 4 A6 ??? 5 May be used by SUBMIT.COM? AB SavDrv 1 Save current Drv here if SUBMIT may change it. AC RetCode 2 CCP resets to 0 if not chaining The remainder of a multiple command line (the part after the !) is stored as an RSX. RSXPAGE and NXTCMD are used to locate this special area. AE RSXPage 1 HiByte of RSX address AF DefDrv 1 Default drive saved here B0 DefUser 1 Default user # saved here B1 NxtCmd 2 Address of rest of multiple input line B3-B4 CCPFLGS Used by the CCP for a number of purposes. Involved in SUB file, multiple cmd line processing and chaining. Note that Flag2 overlagps SavBuff. B3 Flag1 1 Bit 7: chain requested Bit 6: use default User & Drv Bit 1: remove RSXs B4 Flag2 1 Bit 7: cmd line not finished Bit 6: Use current User code Bit 5: reset dieks Bit 4&3: COM/PRL/SUB code Bit 0: SUB file active B4 SavBuff 2 Address of previously saved input line used to recall last command. B5 Profile 1 Overlaps. If Bit 1 is set, which is only on a cold boot, the PROFILE.SUB command is executed. B6 ConWidth 1 B7 CurCol 1 B8 PageLength 1 B9 ??? 1 Default Page length??? BA BuffPtr 2 input line pointer BC KBPtr 2 keyboard input line pointer BE @CIVEC 2 C0 @COVEC 2 C2 @AIVEC 2 C4 @AOVEC 2 C6 @LOVEC 2 C8 PageMode 1 C9 DefPgMode 1 Page mode stored here by CCP CA CTRL$H 1 CB RUBOUT 1 CC KeyStat 1 Keyboard status for submit mode input CD ??? 2 CF ConMode 1 Console mode CCP resets to 1 @ WarmBoot D0 RSXInput 1 Flag set if an RSX is providing console input. Used by SUBMIT and GET. CCP resets to 0 @ warm boot D1 @BNKBF 2 Address of bank buffer D3 Delim 1 CCP resets to '$' on warm boot D4 OutFlag 1 D5 KeyBdFlg 1 Keyboard locked flag D6 SCBBase 2 The base of this table D8 @CRDMA 2 DA @CRDSK 1 CCP resets to DefDrv at warmboot DB @VINFO 2 (DE) on entry to this function ->fcb DD @RESEL 1 DE @MEDCHG 1 DF @FX 1 Register C on entry to BDOS E0 @USRCD 1 CCP resets to DefUser at Warm boot E1-E5 SEARCH Used by BDOS functions 17 & 18 E1 Entry 2 directory entry location for searching E3 SrchFCB 2 fcb adr for searches E5 MtchCnt 1 char count to match E6 @MLTIO 1 CCP resets to 1 on warm boot E7 @ERMDE 1 CCP resets to 0 on warm boot E8 DrvChain 4 EC TempDrv 1 ED @ERDSK 1 EE ?? 2 F0 @MEDIA 1 door open flag F1 ?? 2 F3 @BFLAGS 1 Bit 7: error message length F4 @DATE 2 F6 @HOUR 1 F7 @MINUTE 1 F8 @SECONDS 1 F9 Common 2 address of common memory base FB ?ERJMP 3 FE @MXTPA 2 Perhaps the most interesting unpublished locations are "DefDrv" and "DefUser". Applications programs either directly or via BDOS calls may set and reset the current drive and user number at will. The CCP will always reset them to the default when the application program ends. The CCP does this by setting @USERCD and @CRDSK to the values in AFh and B0h on warm boot. When the CCP changes the user (the USER command) or the current drive ("B:"), it also sets "DefUser" or "DefDrv". In the normal course of events only the CCP can permanently change either the User or default drive. A sneaky application program can do the same thing by changing "DefUser" and/or "DefDrv". The current user and drive settings will not be affected, but the CCP will reset them on warmboot. This work was based on the disassembled code produced by SCG31, a program copyright by C.C.Software, 1907 Alvarado Ave Walnut Creek CA 94596, 415 939-8153. It costs $75 and is worth it for anyone knowledgeable in assembly language and curious about the way the operating system works. Labels beginning with "@" or "?" are copyright by DRI.  language and curious about the way the operating system woOXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*!Osborne Executive system patch If a CPM3 command in a SUB file or on a multiple command line begins with a colon and the preceeding program ended with an error, the command will not be executed. Ending a program with ^C (control C) is not considered an error termination in spite of the wording of the DRI CPM Plus Programmers Guide (page 1-23). Under some circumstances this may be the correct choice, but consider this command line: CC FOOBAR ! RMAC FOOBAR ! LINK FOOBAR,STDLIB If many errors occur in the c compilation or assembly steps, it would be nice the abort with a ^C and not have to sit through futile executions of the linker. The patch described below convinces the console command processor to accept ^C terminations as errors and not execute the next command. Use DU or similar disk editor to change Track 1 Sector 19 Addresses 16-18 FROM CA 1C 0A TO 00 00 00 If the bytes on your disk are different from those shown DO NOT MAKE THE PATCH. Doctor Dobbs Journal Vol 9, Nr 2 (2/84) page 16 showed a number of patches, one of which killed all waiting commands on the multiple command line. This patch will only kill the one command following the aborted program. Unfortunately the patches were made to the relocatable system files as distributed by DRI. Osborne distributed neither the system relocatables nor GENCPM to use them with. If anyone has converted those patches to a new CPM3.SYS file for the Exec, I would like to hear about it. Perhaps FOGHORN would publish the absolute patches. The rest of the published patches increased the efficiency of buffer handling, corrected a hard disk BIOS READ ERROR bug, made it possible to read directory on disks marked R/O, and corrected a random read error bug encountered on large files. GORDON WILK 6707 Springpark Av (213) 645-6419 Los Angeles CA 90056 random read eOXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*10 'This program entered into the public domain on 11 February 1984 20 'by William van Riper. It runs on the Osborne EXECUTIVE but may 30 'be altered to run on the Osborne 1. Its use is intended to be 40 'instructional and is COPYRIGHTED as such. Please respect this. 50 'Any bugs or fixes in this or the accompanying set of programs may 60 'be sent to me c/o MBINEX - 617-423-6985 - username VANRYPER. 61 ' 62 ' 69 'Makes a function to direct-cursor-address the screen: 70 DEF FNP$(X,Y)=CHR$(27)+"="+CHR$(Y+32)+CHR$(X+32) 80 WIDTH 255 90 PRINT CHR$(26) 95 ' 100 PRINT FNP$(5,5);"*** FINDCHAR MENU ***" 110 PRINT FNP$(5,8);"1. Look at one character at a time" 120 PRINT FNP$(5,10);"2. Run through characters 0-255" 130 PRINT FNP$(5,12);"3. Exit to MBASIC" 140 PRINT FNP$(5,16);"Please enter you selection: "; 150 X$=INKEY$:IF X$="" THEN 150 160 IF X$="1" THEN GOTO 340 170 IF X$="3" THEN WIDTH 80:PRINT CHR$(26):FILES:END 180 IF X$="2" THEN GOTO 190 ELSE GOTO 150 184 ' 185 ' 186 'this runs through the characters sequentially from 1-255 187 'note the bank-switching stuff which is needed on the EXEC - the OUT 0,65 188 'shadows in video memory in bank 7 - the OUT 0,1 shadows it out so the 189 'system won't hang! 190 PRINT CHR$(26) 200 PRINT CHR$(27)+CHR$(46)+CHR$(48):'this turns off the cursor 204 PRINT FNP$(5,12);"When poking directly to video memory," 210 PRINT FNP$(15,22);"HIT ANY KEY TO CONTINUE, FOR MENU..."; 220 FOR I=0 TO 255 230 OUT 0,65 240 POKE 50984!,I 250 OUT 0,1 260 PRINT FNP$(29,14);I;FNP$(20,14);"ASCII: ";FNP$(35,14);"="; 265 IF I<32 THEN GOTO 270 266 PRINT FNP$(10,16);"BUT PRINT CHR$(";I;") yields: ";:PRINT CHR$(I); 270 X$=INKEY$:IF X$="" THEN 270 280 IF ASC(X$)=27 THEN 320 290 NEXT I 300 PRINT FNP$(20,14);" " 305 PRINT FNP$(10,16);" " 310 GOTO 220 320 PRINT CHR$(27)+CHR$(46)+CHR$(50):'this turns the cursor back on again... 330 GOTO 90 332 ' 333 ' 334 'this allows you to check on the character that will be written when 335 'you poke it to video memory - it's not always what you might think - 336 'this is because you have a choice of graphics and standard characters 337 'in both normal and reverse video 338 ' 340 PRINT CHR$(26):PRINT:PRINT:PRINT:PRINT 350 PRINT FNP$(5,5);:INPUT "Enter ASCII value desired: ",X 360 PRINT FNP$(20,14);" " 370 OUT 0,65 380 POKE 50984!,X 390 OUT 0,1 400 PRINT FNP$(19,12);"ASCII VALUE" 410 PRINT FNP$(36,12);"CHARACTER" 420 PRINT FNP$(22,14);X; 430 PRINT FNP$(5,22);"HIT ANY KEY TO CONTINUE, FOR MENU...."; 440 X$=INKEY$:IF X$="" THEN 440 450 PRINT FNP$(30,5);" " 460 IF ASC(X$)=27 THEN GOTO 90 470 GOTO 350 480 END  440 X$=OXEGE2 C (OXEGE3 C *OXEGE4 C + OXEGE5 C .OXEGE6 C /OXEGE7 C 4 OXEGE8 C 7 SAMPLE COM :*" This is the release date of the disk. !K"K$K%K&K'K(K)K+K,K-K.K/K2K3K4K5K6K7K8K9K:K;KK?K@KAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKiKjKkKlKmKnKoKpKqKrKsKtKuKvKwKxKyKzK{K|K}K~KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKLOXEGE4 .C F1 17 2560 20 OXEGE5 .C AE 5F 640 5 OXEGE6 .C 0C 57 4352 34 OXEGE7 .C F6 A7 2688 21 OXEGE8 .C F6 F9 2304 18 SAMPLE .COM A1 D2 10880 85 SAMPLE .C 9F 38 2432 19 TEST .BAS A4 37 4864 38 BANKLOOK.COM 77 D6 640 5 BANKLOOK.ASM ED 38 3968 31 BANKLOOK.DOC DF C3 1408 11 BCOPY .COM C6 7E 1536 12 BCOPY  Fog Library Disk FOG-CPM.182 Copyright (1987) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. 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. Both CPM+ (especially Osborne Executive) and CP/M 2.2 users will find valuable tools on this disk. Included here is a program to augment the filename in describing your files and a program to print the ASCII character set on your screen. If you are interested in the SCB, be sure to investigate these goodies from Gordon Wilk. Filename Description -09-15 .87 This is the release date of the disk. -CPM182 .DOC This is the description of the disk contents. OXEGE .DOC EE14 15K [OXEGE 1 of 17] A graphics interface program for the Osborne Executive. It creates a REL file for Executive WorkPlace and other programs. Full BDS 'C' source is included. EGELIB .SUB 6F87 1K [OXEGE 2 of 17] OXASM .MAC F6E8 2K [OXEGE 3 of 17] OXEGE .CHR D090 6K [OXEGE 4 of 17] OXEGE .H A23A 1K [OXEGE 5 of 17] OXEGE .REL 6054 9K [OXEGE 6 of 17] OXEGE1 .C 20FC 3K [OXEGE 7 of 17] OXEGE2 .C 1826 2K [OXEGE 8 of 17] OXEGE3 .C 1E4F 1K [OXEGE 9 of 17] OXEGE4 .C F117 3K [OXEGE 10 of 17] OXEGE5 .C AE5F 1K [OXEGE 11 of 17] OXEGE6 .C 0C57 5K [OXEGE 12 of 17] OXEGE7 .C F6A7 3K [OXEGE 13 of 17] OXEGE8 .C F6F9 3K [OXEGE 14 of 17] SAMPLE .COM A1D2 11K [OXEGE 15 of 17] SAMPLE .C 9F38 3K [OXEGE 16 of 17] TEST .BAS A437 5K [OXEGE 17 of 17] BANKLOOK.COM 77D6 1K [BankLook 1 of 3] Lets you look into the Osborne Executive memory banks. ASM source is included. BANKLOOK.ASM ED38 4K [BankLook 2 of 3] BANKLOOK.DOC DFC3 2K [BankLook 3 of 3] BCOPY .COM C67E 2K ver. 1.0 [Batch Copy 1 of 2] A batch copy program for CPM+ computers. Copies up to seven sets of files; primarily intended for use with RAM disks. BCOPY .DOC 194F 5K ver. 1.0 [Batch Copy 2 of 2] LIST .COM 0DA0 1K  [File Desc. Lister 1 of 5] Extracts the first line of one or more files so as to expand on the filename in describing the purpose of the file. Will even pull first line (hopefully, the copyright) from program files. This is the generic version. ASM source included. LIST .AQM 2985 10K [File Desc. Lister 2 of 5] LIST .DOC F51E 7K [File Desc. Lister 3 of 5] LISTEX .COM 6BA1 1K [File Desc. Lister 4 of 5] Osborne Executive specific version of LIST. See LIST.DOC for details. ASM source is included. LISTEX .AQM C297 10K [File Desc. Lister 5 of 5] LOMEM .COM A45E 1K [LowMemory 1 of 2] Displays low memory on the Osborne Executive. ASM source is included. LOMEM .ASM E078 6K [LowMemory 2 of 2] SETSCB .COM FD54 2K [Set SCB 1 of 3] Sets the System Control Block on any CP#M+ system. See also SCB.TXT for additional information on the SCB. ASM source is included. SETSCB .AQM FB77 9K [Set SCB 2 of 3] SETSCB .DOC 4349 5K [Set SCB 3 of 3] SCB .TXT 8426 7K A discussion of the CPM+ System Control Block and list of locations. CPMPATCH.LTR 6609 2K Patches CPM+ to do a proper abort after a ^C. FINDCHAR.BAS A7E2 3K An MBasic program to display any of the ASCII characters from 0 to 255 on your screen. Written with screen codes for the Osborne Executive but could be edited for any system. 2 of 3] BANKLOOK.DOC DFC3 2K [BankLook 3 of 3] BCOPY .COM C67E 2K ver. 1.0 [Batch Copy 1 of 2] A batch copy program for CPM+ computers. Copies up to seven sets of files; primarily intended for use with RAM disks. BCOPY .DOC 194F 5K ver. 1.0 [Batch Copy 2 of 2] LIST .COM 0DA0 1K $%&'