IMD 1.16: 29/05/2007 12:44:43 FOGCPM.047 --FOGCPM047EXCLOCK COM EXCLOCK DOC> EXCLOCK MAC EXCLOCK SUBEXCLOCKRMAC EXCLOCKRMAC!"#$-06-00 86 DATE MAC%&'ROMBANK MAC(TIME MAC)VIDBANK MAC*SETDEFLTCOM+,-./0123456789:SETDEFLTCOM;<=>-CPM047 DOC&SETDEFLTDOC ?@SETDEFLTPLIvABCDEFGHIJKLMNOTIME COMPTIME ASMQTIME RSXRETERM COMSTETERM DOC#UVWXYCWOODDSKDOC2Z[\]^_`DOCINDEXDOCabcdINVERTEDCHR.efghijBOLDFACECHR.klmnopBOLDINVRCHR.qrstuvEXECCHR DOCwxEXSERIFSCHR.yz{|}~GREEK CHR.GREEK14 FON2GERMAN DOCGERMAN CHR.SCRIPT DOCSCRIPT FIL.APL DOCAPLCHARSDOCAPL CHR.APL OKI FUNNY CHR.This is the disk name. ɀkEXCLOCKR: j3=8>e2P>2_<P:__>f>2_2`>d2P<P:_:` 3EXCLOCK - a utility for the Osborne Executive by George F Peace - 4/84 USAGE: just type EXCLOCK to toggle the status of the clock. $An unexpected error has occurred. If this error persists, reboot the system and try again.$eV^EXCLOCK ãEXCLOCK EXCLOCK - an RSX for the Osborne Executive by George F Peace - 4/84defg y< s1#~!#^#V#^#VSn!#! Sl (>20[lO:p(ye!_~#(##^#V0"{ {>>< / /  [n>:p G[n22pG! $~2D#^#V"H!C3! $=!@ $P [n>G!= $P>2p2[n[n2 sJ1l[*oR:"o*́!{Y!q>!>?:mwb!C32{J3"NҠ|ʠ"Æ>ª>2 x!y*>O" <ھG*|/20[lO:p(ye!_~#(##^#V0"{ {>>< / / ' EXCLOCK - a utility for the Osborne Executive by George F Peace 4/29/84 P.O. Box 481 Midlothian, VA 23113 Compuserve 71555,1501 The EXCLOCK program provides an onscreen clock for the Osborne Executive. The display of the clock can be started or terminated by executing the EXCLOCK.COM program provided. The program will reverse the condition of the onscreen display each time it is executed. Typing: EXCLOCK ? will remind you of EXCLOCK's function and use. CHANGING THE DISPLAY MODE OF THE DATE/TIME DISPLAY Anyone needing to change the display attribute of the onscreen date/time can currently do so with SID, ZSID, EDFILE, etc. The byte at address 04EDh in the EXCLOCK.COM file contains the attribute byte mask used to update the display. The byte, as released, contains 80h to display the date/time in normal intensity. Update the byte to indicate any valid display attribute. The attribute byte is btacketed by right and left arrows and should appear as follows if the SID command D4EC,4EE is issued: 04EC: 3E 80 3C >.< ^^ ^ As a reminder, the following are the changable display attributes: 010000000b ;attribute byte for the date/time display |||||||| ||||-----unused |||-alternate font ||-blink |-underline -full intensity CAVEAT This program has been tested with and operatesd on ROM version 1.2 and BIOS versions 1.0 and 1.1 and is, to the best of my knowledge, sound of design and operation. I don't, however, have knowledge of or access to much of the software available for this operating system and machine. The responsibility for damage due to use of this program is solely the user's. TECHNICAL INFORMATION: Read the following only if you have the stomach for my ramblings. It is rather verbose and vague at times but for the most part follows the design of this program, stopping now and then to confuse a point. The EXCLOCK program is a transient whose function is to load and unload the EXCLOCK Resident System Extension (RSX). The RSX updates the onscreen clock "continuously" as long as it is active. All other operations on the Executive will run without interference. Programs run on the Executive also will not interfere with the onscreen clock operation. Seems like magic? That's what I thought it would take when I first tried to build the RSX. Read on and find out how its done. The EXCLOCK RSX itself is responsible for establishing the RSX environment and starting or stopping the clock display. Its operation is divided into three distinct functions: INITIALIZATION PROCESSING TERMINATION Initialization: Following standard RSX housekeeping operations (save the caller's environment, mark the RSX as active, lock the RSX in memory), an adjustment is made to the Executive's interrupt routing table to point to a routine of local origin. Lesson one: Page 457 of the Executive Reference Guide shows that the RTC interrupt routine is pointed to by the ninth 3-byte entry in the interrupt routing table (INTTBL). A quick trip into the ROM verifies that the table does in fact exist and is in fact copied to 023F3h as the manual states. Ok, that was easy enough. All we need to do is write a new interrupt handler, lift the INTTBL entry, replace it with the address of our new one and we're done, right? Wrong! We have to factor in how INTTBL is used and how an interrupt is processed in the "untampered" machine. First of all, the INTTBL entry indicates that the stock interrupt routine is in memory bank eight (as are all of the Executive's interrupt processing routines). Our routine will be operating in bank one, so all we need to do is jump over to bank eight when we're done. Seems easy enough. Lesson two: Any routine passing control to the RTC interrupt routine must do so with only banks zero (always there) and eight visible. Our routine executes in bank one and a switch to bank eight might be a little messy in the middle of our routine. Ok, now we need to develop a "back-end" to our interrupt "front-end" that will properly turn control over to the real interrupt routine. All we need to do is find some as yet unused memory somewhere in bank eight. We're limited here by the hardware and software design and so decide to concentrate on the BIOS code in common memory (above 0F900h). So begins the search for available memory. Just look for zeros and try fiddling with them. Found some zeros. Fiddled. Machine hung. Found some more. Fiddled. Machine still ran. Now backtrack and discover that we have a space with 88 unused bytes. That seems to be enough as by now a back-end routine seven bytes long has been developed. That routine simply switches bank eight in and jumps down to the ROM routine. The goldmine, we discover, is a portion of the Character Device Table (CHRTBL) in BIOS. That table allows for up to 16 "physical" character devices to be defined to the operating system. The Executive uses only five slots so 88 bytes are left over. 16 table entries of 8 bytes each plus 1 byte table terminator = 129 5 used entries of 8 bytes each plus 1 byte table terminator = 41 ---- unused space: 88 bytes In cases like this, it is wisest to hide things, so the seven byte back-end routine is targeted for the last seven bytes of the table. That will allow definition of nine additional devices before any more fiddling is required. The initialization routine thus performs the following tasks: - Switch in the ROM bank (eight) and build the back-end routine from the values in entry nine (the RTC interrupt) - Save the original three-byte interrupt routing table entry so the termination routine can return things to normal - Relocate the back-end to the unused area in BIOS - Update the interrupt routing table entry to point to the local front-end in the RSX - Tell the caller the task is complete Processing This routine is used to "pre-process" the Real Time Clock Interrupt in the Executive. It maintains and updates the onscreen clock. The date and time are extracted directly from the System Control Block (SCB) in BDOS. The information is extracted in this way as opposed to the standard BDOS call 31h as there appears to be an EI (enable interrupts) instruction somewhere in the BDOS path. That cannot be tolerated in the middle of interrupt processing so we have to rough it. Lesson three: Interrupt processing on a CPU such as the Z80A is performed with all interrupts disabled in order to preserve the path back to the interrupted activity. The EI instruction reenables interrupt processing at their completion and thus allow the another queued interrupt to be processed. If the routine interrupted is an interrupt processing routine and interrupts are allowed to continue, the results are unpredictable. It is therefore necessary to code interrupt processing routines such that no loss of integrity occurs. Since this routine processes RTC interrupts and those interrupts occur frequently, it is unwise to allow anything or anybody to interfere with its operation. Two failsafe features have been built into the routine to reduce the chance of corruption: - The back-end routine is replaced in high RAM on each pass through the interrupt code in case some unknown force destroys all or part of it. - The RSX memory lock is reset on each pass in case some other unknown force tries to release the RSX. Termination This routine simply copies the original interrupt routing table entry into entry nine to bypass our front-end code. ation This routine simply copies the original interrupt routing table entry into entry nine to bypass our front If the routine interrupted is an interrupt processing routine and interrupts are allowed to continue, the results are unpredictable. It is therefore necessary to code interrupt processing routines such that no loss of integrity occurs. Since  .Z80 ;use M80.COM ASEG ; EXCLOCK.MAC by George F Peace 4/84 ; P. O. Box 481 ; Midlothian, VA 23113 ; CompuServe 71555,1501 ; ; function: Starts or stops the onscreen clock by loading or unloading ; the EXCLOCK RSX. ; ; usage: EXCLOCK toggles the condition of the clock dma equ 80h cr equ 0dh lf equ 0ah bdos equ 5 wboot equ 0 pstring equ 9 callrsx equ 60 rsx$ck equ 100 rsx$init equ 101 rsx$term equ 102 org 100h start: ld a,(dma) ;get command line byte count cp 00 ;anything there? jp z,doclock ;nope - go ahead with the show ld c,pstring ;get print string BDOS function ld de,signon ;get signon message address call bdos ;display the signon message jp exit ;and exit doclock: call rsxck jp z,termrsx ;we're already loaded, terminate active copy ld a,rsx$init ;get initialization function loadrsx: ld (rsxpb),a ;store subfunction in parameter block ld a,0ffh ;reset status byte ld (stat),a ld c,callrsx ;get RSX command index ld de,rsxpb ;get RSX parameter block address call bdos ld a,(stat) ;get the status byte cp 00 ;was all ok? jp nz,error1 ;nope - tell the caller exit: ld c,wboot ;terminate the program but not the RSX jp bdos termrsx: ld a,rsx$term ;get RSX termination function jp loadrsx ;now go set up the RSX rsxck: ld a,0 ;clear status bytes before calling the RSX ld (stat1),a ld (stat2),a ld a,rsx$ck ;get check subfunction ld (rsxpb),a ;store subfunction in parameter block ld c,callrsx ;get RSX command index ld de,rsxpb ;get RSX parameter block address call bdos ld a,(stat1) ;get the status byte cp 0CCh ;is the RSX loaded? ret nz ;nope ld a,(stat2) ;get the second status byte cp 0CCh ;is the RSX loaded? ret nz ;nope ret ;return error1: ld c,pstring ;get print string function ld de,err1msg ;get error message address call bdos ;display the error message jp exit ;go away signon: db 'EXCLOCK - a utility for the Osborne Executive' db ' by George F Peace - 4/84' db cr,lf,cr,lf db 'USAGE: just type EXCLOCK to toggle the status of the clock.' db cr,lf db '$' err1msg: db 'An unexpected error has occurred. If this error persists, ' db cr,lf,'reboot the system and try again.' db '$' rsxpb: db rsx$init ;RSX initialization function db 2 ;2 parameter words follows dw rsxname ;parameter 1 address dw args ;parameter 2 address rsxname: db 'EXCLOCK ' ;name of RSX we're calling args: db 0 stat: stat1: db 0 stat2: db 0 db 0,0,0 end  2 address rsxname: db 'EXCLOCK ' ;name of RSX we're calling args: db 0 stat: stat1: db 0 stat2: db 0 db 0,0, 0CCh ;is the RSX loaded? ret nz ;nope ld a,(stat2) ;get the second status byte cp 0CCh ;is the RSX loaded? ret nz ;nope ret ;return error1: ld c,pstring ;get print string function ld de,err1msg ;get error message address call bdos ;display the error message jp exit ;go away signon: db 'EXCLOCK - a utility for the Osborne Executive' db ' by GeorgNOTE: This file was received with other files associated with the EXCLOCK routines submitted by George Peace. It is designed to act as a SUBMIT set of instructions to compile the various routines under the M80 compiler, not normally supplied with the Osborne Executive. You should consider the following to be an example only, and should change the commands where appropriate in order to use the MAC and HEXCOM routines supplied with the Executive. Jim Switz, FOG Executive Librarian 2 May 84 era EXCLOCK.bak era EXCLOCKR.bak m80 <=EXCLOCK <=EXCLOCKR <=DATE <=TIME <=ROMBANK <=VIDBANK <^C link EXCLOCK[nr] era EXCLOCK.rel link EXCLOCKR[op,nr],DATE[s],TIME[s],ROMBANK[s],VIDBANK[s] era EXCLOCKR.rel rename EXCLOCKR.rsx=EXCLOCKR.prl gencom EXCLOCK EXCLOCKR era EXCLOCKR.rsx s],ROMBANK[s],VIDBANK[s]  .Z80 ;using M80.COM ;EXCLOCKR.MAC version 1.0 by George F Peace 4/84 ; P. O. Box 481 ; Midlothian, Virginia 23113 ; CompuServe 71555,1501 ;This is a Resident System Extension (RSX) intended to run under CP/M Plus. ;The RSX provides an onscreen clock for the Osborne Executive by inserting ;a front-end onto the RTC interrupt code in ROM. ;The RSX is called via BDOS function 60 (in register C) with register pair DE ;pointing to the RSX parameter block. The parameter block has the following ;format: ; RSXPB: DB subfnc ;the subfunction number (0-127) for this RSX ; DB 2 ;exactly two parameters follow ; DW rsxnam ;pointer to the name of the RSX being called ; ; (must be exactly 8 bytes) ; DW arglst ;pointer to the arguments for the subfunction ; ; (may vary in length depending on subfunction) public @dcfld ;receiving area for converted date external @dcvrt ;convert date (HL) to display (@DCFLD) external @tcvrt ;convert time (DE) to display (HL) external vidin ;make video RAM bank visible external vidout ;make video RAM bank invisible external romin ;make ROM bank visible external romout ;make ROM bank invisible ;------ RSX Prefix Structure ------ ; serial: defb 0,0,0,0,0,0 ;room to insert serial number start: jp ftest ;beginning of program next: defb 0C3H ;jump instruction op-code defw 0 ;next module in line (or BDOS) prev: defw 0 ;previous module remov: defb 0FFh ;remove flag initially set nonbnk: defb 0 ;>0 to load only in non-banked CP/M rsxnam: defb 'EXCLOCK ' ;the name of this RSX loader: defb 0 ;loader flag defb 0,0 ;reserved db 'EXCLOCK - an RSX for the Osborne Executive' db ' by George F Peace - 4/84' ;------ BDOS function 60 sub-functions used by this RSX ------ ; rsxtest equ 100 ;test for RSX in memory rsxinit equ 101 ;RSX initialize function code rsxterm equ 102 ;RSX terminate function code rsxdebug equ 103 ;debug control ;------ RSX-specific Constants used to support this RSX ------ ; nparam equ 2 ;number of parameters required in caller's ; RSX parameter block ;------ Define the RSX subfunction lookup table format ------ ; tabent macro m1,m2 ;TABENT subfunction,address defb m1 ;RSX subfunction number defw m2 ;RSX routine address endm ;------ RSX subfunction lookup table ------ ; ftable: tabent rsxtest,rsxtst ;Test for RSX in memory tabent rsxinit,rsxint ;RSX initialize tabent rsxterm,rsxtrm ;RSX terminate and deactivate tabent rsxdebug,rsxdbg ;set/clear debug mode defb 0FFh ;end of table ;------ Miscellaneous data/constants ------ ; debug equ 0 ;debug code generation control rsxpb: defw 0 ;caller's RSX parameter block address spsave: dw 0 ;pointer storage iniflg: defb notinit ;if not reset, all operations rejected init equ 00 ; initialized notinit equ 0FFh ; not initialized ;------ Stack storage ------ ; defs 48 locstk: ;internal stack stksav: defw 0 ;caller's stack pointer CR EQU 0DH ;carriage return LF EQU 0AH ;line feed ;------ Macro Definitions ------ ; ; DDMSG ; ddmsg macro ?msg ;display a string on the console local pastsb local pstcal if debug jr pastsb msgout: push af ld a,(debflg) cp 00 jr z,pstcal push bc push hl push ix push iy ld c,9 call next pop iy pop ix pop hl pop bc pstcal: pop af ret pastsb: endif ;debug ddmsg macro ??msg local tymsg local pastm if debug push de ld de,tymsg call msgout pop de jr pastm tymsg: defb '&??msg',cr,lf,'$' pastm: endif ;debug endm if debug ddmsg endif ;debug endm ;------------------------------------ ;------ Entry point to the RSX ------ ;------------------------------------ ; ftest: ld a,c ;get BDOS function cp 60 ;could this one be for us? jp nz,next ;nope - ignore this function ddmsg < > ddmsg ;This is the RSX-specific BDOS call. First, we'll make sure that the call ;is actually for this RSX by testing the name of the RSX passed as the first ;parameter. ld (stksav),sp ;save caller's stack pointer ld sp,locstk ;load stack pointer with our stack address push bc ;save caller's environment (except AF) push de push hl push ix push iy push de ;save caller's DE ex de,hl ;get caller's parameter block address in HL inc hl ;move past function code ld a,(hl) ;get number of parameters passed cp nparam ;exactly right number of parameters? jp nz,bypass ;if not, pass the caller on to the next RSX ddmsg inc hl ;move pointer past number of parameters ld e,(hl) ;get first parameter address inc hl ld d,(hl) inc hl ;HL points to second parameter push de ;save first parameter address ld e,(hl) ;get second parameter address inc hl ld d,(hl) ld (spsave),de ;save address of actual caller parameters pop de ;restore first parameter address ld hl,rsxnam ;get location of the RSX name field ld b,8 ;set loop counter to 8 (characters) ckname: ld a,(de) ;get next character of caller's parameter inc de ;update pointer to caller's parameter cp (hl) ;compare to this RSX's name inc hl ;update pointer to my RSX name jp nz,bypass ;no match - not for us dec b ;decrement loop counter jr nz,ckname ;go back for more if not done ;Ok, the name matches so this must be the right RSX. ddmsg pop de ;recall passed parameter ld (rsxpb),de ;save caller's RSX parameter block address ;But wait ... what if there is already another copy of this RSX in memory? ;We'll check ... ;Call the next RSX or BDOS to see if this is the only copy of the RSX ;currently in memory with our name. ddmsg call next ;check if this the only one copy in memory ddmsg cp 0FFh ;did the call reach BDOS? jr z,realthing ;yes - this RSX is unique ddmsg ld a,0FFh ;no - this RSX duplicates one already resident ld (remov),a ;mark this RSX to be unloaded jp done ;and return to caller realthing: ddmsg ;Ok, this is it. All the external validity checks are complete. Now make sure ;the RSX has been properly initialized. If not, only an initialize operation ;is allowed. ;Get the RSX subfunction from the first byte of the caller's parameter block ld de,(rsxpb) ;retrieve original parameter pointer ld a,(de) ;get RSX function number from parameter block ld c,a ;save RSX function ;Check the initialize indicator ld a,(iniflg) ;get the initialize flag cp init ;is the RSX initialized? jr z,allfok ;yes - all functions are ok ld a,c ;retrieve the function code cp rsxinit ;is it an initialize request? jp nz,erfun ;nope, treat the request as if it is undefined ddmsg allfok: ld hl,ftable ;get function table address flook: ld a,(hl) ;pick up function value inc hl ;increment pointer to routine address cp 0FFh ;reached end of table yet? jp z,erfun ;yes - bad function passed cp c ;is this our function? jr z,fmatch ;yes - go jump to our function inc hl ;increment HL past inc hl ; address field jr flook ; and try again fmatch: ddmsg ld e,(hl) ;get address of routine inc hl ;in register pair DE ld d,(hl) ex de,hl ;set up HL for the jump ld de,done ;get routine return address push de ;put it on the stack for RET instruction jp (hl) ;and jump to the requested routine erfun: ddmsg jp bypas1 ;no match - continue with next RSX ;------ Bypass this RSX and pass control on to the next one ------ ; bypass: pop de ;restore stack condition bypas1: pop iy ;restore caller's environment pop ix pop hl pop de pop bc ddmsg ld sp,(stksav) ;restore caller's stack pointer jp next ;move on to next RSX ;------ Processing is complete - return to caller ------ ; done: xor a ;indicate to caller that we were here pop iy pop ix pop hl pop de pop bc ddmsg ld sp,(stksav) ;restore caller's stack pointer ret ;return to caller ;----------------------------------- ;------ RSX control functions ------ ;----------------------------------- ;------ Data for Real Time Clock Interrupt Preprocessing ------ ; inttab equ 023F3h ;beginning address of interrupt routing table itablen equ 3 ;length of each interrupt routing table entry intno equ 9 ;number of RTC interrupt in routing table rtcint equ inttab+((intno-1)*itablen) ;address of interrupt routing entry rtcsav: ds 3 ;local save of original interrupt pointer rtcloc: db 1 ;replacement bank index dw rtc ;replacement interrupt routine address chrtbl equ 0FABAh ;address of character device table in BIOS xbank8 equ chrtbl+128-fudgel ; force fudge routine to the tail end of the ; unused portion of CHRTBL ; Routine to pass control to the ROM RTC interrupt routine ; This routine must be in common memory. fudge: db 03eh ;LD A,nnh - load interrupt routine bank rtcbnk: db 0 db 0d3h,0 ;OUT (0),A - make routine bank visible db 0c3h ;JP nnnnh - jump to interrupt routine rtcadd: dw 0 fudgel equ $-fudge rtcsph: dw 0 ;original stack hold ds 32 rtcstk: ;top of local stack vidram equ 0C000h ;start of video RAM row to contain date/time attram equ vidram+1000h ;start of video attribute mask RAM datatt equ 010000000b ;attribute byte for the date/time display ; |||||||| ; ||||-----unused ; |||-alternate font ; ||-blink ; |-underline ; -full intensity db '>' datatb: db datatt ;storage for the date attribute db '<' scbdat equ 0f8f4h ;address of date in BDOS scbtim equ 0f8f6h ;address of time in BDOS datsav: dw 0 ;save area for date compare daytim: db ' ' @dcfld: db ' / / ' ;reserve 8 bytes for system date db ' ' @tcfld: db ' ' ;reserve 8 bytes for system time datlen equ $-daytim ;------ Provide an indication that the RSX is in memory and available ------ ; ; ARGLST: DB nn ;dummy parameter ; DB nn ;status 1 of the request (0CCh=ok, other=error) ; DB nn ;status 2 of the request (0CCh=ok, other=error) ; ;(both bytes must be equal) ; rsxtst: ld de,(spsave) ;retrieve second parameter address ld a,0CCh ;get a special status code inc de ;increment to first status byte ld (de),a ;and update the caller's status byte inc de ;increment to second status byte ld (de),a ;and update the caller's status byte ret ;complete - return to caller ;------ Initialize the RSX environment for subsequent calls ------ ; ; This routine establishes the environment for all other calls to the RSX. ; The operation is completed only if the RSX is not in an initialized state. ; If the RSX is already initialized, the function is bypassed and an error ; status is passed back to the caller. ; ; ARGLST: DB nn ;dummy parameter ; DB nn ;status of the request (0=ok, other=error) ; rsxint: ld a,(iniflg) ;get the initialize indicator cp notinit ;is this a clean copy? jr nz,rsxin2 ;no - can't reinitialize, must use RESET ld de,(spsave) ;retrieve second parameter address inc de ;increment to status byte xor a ;get a zero ld (remov),a ;mark the RSX resident ld (de),a ;set status normal ld (iniflg),a ;and mark this RSX as open for business ; OK, hosekeeping is all done. Switch in the ROM bank and build the FUDGE ; routine from the bank mask and interrupt routine address for the Real Time ; Interrupt. ; call romin ;make the ROM bank visible ld hl,rtcint ;get original pointer address ld a,(hl) ;get original bank index ld (rtcbnk),a ;update fudge routine inc hl ;point to original address ld e,(hl) ;transfer address to fudge routine inc hl ld d,(hl) ex de,hl ;move RTC interrupt routine address to HL ld (rtcadd),hl ;save the address for the termination function ; The original interrupt routing table entry is saved. Now transfer the ; updated interrupt transition routine up to common memory. ; ld hl,fudge ;get routine address ld de,xbank8 ;get destination address ld bc,fudgel ;get routine length ldir ;transfer the routine to common memory ; Save the original routing table entry for replacement at RSX termination. ; ld hl,rtcint ;source is interrupt pointer table entry ld de,rtcsav ;destination is local storage ld bc,itablen ;length of table entry is ITABLEN bytes ldir ;save the original interrupt table entry ; Setup is complete. Transfer our replacement routine into the routing table. ; di ;disable interrupts during table changes ld hl,rtcloc ;source is replacement pointer table entry ld de,rtcint ;destination is interrupt pointer table entry ld bc,itablen ;length of table entry is 3 bytes ldir ;replace the interrupt table entry with ours ei ;we're ready - allow interrupts to occur c all romout ;make the ROM bank invisible jr rsxin9 ;complete - exit rsxin2: ld de,(spsave) ;retrieve second parameter address inc de ;increment to status byte ld a,0FFh ;get an error code ld (de),a ;and let caller know we failed jr rsxin9 ;complete - exit rsxin9: ret ;all done - return to caller ;------ Disengage this RSX ------ ; ; ARGLST: DB nn ;dummy parameter ; DB nn ;status of the request (0=ok, other=error) ; rsxtrm: di ;disable interrupts during table changes ; Copy the original interrupt routing table entry back to allow this RSX ; to fade away. ; call romin ld hl,rtcsav ;source is replacement pointer table entry ld de,rtcint ;destination is interrupt pointer table entry ld bc,3 ;length of table entry is 3 bytes ldir call romout ei ;table update complete - allow interrupts ld a,0FFh ;get a non-zero value ld (iniflg),a ;reset the init flag to prevent further access ld (remov),a ;flag to drop this RSX on next warm boot ld de,(spsave) ;retrieve second parameter address inc de ;increment to status byte xor a ;get a zero ld (de),a ;set status normal ret ;finished with RSX function, return ;------ Set/Reset Debug Mode ------ ; ; ARGLST: DB nn ;00=no debug non-zero=debug on ; debflg: db 0 ;global debug flag (default = off) rsxdbg: ld de,(spsave) ;retrieve second parameter address ld a,(de) ;get argument ld (debflg),a ;update debug flag ret ;operation complete ;------ Real-time clock (tick) interrupt pre-processing ------ ; ; This routine is used to "pre-process" the Real Time Clock Interrupt in the ; Executive. It provides an onscreen clock. The routine has been tested with ; ROM version 1.2 and BIOS versions 1.0 and 1.1. Hard-coded System Control ; Block accesses are used rather than the standard BDOS call 31h as there ; appears to be an EI (enable interrupts) instruction somewhere in the BDOS ; path. That cannot be tolerated in the middle of interrupt processing so we ; have to rough it. ; ; In addition, since the Executive uses only 5 of the possible 16 entries in ; the Character Device Table and the table is a fixed length at a fixed ; location in both BIOS versions currently available, 7 of the 88 unused ; bytes are appropriated for the return-to-ROM routine: ; ;(129 bytes total) - (5 entries * 8 bytes per entry) - (1 byte terminator) = 88 ; ; This is necessary as the ROM interrupt routines must be entered with only ; banks 0 and 8 visible. The location of the CHRTBL satisfies that ; requirement so that bank 1 (where this code executes) can be switched out ; without going off the edge. ; ; Also note that since this routine processes RTC interrupts, it is unwise ; to allow it to be removed from memory without disengaging it. In an effort ; to prevent that event, each pass through the code forces the REMOV flag ; in the RSX header to the FALSE condition to override any unauthorized ; tampering. ; ; The routine uses PUSH/POP sequences for environment save/restore in case ; someone is using the alternate register set (i.e. Turbo Pascal). ; rtc: ld (rtcsph),sp ;save the stack pointer ld sp,rtcstk ;get new stack pointer push iy ;save caller's environment push ix push hl push de push bc push af ; First, compare the current date with the one we saved last time thru here. ; If they are equal, we can avoid alot of unnecessary overhead by skipping ; the conversion to display. ; ld de,(scbdat) ;get SCB date word ld hl,(datsav) ;get saved date word and a ;clear carry sbc hl,de ;check for equal jp z,dotime ;still the same, no need to do conversion again ex de,hl ;move new date over to HL ld (datsav),hl ;and save for next time around ; The date is different so go ahead and convert it. ; ld hl,(scbdat) ;get SCB date word call @dcvrt ;convert the date to display mm/dd/yy dotime: ; The current date is now in @DCFLD and ready for transfer to video RAM. ; Convert the current time to display. ; ld de,scbtim ;get SCB time address  ld hl,@tcfld ;get receiving area address call @tcvrt ;convert the time to display hh:mm:ss ; OK, the date and time are both converted and ready to be displayed. ; Switch in the video RAM bank and transfer the date and time to the ; screen. ; call vidin ;switch in video RAM ld hl,daytim ;get date/time string address ld de,vidram+80-datlen ; get video RAM destination address ld bc,datlen ;get date/time string length ldir ;transfer the date/time to video RAM ; The date and time are now at the configured address in video RAM. Now ; set the display attribute to the configured value. ; ld hl,attram+80-datlen ; get attribute RAM address ld de,attram+80-datlen+1 ; get destination address ld bc,datlen-1 ; get number of bytes to transfer ld a,(datatb) ;get attribute byte ld (hl),a ;load attribute mask into first byte ldir ;and propogate it call vidout ;switch back to original bank configuration ; ; The last thing we want to do is check to be sure the FUDGE  routine is ; available to jump into the original ROM interrupt routine. Just another ; fortification against hackers and as yet unthought-of ills. ; We could just check a couple of bytes for match but that would take nearly ; as many cycles as the copy itself, so let's just copy the routine up ; there again. ; ; ld hl,(xbank8) ;get the (supposed) first 2 bytes from memory ; ex de,hl ;free up HL ; ld hl,(fudge) ;get the first 2 bytes from local storage ; and a ;clear carry ; sbc hl,de ;check for equal ; jp z,fudgok ;assume all is ok if 1st 2 bytes match ld hl,fudge ;get routine address ld de,xbank8 ;get destination address ld bc,fudgel ;get routine length ldir ;transfer the routine to common memory fudgeok: ; We're all done. Before we leave, let's make sure this routine will still ; be here next time an RTC interrupt occurs. We'll do that by forcing the ; REMOV flag in the RSX header to FALSE. ; xor a ;get a zero ld (remov),a ;force the RSX to stay resident as long as ;it is processing RTC interrupts pop af ;restore caller's environment pop bc pop de pop hl pop ix pop iy ld sp,(rtcsph) ;restore original stack pointer jp xbank8 ;now jump to original ROM routine end l pop ix pop iy py itself, so let's just copy the routine up ; there again. ; ; ld hl,(xbank8) ;get the (supposed) first 2 bytes from memory ; ex de,hl ;free up HL ; ld hl,(fudge) ;get the first 2 bytes from local storage ; and a ;clear carry ; sbc hl,de ;check for equal ; jp z,fudgok ;assume all is ok if 1st 2 bytes match ld hl,fudge ;get routine address ld de,xbank8 ;get destination address ld bc,fudgel ;get routine length ldir ;transfer the routine to common memory fudgeok: ; We're all done. Before we leave, let's make sure this routine will still ; be here next time an RTC interrupt occurs. We'll do that by forcing the ; REMOV flag in the RSX header to FALSE. ; xor a ;get a zero ld (remov),a ;force the RSX to stay resident as long ;DATE.ASM v 1.10 10/26/83 ; S. Kluger El Paso RCPM ; ; This module will take the date in Digital Research ; format and change it into human-readable form. ; ;Input: The number of days since 01/01/78. @DCFLD ; must be defined in the main module and be ; a structure of format "mm/dd/yy$" ;Output:The structure at @DCFLD will contain the ; date in ASCII. ; ; The routine works, don't ask me why. If you think it's ; too kludgy or too big, feel free to change it. Just ; don't leave my name off the ASM file, ok? ; PUBLIC @DCVRT EXTRN @DCFLD ; CSEG .8080 ; ; Enter with the number of days since 1-1-78 in HL ; @dcvrt: shld drtime ;save it for now mvi b,78 ;set years counter loop: call ckleap lxi d,-365 ;set up for subtract jnz nolpy ;skip if no leap year dcx d ;set for leap year nolpy: dad d ;subtract jnc ydone ;continue if years done mov a,h ora l jz ydone shld drtime ;else save days count inr b ;increment years count jmp loop ;and do again ; ; The years are now finished, the years count is in B ; and drtime holds the days (HL is invalid) ; ydone: call ckleap ;check if leap year mvi a,-28 jnz febno ;february not 29 days mvi a,-29 ;leap year febno: sta feb ;set february mov a,b ;get years count lxi h,@dcfld+7 ;point to years field call stasha ;stash A into years field lhld drtime ;get days count lxi d,mtable ;point to months table mvi b,0ffh ;set up b for subtract mvi a,0 ;set a for # of months mloop: push psw ldax d ;get month mov c,a ;put in C for subtract pop psw shld drtime ;save days count dad b ;subtract inx d ;increment months counter inr a jc mloop ;and loop for next month ; ; The months are finished, days count is on stack. ; First, calculate month. ; mdone: mov b,a ;save months lhld drtime mov a,h ora l jnz nzd dcx d dcx d ldax d cma inr a mov l,a shld drtime dcr b nzd: mov a,b push h lxi h,@dcfld+1 ;point to months field call stasha ;put a into months field pop h ;get days count back mov a,l ;into a lxi h,@dcfld+4 ;point to day field ; ; Plug the accumulator into as decimal ; stasha: push b ;save bc as counter mvi b,0 ;initialize tens stl: cpi 10 ; > 10? jc got10 ;no, done sui 10 ;subtract 10 from A inr b ;increment tens jmp stl ;and loop ; ; B has the tens, A has the units. Store the units first ; got10: adi '0' ;make ascii mov m,a ;stash units mov a,b ;get tens adi '0' ;make ascii dcx h ;point to tens mov m,a pop b ;restore bc ret ; ; This routine checks for leap years. ; ckleap: mov a,b ani 0fch cmp b ret ; ; This is the months table ; mtable: db -31 ;January feb: db -28 ;February db -31,-30,-31,-30 ;Mar-Jun db -31,-31,-30 ;Jul-Sep db -31,-30,-31 ;Oct-Dec ; drtime: dw 0 ;temporary storage ; end db -31,-30,-31,-30 ;Mar-Jun db -31,-31,-30 ;Jul l,a shld drtime dcr b nzd: mov a,b push h lxi h,@dcfld+1 ;point to months field call stasha ;put a into months fiel ;ROMBANK.MAC ; ; Provide switching capability to/from ROM in the Osborne Executive ; .Z80 CSEG PUBLIC ROMIN PUBLIC ROMOUT memport equ 0 ;hardware port for memory bank pointer bank8 equ 10000000b ;mask for memory bank 8 nbank8 equ 01111111b ;mask to drop memory bank 8 romin: push af in a,(memport) ;get current bank pointer or bank8 ;add bank 8 (ROM) to it out (memport),a ;and update the pointer pop af ret romout: push af in a,(memport) ;get current bank pointer and nbank8 ;drop bank 8 out (memport),a ;and update the pointer pop af ret END emport) ;get current bank pointer and .z80 cseg ;TIME.MAC ; ; This module will take the time in BCD ; format and change it into human-readable form. ; ;Input: DE points to a three byte area containing hours, minutes, and seconds ; in BCD (like in DR's SCB) ; HL points to an eight byte area to receive the time ;Output: The area pointed to by HL will contain the time in format HH:MM:SS ; public @tcvrt @tcvrt: push hl ;save the caller's environment push de push bc push af ; ; insert time into buffer at hl ; ld b,2 time1: ld a,(de) inc de call putbcd ;insert hh:mm: ld m,':' inc hl djnz time1 ld a,(de) call putbcd ;insert seconds pop af ;restore the caller's environment pop bc pop de pop hl ret ; ; convert bcd in a to two ascii charcters at hl ; putbcd: push af rrc a rrc a rrc a rrc a ;get high nibble call putnib pop af call putnib ret ; ; make ascii & put into buffer ; putnib: and 0fh or '0' ld (hl),a inc hl ;next buffer location ret end ret ; ;VIDBANK.MAC ; ; Provide switching capability to/from video ram in the Osborne Executive ; .Z80 CSEG PUBLIC VIDIN PUBLIC VIDOUT memport equ 0 ;hardware port for memory bank pointer bank7 equ 01000000b ;mask for memory bank 7 nbank7 equ 10111111b ;mask to drop memory bank 7 vidin: push af in a,(memport) ;get current bank pointer or bank7 ;add bank 7 (video RAM) to it out (memport),a ;and update the pointer pop af ret vidout: push af in a,(memport) ;get current bank pointer and nbank7 ;drop bank 7 out (memport),a ;and update the pointer pop af ret END emport) ;get current bank p?R";#>&!B>1̈́8k"͛>R>;#>&!B>̈́8k"͛>RU;#!B>̈́8k"͛>Rf;#>&͛>!|K6#6*|K!C>8Š*|KC>8!@>=R;#>&!C>̈́8k"*|K͂8k"!C>̈́8k"͛>h@!@>=R;#>&!-C>̈́8k"*|K͂8k"͛>h@*|K͂8G3! !!@͕'!@D"*|K͂8G3!, !!@͕'!"K!@[@#og͌!!IE%͛>!@|@#>og͌!!|JE%͛>! JBB$x8!J!>Cx8G:zJ:{Jog#"K!@@#*K͌!!IE%͛>!@@#*K#͌!!|JE%͛>! JBB$x8!J!>Cx8GRD;#>&!C>̈́8k"*|K͂8k"!?C>̈́8k"͛>h@*K:Iog) "K:I:Ix*K "K!@@#*K͌!!JE%͛>R;#>&͛>R;#>&!UC>̈́8k"͛>7#!A m!K͗8͛>!KK>8!K͐!K͗8Ö!9"K!=4R1;#>&!lC>̈́8k"͛>4*K|9!CKx8Rf;#>&!C>&̈́8k"͛>R;#!A :2K<2K!K> 6R!C>̈́8R͛>7#!A m!~Kͭ8͛>!C~K>89!~K͂83!C>n7ͬ7ͧ5}!2Kw9!CKx8—R;#>&!C>0̈́8k"͛>RF;#!A :4K<2K!K> 6R!C>̈́8R͛>c7#!A m!~Kͭ8͛>!C~K>8u9!~K͂83!C>n7ͬ7ͧ5}!4Kw9!CKx8&R;#>&!C>"̈́8k"͛>7#!A m!K͗8͛>!KK>8!K͐!K͗8!DKx8!DK6! DKx8"!DK69! DKx8&RQ;#>&! D>̈́8k"͛>Rb;#>&͛>R;#>&!$D>̈́8k"!}B>̈́8k"͛>R;#>&!,D>̈́8k"!fB>̈́8k"͛>R;#>&͛>R;#>&!4D>̈́8k"͛>7#!B m!K͗8͛>!BDKx8!FK6!CDKx8"!FK69!DDKx8&RQ;#>&!ED>̈́8k"͛>Rb;#>&͛>R;#>&!$D>̈́8k"!fB>̈́8k"͛>R;#>&!,D>̈́8k"!}B>̈́8k"͛>R;#>&͛>R;#>&!bD> ̈́8k"͛>7#!B m!K͗8͛>!BDKx8!GK6!CDKx8"!GK69!oDKx8 RQ;#>&!pD>9̈́8k"͛>n7#! B m!~Kͭ8͛>!K͐!~Kͭ8!"K!~Kn&*K$9!~K*K]7Bͺ|!~K*K]7G!~K>8!d"K*K#"KÂ!~KB͵++|9!~KB͵++}!+Kw9 !DKx8¡ R, ;#>&!D>+̈́8k"͛>RH ;#>&!D>̈́8k"͛>b 7#ͻ)_ !~Kͭ8͛>!D~K>8t 9!~K͂8ͷ5"K*K |/:K 9:K!,Kw9!DKx8” R ;#>&!D>̈́8k"͛>R ;#>&! E>̈́8k"͛>!"K*K | !dK*K~c !dK*K~1 R. ;#!E>̈́8k"͛>c Rc ;#! E>̈́8!dK*K~og@ }3>^8k"͛>*K+++| !dK*K#~ʕ R ;#!!E>̈́8k"͛>*K#"K R ;#!"E>̈́8k"͛> 7#!B m!~Kͭ8͛>!K͐!~Kͭ8!&E~K>8 9!"K+"K!~Kn&*K$9/*K |i !~K*K]7Bͺ|_ !~K*K]7Bͺ+}!dK*Kw*K#"K*K#"K *K"K*K | !dK*K6*K#"Ko 9!&EKx8ƒ R ;#>&!'E>)̈́8k"͛>R ;#!PE>̈́8k"͛> 7#!B m!~Kͭ8͛>!K͐!~Kͭ8!"K!~Kn&*K$9Z !~K*K]7Bͺ|P !~K*K]7G!~K>8!d"K*K#"K !~KB͵|n 9!~KB͵+}!hKw9!mEKx8lR ;#>&!nE>.̈́8k"͛>R ;#>&͛>R ;#>&!E> ̈́8k"͛>R ;#>&!E>̈́8k"͛>R ;#>&!E>̈́8k"͛>R/ ;#>&!E>̈́8k"͛>R@ ;#>&͛>R\ ;#>&!bD> ̈́8k"͛>y 7#!B m!K͗8͛>!BDKx8• :0K>/!0Kw!CDKx8¶ :0K>/>!0Kw!EKx8 :0K>/>!0Kw!EKx8hR;#>&!E>,̈́8k"͛>R;#>&! F>,̈́8k"͛>R:;#>&!5F>*̈́8k"͛>RV;#>&!_F>,̈́8k"͛>:0K>/>!0Kw9!FKx8R;#>&!F>*̈́8k"͛>7#! B m!K͗8͛>!KK>8!K͐!K͗8!DKx8!0K>w! DKx8:0K>/!0Kw9!FKx8‰R0;#>&!F>.̈́8k"͛>RG;#!F>̈́8k"͛>!"K*K |{7#ͻ)xͷ5}!K*Kw͛>*K#"KM9!FKx8!uK~#_R;#>&!F>(̈́8k"͛>R;#>&!G>"̈́8k"͛>R;#>&͛>R ;#>&!bD> ̈́8k"͛>)7#!%B m!K͗8͛>!BDKx8?!oK>w!CDKx8[:oK>/!oKw9!6GKx8qh@!7GKx8!=ïR;#>&*|K͂8!8GL8k"͛>h@!@L@#*K͌!!Jͦ$͛>!@D"R;#>&*|K͂8k"!NG>̈́8k"͛>h@9R;#>&͛>R,;#>&!gG>&̈́8k"͛>RS;#!*B :2K<2K!K> 6R͛>Ro;#>&!G>&̈́8k"͛>R;#!0B :4K<2K!K> 6R͛>R;#>&!G>&̈́8k"͛>:DKR;#!G>̈́8k"͛>R;#!G>̈́8k"͛>R;#>&!G>&̈́8k"͛>:FK'R$;#!fB>̈́8k"͛>>R>;#!}B>̈́8k"͛>RZ;#>&!H>&̈́8k"͛>:GK{Rx;#!}B>̈́8k"͛>ÒR;#!fB>̈́8k"͛>R;#>&!*H>&̈́8k"! E>̈́8:+KogA }3>^8k"͛>R;#>&!PH>&̈́8k"͛>R;#!6B !,K"K!K> 6R͛>R+;#>&!vH>&̈́8k"͛>!"K*K |!dK*K~ʦ!dK*K~tRq;#!E>̈́8k"͛>æR;#! E>̈́8!dK*K~og@ }3>^8k"͛>*K+++|!dK*K#~R;#!!E>̈́8k"͛>*K#"K1R;#>&!H>&̈́8k"͛>:hKR;#!E>̈́8k"͛>JRJ;#! E>̈́8:hKog@ }3>^8k"͛>Rf;#>&!H>&̈́8k"͛>:0K>R;#!H>̈́8k"͛>:0K>´R;#!H>̈́8k"͛>:0K>R;#!H>̈́8k"͛>R;#!I>̈́8k"͛>R;#>&!I>&̈́8k"͛>:0K>5R2;#!G>̈́8k"͛>LRL;#!G>̈́8k"͛>Rh;#>&!)I>&̈́8k"͛>!"K*K |R;#! 6R͛>*K+++|R;#!!E>̈́8k"͛>*K#"Kn!uK~#5R;#>&!OI>&̈́8k"͛>:oK>րR;#!uI>̈́8k"͛>5R5;#!yI>̈́8k"͛>RF;#>&͛>Rb;#>&!~I>%̈́8k"͛>R~;#>&!I>%̈́8k"͛>^#V"K*K~3^#V"K*K͂8!I>̈́8!I>̈́89~#úO# gl E#~w ̀"@ŒeBZ!9ʄ{~#@k> @{&9®x2Ay ›2A"Kr<͞*K1x2A=+9A AG:A=+9x2A"Kr!AF6!A~#x=2A͞>E@:A+ -/2AJT¶ ʺ ]Jç.JT]JeE$J+J-JT+9GJTxGGGJ GyO3 +9J$:AE]6y2AQ~#z0 0!A_w!A~z4_!As+9+92AG:A<2A=+9:A+9¸:Aʸ!A5!A4+9:AG:A!Á>2A@!A5:A!A<_!A>w w>+!A~5>.;G:Ax0":A> !A~55!A4!A5-2Ax!A^4{TT!A~0>0"K*@~2L:Arr+9:L2L>V!L„5~/o :Aº>9ʺ>*ʨ ê*:L!9q#=±>2L<2L2L;2L:L_:L*@~2K:K9:L :L2L :L=O:LPH:LO:LHZ'*rO:L6y2L:LZ:L0Z:LO:K*T> Hl:L2L:LO:LH:K:K·:K- :LO:KPH:K2L:LO> H:L:L0:LO> H:L=O:KPH:LO:LH:L2L:LO:LH:KVD:L2:L2L2:L=O:LPH:L><2L:LO:Ky:Ld:KBnp:L*p> H:LO:KCʇD:Aš> H H÷:KC®H >RH÷H >BH:L*K!L4!L4S+-$G:LOx*@## <>S>+>- >C>D:/,.B!LN*@# Ⱦ$G:L_:LO x*@# Ⱦ?!i#9w$G:Aix+-}Swx+}-Sz>+>-> ™x=GÀ :0Aʩں!Axʀں7Àͯ&À ʀ> @ x>7À Àx>ʀ=ͯ&5x!A5:.A(5:A> @>2 L! L&:.A\!A\> d> dd2L!Lý&_ y<>ˆ= ÈO o& ####W ©60#E°>ew#.ºex1 © GZ+y=x=0 60$w +6.$y=x=x<^!9G G F Fw# +9.H !9 Y+wNxOo>g9x G +9 l lw#i =< <_ K ™oW& ## K0+9 0_+9 +9K0w# x1 ² GZ +wx1  x1 +9 o>g9##G +9 1 1 +95+[ ! L:;> t _ 5+h † x€ >; _ ͏ _ ʼ x!AҤ ͼ Ï :.Aʯ ڼ :A5+ä >2L!L&!L:;5!v!^́!^#V! 5! #F!#N!#^#r+s#^#V++r+s~ 5 v!5^́!q#p Ov!4~ S!_́!s#r#s#r#q!Y!:;a!b!GAc!e! Format Overflow*IA-&ZA! %#> %##> %#{=>'%#!9 #=~#'#{>'%#%#"{=>'%#{>b%#*A++|2)M!'Mͽ&ɯB#>B#>24M"5M"7M`i"9M!9";M!*M^#M ~# c#*M~#*M~§#!M>̈́8G3!!!kA͕'!kA"M!MY)#!M>̈́8G3!R.!!A͕'!A"M!MY)#*M"M!MY)!Mʹ'*M^#V!&As#r*M^#V!(As#r*M^#V7|*6A7|G)$!M͌$*M^#V}*6A}GL$!M͌$:fAp$*M^#V}*6A}Gp$!M͌$:iA$*M^#V}$!M͌$^#V"M!GA"M*M"M!M:;"M"M!Mó$M~# ¸$:bA%*M~3*Ms#r!"M*M^#V"M*M*M$9%*M+*M#"M!Mͽ&*M#"M$D%!A"M*M"M*M"M!Mb0D%!GA"M!"M!M:;"M"M!MR%M~# W%:bA%%%t%%ͤ%!M^#V}*Mw!A"M*M"M*M"M!M?0%%!"M%%*M#"M:M*M*Mw*M*M^#V+$9|%:M %%ê%5+2M:M!GA"M!"M!M:;2N!M&^#V"N:bA(&:dAT&*NQ&*N5!N6:N N&́&@&/&À&!Nͽ&*N&*N5!%A6! Nͽ&:%A}&*N6Z&5+2N:N®&!GA"N!"N! N:;!A6#6!N6 :jA&!Nͽ&^#V"N!A"#N*N"!N!N0&!GA")N!"-N!%N:;&Ô':bA'*N~ '*A#"AÔ'*N~ !'!A6#6Ô':jA'*N~ C'*!A#"!A!A6#6Ô'*N~ ”'*A#"A!A#e'!A6#6*A*0A#$9|”'!GA"3N!"7N!/N:;'ͯ&!%A6"9N!9";N!9Nʹ'! 9^CN~# ¹'*CN^#V|'*CN*EN 7*EN nb(*EN !HN>8(!=N>̈́8*CNJ8!HN͗8*CN~#I(*CN^#V)))|I(*CN6P#6*CN~#ƒ(*CN^#V))|w(*CN6#6Ã(*CN6<#6*CN6#6*CN6#6*CN6#6*CN 6*CN^#V}3}2GN*CN^#V}(!GN44*CN^#V}(>2GN*CN^#V})*EN~#)*EN6#6*CN"`N*EN"\N*EN"^N!VN.*CN^#V|X)*CN"jN!"lN!bN:;^#V^#V>:IAv)!):;2IAO!ZA…)6Ê) +~#w!JA s#r!IA4ͧ>ɣ))GA)) I/O Stack Overflow!9"nN!nN)!9$>)%~T]O )+~)>x^#V"rN*rN6Z* +"*!GA"zN!"~N!vN:;++*,+2uN:uNQ**w*:tN> bN**T*w*ʹ*>* +e*$+t*+t*Z*$+*:uN*,+**,+*ë*+*+***w*!%A6+*$+*+*:tN!%Aw*ù*5+2tN*rN~*:tN*rN#*rN~ogw*rN4:tN:tN :tN,:tN ?:tN':%AU+!A"N!N0R+!N6`+:%A2N!%A6:N o+*A#"A:N +!A6#6:N"1"1*1^#V#"1^#V͍+͙+"1͙+"1|͞+|~͍+͙+ya+A =.:;<>[]y *1+ +++$++1, o&))))\xH  5,#w 5,++*1#d,Ad,G++:i, 6n,p4++,ʓ,#+ʟ,#*‹,6?Ï,w+z,+ʦ,+Ó,#6 Ÿ,.,+ ,,+,#*,6?,w+º,+,+,#6 ,%#6,*1##^ ~?,# ,xCON CON RDR PUN LST M!- ~+$—-++1c-\J-l—-$—-!~ —-+!-+~- ʌ-+#k-x=Gh-+>ɯ*1+͙-^#V͡-#{#z͙-6#6͡- r+s!NF#~-!N6P  ? ?!N^r+s6 #6 !N4^N*1|(.}=.-$. - .O>~4.4.>v.N*1|`.Y -=M.yY.?\.>~l.=l.>v.q21*1/"1ͨ-.{Ͳ-͡-*1*1#:1Oʶ.͡-#s#rÿ.ͻ-ͨ-ڏ.Ͳ-v.͡-r+s{.!14*1+>|.+}o̓+͍+~21͍+"1͞+:1/)-//G:1/*1p)/4#61͹+:1J/.*1++"1S/}+W/.}|21"1͹+."119|/##"16*1s#rD,h1{ h1*1:1wښ/6½/*1"11*1w#w1̓+͞+1.͍+q1̓+͞+1͍+N;.1*1~" 4#4#4̓+͞+1~Z0͐031Ͳ->͟01̓+͞+1~̲->͟01*1~ʇ0>1͐031*1!*~!/21*1|ʴ0(^#V͹+͹+{z0z+121z0:10.q0N;.#0*1|+1*~+1=!1(1:1v.%1!1w1,0>̓+͞+1|}1~> 1<1̓+͞+1|b1*1w=1*1?*1^#V6+6++|:1̓+Ͱ+1>1"N#F#~͍+q#p#w>1̓+Ͱ+1>1*~͹+!1=Ҿ1>!*1" s#r#w=1*1 }!N6 4>2N*N!4#4#4~#N#F#y#x#:N*N!!:NV2+22:N~G~#~O?ҕ2#~•2! p! y! q<™2<2ɯ~#N#F#w#q#p 21~2#!!͛2! 6?<2= _!x22FN2wxG>O>G!$q#p#6 3"N"N2Nx2N12N 2!N~53;2f3=‘3:N‘3*NGx|g}o3O! 9x3~ 3#3zi4>o>g9~+"4¦4W3-4.54¦4304:40G4G!9~wG# N4x¦43! 9~ v4_>W! 9+w–4yé4+9!44##/<^#V4054!9VzwzO#4477! 9/GO~7O7~q+5!96#=(5O!9Fx7y_5! 9~WwzO+L5ʄ5_ /!9~#=s5~57"N>:6*N"N͊5ͷ5*N"N͊5ͷ5*NG!9!x6 6+5$%+9g6-50+9:+90T])+9)+9+9)+9o|g+95{#6$%+9}$6|+9z-9o&9}O!9 w#H660#60! 9~ w6!97>?'w#h6-!9~ͼ6ʐ6~#ͼ6}6! 9~.¢6+60î60®66 #–6+r>o&9y>o&90w+66./G!97 7>0.7 $7>-307T]))97寕iO>`G>0 \7 7w#Î7!97>?'w#7!9!7>?'w#¸7!7:;7777ȇ7)7yw# 7~#8~#W #@8F#"Nẍ́8^8*N!9G_>WObk++~8~+v8y~#/g{ozg!19:;99:9;9=9?9 Conversion*AO|y9^#V"AO###^#V#N#Fxu9 #~h9|:*AO|ʣ9^#V#N#F!9yxң9"AO|:|9:IA9!9!(A{z#9͛>ã9!9!9:AO!A {#z!A59#}OD*?O~(:##~#fo9!::; : :::: Free Space Exhausted##^#V#{_zW:{_zW94zN:{w:##^#V# ##s#rs#r#s#r+++~sw#r####}*?O}|:*{z:+F+N+V+5^{:{z:}|:{::i`~sw#r##q#p i`N#F#^#V~:q4#p+i`##s#r:Ã@;Ã@ FREE Request Out-of-Range$ Free Space Overwrite$GKR;MbkR;=F=N=N#F=^#V"Ay2Axe;i&_>ʜ;p;x|;>ڟ;!GA{#z*&A*(A͛>xyx;<_!;=^#VZ<;>(;y6<>);|;;<|;;Z,;;> _? ? ?0:;; < <;|<}< F<dH< H<S<J#;*9O>=^#V#'<á<͸<>: <>?;!%=Z<Z<>=;^#V|<}<.))=Z<#F>Aij<> #=~ >.ĸ<~ ĸ<==^#V# File: Traceback:K=R=b=l=w==== ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLSTBADG!A~==Ã@ Condition Stack Overflow$4Ox!N w#s#r#s#r!9!A s#r!AN!N +++++'>#{@>#zE>++~'>++!A5!~# T>P>!AN!N +++++o>#~#ʓ>+{Ž>#zʓ>++~o>#^#V=!IA~>5:IA_!JA^#V"GAA.~# >*6A)))))bA )| >*A|}*A"A:IA*GAAw# >*A{ ? ?!#"AL?Copyright (c) 1980 Digital Research, v1.3 !"=O";O"AO2A2IA*DO ڋ?"9Oq#p##}o"?O*}o|ґ?@Ã@+w+w+r+s4w#w#s#r<2CO++*=Os#r"=O*;O#";O*;ODM!=Ox~^@#~+^@+F+Nq#p*;O+";OY@\@=@!+~O~#~G!>w!/x7@yT@ >O6# .@ @=ɯ ~#fo++?!;O~#ʀ@*=O?h@@Ã@@  Insufficient Memory$ Invalid I/O List End of Execution$@ ' 'CPM3SYSSYSINSYSPRINTCopyright (C) 1982, Digital ResearchEcho deleted charactersBackspace over characters*ABCDEFGHIJKLMNOPSETDEFLT version 1.1 1/16/84 By: Craig D. MillerDefault parameter generatorfor CPM3.SYS file of CP/M PlusCPM3.SYSFilecannot be found.Unexpected end of$is not a CPM3.SYS file Enter option:BAD INPUT - Try AgainAEnter the width of your console (=) : BEnter the number of lines on your console (=CTurn console paging mode on (Y/N)?YNDDo you want control-H to: 1.) 2.)Enter option: 12EDo you want Rubout/Delete to:Enter option:FEnter the default disk to be used a boot time ( A:-P: ): GEnter the default user to be printed in thefirst prompt, enter 0-15: HEnter the drive search chain('*'=default, =*:, ): IEnter the Tempoary file drive to be used,('*' for default or A:-P: ): JEnter one of the following for program search: 1.) COM 2.) COM, SUB 3.) SUB, COM 4.) PRL, COM34IF YOU USE THIS OPTION THEN DON'T RUN SETDEFIT WILL CRASH. If you need to run PRL's, itis better to run them by appending '.p' tothe end of the command. (i.e. A>prlfile.p ).KDo you want program name display on (Y/N)?LEnter all four values to be stored at SCB+6 toSCB+9:MEnter 1.) for long error messages and 2.) for short error messagesQSERROR during write to - Updated successfullyA - Console Width, Currently:B - Console Length, Currently:C - Console page mode, Currently:OffOnD - Control-H function, Currently:E - Rubout/Delete function, Currently:F - Default disk, Currently:G - Default user, Currently:H - Drive Search chain, Currently:I - Tempoary file drive, Currently:J - Program search order, Currently:PRL, COMSUB, COMCOM, SUBCOMK - Program name display, Currently:L - User useable areas, Currently:M - Error messages, Currently:LongShortS - Save SCB to file and exit to CP/MQ - Quit, exit to CP/M without savingABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzKKKK~K~K~KKKKL LLLGALL#L$LGA%L'L Invalid Format ItemLL Invalid KeyLLMLLLMLM!M)M4M5M7M9M;M Stream/Record Sequen/Direct Input/Output Keyed Access P< $conMMAuM=MKMYMgMMMMMMMMMMMMMMMMN NNNNN N#NNN-NNN7N.datGNHN`NANBNjNlNpNqN~NNNFOKKKK~K~K~KKKKL LLLGALL#L$LGA%L'L Invalid Format ItemLL Invalid KeyL/**************************************************************** * SETDEFLT version 1.1 - January 17,1984 * * by Craig D. Miller * * 43 Esperanza Apt H * * Sierra Madre, Ca 91024 * * * * Released to the Public Domain by the author. * *****************************************************************/ /* This program is written for CP/M + and allows the user to change fields in the SCB contained within a CPM3.SYS file that GENCPM will not allow you to change. This will allow for most installations to work without a PROFILE.SUB. The following is a list of fields that this program will change: SCB OFFSET DESCRIPTION ---------- -------------------------------------------------- 06-09 User settable areas 13 Default disk (Note: not defined in system guide) 14 Default user (Note: not defined in system guide) 18 BITS 4,5 Search order 18 BITS 0,1 Program Name display 1A Console Width 1C Console page length 2C Console page mode flag 2E Control-H flag 2F Rubout/Delete flag 4C-4F Drive search chain 50 Tempoary file drive 57 BIT 7 Extended error messages flag If you make any improvements or find any problems please contact me at the above address. I hope you enjoy this program. Craig D. Miller M + and allows the user to change fields in the SCB contained within a CPM3.SYS file that GENCPM will not allow you to change. This will allow for most installations to work without a PROFILE.SUB. The following is a list of fields that this program will change: SCB OFFSET DESCRIPTION ---------- -------------------------------------------------- 06-09 User settable areas 13 Default disk (Note: not defined in system guide) 14 Default user (Note: not defined in system guide) 18 BITS 4,5 Search order 18 BITS 0,1 Program Name display 1A Console Width 1C Console page length 2C Console page mode/**************************************************************** * SETDEFLT version 1.1 - January 17,1984 * * by Craig D. Miller * * 43 Esperanza Apt H * * Sierra Madre, Ca 91024 * * * * Released to the Public Domain by the author. * *****************************************************************/ /* This program is written for CP/M + and allows the user to change fields in the SCB contained within a CPM3.SYS file that GENCPM will not allow you to change. This will allow for most installations to work without a PROFILE.SUB. The following is a list of fields that this program will change: SCB OFFSET DESCRIPTION ---------- -------------------------------------------------- 06-09 User settable areas 13 Default disk (Note: not defined in system guide) 14 Default user (Note: not defined in system guide) 18 BITS 4,5 Search order 18 BITS 0,1 Program Name display 1A Console Width 1C Console page length 2C Console page mode flag 2E Control-H flag 2F Rubout/Delete flag 4C-4F Drive search chain 50 Tempoary file drive 57 BIT 7 Extended error messages flag If you make any improvements or find any problems please contact me at the above address. I hope you enjoy this program. Craig D. Miller */ setdeflt: proc options(main); %replace forever by '1'b; dcl 1 header_record, /* Record 0 of CPM3.SYS */ 2 res_top bin(7), /* Top page +1 of resident memory */ 2 res_length bin(7), /* Length of resident portion */ 2 bnk_top bin(7), /* Top page +1 of banked memory */ 2 bnk_length bin(7), /* Length of resident portion */ 2 boot_addr bin(15), /* Bios cold boot entry */ 2 reserved1 char(10), /* Reserved area */ 2 copyright char(36), /* DRI copyright message */ 2 reserved2 char(1), /* Reserved area */ 2 serial_no char(6), /* Serial number */ 2 reserved3 char(67), /* Reserved area */ 2 reserved4 bin(7), /* Reserved area */ 2 reserved5 bin(7); /* Reserved area */ dcl 1 print_record, /* Record 1 of CPM3.SYS */ 2 message char(127), /* Memory usage message */ 2 terminator char(1); /* Terminator */ dcl 1 scb_record, /* Record ?? of CPM3.SYS */ 2 filler char(28), /* Filler area in SCB sector before SCB */ 2 reserved1 char(5), /* Reserved for system use */ 2 Bdos_ver bin(7), /* Bdos version number */ 2 user(0:3) bin(7), /* Reserved for user use */ 2 reserved2 char(6), /* Reserved for system use */ 2 error_ret bin(15), /* Error return code */ 2 reserved3 char(1), /* Reserved for system use */ 2 def_disk fixed(7), /* Cold boot disk */ 2 def_user fixed(7), /* Cold boot user */ 2 reserved4 char(3), /* Reserved for system use */ 2 def_flags bit(8), /* Various flags set by SETDEF */ 2 reserved5 char(1), /* Reserved for system use */ 2 con_width bin(7), /* Console width */ 2 con_col_pos bin(7), /* Current console column */ 2 con_length bin(7), /* Console page length */ 2 reserved6 char(5), /* Reserved for system use */ 2 ci_vec bin(15), /* Console input redirection */ 2 co_vec bin(15), /* Console output redirection */ 2 ai_vec bin(15), /* Auxiliary input redirection */ 2 ao_vec bin(15), /* Auxiliary output redirection */ 2 lo_vec bin(15), /* List output redirection */ 2 page_flag bit(8), /* Page mode flag */ 2 reserved7 char(1), /* Reserved for system use */ 2 ctrl_h_flag bit(8), /* Control-H flag */ 2 rubout_flag bit(8), /* Rubout flag */ 2 reserved8 char(3), /* Reserved for system use */ 2 con_mode bit(16), /* Console mode flag */ 2 bnk_buff bin(15), /* 128 byte buffer address */ 2 out_delim char(1), /* Output delimiter character */ 2 list_flag bit(8), /* Control-P toggle flag */ 2 reserved9 char(3), /* Reserved for system use */ 2 cur_dma bin(15), /* Current DMA address */ 2 cur_disk fixed(7), /* Current disk (0-15 => A:-P:) */ 2 vinfo bin(15), /* Address of FCB if RESEL true */ 2 resel bit(8), /* Valid FCB flag */  2 reserved10 char(1), /* Reserved for system use */ 2 fx fixed(7), /* Last function executed */ 2 user_code fixed(7), /* Current user code */ 2 reserved11 char(5), /* Reserved for system use */ 2 multio fixed(7), /* Multi-sector count */ 2 error_mode bin(7), /* Bdos error mode */ 2 drive_chain(0:3) bin(7), /* Drive Search chain */ 2 temp_disk fixed(7), /* Tempoary file drive */ 2 err_disk fixed(7), /* Bdos error disk */ 2 reserved12 char(2), /* Reserved for system use */ 2 media bit(8), /* Media changed flag */ 2 reserved13 char(2), /* Reserved for system use */ 2 bdos_flags bit(8), /* Various Bdos flags */ 2 time_date char(5), /* Time and date field */ 2 com_base bin(15), /* Common memory base address */ 2 err_jump char(3), /* Bdos error jump */ 2 max_tpa bin(15); /* Top of the TPA */ dcl copyright static char(36) init('Copyright (C) 1982, Digital Research'), echo static char(23) init('Echo deleted characters'), backspace static char(25) init('Backspace over characters'), drives char(17) static init('*ABCDEFGHIJKLMNOP'), cpm3sys file, comtail char(127) var based(comtail_p),comtail_p pointer, input char(20) var, option char(1), scb_offset,i,j; put skip list('SETDEFLT version 1.1 1/16/84 By: Craig D. Miller'); put skip list('Default parameter generator'); put list('for CPM3.SYS file of CP/M Plus'); put skip; unspec(comtail_p)='0080'b4; if comtail='' then comtail='CPM3.SYS'; on undefinedfile(cpm3sys) begin; put skip list('File',comtail,'cannot be found.'); stop; end; on endfile(cpm3sys) begin; put skip list('Unexpected end of',comtail); stop; end; open file(cpm3sys) direct title(comtail); close file(cpm3sys); open file(cpm3sys) title(comtail) direct update; scb_offset=0; read file(cpm3sys) into(header_record) key(0); read file(cpm3sys) into(print_record) key(1); if copyright~=header_record.copyright ! terminator~='$' then do; /* The following handles the special case of USERCPMx.DAT files under the DPC/OS multi-processor operating system written by Action Computer Enterprise, Pasadena, Ca */ scb_offset=header_record.reserved4+header_record.reserved5+1; read file(cpm3sys) into(header_record) key(0+scb_offset); read file(cpm3sys) into(print_record) key(1+scb_offset); /* if not a CPM3.SYS or a USERCPMx.DAT file then abort */ if copyright~=header_record.copyright ! terminator~='$' then do; put skip list('File',comtail,'is not a CPM3.SYS file'); stop; end; end; /* Calculate which record is the SCB record */ scb_offset=scb_offset+res_length*2-10; /* Calculate offset for non-banked */ if bnk_top=0 & bnk_length=0 then scb_offset=scb_offset-50; read file(cpm3sys) into(scb_record) key(scb_offset); /* Do command loop */ do while(forever); call menu(); put skip; put skip list(' Enter option:'); get edit(option)(a); option=uppercase(option); call doit(); end; doit: proc; on error(1) begin; put skip list('BAD INPUT - Try Again'); goto retry; end; retry: if option='A' then do; put skip list('Enter the width of your console (='); put edit(display(con_width+1),') : ')(f(3),a); get edit(input)(a); if input='' then return; con_width=input-1; return; end; if option='B' then do; put skip list('Enter the number of lines on your console (='); put edit(display(con_length+1),') : ')(f(3),a); get edit(input)(a); if input='' then return; con_length=input-1; return; end; if option='C' then do; put skip list('Turn console paging mode on (Y/N)?'); get edit(option)(a); option=uppercase(option); if option='Y' then page_flag='00'b4; if option='N' then page_flag='ff'b4; return; end; if option='D' then do; put skip list('Do you want control-H to:'); put skip; put skip list(' 1.)',backspace); put skip list(' 2.)',echo); put skip; put skip list('Enter option: ');  get edit(option)(a); if option='1' then ctrl_h_flag='00'b4; if option='2' then ctrl_h_flag='ff'b4; return; end; if option='E' then do; put skip list('Do you want Rubout/Delete to:'); put skip; put skip list(' 1.)',echo); put skip list(' 2.)',backspace); put skip; put skip list('Enter option:'); get edit(option)(a); if option='1' then rubout_flag='00'b4; if option='2' then rubout_flag='ff'b4; return; end; if option='F' then do; put skip list( 'Enter the default disk to be used a boot time ( A:-P: ): '); get edit(input)(a); input=uppercase(input); i=1; do while(i<=length(input)); if index(drives,substr(input,i,1))~=0 then do; input=substr(input,i,1); i=100; end; i=i+1; end; if index(drives,input)<2 then return; def_disk=index(drives,input)-2; return; end; if option='G' then do; put skip list('Enter the default user to be printed in the'); put skip list('first prompt, enter 0-15: '); get list(input); if input='' then return; j=input; if j<0 ! j>15 then return; def_user=j; return; end; if option='H' then do; put skip list('Enter the drive search chain'); put skip list('(''*''=default, ='); do i = 0 to 3; if drive_chain(i)~=-1 then if drive_chain(i)=0 then put list('*'); else put list(ascii(64+drive_chain(i))!!':'); if i < 3 then if drive_chain(i+1)~=-1 then put list(','); end; put list(' ): '); get edit(input)(a); input=uppercase(input); if input='' then return; i=1;j=0; do while(i<=length(input) & j<4); if index(drives,substr(input,i,1))~=0 then do; drive_chain(j)=index(drives,substr(input,i,1))-1; j=j+1; end; i=i+1; end; do i=j to 3; drive_chain(i)=-1; end; return; end; if option='I' then do; put skip list('Enter the Tempoary file drive to be used,'); put list('(''*'' for default or A:-P: ): '); get edit(input)(a); input=uppercase(input); i=1; do while(i<=length(input)); if index(drives,substr(input,i,1))~=0 then do; input=substr(input,i,1); i=100; end; i=i+1; end; if index(drives,input)=0 then return; temp_disk=index(drives,input)-1; return; end; if option='J' then do; put skip list('Enter one of the following for program search:'); put skip; put skip list(' 1.) COM'); put skip list(' 2.) COM, SUB'); put skip list(' 3.) SUB, COM'); put skip list(' 4.) PRL, COM'); put skip; put skip list('Enter option:'); get edit(option)(a); if option='1' then def_flags=(def_flags & ~ '18'b4); if option='2' then def_flags=(def_flags & ~ '18'b4) ! '08'b4; if option='3' then def_flags=(def_flags & ~ '18'b4) ! '10'b4; if option='4' then do; put skip list('IF YOU USE THIS OPTION THEN DON''T RUN SETDEF'); put skip list('IT WILL CRASH. If you need to run PRL''s, it'); put skip list('is better to run them by appending ''.p'' to'); put skip list('the end of the command. (i.e. A>prlfile.p ).'); def_flags=(def_flags & ~ '18'b4) ! '18'b4; end; return; end; if option='K' then do; put skip list('Do you want program name display on (Y/N)?'); get edit(option)(a); option=uppercase(option); if option='Y' then def_flags=(def_flags ! '03'b4); if option='N' then def_flags=(def_flags & ~ '03'b4); return; end; if option='L' then do; put skip list('Enter all four values to be stored at SCB+6 to'); put list('SCB+9:'); do i=0 to 3; get list(user(i)); end; return; end; if option='M' & com_base ~= 0 then do; put skip list('Enter 1.) for long error messages and'); put skip list(' 2.) for short error messages'); put skip; put skip list('Enter option:'); get edit(option)(a); if option='1' then bdos_flags=(bdos_flags ! '80'b4); if option='2' then bdos_flags=(bdos_flags & ~ '80'b4); return; end; if option='Q' then stop; if option='S' then do; on error begin; put skip list('ERROR during write to '!!comtail); stop; end; write file(cpm3sys) from(scb_record) keyfrom(scb_offset); close file(cpm3sys); put skip list(comtail,' - Updated successfully'); stop; end; end doit; menu: proc; put skip; put skip list('A - Console Width, Currently:'); put edit(display(con_width+1))(f(3)); put skip list('B - Console Length, Currently:'); put edit(display(con_length+1))(f(3)); put skip list('C - Console page mode, Currently:'); if page_flag then put list('Off'); else put list('On'); put skip list('D - Control-H function, Currently:'); if ctrl_h_flag then put list(echo); else put list(backspace); put skip list('E - Rubout/Delete function, Currently:'); if rubout_flag then put list(backspace); else put list(echo); put skip list('F - Default disk, Currently:', ascii(65+def_disk)!!':'); put skip list('G - Default user, Currently:'); put edit(display(def_user))(f(3)); put skip list('H - Drive Search chain, Currently:'); do i = 0 to 3; if drive_chain(i)~=-1 then if drive_chain(i)=0 then put list('*'); else put list(ascii(64+drive_chain(i))!!':'); if i < 3 then if drive_chain(i+1)~=-1 then put list(','); end; put skip list('I - Tempoary file drive, Currently:'); if temp_disk=0 then put list('*'); else put list(ascii(64+temp_disk)!!':'); put skip list('J - Program search order, Currently:'); if (def_flags & '18'b4) = '18'b4 then put list('PRL, COM'); else if (def_flags & '10'b4) = '10'b4 then put list('SUB, COM'); else if (def_flags & '08'b4) = '08'b4 then put list('COM, SUB'); else put list('COM'); put skip list('K - Program name display, Currently:'); if (def_flags & '03'b4) = '03'b4 then put list('On'); else put list('Off'); put skip list('L - User useable areas, Currently:'); do i = 0 to 3; put edit(display(user(i)))(f(3)); if i < 3 then put list(','); end; if com_base ~= 0 then do; put skip list('M - Error messages, Currently:'); if (bdos_flags & '80'b4) = '80'b4 then put list('Long'); else put list('Short'); end; put skip; put skip list('S - Save SCB to file and exit to CP/M'); put skip list('Q - Quit, exit to CP/M without saving'); end menu; display: proc(i) returns(bin); dcl i bin(7); return(unspec(i)); end display; uppercase: proc (chr) returns(char(20) var); dcl chr char(20) var; return (translate(chr,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')); end uppercase; end setdeflt; put list('COM'); put skip list('K - Program name display, Currently:'); if (def_flags & '03'b4) = '03'b4 then put list('On'); else put list('Off'); put skip list('L - User useable areas, Currently:'); do i = 0 to 3; put edit(display(userɀ?TIME TIME y< 2>2*#8!"#>T] @; TIME RSX ; Reads or sets the internal clock (tick) ; Usage: ; Assemble, HEXCOM and GENCOM this file to a NULL COM file ; Before using, load it by calling TIME ; ; In calling program ; To set clock to 00 call BDOS with DE = 0 ; To read clock call BDOS function 60 with DE > 0 ; ;RSX HEADER ; SERIAL DB 0,0,0,0,0,0 START JMP MAIN NEXT DB 0C3H DW 0 PREV DW 0 REM DB 0 NON DB 0 NAM DB 'TIME ' LOD DB 0,0,0 ; MAIN: MOV A,C ;Is this func 60 CPI 60 JNZ NEXT JNZ ZERO MVI A,81H ;Bank 8 OUT 0 SUB A CMP E JZ ZERO LHLD 23E8H ;load clock bits JMP ONE ZERO LXI H,0 SHLD 23E8H ONE MVI A,01 ;Bank 1 OUT 0 MOV D,H ;DE=HL MOV E,L RET ; ?TIME y< 2>2*#8!"#>T] @SETDEFLTCOM;<=>SETDEFLTDOC ?@SETDEFLTPLIvABCDEFGHIJKLMNOTIME COMPTIME ASMQTIME $$$`0ATM0E1X1TS7=15S0=0 +|0}0_㯆#KR> ^e㯆# e^ x^ʃ{ :{^ʗ{ :* ^+|¬}¬{~_͗# _`{   {>^K@K> 2{K: =2{K!"> 2Rjs0=7 s1k:`!`’!":: > > > >D > > > > ͕^_ :R Modem not ready.:>2x!2Rs0= (jBAUD=1200:`,R 3:FR= <k jRR= 21#R ETERM 1.1 :: (c) E.Meyer :: 84/06/21R Modem program for Osborne Executive.R Press RETURN to begin, or X to cancel: C_ RZ.0z0 7oz1! 6oz2! #o:*R=5 :]C_^̠_;ws_:͗b{* 6 `̓b:nbs#"{Rjs0=7:KK:<2b: b+"Rjs0=7:=2K> Kb6 #6:G͗R=5 !> K> 2:b͗bC_X(LʳBʭEMSCUb̈́_e+++!0_:{2_:{2__̓b:{2_:{2*bRs2Zz1! 6oRz1$ 6os2j ESC E toggle ECHO ESC C toggle CHAR ESC B BAUD rate ESC S toggle ^S^Q ESC ^H/ESC send ^H/ESC ESC U UNDO line ESC M toggle MENU ESC L LOCAL "+++" ESC X EXIT ETERM s1kR.4s0k^R (Modem is still on line!)Rs1k=5:Kè^_ʆè{_è #o:*R=5 :]C_^̠_;ws_:͗b{* 6 `̓b:nbs#"{Rjs0=7:K ETERM.DOC --------- Documentation for ETERM.COM version 1.0 84/06/17 - E.Meyer ETERM is a terminal program for the Osborne Executive computer and a serial modem. It is a very small (2K) and fast program, with few special features (no file buffers, transfers, etc). It is designed specifically for communicating in a "conversational" environment, such as an online conference, where you wish to compose your input free from interruption from screen output. You may enter from, or exit to, another terminal program at will. The program takes no arguments; simply type "ETERM" at the CP/M prompt ("A>" or "B>"). ETERM provides, highlighted in inverse video: (1) A status line at the top of the screen, showing ECHO mode, BAUD rate (300/1200) and ON/OFF LINE. (2) An entry line at the bottom of the screen, where your input can be composed. As you enter characters, they will accumulate on the bottom line. You may use the backspace key (^H) to correct errors. Meanwhile, any incoming characters will be appearing on the screen above, without any interference. When you are ready to send your line, hit RETURN. On the other hand, any CONTROL CODES you enter will be sent through to the host system immediately. The exception is ^H, which functions as backspace and is never sent. ETERM displays control codes in filtered form: for example, ^G will show on your screen as "^G" instead of sounding a bell. The exceptions are carriage return and linefeed, which function normally. (I find bells, screen clears, etc annoying; also, the Exec loses characters while a bell is sounding.) ESCAPE COMMANDS --------------- ETERM accepts a few escape commands. These are: ESC B ...(Baud).......... Toggles baud rate from 300 to 1200.  (If offline, also reinitializes modem.) ESC E ...(Echo).......... Provides screen echo of your input. (So you can see what you typed, even if the remote system isn't echoing it. Useful for "chatting" with other micros.) ESC L ...(Local)......... Sends "+++" for smart modem, to send it into local command mode. (On some modems, also disconnects phone line.) ESC X ...(EXIT).......... Exits ETERM (does not disconnect). ESC followed by any other key will be ignored. CUSTOMIZATION ------------- Several default values are user patchable. (Use SID or equivalent.) ADDRESS PURPOSE 103H Echo mode: 00H=off, FFH=on. 104H Hardware DSR supported: 00H=no, FFH=yes. 105-106H Default modem speed is 1200 baud if these bytes are 60H and 00H, or 300 baud if they are 80H and 01H. 107-108H Character echo delay, also LSB first (eg 00H, 20H means 2000H). Increase if garbling is occurring. 109H An initialization string for a (smart) modem begins here, and should be terminated by 0DH,00H. Maximum 32 characters total. If you don't have a smart modem, patch 109H to 00H. Note on hardware support: if your modem and/or cable do not support the DSR (DataSetReady) signal, ETERM will think the modem is not ready. Patching byte 104H to 00 will avoid this problem. If the DCD (Data- CarrierDetect) signal is not supported, you will not be able to enter ETERM and preserve an existing connection. NOTES ----- This program runs only on the Osborne Executive. It could be easily modified to run on another machine only if it had CP/M 3.0 and ADM-style video codes, including windowing. Thus I have not bothered with detailed hardware patches, overlays, etc. I'm no whiz at 8080 assembler (I prefer C), and ETERM 1.0 is a one-weekend hack job. Nonetheless, for me it has replaced a 14K program called COEXEC 1.1 that someone once gave me (I think it was written in PL/I). I hope you find it useful. Please let me know if you discover a bug, or have trouble using it. Eric Meyer, 427 N.Washington, Bloomington IN. (812)332-5018. CompuServe [74415,1305]. using it. Eric Meyer, 427 N.Washsupport the DSR (DataSetReady) signal, ETERM will think the modem is not ready. Patching byte 104H to 00 will avoid this problem. If the DCD (Data- CarrierDetect) signal is not supported, you will not be able to enter ETERM and preserve an existing connection. NOTES ----- This program runs only on the Osborne Executive. It could be easily modified to run on another machine only if it had CP/M 3.0 and ADM-style video codes, including windowing. Thus I have not bothered with detailed hardware patches, overlays, etc. I'm no whiz at 8080 assembler (I prefer C), and ETERM 1.0 is a one-weekend hack job. Nonet Here are some things I found out about the Exec. 1) DOCINDEX.DOC- I wrote this the first month I had my Exec, since, as you know, the write-ups for all the various CP/M+ utilities are scattered throughout the six books we received with the Exec. (and people thought the Osborne 1 book was hard to use!) If you didn't get volumes 0-4 and the looseleaf "Reference Guide", GET THEM! You can circumvent this scattered approach somewhat by buying the complete CP/M+ documentation from Digital Research ($40. and maybe worth it), but even then you don't get write-ups of the programs written by OCC: COPY, CHARGEN, COPYSYS, and SETUP. Voila! my one page index. It tells where the write-ups are and also on which of the three system disks the program appears. Also, at the bottom of the page is a quick translation guide to let you converse with OsOne and other CP/M 2.2 users. 2) After you push the reset button, you have three choices: A) press return- normal load process B) press T- run the self-test until you press reset again C) press Tab- this inverts the drives; your top drive is now B: and your bottom drive is A: (where your CP/M+ system disk needs to be) X) The Exec will load any program you rename EXECST.COM as it loads the system. 3)Alternate character fonts A) first, load one; there are three on this disk. CHARGEN.COM on your first CP/M+ disk will let you "read a file into the character set." Use INVERTED.CHR from this disk- go ahead and "write the character set to the system tracks" as the Alternate character set. Unless you have already modified your character fonts, your main and alternate character sets were identical. (you can un-do this later, if you want.) B) now, Reset, Return. (You probably call this "Booting", but I call it initial program load or "I.P.L.ing", so let's use terms we all understand) This loads your original (Main) and new (Alternate) character sets to the font RAM. C) Now, as you keystroke, hitting Control Tab will toggle you back and forth from your Main to Alternate fonts. If you used my INVERTED.CHR, isn't this a lot easier than using SETUP.COM each time you want inverted characters? D) The other fonts I have included are BOLDFACE.CHR and BOLDINVR.CHR, which I find somewhat easier to read. Be creative! If you invent a nice font, please get it into this FOG library. 4) Hardware- The Zilog Z-80A SIO2 Serial Input/Output Controller is a monster! Let me quote from Zilog's Data Book: "Two independant full-duplex channels, with separate control and status lines for modems or other devices. "Data rates of 0 to 800k bits/second with a 4.0 MHz clock. "Asynchronous protocols: everything necessary for complete messages in 5, 6, 7, or 8 bits/character.  "Synchronous protocols: everything necessary for complete bit or byte oriented messages in 5, 6, 7 or 8 bits/character, in- cluding IBM Bisync, SDLC, HDLC, CCITT-X.25 and others. Auto- matic CRC generation/checking, sync character and zero inser- tion/deletion, abort generation/detection and flag insertion" Etc. I'm not even sure what all of that is, but what I do understand really verifies what Ron Brown said at the January MtDOG meeting; that is, the Exec was intended to be neither an improved OsOne nor an IBM-PC clone, but a communi cation machine. (For comparison, the OsOne uses a 6850 Motor ola asynchronous communication interface adapter, with a speed of 1200 bits/sec or less) Have you watched a Modem7 download at 9600 or 19200 bps? it's FAST! So, since the Data Book I quoted from above was the 1981 edition, why hasn't the UTE Universal Terminal Emulator prog- ram been released yet? OCC isn't the only company using the Z80A SIO2, is it? I mean, the wheel must have been invented already by somebody, and I want it. 5)Hardware- the OsOne has a Western Digital 1793 floppy disk controller, while the OsEx has a 1797. The difference is side select. So come on, aftermarket! sell me some half-height double-sided drives with a modified BIOS or BDOS so I can use them. That's all that's needed. That says 366K of formatted storage per disk to me. 6)Hardware- Parallel printer connection. The documentation is a mess, so pay attention. Look at your IEEE 488 connector closely. The top row of contacts is labled 12-1 (left to right), while the bottom row is labled 24-13. This is just like the picture on page R-443 (R means Reference Guide), and this matches the listing on p. R-442. BUT, the signal descriptions on R-442 are IEEE 488, and not Centronics or other printer manufacturers. The listing on R-445 matches the listing on 2-210, but the only picture that matches these lists is in the Osborne One Reference Guide! Using the listings on R-445 and 2-210, use this picture: 23 21 19 17 15 13 11 9 7 5 3 1 24 22 20 18 16 14 12 10 8 6 4 2 _________________________________________________________________ OSBORNE EXECUTIVE PARALLEL PRINTER pins 1-8 Data Bits >>>>>>>>>>>>>>>> pin 11 Strobe >>>>>>>>>>>>>>>>>>> pin 15 <<<<<<<<<< Busy pin 19 <<<<<<<<<< Select, Ready, Demand pins 10, 12 14 16 18 20 22 24 Ground. Select, Ready, Demand, Service Request are different names for the same signal. My printer, and maybe all printers alternate this signal with Busy. That's all I know for now, and the more I know, the more I know I don't know. I'm Clark Wood, aka CWOOD, and I am a member of East Bay Chapter of FOG, and a systems engineer for Kaiser Permanente Medical Care Program, Oakland. I may be reached for talk or data (at 300 bps) at (415)724-6668, evenings. CWOOD 17FEB84ture: 23 21 19 17 15 13 11 9 7 5 3 1 24 22 20 18 16 14 12 10 8 6 4 2 _________________________________________________________________ OSBORNE EXECUTIVE PARALLEL PRINTER pins 1-8 Data Bits >>>>>>>>>>>>>>>> pin 11 Strobe >>>>>>>>>>>>>>>>>>> pin 15 <<<<<<<<<< Busy pin 19 <<<<<<<<<< Select, Ready, Demand pins 10, 12 14 16 18 20 22 24 Ground. Select, Ready, Demand, Service Request are different names for the same signal. My printer, and maybe all printers alternate this signal with Busy. That's all I know for now, and the more I know, the more I know I don't know. I'm Clark Wood, a OSBORNE EXECUTIVE DOCUMENTATION INDEX by CWOOD 4 FEB 84 numbers show volume-page; e.g. R-271 is p.271 of Ref. Guide ****** RESIDENT (built-in) UTILITIES ****** DIRectory 1-50 DIRSys 1-53 USEr 1-53, 4-30, R-271 REName 1-49, 1-54 ERAse 1-49, 1-57 TYPe 1-49, 1-56 file types 1-51, R-155, Hogan's CP/M user guide p.28 file specs R-152 control characters 4-3 ****** TRANSIENT (.COM file required) UTILITIES ************ SIZE CHARGEN (written by OCC) 1-81 . . . . . . . . . CP/M+ DISK 1. 29K COPY (written by OCC) 0-7, 1-33, 1-40 . . . . . CP/M+ DISK 1. 8K COPYSYS (version written by OCC) 1-64, R-159. . CP/M+ DISK 1. 5K DATE 4-11, R-162. . . . . . . . . . . . . . . . CP/M+ DISK 2. 3K DEVICE 4-43, R-165. . . . . . . . . . . . . . . CP/M+ DISK 3. 8K DIRectory 1-50, 4-31, R-170 . resident & CP/M+ DISKS 1, 2, 3. 15K DUMP R-179. . . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 1K EDitor 4-52, R-180. . . . . . . . . . . . . . . CP/M+ DISK 3. 10K ERAse 1-57, R-187 . . . . . . . . . .resident & CP/M+ DISK 2. 4K GENCOM R-189. . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 15K GENCPM. . . . . . . . . . . . . . . . . . . . . not provided. GET 4-56, 4-62, R-193 . . . . . . . . . . . . . CP/M+ DISK 3. 7K HELP 4-9 R-195. . . . . . . . . . . . . . . . . CP/M+ DISK 2. 69K HEXCOM R-200. . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 2K INITDIR 4-14, R-200 . . . . . . . . . . . . . . CP/M+ DISK 2. 32K LIB R-202 . . . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 7K LINK 4-64, R-205. . . . . . . . . . . . . . . . CP/M+ DISK 3. 16K MAC 4-64, R-209 . . . . . . . . . . . . . . . . CP/M+ DISK 3. 12K PATCH R-212, R-467, R-468 . . . . . . . . . . . not provided. PIP 1-63, 4-34, R-213 . . . . . . . . . .CP/M+ DISKS 1, 2, 3. 9K PROFILE.SUB R-269 . . . . . . . . . . . . . . .user provided. PUT 4-56, 4-59, R-230 . . . . . . . . . . . . . CP/M+ DISK 3. 7K REName 1-54, R-233. . . . . . . . . .resident & CP/M+ DISK 2. 3K RMAC 4-64, R-235. . . . . . . . . . . . . . . . CP/M+ DISK 3. 14K SAVE R-236. . . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 2K SET 4-15, 4-21, R-238 . . . . . . . . . . . . . CP/M+ DISK 2. 11K SETDEF 4-18, R-248. . . . . . . . . . . . . . . CP/M+ DISK 2. 4K SETUP (written by OCC) 1-68 . . . . . . . . . . CP/M+ DISK 1. 11K SHOW 1-62, 4-28, R-253. . . . . . . . . . . .CP/M+ DISKS 1,3. 9K SID 4-64, 4-72, R-257 . . . . . . . . . . . . . CP/M+ DISK 3. 8K SUBMIT 4-56, R-264. . . . . . . . . . . . . . . CP/M+ DISK 2. 6K TYPE 1-56, R-270. . . . . . . . . . .resident & CP/M+ DISK 2. 3K XREF R-272. . . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 16K *** CP/M 2.2 COMMAND CP/M+ 3.0 COMMAND *** USER, DIRSYS. . . . . . . . . same  DIR, TYPE, ERA, REN . . . . . same (also .COM files now) control C (log new disk). . . CP/M+ detects media change STAT, XDIR. . . . . . . . . . DIR.COM, SHOW, DEVICE, SET PIP, ED, DUMP, SAVE . . . . . same SYSGEN, MOVCPM. . . . . . . . GENCPM, COPYSYS SUBMIT, XSUB. . . . . . . . . SUBMIT ASM . . . . . . . . . . . . . MAC, RMAC, LINK, LIB DDT . . . . . . . . . . . . . SID Drive Invert: Reset, Quote. . Reset, Tab [B: becomes A:] . . . . . . . . . . . . CP/M+ DISK 3. 8K SUBMIT 4-56, R-264. . . . . . . . . . . . . . . CP/M+ DISK 2. 6K TYPE 1-56, R-270. . . . . . . . . . .resident & CP/M+ DISK 2. 3K XREF R-272. . . . . . . . . . . . . . . . . . . CP/M+ DISK 3. 16K *** CP/M 2.2 COMMAND CP/M+ 3.0 COMMAND *** USER, DIRSYS. . . . . . . . . same :10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :10021000FFEFEFEFEFEFFFEFFFFFFFFFFFFFFFFF4E :10022000FFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFF56 :10023000FFD7D783D783D7D7FFFFFFFFFFFFFFFF8E :10024000FFEFC3AFC7EB87EFFFFFFFFFFFFFFFFF2E :10025000FF9F9BF7EFDFB3F3FFFFFFFFFFFFFFFF02 :10026000FFDFAFAFDFABB7CBFFFFFFFFFFFFFFFF4E :10027000FFEFEFDFFFFFFFFFFFFFFFFFFFFFFFFFCE :10028000FFEFDFBFBFBFDFEFFFFFFFFFFFFFFFFF9E :10029000FFEFF7FBFBFBF7EFFFFFFFFFFFFFFFFFAA :1002A000FFEFABC7EFC7ABEFFFFFFFFFFFFFFFFFA6 :1002B000FFFFEFEF83EFEFFFFFFFFFFFFFFFFFFF0A :1002C000FFFFFFFFFFEFEFDFFFFFFFFFFFFFFFFF7E :1002D000FFFFFFFF83FFFFFFFFFFFFFFFFFFFFFFAA :1002E000FFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFF2E :1002F000FFFFFBF7EFDFBFFFFFFFFFFFFFFFFFFF8A :10030000FFC7BBB3AB9BBBC7FFFFFFFFFFFFFFFFF9 :10031000FFEFCFEFEFEFEFC7FFFFFFFFFFFFFFFFA5 :10032000FFC7BBFBC7BFBF83FFFFFFFFFFFFFFFF91 :10033000FF83FBF7E7FBBBC7FFFFFFFFFFFFFFFFED :10034000FFF7E7D7B783F7F7FFFFFFFFFFFFFFFFD9 :10035000FF83BF87FBFBBBC7FFFFFFFFFFFFFFFF65 :10036000FFE3DFBF87BBBBC7FFFFFFFFFFFFFFFF51 :10037000FF83FBFBF7EFDFBFFFFFFFFFFFFFFFFF89 :10038000FFC7BBBBC7BBBBC7FFFFFFFFFFFFFFFF35 :10039000FFC7BBBBC3FBF78FFFFFFFFFFFFFFFFFE5 :1003A000FFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFF7D :1003B000FFFFFFEFFFFFEFEFDFFFFFFFFFFFFFFF9D :1003C000FFF7EFDFBFDFEFF7FFFFFFFFFFFFFFFFED :1003D000FFFFFF83FF83FFFFFFFFFFFFFFFFFFFF25 :1003E000FFDFEFF7FBF7EFDFFFFFFFFFFFFFFFFF91 :1003F000FFC7BBFBE7EFFFEFFFFFFFFFFFFFFFFFC5 :10040000FFC7BBABA3A7BFC3FFFFFFFFFFFFFFFFFC :10041000FFEFD7BBBB83BBBBFFFFFFFFFFFFFFFFB0 :10042000FF87BBBB87BBBB87FFFFFFFFFFFFFFFF54 :10043000FFC7BBBFBFBFBBC7FFFFFFFFFFFFFFFF84 :10044000FF87BBBBBBBBBB87FFFFFFFFFFFFFFFF00 :10045000FF83BFBF87BFBF83FFFFFFFFFFFFFFFF1C :10046000FF83BFBF87BFBFBFFFFFFFFFFFFFFFFFD0 :10047000FFC7BBBFBFB3BBC3FFFFFFFFFFFFFFFF54 :10048000FFBBBBBB83BBBBBBFFFFFFFFFFFFFFFF90 :10049000FFC7EFEFEFEFEFC7FFFFFFFFFFFFFFFF2C :1004A000FFFBFBFBFBFBBBC7FFFFFFFFFFFFFFFFEC :1004B000FFBBB7AF9FAFB7BBFFFFFFFFFFFFFFFF64 :1004C000FFBFBFBFBFBFBF83FFFFFFFFFFFFFFFF38 :1004D000FFBB93ABABABBBBBFFFFFFFFFFFFFFFF60 :1004E000FFBBBB9BABB3BBBBFFFFFFFFFFFFFFFF30 :1004F000FFC7BBBBBBBBBBC7FFFFFFFFFFFFFFFFD0 :10050000FF87BBBB87BFBFBFFFFFFFFFFFFFFFFF33 :10051000FFC7BBBBBBABB7CBFFFFFFFFFFFFFFFFBF :10052000FF87BBBB87AFB7BBFFFFFFFFFFFFFFFF2F :10053000FFC7BBBFC7FBBBC7FFFFFFFFFFFFFFFF3F :10054000FF83ABEFEFEFEFEFFFFFFFFFFFFFFFFFDB :10055000FFBBBBBBBBBBBBC7FFFFFFFFFFFFFFFF7B :10056000FFBBBBBBD7D7EFEFFFFFFFFFFFFFFFFFD7 :10057000FFBBBBBBABABABD7FFFFFFFFFFFFFFFF7B :10058000FFBBBBD7EFD7BBBBFFFFFFFFFFFFFFFFEB :10059000FFBBBBD7EFEFEFEFFFFFFFFFFFFFFFFF5B :1005A000FF83FBF7EFDFBF83FFFFFFFFFFFFFFFFCF :1005B000FF839F9F9F9F9F83FFFFFFFFFFFFFFFF23 :1005C000FFFFBFDFEFF7FBFFFFFFFFFFFFFFFFFFB7 :1005D000FF83F3F3F3F3F383FFFFFFFFFFFFFFFF5F :1005E000FFFFFFEFD7BBFFFFFFFFFFFFFFFFFFFF97 :1005F000FFFFFFFFFFFFFF83FFFFFFFFFFFFFFFF87 :10060000FFEFEFF7FFFFFFFFFFFFFFFFFFFFFFFF22 :10061000FFFFFFCBB3BBB3CBFFFFFFFFFFFFFFFF2E :10062000FFBFBFA79BBB9BA7FFFFFFFFFFFFFFFF16 :10063000FFFFFFC7BFBFBFC7FFFFFFFFFFFFFFFFFA :10064000FFFBFBCBB3BBB3CBFFFFFFFFFFFFFFFF06 :10065000FFFFFFC7BB83BFC3FFFFFFFFFFFFFFFF1E :10066000FFEFD7DF8FDFDFDFFFFFFFFFFFFFFFFFC2 :10067000FFFFFFCBB3BBB3CBFB87FFFFFFFFFFFF4A :10068000FFBFBFA79BBBBBBBFFFFFFFFFFFFFFFF82 :10069000FFFFEFFFEFEFEFEFFFFFFFFFFFFFFFFFBA :1006A000FFFFF7FFF7F7F7F7B7CFFFFFFFFFFFFFFA :1006B000FFBFBFBBB78FB7BBFFFFFFFFFFFFFFFF52 :1006C000FFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFAA :1006D000FFFFFFD7ABABABBBFFFFFFFFFFFFFFFF92 :1006E000FFFFFFA79BBBBBBBFFFFFFFFFFFFFFFFA2 :1006F000FFFFFFC7BBBBBBC7FFFFFFFFFFFFFFFF46 :10070000FFFFFFA79BBB9BA7BFBFFFFFFFFFFFFF35 :10071000FFFFFFCBB3BBB3CBFBFBFFFFFFFFFFFF35 :10072000FFFFFFA79BBFBFBFFFFFFFFFFFFFFFFF55 :10073000FFFFFFC3BFC7FB87FFFFFFFFFFFFFFFFF9 :10074000FFEFEFC7EFEFEFF7FFFFFFFFFFFFFFFF49 :10075000FFFFFFBBBBBBB3CBFFFFFFFFFFFFFFFFF5 :10076000FFFFFFBBBBD7D7EFFFFFFFFFFFFFFFFF81 :10077000FFFFFFBBABABABD7FFFFFFFFFFFFFFFFF1 :10078000FFFFFFBBD7EFD7BBFFFFFFFFFFFFFFFF61 :10079000FFFFFFBBBBBBB3CBFB87FFFFFFFFFFFF31 :1007A000FFFFFF83F7EFDF83FFFFFFFFFFFFFFFF89 :1007B000FFE7DFDF9FDFDFE7FFFFFFFFFFFFFFFF59 :1007C000EFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFD9 :1007D000FFCFF7F7F3F7F7CFFFFFFFFFFFFFFFFFB5 :1007E000FFFFFFDFABF7FFFFFFFFFFFFFFFFFFFF95 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C000FFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFAA :1006D000FFFFFFD7ABABABBBFFFFFFFFFFFFFFFF92 :1006E000FFFFFFA79BBBBBBBFFFFFFFFFFFFFFFFA2 :1006F000FFFFFFC7BBBBBBC7FFFFFFFFFFFFFFFF46 :10070000FFFFFFA79BBB9BA7BFBFFFFFFFFFFFFF35 :10071000FFFFFFCBB3BBB3CBFBFBFFFFFF:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100000101010101000100000FFFFFFFFFFFF84 :1002200000282828000000000000FFFFFFFFFFFF5C :100230000028287C287C28280000FFFFFFFFFFFF04 :1002400000103C50381478100000FFFFFFFFFFFF44 :100250000060640810204C0C0000FFFFFFFFFFFF50 :1002600000205050205448340000FFFFFFFFFFFFE4 :1002700000101020000000000000FFFFFFFFFFFF44 :1002800000102040404020100000FFFFFFFFFFFF54 :1002900000100804040408100000FFFFFFFFFFFF28 :1002A00000105438103854100000FFFFFFFFFFFF0C :1002B000000010107C1010000000FFFFFFFFFFFF88 :1002C00000000000001010200000FFFFFFFFFFFFF4 :1002D000000000007C0000000000FFFFFFFFFFFFA8 :1002E00000000000000000100000FFFFFFFFFFFF04 :1002F00000000408102040000000FFFFFFFFFFFF88 :100300000038444C546444380000FFFFFFFFFFFFF7 :1003100000103010101010380000FFFFFFFFFFFF2B :10032000003844043840407C0000FFFFFFFFFFFF1F :10033000007C0408180444380000FFFFFFFFFFFFA3 :1003400000081828487C08080000FFFFFFFFFFFF97 :10035000007C4078040444380000FFFFFFFFFFFFEB :10036000001C2040784444380000FFFFFFFFFFFFDF :10037000007C0404081020400000FFFFFFFFFFFF87 :1003800000384444384444380000FFFFFFFFFFFFBB :10039000003844443C0408700000FFFFFFFFFFFFEB :1003A00000000010000010000000FFFFFFFFFFFF33 :1003B00000000010000010102000FFFFFFFFFFFFF3 :1003C00000081020402010080000FFFFFFFFFFFF83 :1003D0000000007C007C00000000FFFFFFFFFFFF2B :1003E00000201008040810200000FFFFFFFFFFFF9F :1003F00000384404181000100000FFFFFFFFFFFF4B :10040000003844545C58403C0000FFFFFFFFFFFFF2 :1004100000183C66667E66660000FFFFFFFFFFFF78 :1004200000786666786666780000FFFFFFFFFFFFD2 :10043000003C66606060663C0000FFFFFFFFFFFF5E :1004400000786666666666780000FFFFFFFFFFFFC4 :10045000007C60607860607C0000FFFFFFFFFFFFB2 :10046000007C6060786060600000FFFFFFFFFFFFBE :10047000003C6660606E663C0000FFFFFFFFFFFF10 :10048000006666667E6666660000FFFFFFFFFFFF90 :10049000003C18181818183C0000FFFFFFFFFFFF72 :1004A000000606060606663C0000FFFFFFFFFFFF92 :1004B00000666C7870786C660000FFFFFFFFFFFF3E :1004C000006060606060607C0000FFFFFFFFFFFF76 :1004D0000062767E6A6262620000FFFFFFFFFFFF3C :1004E000006666766E6666660000FFFFFFFFFFFF30 :1004F000003C66666666663C0000FFFFFFFFFFFF8C :1005000000786666786060600000FFFFFFFFFFFF15 :10051000003C6262626A643A0000FFFFFFFFFFFF77 :10052000007C66667C6C66630000FFFFFFFFFFFFD8 :10053000003C66603C06663C0000FFFFFFFFFFFFDB :10054000007E5A18181818180000FFFFFFFFFFFF61 :10055000006666666666663C0000FFFFFFFFFFFF01 :1005600000666666343418180000FFFFFFFFFFFFC7 :10057000006262626A6A7A240000FFFFFFFFFFFFE9 :100580000066663C183C66660000FFFFFFFFFFFF49 :1005900000626234181818180000FFFFFFFFFFFF09 :1005A000007E060C1830607E0000FFFFFFFFFFFF9B :1005B000007C60606060607C0000FFFFFFFFFFFF69 :1005C00000004020100804000000FFFFFFFFFFFFB5 :1005D000007C0C0C0C0C0C7C0000FFFFFFFFFFFFED :1005E00000000010284400000000FFFFFFFFFFFF95 :1005F000000000000000007C0000FFFFFFFFFFFF85 :1006000000101008000000000000FFFFFFFFFFFFC8 :10061000000000344C444C340000FFFFFFFFFFFF9C :1006200000404058644464580000FFFFFFFFFFFF94 :1006300000000038404040380000FFFFFFFFFFFF90 :10064000000404344C444C340000FFFFFFFFFFFF64 :1006500000000038447C403C0000FFFFFFFFFFFF2C :1006600000102820702020200000FFFFFFFFFFFF68 :10067000000000344C444C340478FFFFFFFFFFFFC0 :1006800000404058644444440000FFFFFFFFFFFF68 :1006900000001000101010100000FFFFFFFFFFFF10 :1006A00000000800080808084830FFFFFFFFFFFFB0 :1006B00000404044487048440000FFFFFFFFFFFF38 :1006C00000101010101010100000FFFFFFFFFFFFC0 :1006D00000000028545454440000FFFFFFFFFFFFB8 :1006E00000000058644444440000FFFFFFFFFFFF88 :1006F00000000038444444380000FFFFFFFFFFFFC4 :1007000000000058644464584040FFFFFFFFFFFFB3 :10071000000000344C444C340404FFFFFFFFFFFF93 :1007200000000058644040400000FFFFFFFFFFFF53 :100730000000003C403804780000FFFFFFFFFFFF8F :1007400000101038101010080000FFFFFFFFFFFF1F :100750000000004444444C340000FFFFFFFFFFFF53 :1007600000000044442828100000FFFFFFFFFFFFA7 :1007700000000044545454280000FFFFFFFFFFFF17 :1007800000000044281028440000FFFFFFFFFFFF87 :100790000000004444444C340478FFFFFFFFFFFF97 :1007A0000000007C0810207C0000FFFFFFFFFFFF1F :1007B00000182020602020180000FFFFFFFFFFFF2F :1007C00010101010101010101010FFFFFFFFFFFF8F :1007D000003008080C0808300000FFFFFFFFFFFF93 :1007E00000000020540800000000FFFFFFFFFFFF93 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C00000101010101010100000FFFFFFFFFFFFC0 :1006D00000000028545454440000FFFFFFFFFFFFB8 :1006E00000000058644444440000FFFFFFFFFFFF88 :1006F00000000038444444380000FFFFFFFFFFFFC4 :1007000000000058644464584040FFFFFFFFFFFFB3 :10071000000000344C444C340404FFFFFF:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :10020000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE :10021000FFEFEFEFEFEFFFEFFFFFFFFFFFFFFFFF4E :10022000FFD7D7D7FFFFFFFFFFFFFFFFFFFFFFFF56 :10023000FFD7D783D783D7D7FFFFFFFFFFFFFFFF8E :10024000FFEFC3AFC7EB87EFFFFFFFFFFFFFFFFF2E :10025000FF9F9BF7EFDFB3F3FFFFFFFFFFFFFFFF02 :10026000FFDFAFAFDFABB7CBFFFFFFFFFFFFFFFF4E :10027000FFEFEFDFFFFFFFFFFFFFFFFFFFFFFFFFCE :10028000FFEFDFBFBFBFDFEFFFFFFFFFFFFFFFFF9E :10029000FFEFF7FBFBFBF7EFFFFFFFFFFFFFFFFFAA :1002A000FFEFABC7EFC7ABEFFFFFFFFFFFFFFFFFA6 :1002B000FFFFEFEF83EFEFFFFFFFFFFFFFFFFFFF0A :1002C000FFFFFFFFFFEFEFDFFFFFFFFFFFFFFFFF7E :1002D000FFFFFFFF83FFFFFFFFFFFFFFFFFFFFFFAA :1002E000FFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFF2E :1002F000FFFFFBF7EFDFBFFFFFFFFFFFFFFFFFFF8A :10030000FFC7BBB3AB9BBBC7FFFFFFFFFFFFFFFFF9 :10031000FFEFCFEFEFEFEFC7FFFFFFFFFFFFFFFFA5 :10032000FFC7BBFBC7BFBF83FFFFFFFFFFFFFFFF91 :10033000FF83FBF7E7FBBBC7FFFFFFFFFFFFFFFFED :10034000FFF7E7D7B783F7F7FFFFFFFFFFFFFFFFD9 :10035000FF83BF87FBFBBBC7FFFFFFFFFFFFFFFF65 :10036000FFE3DFBF87BBBBC7FFFFFFFFFFFFFFFF51 :10037000FF83FBFBF7EFDFBFFFFFFFFFFFFFFFFF89 :10038000FFC7BBBBC7BBBBC7FFFFFFFFFFFFFFFF35 :10039000FFC7BBBBC3FBF78FFFFFFFFFFFFFFFFFE5 :1003A000FFFFFFEFFFFFEFFFFFFFFFFFFFFFFFFF7D :1003B000FFFFFFEFFFFFEFEFDFFFFFFFFFFFFFFF9D :1003C000FFF7EFDFBFDFEFF7FFFFFFFFFFFFFFFFED :1003D000FFFFFF83FF83FFFFFFFFFFFFFFFFFFFF25 :1003E000FFDFEFF7FBF7EFDFFFFFFFFFFFFFFFFF91 :1003F000FFC7BBFBE7EFFFEFFFFFFFFFFFFFFFFFC5 :10040000FFC7BBABA3A7BFC3FFFFFFFFFFFFFFFFFC :10041000FFE7C39999819999FFFFFFFFFFFFFFFF56 :10042000FF87999987999987FFFFFFFFFFFFFFFFDC :10043000FFC3999F9F9F99C3FFFFFFFFFFFFFFFF30 :10044000FF87999999999987FFFFFFFFFFFFFFFFAA :10045000FF839F9F879F9F83FFFFFFFFFFFFFFFF9C :10046000FF839F9F879F9F9FFFFFFFFFFFFFFFFF70 :10047000FFC3999F9F9199C3FFFFFFFFFFFFFFFFFE :10048000FF99999981999999FFFFFFFFFFFFFFFF5E :10049000FFC3E7E7E7E7E7C3FFFFFFFFFFFFFFFF5C :1004A000FFF9F9F9F9F999C3FFFFFFFFFFFFFFFF1C :1004B000FF9993878F879399FFFFFFFFFFFFFFFF50 :1004C000FF9F9F9F9F9F9F83FFFFFFFFFFFFFFFFF8 :1004D000FF9D8981959D9D9DFFFFFFFFFFFFFFFF12 :1004E000FF99998991999999FFFFFFFFFFFFFFFFFE :1004F000FFC39999999999C3FFFFFFFFFFFFFFFF82 :10050000FF879999879F9F9FFFFFFFFFFFFFFFFFD7 :10051000FFC39D9D9D959BC5FFFFFFFFFFFFFFFF55 :10052000FF8399998393999CFFFFFFFFFFFFFFFFD4 :10053000FFC3999FC3F999C3FFFFFFFFFFFFFFFFB1 :10054000FF81A5E7E7E7E7E7FFFFFFFFFFFFFFFF0B :10055000FF999999999999C3FFFFFFFFFFFFFFFF4B :10056000FF999999CBCBE7E7FFFFFFFFFFFFFFFF65 :10057000FF9D9D9D959585DBFFFFFFFFFFFFFFFF23 :10058000FF9999C3E7C39999FFFFFFFFFFFFFFFFA3 :10059000FF9D9DCBE7E7E7E7FFFFFFFFFFFFFFFFC3 :1005A000FF81F9F3E7CF9F81FFFFFFFFFFFFFFFF11 :1005B000FF839F9F9F9F9F83FFFFFFFFFFFFFFFF23 :1005C000FFFFBFDFEFF7FBFFFFFFFFFFFFFFFFFFB7 :1005D000FF83F3F3F3F3F383FFFFFFFFFFFFFFFF5F :1005E000FFFFFFEFD7BBFFFFFFFFFFFFFFFFFFFF97 :1005F000FFFFFFFFFFFFFF83FFFFFFFFFFFFFFFF87 :10060000FFEFEFF7FFFFFFFFFFFFFFFFFFFFFFFF22 :10061000FFFFFFCBB3BBB3CBFFFFFFFFFFFFFFFF2E :10062000FFBFBFA79BBB9BA7FFFFFFFFFFFFFFFF16 :10063000FFFFFFC7BFBFBFC7FFFFFFFFFFFFFFFFFA :10064000FFFBFBCBB3BBB3CBFFFFFFFFFFFFFFFF06 :10065000FFFFFFC7BB83BFC3FFFFFFFFFFFFFFFF1E :10066000FFEFD7DF8FDFDFDFFFFFFFFFFFFFFFFFC2 :10067000FFFFFFCBB3BBB3CBFB87FFFFFFFFFFFF4A :10068000FFBFBFA79BBBBBBBFFFFFFFFFFFFFFFF82 :10069000FFFFEFFFEFEFEFEFFFFFFFFFFFFFFFFFBA :1006A000FFFFF7FFF7F7F7F7B7CFFFFFFFFFFFFFFA :1006B000FFBFBFBBB78FB7BBFFFFFFFFFFFFFFFF52 :1006C000FFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFAA :1006D000FFFFFFD7ABABABBBFFFFFFFFFFFFFFFF92 :1006E000FFFFFFA79BBBBBBBFFFFFFFFFFFFFFFFA2 :1006F000FFFFFFC7BBBBBBC7FFFFFFFFFFFFFFFF46 :10070000FFFFFFA79BBB9BA7BFBFFFFFFFFFFFFF35 :10071000FFFFFFCBB3BBB3CBFBFBFFFFFFFFFFFF35 :10072000FFFFFFA79BBFBFBFFFFFFFFFFFFFFFFF55 :10073000FFFFFFC3BFC7FB87FFFFFFFFFFFFFFFFF9 :10074000FFEFEFC7EFEFEFF7FFFFFFFFFFFFFFFF49 :10075000FFFFFFBBBBBBB3CBFFFFFFFFFFFFFFFFF5 :10076000FFFFFFBBBBD7D7EFFFFFFFFFFFFFFFFF81 :10077000FFFFFFBBABABABD7FFFFFFFFFFFFFFFFF1 :10078000FFFFFFBBD7EFD7BBFFFFFFFFFFFFFFFF61 :10079000FFFFFFBBBBBBB3CBFB87FFFFFFFFFFFF31 :1007A000FFFFFF83F7EFDF83FFFFFFFFFFFFFFFF89 :1007B000FFE7DFDF9FDFDFE7FFFFFFFFFFFFFFFF59 :1007C000EFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFD9 :1007D000FFCFF7F7F3F7F7CFFFFFFFFFFFFFFFFFB5 :1007E000FFFFFFDFABF7FFFFFFFFFFFFFFFFFFFF95 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C000FFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFAA :1006D000FFFFFFD7ABABABBBFFFFFFFFFFFFFFFF92 :1006E000FFFFFFA79BBBBBBBFFFFFFFFFFFFFFFFA2 :1006F000FFFFFFC7BBBBBBC7FFFFFFFFFFFFFFFF46 :10070000FFFFFFA79BBB9BA7BFBFFFFFFFFFFFFF35 :10071000FFFFFFCBB3BBB3CBFBFBFFFFFF KEVIN MESSER BEREA COLLEGE CPO 1397 BEREA, KY 40404 Member Number: 8616 March 5, 1984 1. The file, EXSERIFS.CHR, is a character file for use with the Executive 1 and the CHARGEN.COM program. Its use is primarily as a "fancy" screen character set. To use it, read the file into the program and then write it to the system tracks of the disk with which you will use it (I put it on my WordStar disk); your choice of either main or alternate set. You must boot up the disk from a reset in order for the character set ot be in the font ram. If you wish to change the set, feel free. 2. The files, GREEK.CHR and GREEK14.FON, are meant to be used together. GREEK.CHR is a character set for use with CHARGEN.COM (like EXSERIFS.CHR, above). Since Greek is an aspirated language, accents are included on some characters, principally j, v, and the numbers 0-9. It is meant to correspond to GREEK14.FON in upper- and lower-case alphabetics and number keys. GREEK14.FON must be used with the FANCY FONT software program and an EPSON printer. When used in this manner it will enable you to print Greek text. Since, however, the video attributes of the EXECUTIVE 1 are not utilized by WordStar be careful to indicate the start and stop of the GREEK14 font in your text. Once you move off the page it will be difficult to tell what is Greek and what might have been simply misspelled.  wish to change the set, feel free. 2. The files, GREEK.CHR and GREEK14.FON, are meant to be used together. GREEK.CHR is a character set for use with CHARGEN.COM (like EXSERIFS.CHR, above). Since Greek is an aspirated language,:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100000081C1C080800080000FFFFFFFFFFFF8C :1002200000141414000000000000FFFFFFFFFFFF98 :100230000014143E143E14140000FFFFFFFFFFFFE4 :1002400000081E281C0A3C080000FFFFFFFFFFFFFC :1002500000303204081026060000FFFFFFFFFFFFFA :1002600000102828102A241A0000FFFFFFFFFFFFBC :1002700000080810000000000000FFFFFFFFFFFF64 :1002800000102040404020100000FFFFFFFFFFFF54 :1002900000080402020204080000FFFFFFFFFFFF46 :1002A00000082A1C081C2A080000FFFFFFFFFFFFB0 :1002B000000008083E0808000000FFFFFFFFFFFFE6 :1002C00000000000000000080810FFFFFFFFFFFF14 :1002D000000000003E0000000000FFFFFFFFFFFFE6 :1002E00000000000000000100000FFFFFFFFFFFF04 :1002F00000000204081020000000FFFFFFFFFFFFC6 :10030000001C22262A32221C0000FFFFFFFFFFFFF5 :10031000000818080808081C0000FFFFFFFFFFFF87 :10032000001C22021C20203E0000FFFFFFFFFFFFF9 :10033000003E02040C02221C0000FFFFFFFFFFFF33 :1003400000040C14243E04040000FFFFFFFFFFFF25 :10035000003E203C0202221C0000FFFFFFFFFFFFC7 :10036000000E10203C22221C0000FFFFFFFFFFFFB9 :10037000003E0202040810200000FFFFFFFFFFFF05 :10038000001C22221C22221C0000FFFFFFFFFFFF97 :10039000001C22221E0204380000FFFFFFFFFFFFA7 :1003A00000000010000010000000FFFFFFFFFFFF33 :1003B00000000010000000101020FFFFFFFFFFFFF3 :1003C00000040810201008040000FFFFFFFFFFFFDB :1003D0000000003E003E00000000FFFFFFFFFFFFA7 :1003E00000100804020408100000FFFFFFFFFFFFD9 :1003F000001C22020C0800080000FFFFFFFFFFFFA7 :10040000001C222A2E2C201E0000FFFFFFFFFFFFF2 :1004100000081422223E22630000FFFFFFFFFFFFBF :10042000007C22223C22227C0000FFFFFFFFFFFF16 :10043000001C22202020221C0000FFFFFFFFFFFFE6 :10044000007C22222222227C0000FFFFFFFFFFFF10 :10045000003E22203C20223E0000FFFFFFFFFFFF66 :10046000003E20203C2020700000FFFFFFFFFFFF28 :10047000001C22202026221E0000FFFFFFFFFFFF9E :10048000006322223E2222630000FFFFFFFFFFFFE6 :10049000001C08080808081C0000FFFFFFFFFFFF02 :1004A000001E0404040444380000FFFFFFFFFFFFA8 :1004B00000622428302824620000FFFFFFFFFFFFB6 :1004C000007020202020223E0000FFFFFFFFFFFFE2 :1004D0000063362A2A2A22630000FFFFFFFFFFFF86 :1004E000006222322A2622220000FFFFFFFFFFFFC8 :1004F000001C22222222221C0000FFFFFFFFFFFF20 :10050000007C22223C2020700000FFFFFFFFFFFF45 :10051000001C2222222A241A0000FFFFFFFFFFFFF7 :10052000007C22223C2824730000FFFFFFFFFFFF16 :10053000001C22201C02221C0000FFFFFFFFFFFF07 :10054000003E2A080808081C0000FFFFFFFFFFFF0D :10055000006322222222221C0000FFFFFFFFFFFF78 :1005600000632222141408080000FFFFFFFFFFFFB2 :1005700000414141494949360000FFFFFFFFFFFFAD :1005800000222214081422220000FFFFFFFFFFFFB9 :10059000002222140808081C0000FFFFFFFFFFFFD5 :1005A000003E22040810223E0000FFFFFFFFFFFF75 :1005B000007C60606060607C0000FFFFFFFFFFFF69 :1005C00000002010080402000000FFFFFFFFFFFFF3 :1005D000003E06060606063E0000FFFFFFFFFFFF87 :1005E00000000008142200000000FFFFFFFFFFFFD3 :1005F00000000000000000FF0000FFFFFFFFFFFF02 :1006000000101008000000000000FFFFFFFFFFFFC8 :100610000000001A2622261A0000FFFFFFFFFFFF3E :100620000060202C3222223C0000FFFFFFFFFFFF72 :100630000000001C2020201C0000FFFFFFFFFFFF28 :10064000000604344C444C360000FFFFFFFFFFFF60 :100650000000001C223E201E0000FFFFFFFFFFFFE6 :1006600000081410381010380000FFFFFFFFFFFFD4 :100670000000001A2622261A023CFFFFFFFFFFFFA0 :100680000060202C322222630000FFFFFFFFFFFFEB :10069000000800180808081C0000FFFFFFFFFFFF0C :1006A0000004000C040404042418FFFFFFFFFFFFF4 :1006B00000602022243824630000FFFFFFFFFFFFBB :1006C000001808080808081C0000FFFFFFFFFFFFD4 :1006D000000000D26D4949410000FFFFFFFFFFFF0E :1006E0000000006C322222230000FFFFFFFFFFFF0B :1006F0000000001C2222221C0000FFFFFFFFFFFF62 :100700000000006C3222322C2020FFFFFFFFFFFF91 :10071000000000364C444C340404FFFFFFFFFFFF91 :100720000000006C322020700000FFFFFFFFFFFF81 :100730000000001E201C023C0000FFFFFFFFFFFF27 :1007400000101038101010080000FFFFFFFFFFFF1F :100750000000004644444C360000FFFFFFFFFFFF4F :1007600000000022221414080000FFFFFFFFFFFF1B :10077000000000C1494955220000FFFFFFFFFFFFB5 :100780000000006234182C460000FFFFFFFFFFFF4F :100790000000004644444C340478FFFFFFFFFFFF95 :1007A0000000003E0408103E0000FFFFFFFFFFFFB7 :1007B00000182020602020180000FFFFFFFFFFFF2F :1007C00008080808080808080808FFFFFFFFFFFFDF :1007D00000180404060404180000FFFFFFFFFFFFD9 :1007E000000000102A0400000000FFFFFFFFFFFFD1 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C000001808080808081C0000FFFFFFFFFFFFD4 :1006D000000000D26D4949410000FFFFFFFFFFFF0E :1006E0000000006C322222230000FFFFFFFFFFFF0B :1006F0000000001C2222221C0000FFFFFFFFFFFF62 :100700000000006C3222322C2020FFFFFFFFFFFF91 :10071000000000364C444C340404FFFFFF:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :10010000000000FCFCFCFC3C3C3CFFFFFFFFFFFF51 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :10021000001C1C1C080800080000FFFFFFFFFFFF78 :1002200000282828000000000000FFFFFFFFFFFF5C :100230000028287C287C28280000FFFFFFFFFFFF04 :1002400000103C50381478100000FFFFFFFFFFFF44 :100250000060640810204C0C0000FFFFFFFFFFFF50 :1002600000205050205448340000FFFFFFFFFFFFE4 :1002700000020204000000000000FFFFFFFFFFFF7C :1002800000102040404020100000FFFFFFFFFFFF54 :1002900000100804040408100000FFFFFFFFFFFF28 :1002A00000105438103854100000FFFFFFFFFFFF0C :1002B000000010107C1010000000FFFFFFFFFFFF88 :1002C00000000000000000101020FFFFFFFFFFFFF4 :1002D000000000007C0000000000FFFFFFFFFFFFA8 :1002E00000000000000000100000FFFFFFFFFFFF04 :1002F00000000408102040000000FFFFFFFFFFFF88 :100300000000003E444444380000FFFFFFFFFFFFB1 :100310000000003A44443A001018FFFFFFFFFFFFBF :100320000000006C322222024460FFFFFFFFFFFF4B :100330002010006C322222020400FFFFFFFFFFFFAB :100340003C421020002020201000FFFFFFFFFFFF95 :1003500000404020001010100800FFFFFFFFFFFFCB :1003600000402010001010100800FFFFFFFFFFFFEB :1003700020100038444444380000FFFFFFFFFFFF17 :1003800020201044444444380000FFFFFFFFFFFFDB :1003900008081044444444380000FFFFFFFFFFFFFB :1003A00000000000100000000000FFFFFFFFFFFF43 :1003B00000000010000010102000FFFFFFFFFFFFF3 :1003C00000081020402010080000FFFFFFFFFFFF83 :1003D0000000007C007C00000000FFFFFFFFFFFF2B :1003E00000201008040810200000FFFFFFFFFFFF9F :1003F00000000010000010102000FFFFFFFFFFFFB3 :10040000003844545C58403C0000FFFFFFFFFFFFF2 :1004100000102844447C44C60000FFFFFFFFFFFF9C :1004200000F84444784444F80000FFFFFFFFFFFF5A :1004300000444428102844440000FFFFFFFFFFFF52 :1004400000102844448282FE0000FFFFFFFFFFFFF0 :10045000007C44407840447C0000FFFFFFFFFFFF2A :10046000007C1054929254107C00FFFFFFFFFFFFAE :1004700000FE4240404040E00000FFFFFFFFFFFF62 :1004800000C644447C4444C60000FFFFFFFFFFFF5A :1004900000381010101010380000FFFFFFFFFFFFA2 :1004A000405C88080808081C0000FFFFFFFFFFFFF2 :1004B00000C64850605048C60000FFFFFFFFFFFF26 :1004C00000102844444444C60000FFFFFFFFFFFF24 :1004D00000C66C54545444C60000FFFFFFFFFFFFEA :1004E00000C64464544C44C40000FFFFFFFFFFFFFC :1004F00000384444444444380000FFFFFFFFFFFF3E :1005000000FE4444444444C60000FFFFFFFFFFFFD9 :10051000007C8282BA82827C0000FFFFFFFFFFFF27 :10052000007C22223C2020700000FFFFFFFFFFFF25 :10053000007E22100810227E0000FFFFFFFFFFFF59 :1005400000FE9210101010380000FFFFFFFFFFFFA9 :1005500000864428101010100000FFFFFFFFFFFF6F :1005600000444444282810100000FFFFFFFFFFFF55 :1005700000003844828244C60000FFFFFFFFFFFFF7 :10058000007F41141C14417F0000FFFFFFFFFFFFAD :1005900000545454543810100000FFFFFFFFFFFFB9 :1005A000007E4408102044FC0000FFFFFFFFFFFF17 :1005B000007C60606060607C0000FFFFFFFFFFFF69 :1005C00000004020100804000000FFFFFFFFFFFFB5 :1005D000007C0C0C0C0C0C7C0000FFFFFFFFFFFFED :1005E00000040810002020201000FFFFFFFFFFFF85 :1005F000000000000000007C0000FFFFFFFFFFFF85 :1006000000040402000000000000FFFFFFFFFFFFE6 :10061000000000003A44443A0000FFFFFFFFFFFFE4 :10062000000E11223842625C4040FFFFFFFFFFFFD7 :1006300000000000621408142200FFFFFFFFFFFF0C :100640003C201018244224180000FFFFFFFFFFFF8A :100650000000001E207E201E0000FFFFFFFFFFFFA6 :100660000004043C4A523C202000FFFFFFFFFFFF34 :1006700000000001E1110A040810FFFFFFFFFFFF67 :100680000000006C322222020400FFFFFFFFFFFF88 :1006900000000000101010100800FFFFFFFFFFFF18 :1006A00000020204001010100800FFFFFFFFFFFF10 :1006B00000000044487048440000FFFFFFFFFFFFB8 :1006C00000402010081422420000FFFFFFFFFFFF40 :1006D000000000242424245A4040FFFFFFFFFFFFB6 :1006E00000000044442828100000FFFFFFFFFFFF28 :1006F00000000038444444380000FFFFFFFFFFFFC4 :100700000000007E242424240000FFFFFFFFFFFFE1 :1007100000384444FE4444380000FFFFFFFFFFFF61 :100720000000001C22625C404040FFFFFFFFFFFF13 :100730000000003C403804083000FFFFFFFFFFFFCF :100740000000003E080808100000FFFFFFFFFFFF49 :1007500000000044444444380000FFFFFFFFFFFF57 :100760000000008292926C002030FFFFFFFFFFFF2D :10077000000000829292926C0000FFFFFFFFFFFFDB :10078000022E10201820403C020CFFFFFFFFFFFF4D :1007900000101010949494781010FFFFFFFFFFFFDB :1007A00000063C0810207C021C00FFFFFFFFFFFF3B :1007B00000182020602020180000FFFFFFFFFFFF2F :1007C00010101010101010101010FFFFFFFFFFFF8F :1007D000003008080C0808300000FFFFFFFFFFFF93 :1007E00000000020540800000000FFFFFFFFFFFF93 :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C00000402010081422420000FFFFFFFFFFFF40 :1006D000000000242424245A4040FFFFFFFFFFFFB6 :1006E00000000044442828100000FFFFFFFFFFFF28 :1006F00000000038444444380000FFFFFFFFFFFFC4 :100700000000007E242424240000FFFFFFFFFFFFE1 :1007100000384444FE4444380000FFFFFFTranslation by Pacific Software SystemsAUse with CHARGEN & GREEK.CHR;(1983) Kevin Messer,Berea College CPO 1397,Berea,KY 40404S !" % &'* + ,- .0 1 2 3 45 6  7  8 9 :;<  = >  ?  @AB CD E  F G  HIJKLMN O PQ R S T U W X YZ  ^ _`a b c  d  e  f g h i j k l mn o  pq  r s  t u v w x yz  ~    @  @ @  08H@`(x8 D`088$@08   @@@@@@@@@@@@   @@@@@@@@@@@@@ p`0xp8xĀpx0xȅxH8xā8L@@8>A8A<8>@ <@<   ||0  0 !! ,,  (*(($$||  ||  p`0xp8xĀp  80@@   80@@   @@@@` @ @ @   @ @ @(h$D$@@0 (   d` pd| 8 Hx0x0D p8 4 `    (8$<0@p8  8     ``   @`0D`4 @0   `pd| 8 P(`x`x  P(`0`0DD  DD@@@@(Ȉ0 $Ą @       88  HȈ  DDDDD      ` `````8p8 4dĄ  0`    px0xȄxH8xĀ8L>Hx0p8x@d |.@|#@>!@p`0xp8xĀp   p0x8x p<pppxx ~ ~0@>`8>@ <@<||||`    8`0x0xx``8 0@0  0`0 >x|||8   p`0xp8xĀpppp8x8x`8hp "< give yo "+ an "> give yo * Nonetheless lef th angle-bracket i th Germa set t avoi wreakin to muc havo i th appear anc o Wordsta screen. Thos ar th inconveniences al o whic "Smartprint woul eliminate T examin th layou o th remainin characters jus mak printou o eac ro o you key board Yo wil fin mos character i thei usua spots som quit ou o th way som character utterl useles excep fo writin logarithms an som usefu character no ther a all I anyon readin thi ha foun bette daisy-wheel, please drop me a line! Robert Schine 445 Locust Street Mt. Vernon, New York 10552 yo wil fin accen grav an accen agut And what' more Wordsta wil stil trea the a colo an semicolon tha is a designatin th en o word However thi shoul bothe onl thos wh writ French. - Ther ar n "< give yo "+ an "> give yo * Nonetheless lef th angle-bracket i th Germa set t avoi wreakin to muc havo i th appear anc o Wordsta screen. Thos ar th inconveniences al o whic "Smartprint woul eliminate T examin th layou o th remainin characters jus mak printou o eac ro o you key board Yo wil fin mos character i thei usua spots som quit ou o th way som character utterl useles excep fo writin loga:10000000FFC3C3C3C3C3C3C3C3FFFFFFFFFFFFFFE0 :10001000F0F0F0F0F0F0F0F0F0F0FFFFFFFFFFFF86 :100020000F0F0F0F0FF0F0F0F0F0FFFFFFFFFFFFDB :100030000F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFF80 :100040000F0F0F0F0F0F0F0F0F0FFFFFFFFFFFFF20 :10005000FFFFFFFFFF0F0F0F0F0FFFFFFFFFFFFF60 :100060000000000000F0F0F0F0F0FFFFFFFFFFFFE6 :1000700000000000000F0F0F0F0FFFFFFFFFFFFF3B :1000800080C0E0F0F0F8F8FCFEFFFFFFFFFFFFFF8D :100090000000003F3F3F3F3C3C3CFFFFFFFFFFFFB6 :1000A0000103070F0F1F1F3F7FFFFFFFFFFFFFFF32 :1000B0003C3C3C3C3C3C3C3C3C3CFFFFFFFFFFFFEE :1000C0003C3C3CFFFFFFFF3C3C3CFFFFFFFFFFFFD2 :1000D00000003C7E7E7E7E3C0000FFFFFFFFFFFFB6 :1000E000F0F0F0F0F00F0F0F0F0FFFFFFFFFFFFF1B :1000F000000000FFFFFFFF3C3C3CFFFFFFFFFFFF56 :1001000000000010000010000000FFFFFFFFFFFFD5 :10011000FFFFFFFFFFF0F0F0F0F0FFFFFFFFFFFF3A :10012000F0F0F0F0F00000000000FFFFFFFFFFFF25 :10013000003C4299A1A199423C00FFFFFFFFFFFF55 :100140000F0F0F0F0F0000000000FFFFFFFFFFFF6A :10015000FF7F3F1F1F0F0F070301FFFFFFFFFFFF81 :10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F :10017000FFFFFFFFFF0000000000FFFFFFFFFFFF8A :100180000000000000FFFFFFFFFFFFFFFFFFFFFF7A :10019000FFFEFCF8F8F0F0E0C080FFFFFFFFFFFF7C :1001A000F0F0F0F0F0FFFFFFFFFFFFFFFFFFFFFFAA :1001B000000000FFFFFFFF000000FFFFFFFFFFFF49 :1001C0003C3C3C3F3F3F3F000000FFFFFFFFFFFF85 :1001D000C0C6CCD8306EC306183FFFFFFFFFFFFF3D :1001E0003C3C3CFFFFFFFF000000FFFFFFFFFFFF65 :1001F0003C3C3CFCFCFCFC000000FFFFFFFFFFFF61 :1002000000000000000000000000FFFFFFFFFFFFF4 :1002100000101010101000100000FFFFFFFFFFFF84 :1002200044102844447C44440000FFFFFFFFFFFFCC :100230001E1228140A0424380000FFFFFFFFFFFFEE :1002400000103C50381478100000FFFFFFFFFFFF44 :100250000060640810204C0C0000FFFFFFFFFFFF50 :1002600000284444584444584040FFFFFFFFFFFF2C :10027000002400344C444C340000FFFFFFFFFFFF1C :1002800000100804040408100000FFFFFFFFFFFF38 :100290000000003E003E00000000FFFFFFFFFFFFE8 :1002A00000102040404020100000FFFFFFFFFFFF34 :1002B00044384444444444380000FFFFFFFFFFFF3C :1002C00000000000001010200000FFFFFFFFFFFFF4 :1002D000000000003E0000 000000FFFFFFFFFFFFE6 :1002E00000000000000000100000FFFFFFFFFFFF04 :1002F00000000408102040000000FFFFFFFFFFFF88 :100300000038444C546444380000FFFFFFFFFFFFF7 :1003100000103010101010380000FFFFFFFFFFFF2B :10032000003844043840407C0000FFFFFFFFFFFF1F :10033000007C0408180444380000FFFFFFFFFFFFA3 :1003400000081828487C08080000FFFFFFFFFFFF97 :10035000007C4078040444380000FFFFFFFFFFFFEB :10036000001C2040784444380000FFFFFFFFFFFFDF :10037000007C0404081020400000FFFFFFFFFFFF87 :1003800000384444384444380000FFFFFFFFFFFFBB :10039000003844443C0408700000FFFFFFFFFFFFEB :1003A00000100804000000000000FFFFFFFFFFFF37 :1003B00000081020000000000000FFFFFFFFFFFF0B :1003C000000810204C2010080000FFFFFFFFFFFF77 :1003D00000440038444444380000FFFFFFFFFFFFA3 :1003E00000100804320408100000FFFFFFFFFFFFA9 :1003F00000384404181000100000FFFFFFFFFFFF4B :1004000000282828000000000000FFFFFFFFFFFF7A :1004100000102844447C44440000FFFFFFFFFFFF1E :1004200000784444784444780000FFFFFFFFFFFF5A :1004300000384440404044380000FFFFFFFFFFFF0A :1004400000784444444444780000FFFFFFFFFFFF6E :10045000007C40407840407C0000FFFFFFFFFFFF32 :10046000007C4040784040400000FFFFFFFFFFFF5E :1004700000384440404C443C0000FFFFFFFFFFFFBA :10048000004444447C4444440000FFFFFFFFFFFF5E :1004900000381010101010380000FFFFFFFFFFFFA2 :1004A00000040404040444380000FFFFFFFFFFFFC2 :1004B00000444850605048440000FFFFFFFFFFFF2A :1004C000004040404040407C0000FFFFFFFFFFFF36 :1004D00000446C54545444440000FFFFFFFFFFFFEE :1004E00000444464544C44440000FFFFFFFFFFFFFE :1004F00000384444444444380000FFFFFFFFFFFF3E :1005000000784444784040400000FFFFFFFFFFFFB9 :1005100000384444445448340000FFFFFFFFFFFF0D :1005200000784444785048440000FFFFFFFFFFFF7D :1005300000384440380444380000FFFFFFFFFFFF4D :10054000007C5410101010100000FFFFFFFFFFFF91 :1005500000444444444444380000FFFFFFFFFFFFD1 :1005600000444444282810100000FFFFFFFFFFFF55 :1005700000444444545454280000FFFFFFFFFFFF91 :1005800000444428102844440000FFFFFFFFFFFF01 :1005900000444428101010100000FFFFFFFFFFFF71 :1005A000007C04081020407C0000FFFFFFFFFFFFDD :1005B00000001824241800000000FFFFFFFFFFFFC9 :1005C0000044004444444C340000FFFFFFFFFFFFA1 :1005D00010101010101010101010FFFFFFFFFFFF81 :1005E00000102844000000000000FFFFFFFFFFFF95 :1005F0000000000000000000FF00FFFFFFFFFFFF02 :100600000028287C287C28280000FFFFFFFFFFFF30 :10061000000000344C444C340000FFFFFFFFFFFF9C :1006200000404058644464580000FFFFFFFFFFFF94 :1006300000000038404040380000FFFFFFFFFFFF90 :10064000000404344C444C340000FFFFFFFFFFFF64 :1006500000000038447C403C0000FFFFFFFFFFFF2C :1006600000102820702020200000FFFFFFFFFFFF68 :10067000000000344C444C340478FFFFFFFFFFFFC0 :1006800000404058644444440000FFFFFFFFFFFF68 :1006900000001000101010100000FFFFFFFFFFFF10 :1006A00000000800080808084830FFFFFFFFFFFFB0 :1006B00000404044487048440000FFFFFFFFFFFF38 :1006C00000101010101010100000FFFFFFFFFFFFC0 :1006D00000000028545454440000FFFFFFFFFFFFB8 :1006E00000000058644444440000FFFFFFFFFFFF88 :1006F00000000038444444380000FFFFFFFFFFFFC4 :1007000000000058644464584040FFFFFFFFFFFFB3 :10071000000000344C444C340404FFFFFFFFFFFF93 :1007200000000058644040400000FFFFFFFFFFFF53 :100730000000003C403804780000FFFFFFFFFFFF8F :1007400000101038101010080000FFFFFFFFFFFF1F :100750000000004444444C340000FFFFFFFFFFFF53 :1007600000000044442828100000FFFFFFFFFFFFA7 :1007700000000044545454280000FFFFFFFFFFFF17 :1007800000000044281028440000FFFFFFFFFFFF87 :100790000000004444444C340478FFFFFFFFFFFF97 :1007A0000000007C0810207C0000FFFFFFFFFFFF1F :1007B000182408203C0000000000FFFFFFFFFFFF9F :1007C00000000010001010200000FFFFFFFFFFFFDF :1007D0003C041804380000000000FFFFFFFFFFFF8B :1007E00044004444444444380000FFFFFFFFFFFF3F :1007F000AA55AA55AA55AA55AA55FFFFFFFFFF06FD :00000000 6C00000101010101010100000FFFFFFFFFFFFC0 :1006D00000000028545454440000FFFFFFFFFFFFB8 :1006E00000000058644444440000FFFFFFFFFFFF88 :1006F00000000038444444380000FFFFFFFFFFFFC4 :1007000000000058644464584040FFFFFFFFFFFFB3 :10071000000000344C444C340404FFFFFF<<<<<<<<<<<<<<<<<<<<<<<<<<