IMD 1.17: 3/11/2014 10:51:05 CP/M-68k for VME10 Version 1.2 DISK 3 Serial number 1041-0000-000095 1984  CP/M 9/30CP/M-68K of 9/30/82 0020¤„-€?<N¹DTJfêJŸLß N^NuNVHç>.0`".¼%ðaºN¹0.¼%þa¬`.¼&a¢`J@gÚ°|gâ°|gæ.¼&-aˆN¹0JŸLßÀN^NuNVHç*n.¼,¤Bg?<N¹DX.Bg?<N¹DX°|ÿm>¼aÿjB- .Bg?<N¹DXJ@g>¼aÿJ&|,¤ S`fJkf>¼aÿ0(k.+Þ«>¼d/ /<,ÀN¹¬PÙüdž¼d`8.ŒBg?<N¹DX.Bg?<N¹DXJ@g>¼aþÖÙü€ž¼€J‡nÄ +JŸLß8€N^NuNVÿøBW?<N¹DTJ@gBWaþœ.¼%Îaþì-@ÿü.¼&5aþV.¼&\aþL nÿüNN^Nu$/` 4/`"/`2/0/HçN¹–LßxøNu/áH/Nu/ o /€ï 0ÀH@0€ _NuNVÿêpH€@ÿîB@H€@ÿï-nÿò-n ÿø-y,ˆÿü.Ž—ÿÿÿîN¹ÖN^NuNVÿü.¹,Œ0n/a´XN^NuNVHç *n (y,BG`RB@0À|f<äN>†aÀJ@gpÿ`B?B@0À|ëHH@B@H@й,Œ// nNßü J@g B@0À|` RG¾lc¨0<ÿJŸLß0ÀN^NuNVÿîHç. H€À|ÿ°|opÿ`FB.ÿîGÿñB.ÿï.Ž—ÿÿÿîN¹Ö#îÿü,ˆfpÿ` y,ˆ#è ,Œ y,ˆ#è,B@JŸLß ÀN^NuNVHç *n(n >.`Ý0SGJ@föJŸLß0€N^NuNVHç *n(n ~  ?H€H³@À|gJgB@`LSGJGfÜJ.g> ?g H€H³@"y,)HFAÀAgB@`TTŒH€H³@À|?gB@`pJŸLß0ÀN^NuNVHç*n>¼/. / aÿbPg- >¼ / /. aÿ PG H€JŸLß ÀN^NuNVHç *n(y,,H†- H‡,H€Î@pFág0- HÂ|ÿ4äaÐAJŸLß0ÀN^NuNVHç*n>. Jng0GÑÈ>µˆN¹L` ` 5pH€À|ÿJŸLß €N^NuNVÿüHç*y,B€0.-HHÁã -H. H‚ÂBHÁÐ-@ÿü.¹,”/.ÿüN¹pXJŸLß N^NuNVHç*n-Î<?- R¼< mBR¾<@mp``H€-HÂ|?°Af*H€- H³@"y,)HFAÀAÀ|fF B@`$GF ./<\N¹ÂX°|ÿep`B@JŸLß ÀN^NuNVHç *n~Ií J$fSGJGfö y, hÿcâOp"y,)HAàoB@0"y,)HFA- H‚ÂBÂ|€AJŸLß0€N^NuNVHç*n.aˆ>- H€¾@f-H€À|ÿ``- H€¾@c0<€``B@JŸLß €N^NuNVHç*n y,8(È|ÿ -€ f.aþ’J@gp`LB- .a€- HÂ|ÿ°Abp`2.aý–<>„?/ aýÒ\>JGfp`- H€>€?aýôTR- JŸLß ðN^NuNVHç>.<. *n 0`XB@0À|ÿ>€?<N¹4T`V>†N¹>`NBB- B-./<\N¹ÂX`2B.N¹¾`&#Í,”`pÿ``HÀ |&”r°˜WÉÿü hNÐB@JŸLß ÀN^NuNVÿüHç*nH€`–-H€>€-H€??< N¹(X+@`~(m&l.ŽY—?/-N¹X\>®ÿüB@0+ÑW?< N¹4T.”?.ÿþ?<N¹"X>€?< N¹4T.­ ?< N¹.T>¼ N¹8`` J@gÿh°|g„B@JŸLß8N^NuNV//?N¹$fN^Nu@ÀàHÀ¼@ÁàYÂ|ÿøÒoàYFÁNu// Kï MíNO*_,_Nu o0<"|ñÀÙÑQÈÿüNu o0<"|ñÀÙ˜QÈÿüNu o/9#ü(p#ßNupßü:#ßNuNVÿü`þN^NuNVHç?>.&. <.:.8.0`&0GÑÈÑÈÑü,x ƒ`,0GÑÈÑÈÑü,x ¼``S@°| bå@0@Ñü'ê PNо|l¸|g¸| fJƒfz|ÄñÀÑ |'â0pH€ë@HÀ"tä¡€ÀñÀÑ à€ÀñÀÑÃñÀÑÆñÀÑ02GÓÉÓü=¼2€AÀñÀÑJŸLßøN^NuNVÿþHç>.<. :. 8.BnÿþüÀñÀÑ |'â0pH€ë@ÀñÀÑ0ë@2àA€AÀñÀÑÅñÀÑÄñÀÑ0.ÿþÀñÀÑ0GÑÈÑÈÑü,x ¼JŸLßðN^NuNVÿü9ñÀÓH€À|€fòùñÀÑ=®ùñÀÑ=°9=°H€ê@À|HÀм'æ @Ð=¯9ñÀÑH€3À=²09=²á@9ñÀÑHÐA3À=²ùñÀÑ=´9=´H€À|À=µ9=´H€ê@À=´ùñÀÑ=¶ùñÀÑ=·ùñÀÑ=¸ùñÀÑ=¹ùñÀÑ=ºN^NuNVHç>.<. 0Áüм'v @*h¾|m02HÁ4GÕÊÕü'>ƒÒÁÁ`NzP»ü'Ff:< 0HÀü¼@l02HÁ4GÕÊÕü'>ƒÒÁÁã@HÀ`0Fã@S@2HÁ4GÕÊÕü'>ƒÒÁÁJŸLß àN^NuNVÿøHç>.*. <.*n>¼?<4?/?aý,ßü `Ú`9ñÀÓH€À|g.N¹ÜÛü€9ñÀÓH€À|€fÖaþ< 9=®g9=®H€`˜`9=·H€á@9=¸HÐAHÀ-@ÿü мÿÿÿ-@ÿø9=¹H€"nÿøÓîÿü±9=ºH€"nÿøÓîÿüR‰±J9=¶g6>¼?<49=¶H€? 2HÁÐ9=¶HHÁ/?aüVßü `B@``ÿ&JŸLß àN^NuNVÿðHç>.<. *n :.>†?aþ2T-@ÿú0Áü @"|'v p˜=Pÿö0.ÿöHÀ2GÓÉÓü'>Ñ=@ÿø-Mÿò=| ÿþ0`¬.?.ÿø/.ÿú?aþvP=@ÿð`¤>…?<4?.ÿø/.ÿú?aû¬ßü `&9ñÀÓH€À|gJnÿög.N¹òÛü€Snÿö9ñÀÓH€À|€fÌaü¶9=®H€=@ÿð`@>…?<4?.ÿø/.ÿú?aûJßü aüŠ9=®H€=@ÿð``°|gÿP°| gÿb`À*nÿòJnÿðgSnÿþfÿ.JnÿðgB@``pJŸLß àN^NuNVHç. H€3À=ªH€Áü*@Ûü'v. føH€`ÔH€0@ÑÈÑü=¼JPf(H€0@ÑÈÑÈÑü,x 〠€H€0@ÑÈÑü=¼0¼€/<H€0@ÑÈÑÈ"|,x/0˜N¹%0P,J†f|é†>¼ ?<4?</H€?aú>ßü aû~9=®H€`*+|'F`,+|'VH€0@ÑÈÑü=¼BP`›Í`` J@gÒ°|gÖ`î`$`"B€` `J@gÿ*°|gÿ"°|gä°|gÞ`Þ JŸLß ÀN^NuNVÿüBy=Ä>¼?<4BgB§?9=ªaù¢ßü 9ñÀÓH€À|€fòN^NuNVHçJy'Þf‚B9ñÀÓBG`"0GÑÈÑü=¼0¼€0GÑÈÑÈÑü,x ¼RG¾|mØ>¼(?<O?<Bgaú\9ñÀÓH€À|€fò>¼ÿ?<1?<?<aùà\9ñÀÓH€À|€fò3ü'ÞJŸL߀N^NuNVHç J9,˜g09=¬°y=Äg$>¼/<-¨?9=Ä?9=ªaü|PJ@fp`8ü,˜3ù=Ä=¬09=¨ï@HÀ*@Ûü-¨(y-¤><€ÝSGJGføB@JŸLß0€N^NuNVHç>.*n g 5pH€``0R@JŸLß €N^NuNVHç0.å@HÀ*@Ûù(. n/g nNg*® JŸLß €N^NuNVÿüaN^NuNVHçB9,˜aþ`JŸL߀N^NuNVHç>.,. *.0`”a¾`¢ H€>€N¹Æ`’aýê`Š0y'à"|'æ0˜H€HÀ, H€>€ H€?aüŽT`^3Æ=Ä`V S@3À=¨`J#Æ-¤`BaþpHÀ`:.… ?aþæTHÀ`*.… ?aÿT`B€```°|bòå@0@Ñü( PNÐJŸLßàN^NuNVÿþHç?BCB…..,. f#ü€,t <€ü`hlD†RCJ‡lD‡RC¼‡n8fzB‡`0¾¼l ŽÆ:HGHÇ`x¾†eã†ã„`öJ„g¾†eŠ„ž†âŒâŽ`î¶|fD‡#Ç,t D€`#Ç,t JŸLßøN^NuCPM SYS Boot error. Open or Read error on Bad file format on CPM.SYS CP/M-68K(tm) Version 1.2 03/20/84 Copyright (c) 1984 Digital Research, Inc. &Ä'\t~š¦®CP/M-68K(tm), Version 1.1, Copyright (c) 1983, Digital ResearchXXXX-0000-654321Copyright 1984, Motorola Inc.BIOS 2.15 9À  ™À  ¿ÿÿ-$'F-$'F-$'fržžžžbžbbb$€% % % $†% % % $–$ž$È$Ð$Ü$ä% % $ì% % % % % $üééééé* @(#)cbios.s 3.1 * * * Interface between C programs and BIOS * .globl _BIOS _BIOS: move 4(sp),d0 move.l 6(sp),d1 move.l 10(sp),d2 trap #3 rts .end  _BIOS: move 4(sp),d0 moééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé .globl _bdos _bdos: move.w 4(sp),d0 move.l 6(sp),d1 trap #2 rts .end éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééRELOC3 SUBBIOS C € BIOS C € BIOS C €BIOS C € !"BIOS C €#$%&'()*BIOS C  +BIOSA S ,-BIOSTYPSH .VT52 C m/012345BOOTER S 67CPM REL€89:;<=>?CPM REL€@ABCDEFGCPM REL€HIJKLMNOCPM RELXPQRSTUCPMLDR SYS normal bios, 1->loader bios */ /* MEMDSK: 0 -> no memory disk */ /* 4 -> memory disk(sized at boot, drive E:)*/ /* DISKB: 0 -> no disk B: (second floppy) */ /* 1 -> disk B: present */ /* DISKC: 5 -> 5 megabyte hard disk for disk C: */ /* 15 -> 15 megabyte hard disk for disk C: */ /* DISKD: 0 -> no disk D: (second hard disk) */ /* 5 -> 5 megabyte hard disk for disk D: */ /* 15 -> 15 megabyte hard disk for disk D: */ #include "biostyps.h" /* defines portable variable types */ char copyright[] = "Copyright 1984, Motorola Inc."; char biosrev[] = "BIOS 2.15"; #define NULL (0L) /************************************************************************/ /* I/O Device Definitions */ /************************************************************************/ /* for VME-10 defined separately with each module below */ /************************************************************************/ /* Memory Region Table */ /************************************************************************/ struct mrt { WORD count; LONG tpalow; LONG tpalen; } memtab; /* Initialized in BIOSA.S */ #if MEMDSK BYTE *memdsk; /* Initialized in BIOSA.S */ #endif #if ! LOADER /************************************************************************/ /* IOBYTE */ /************************************************************************/ WORD iobyte; /* The I/O Byte is defined, but not used */ /* * used to interface cons_stat() with cons_in(). in_char * is a one character buffer. */ char in_char = '\0'; char char_avail = 0; /************************************************************************/ /* Port initialization */ /************************************************************************/ /* * VME/10 Console interface */ /* defines used for VME/10 Control Register #2 * initial values for CR2: * * bit 0 - enable MMU interface * bit 1 - disable keyboard transmit interrupt * bit 2 - enable BCLR line * bit 3 - ? * bit 4 - disable keyboard RESET * bit 5 - disable RAM writes by other devices * bit 6 - enable SYSFAIL interrupts * bit 7 - enable keyboard recieve interrupt */ #define CR2_INIT 0xdd #define CR2_ADDR 0xf19f09 /* address of control register 2 */ extern VOID keybd_init(); /* vme/10 keyboard initialization */ VOID c_init() /* INITIALIZE THE SYSTEM CONSOLE */ { *((char *)CR2_ADDR) = CR2_INIT; /* initialize Control Register 2; ostensibly to disable transmit interrupts from the keyboard */ keybd_init(); /* initialize the keyboard */ } /************************************************************************/ /* VME-10 keyboard input */ /************************************************************************/ /* * * KEYBOARD -- ROUTINES FOR HANDLING THE VME/10 KEYBOARD.  * * ENVIRONMENT: This is part of the VME/10 keyboard/screen driver, * * FUNCTION: These routines provide initialization and interrupt * service for the VME/10 keyboard, which is connected to the * processor board through a 2661 half-duplex serial port. * * NOTES: This module is very much table-driven, so pains have been * taken to reduce the size of the tables. You will find byte and * word offsets instead of longword addresses, and where feasible * functions are used instead of tables to generate characters. * */ /* DIAGRAM DEPICTING THE ROLES OF THE VARIOUS TABLES * * * routine * offsets * scan --- * code - is routine | | * table index | | * --- ,------------->| |-------------> BSR .... * scan | | / | | TST .... * code | | / --- etc. * ------->| |---------< * | | \ \ --- * --- | \ | | * | `------------->| |--------. * | + is group | | | char * | index | | | table * | --- `-----> --- * | group | | * | parameter offsets | | * | .------>| | * | | | | * `----------------------------------' --- * * * * When a scan code is received, it is used as an index into the SCAN CODE * TABLE to get a group/routine index and a parameter. * * If the group/routine index is positive, then it is a group index. The * corresponding offset is taken from the GROUP TABLE, giving the address * of the character table currently in effect for that group. The parameter * is used as an index into the character table to retrieve the character. * If the entry in the character table is 0, no character is generated. */ VOID mode_chg(); typedef struct /* entry in the scan code table */ { char grp_rout_x; /* group/routine index */ char arg; /* a parameter */ } sc_tbl; /* MODE TYPES */ #define BLANK 0x01 /* blank locking mode key is down */ #define CTRL 0x02 /* CTRL is down. */ #define SHIFT 0x04 /* one or both of shift keys is down */ #define PAD 0x08 /* FUNC/PAD is down (PAD). */ #define ALPHA_LOCK 0x10 /* ALPHA LOCK is down. */ #define ALT 0x20 /* ALT is down. */ #define ALOCK_OR_SHIFT 0x14 /* either lock of shift are down */ /* values generated by function keys. */ #define FNKEY_F1 0xa0 /* Value to generate for func. key 1 */ #define FNKEY_S1 0xb0 /* Value for shifted func. key 1. */ #define STATUS_REG 0xf19f85 /* Address of VMEC1 status register. */ #define KBD_UNLOCK 0x10 /* status of the lock on the front panel, which we interpret as a keyboard lock: 0 if keyboard locked; 1 if unlocked */ #define LEFT 0x01 /* left shift key is down */ #define RIGHT 0x02 /* right shift key is down */ static char modes; /* value of modes reflect the status (up | down) of mode keys on */ static char shift_keys; /* Bits in this byte reflect status (up * or down) of two SHIFT keys. */ /* Declarations for the 2661 (EPCI) connecting us to the keyboard. */ #define EPCI_ADDR 0xf1a031 /* Base address of the 2661. */ typedef struct /* map of the 2661 registers */ { char data; /* data register */ char fill2, status; /* status register */ char fill4, mode; /* mode register */ char fill6, command; /* command register */ } epci_map; /* Bit definitions for the 2661 status register. */ #define CHAR_AVAIL 0x02 /* a received char is in DATA reg. */ #define PARITY 0x08 /* received char had a parity error. */ #define OVERRUN 0x010 /* receive buffer was overrun. */ #define FRAMING 0x020 /* received char had a framing error.*/ #define ANY_ERROR 0x038 /* Mask selecting all 3 errors. */ /* Initialization values for the 2661 control registers. */ #define MODE1_INIT 0x5e /* Initialization for mode reg 1 */ #define MODE2_INIT 0x7b /* Initialization for mode reg 2 */ #define COMM_INIT 0x15 /* Initialization for command reg */ /* Commands for keyboard. In each, bits 0-3 = $0 are keyboard's ID. */ #define SELECT_KB 0x80 /* SELECT command. */ #define READ_KB 0xa0 /* READ command. */ #define AGAIN_KB 0xd0 /* AGAIN command; this causes last scan code sent to be repeated. */ /* Declarations for control register 2 on the VME/10 processor board.*/ typedef struct /* description of control register 2 */ { char cr2; } cr2_map; #define CR2_ADDR 0xf19f09 /* Location of control register 2. */ #define KB_RESET 0x10 /* when low, holds keyboard in reset.*/ #define KB_ENABLE 0x80 /* when high, enables receipt interrupts from the 2661 which connects us to the keyboard. */ /* status values returned by keybd_read */ #define NOCHAR 0 /* no character was returned */ #define BREAK 1 /* break key was struck */ #define KYBD_LOCKED 2 /* key on front panel in lock pos. */ #define IN_CHAR 3 /* a real live character available */ #define WAIT_COUNT 2 /* Initial loop value for timing loop in keyboard reset. */ #define AT_CHAR '@' #define TWO_CHAR '2' /****************************************************************************** ROUTINE AND GROUP OFFSET TABLES FUNCTION: Each entry in the scan code table contains a byte value called the group/routine index. If it is negative it is a routine index and is used as the index in a switch statement. If is is positive, it is a group index and is an offset into GRP_TBL. These tables contain word offsets to routines or tables in this module. The whole purpose for these guys is to allow each scan code table entry to be just 2 bytes long. ******************************************************************************/ /* * If the group/routine index is negative, then it is a routine index. The * index is one of the enumerated types "rtn_index" and is used as the * switch index in a switch statement. The parameter may or may not be * used by the routine. * * Also note that rtn_index starts at 1 so that there is no entry #0 in * the routine table; this is necessary since negative 0 is 0 and that index * would be indistinguishable from the positive 0 index in the group table. * * Note: the NONLOCKABLE enumerated type. Routine indexes which * are above that type will not be executed while the keyboard lock on the front * panel is in the LOCKED position--only when it is UNLOCKED. Routines indexes * below that point are called regardless of the keyboard lock's status. */ #define TWO_AT 1 #define ESC_RESET 2 #define BREAK_CLEAR 3 #define GEN_ALPHA 4 #define FNKEY 5 #define NONLOCKABLE 5 #define SET_SHIFT 6 #define CLR_SHIFT 7 #define SET_MODE 8 #define CLR_MODE 9 #define IGNORE 10 typedef int rtn_index; /****************************************************************************** SCAN CODE TABLE -- CONVERTS A SCAN CODE TO GROUP/ROUTINE INDEX & PARAMETER. FUNCTION: The scan code taken from the 2661, multiplied by 2, is used as an index into this table. This table contains a 2-byte entry for each possible scan code: a 1-byte group/routine index (see the offset table, OFF_TBL) and a parameter. ******************************************************************************/ /* * The rtn macro is used to make entries in the scan code table for those * scan codes which will result in an entry in a switch statement being * invoked. The format is * * RTN (, ) * * The first argument is the name of the routine to go to when this scan * code is received. The second argument, which is optional, is a parameter * to pass to the routine. That is, the same routine may be used with many * different scan codes, each passing a different argument. */ #define RTN(ri, mode) -ri, mode, /* * The ALPHA macro is used to make entries in the scan code table for those * scan codes which will generate alphabetic characters. The format is * * ALPHA */ #define ALPHA(c) -GEN_ALPHA,c, /* * The GROUP macro is used to make entries in the scan code table for those * scan codes which have entries in character tables. The format is * * GROUP , * * Both arguments are required. The first is 0,1,...whatever the highest * group index is. The second argument is the index into the chosen * character table for this scan code. */ #define GROUP(grpnm, index) grpnm, index, static char /* scan code key */ c_scan_code_tbl[] = { /* ---- --------------- */ RTN(IGNORE,0) /* 00 -- Ignore it. */ RTN(IGNORE,0) /* 01 -- Ignore it. */ RTN(IGNORE,0) /* 02 -- Ignore it. */ RTN(IGNORE,0) /* 03 -- Ignore it. */ RTN(IGNORE,0) /* 04 -- Ignore it. */ RTN(IGNORE,0) /* 05 -- Ignore it. */ RTN(IGNORE,0) /* 06 -- Ignore it. */ RTN(SET_MODE,ALPHA_LOCK)/* 07 -- ALPHA LOCK depressed. */ RTN(SET_SHIFT,LEFT) /* 08 -- Left SHIFT depressed. */ RTN(SET_SHIFT,RIGHT) /* 09 -- Right SHIFT depressed. */ RTN(SET_MODE,CTRL) /* 0A -- CTRL depressed. */ RTN(SET_MODE, ALT) /* 0B -- ALT depressed. */ RTN(SET_MODE, BLANK) /* 0C -- Blank locking mode key */ RTN(IGNORE,0) /* 0D -- Clacker mode key */ RTN(SET_MODE, PAD) /* 0E -- FUNC_PAD depressed. */ RTN(CLR_MODE,ALPHA_LOCK)/* 0F -- ALPHA LOCK released. */ RTN(IGNORE,0) /* 10 -- Ignore it. */ GROUP(1,0 ) /* 11 -- ` ~ key. */ GROUP(1,1 ) /* 12 -- 1 ! key. */ RTN(TWO_AT, 0) /* 13 -- 2 @ key. */ GROUP(1,2 ) /* 14 -- 3 # key. */ GROUP(1,13) /* 15 -- TAB key on main keybd. */ ALPHA('Q') /* 16 -- Q key. */ ALPHA(-@ÿl nÿl0(À| =@ÿpBnÿz=nÿþ`ê=|ÿü`¶ n  f.=|ÿÿÿzJnÿrg 0.ÿüR@°|€l¢ N2nÿüÑÉ| ÿ|Rnÿü`\ n  fRJnÿpgLp2.ÿzÂ|A=@ÿx0.ÿüÐnÿx°|€l^0.ÿxÑnÿz` N2nÿüÑÉ| ÿ|Rnÿü0.ÿxSnÿxJ@fâR® ` N2nÿüÑÉ"n Qÿ|R® RnÿüSnÿþRnÿz n€ÿülJnÿþfÿ>0.ÿüS@@ÿ|/—ÿÿÿ| nÿtNXJnÿþfÿB@0.N^NuNVÿþHç*nH‡Î|ÿ=Gÿþ`H€HÀ.€?<N¹¢T0SGJ@nä0.ÿþJŸLß €N^NuNVÿúHç*nH€=@ÿþ M2nÿþÑɼ$BG-Mÿú`H M2GÑÉ $f: nÿú $g.®ÿú?< N¹¢T.¼$?<N¹¢T 2HÁÐR€-@ÿúRG¾nÿþm² 2HÁа®ÿúg.®ÿú?< N¹¢T0.ÿþJŸLß €N^NuNVÿüHç*n 0.Áü´Ð¼>8-@ÿü(nÿüÙüBG.Œ/ N¹3XJ€g3ü=$3ù>=&pÿ`ÐJ,g nÿül nf,>¼?/ R—N¹ìXJ@g3ü=$3ù>=&pÿ`Œ nÿü(H€>€N¹3< nf.Œ?<N¹¢T nf nÿü(g,€.Œ?.N¹¢T>>† nÿü(H€?N¹3bT ng nf0` ¾|nB@`pÿJŸLß8ÀN^NuNVHçJnfB@`4.¼ÿ?< N¹¢T>RG¾ng0.S@HÀ.€?< N¹¢T0JŸL߀N^NuNVÿüJng 0.°n g0. S@HÀ.€?< N¹¢TN^NuNVÿàHç*n>¼ Bg/. N¹Ð\>¼ ?< /. R—N¹Ð\>¼ /—ÿÿÿà/ a‚P*@ :f6.Ž—ÿÿÿà/. a°X°|ÿÿfpÿ`>¼ /—ÿÿÿàR/ aFP*@ *f>¼?<?/. R—N¹Ð\R>¼/. R—/—ÿÿÿàa¾P .fT>¼ /—ÿÿÿàR/ aòP*@ *f>¼?<?/. — N¹Ð\R>¼/. — /—ÿÿÿàabP ;f2>¼ /—ÿÿÿàR/ a˜P*@>¼/. —/—ÿÿÿàa*PH€`B€``J@gö°| gð°| gêpÿJŸLß N^NuNVHç *n(n >.`(H€HÀм=: @g H€Ð|ÿà`H€ÀRSGJgJGfÐJŸLß0€N^NuNVHç *n(n >.`ÝSGJgH€>€/9=(N¹ìXJ@fJGfÜB JŸLß0€N^NuNVHç*n BG`Ïü H€Þ@Þ|ÿÐ0R@"n@H€HÀм=: @fÒJg.H€HÀм=: @g H€Ð|ÿà`H€Ð|ÿÀ"n€RJf n (n n opÿ`B@JŸLß €N^NuNVÿü .°® d"` n"n ‘R® R®0.SnJ@fâ`40.HÀÑ®0.HÀÑ® `S®S® n"n ‘0.SnJ@fâN^NuNVHç *n (n`RŒJfúÝfü .JŸLß0N^NuNVHç *n (nÝfü .JŸLß0N^NuNVHç *n(M`RŒJfú HÀJŸLß0N^NuNVÿüN^NuNVHç *n(n `$H€>€a0H€>€a&¾op`¾lpÿ` JfØJfÔB@JŸLß0ÀN^NuNVHç>.¾|am ¾|znÞ|ÿà0JŸL߀N^NuNVÿüBBJ®lD®RBJ® lD® RB0. Àî-@ÿü0.Àî2. Âî ÐAÐnÿü=@ÿü .ÿügD€N^NuNVHç..,. J†f#ü€=º <€€ü`H¼‡c #Ç=ºB€`:¾†fzB‡`(x¾†e 〼€bã†ã„`îB…J„g¾†eŠ„ž†âŒâŽ`î#Ç=º JŸLßðN^NuJ…g .¼ÿÿÿÿ‹üNuStack Overflow$C runtimeCON:LST: Baud rate selection options: 0 = 50, 1 = 75, 2 = 110, 3 = 134, 4 = 150, 5 = 300, 6 = 600, 7 = 1200, 8 = 1800, 9 = 2000, 10 = 2400, 11 = 3600, 12 = 4800, 13 = 7200, 14 = 9600, 15 = 19200 Enter number of desired baud rate: %d Error: %d is not a valid baud selection. Baud rate reconfigured. : unmatched quoteCannot open Cannot append Cannot create Stack Overflow $:Hfloating pointC RTL - program not linked for Program terminating $%DEFOX[cdefosx Œl | |t| " "l | |t "| Œ Raw I/O   þš@dˆˆˆˆˆˆˆDˆˆˆìˆðˆˆ˜ˆˆˆˆˆˆˆˆˆˆþž@dˆˆˆˆˆˆˆHˆˆˆìˆôˆˆœ<Ðÿÿ<Ð"1001 "0"/B/8.Ô.Ô.à/B/B/B=,<>.,=:|[]* !!!!"CP/M-68K(tm), Version 1.2, Copyright (c) 1983, Digital Research XXXX-0000-654321'W') /* 17 -- W key. */ ALPHA('E') /* 18 -- E key. */ ALPHA('A') /* 19 -- A key. */ ALPHA('S') /* 1A -- S key. */ ALPHA('D') /* 1B -- D key. */ ALPHA('Z') /* 1C -- Z key. */ ALPHA('X') /* 1D -- X key. */ GROUP(1,23) /* 1E -- Space bar. */ RTN(CLR_SHIFT, LEFT) /* 1F -- Left SHIFT key released.*/ RTN(IGNORE,0) /* 20 -- Ignore it. */ RTN(FNKEY, 1) /* 21 -- Function key 1. */ RTN(FNKEY, 2) /* 22 -- Function key 2. */ RTN(FNKEY, 3) /* 23 -- Function key 3. */  GROUP(1,3 ) /* 24 -- 4 $ key. */ GROUP(1,4 ) /* 25 -- 5 % key. */ GROUP(1,5 ) /* 26 -- 6 ^ key. */ ALPHA('R') /* 27 -- R key. */ ALPHA('T') /* 28 -- T key. */ ALPHA('Y') /* 29 -- Y key. */ ALPHA('F') /* 2A -- F key. */ ALPHA('G') /* 2B -- G key. */ ALPHA('C') /* 2C -- C key. */ ALPHA('V') /* 2D -- V key. */ ALPHA('B') /* 2E -- B key. */ RTN(CLR_SHIFT, RIGHT) /* 2F -- Right SHIFT key released*/ RTN(IGNORE,0) /* 30 -- Ignore it. */ RTN(FNKEY,4) /* 31 -- Function key 4. */ RTN(FNKEY,5) /* 32 -- Function key 5. */ RTN(FNKEY,6) /* 33 -- Function key 6. */ GROUP(1,6 ) /* 34 -- 7 & key. */ GROUP(1,7 ) /* 35 -- 8 * key. */ GROUP(1,8 ) /* 36 -- 9 ( key. */ ALPHA('U') /* 37 -- U key. */ ALPHA('I') /* 38 -- I key. */ ALPHA('H') /* 39 -- H key. */ ALPHA('J') /* 3A -- J key. */ ALPHA('K') /* 3B -- K key. */ ALPHA('N') /* 3C -- N key. */ ALPHA('M') /* 3D -- M key. */ GROUP(1,20) /* 3E -- , < key. */ RTN(CLR_MODE,CTRL) /* 3F -- CTRL key released. */ RTN(IGNORE,0) /* 40 -- Ignore it. */ RTN(FNKEY,7) /* 41 -- Function key 7. */ RTN(FNKEY,8) /* 42 -- Function key 8. */ GROUP(1,9 ) /* 43 -- 0 ) key. */ GROUP(1,10) /* 44 -- - _ key. */ GROUP(1,11) /* 45 -- = + key. */ ALPHA('O') /* 46 -- O key. */ ALPHA('P') /* 47 -- P key. */ GROUP(1,14) /* 48 -- [ { key. */ ALPHA('L') /* 49 -- L key. */ GROUP(1,17) /* 4A -- : ; key. */ GROUP(1,18) /* 4B -- ' " key. */ GROUP(1,21) /* 4C -- . */ GROUP(1,22) /* 4D -- / ? key. */ RTN(IGNORE,0) /* 4E -- Ignore it. */ RTN(CLR_MODE,ALT) /* 4F -- ALT key released. */ RTN(IGNORE,0) /* 50 -- Ignore it. */ RTN(FNKEY,9) /* 51 -- Function key 9. */ RTN(FNKEY,10) /* 52 -- Function key 10. */ RTN(FNKEY,11) /* 53 -- Function key 11. */ RTN(FNKEY,12) /* 54 -- Function key 12. */ GROUP(1,12) /* 55 -- DEL key. */ RTN(BREAK_CLEAR, 0) /* 56 -- BREAK CLEAR key. */ GROUP(1,15) /* 57 -- ] } key. */ GROUP(1,16) /* 58 -- \ | key. */ GROUP(0,1 ) /* 59 -- Home key. */ GROUP(1,19) /* 5A -- Return key. */ GROUP(0,3 ) /* 5B -- Backarrow key. */ RTN(IGNORE,0) /* 5C -- SEL key. */ GROUP(0,5 ) /* 5D -- Backtab key. */ GROUP(0,6 ) /* 5E -- Downarrow key. */ RTN(CLR_MODE,BLANK) /* 5F -- lock mode key released.*/ RTN(CLR_MODE,PAD) /* 60 -- PAD key released. */ RTN(FNKEY,13) /* 61 -- Function key 13. */ RTN(FNKEY,14) /* 62 -- Function key 14. */ RTN(FNKEY,15) /* 63 -- Function key 15. */ RTN(FNKEY,16) /* 64 -- Function key 16. */ RTN(ESC_RESET, 0) /* 65 -- ESC RESET key. */ GROUP(2,10) /* 66 -- A DCHR key. */ GROUP(0,2 ) /* 67 -- Uparrow key. */ RTN(IGNORE,0) /* 68 -- CLR TAB SET key. */ GROUP(2,7 ) /* 69 -- 7 EOF key. */ GROUP(0,4 ) /* 6A -- Rightarrow key. */ GROUP(2,4 ) /* 6B -- 4 key on hexpad. */ GROUP(0,7 ) /* 6C -- Tab key on cursor pad. */ GROUP(2,1 ) /* 6D -- 1 ICHR key. */ GROUP(2,0 ) /* 6E -- 0 on hexpad. */ RTN(IGNORE,0) /* 6F -- Clacker mode key release*/ RTN(IGNORE,0) /* 70 -- Ignore it. */ GROUP(2,11) /* 71 -- B DLINE key. */ GROUP(2,12) /* 72 -- C on hexpad. */ GROUP(2,13) /* 73 -- D on hexpad. */ GROUP(2,8 ) /* 74 -- 8 EOL key. */ GROUP(2,9 ) /* 75 -- 9 EOP key. */ GROUP(2,14) /* 76 -- E EAU key. */ GROUP(2,5 ) /* 77 -- 5 on hexpad. */ GROUP(2,6 ) /* 78 -- 6 on hexpad. */ GROUP(2,15) /* 79 -- F on hexpad. */ GROUP(2,2 ) /* 7A -- 2 ILINE key. */ GROUP(2,3 ) /* 7B -- 3 on hexpad. */ GROUP(2,z>…/-?N¹&$\<Bm `n-g>¾< g -м°­b" -­:>…/-?N¹&$\<+mBm `( -­:>…/-?N¹&$\<;|ÿ +mºFg mpÿ`H€À|ÿJŸLß àN^NuNVHç>®N¹'¶*@ fB@`-fB@`pJŸLß N^NuNVHç>®N¹'¶*@ fB@`0À|JŸLß N^NuNVÿü>®a–J@g <8…`B€N^NuNVHç>.^GæORG>‡a*@ fB€` >‡/ a†XJŸLß €N^NuNVHç (y<Ø*T`ZB@0-BA2-³@F@J@g>¼N¹$B€`:B@0-°ne `*»ù<Øf>®a¦*@ f>¼N¹$B€`(M*U`¤JŸLß0N^NuNVHç n*PB@0. X@°me n •`F(MB@0. çHH@B@H@ÙÀB@0-n 9@B@0,F@9@(• n Œ;n B@0-F@;@#î<Ø P€JŸLß0N^NuNVHç >.Þ|?ìGíG0ç@>€N¹%º*@»üÿÿÿÿfB€`* R€À¼ÿÿÿþ*@(M9GB@0,F@9@.ŒP—a 9<ØJŸLß0€N^NuNVHç *nQB@0-BA2-³@F@J@g>¼N¹$pÿ`Ä(y<Ø»Ìe»Ôe¹Ôe»Ôc»Ìd(T`è»Ìe2 BA2-çIHABAHAÐ" BB4,çJHBBBHBÒ‚°b #Ì<ØB@`n BA2-çIHABAHAа”f T0(ÑmB@0-F@;@ T*`*” BA2,çIHABAHAлÀfB@0-ÑlB@0,F@9@(•`(#Ì<ØB@JŸLß0N^NuNVÿüHç *n.aþò>. ^GæORG>‡aýˆ-@ÿüfB€`J nÿü(PPŒ»Ìg2¹Íd`ÝSn Jn fô`B€0. ÙÀB€0. ÛÀ`%Sn Jn fô>‡/.ÿüaý®XJŸLß0€N^NuNVÿüN^NuNVÿüN^NuNVÿðHç /—ÿÿÿð?.?./— /. nNßü*@ мÿÿÿð»ÀfB(n `%H‡Þ|0¾|9o^GÇ мÿÿÿð»ÀfâB JŸLß0€N^NuNVÿüHç-|=ºÿü*n<.HÆ n. nfz` À|Àè‡SEJ‡gJEfì`h nf$z ` À|Àæ‡SEJ‡gJEfìJEf-ÿÿ`*n<.JngJGlB@0D@> n P¼-"n R‘`B€0€ÆH@ÀB€0€Æ>JGfê JŸLß ÀN^NuNVHç >.HÇμÿÿgR‡*y>(GÙù>.ŒN¹†°|ÿÿf3ü =$3ù>=&pÿ`>®Bg/ N¹Ð\ JŸLß0€N^NuNVHç>®N¹'¶*@ fpÿ`vJnfB@`j-g3ü =$3ù>=&pÿ`L0À|g>®/. / N¹/˜P`0-g>®/. / N¹(P``>®/. / N¹)àPJŸLß N^NuNVHç|BG` À¹<Üf ¹<Ü0`ã†RG¾|mâ3ü=$3ù>=&pÿJŸLßÀN^NuNVÿüp2.ã`F@HÀÁ¹<ÜB@N^NuNVHçBG`>‡aRG¾|môJŸL߀N^NuNVHç 0.Áü´*@Ûü>80.@BUB-+|ÿÿÿÿB­B­ >¼ Bg/ —N¹Ð\>¼ ?< / —N¹Ð\JŸLß0N^NuNVHç>.¾|e3ü =$3ù>=&B€`0B@0Àü´*@Ûü>8-f3ü =$3ù>=&B€` JŸLß €N^NuNVÿðHç*n(n >.B€0-@ÿôB`r -î€-@ÿü -°®ÿüg²-gF>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`Uÿ¿ -À¼ÿÿÿ€"- S¼ÿÿÿ€°nB>¼!/</ —4/.ÿü/ N¹-*ßü°|g3ü=$3ù>=&pÿ`¸+nÿü&M -À|HÀ×À×ü4B€0-@ÿð`  f ¼< g< `SGÆR­ м´·ÀdJGbÔ Ð¼´·Àe6>¼"/</ —4/.ÿü/ N¹-*ßü°|g .ÿô®ÿð`&`U@JGf -°­ o+m .ÿô`JGbþŒJŸLß8ÀN^NuNVHç*n>. `B0SGJ@nöJŸLß €N^NuNVÿøHç*nBnÿú -î€=@ÿþB€0.ÿþ°­gÒ-gB>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`Ð -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`F>¼!/</ —4B€0.ÿþ// N¹-*ßü°|g3ü=$3ù>=&pÿ`XUÿ¿B€0.ÿþ+@ -À¼=@ÿø><€žnÿø¾nc>.`¾|€fBGJGc´>‡/. B2.ÿøÐ/—4N¹68PßnÿúB€0Ñ­B@0H@B@H@Ñ® ŸnB@0Ðnÿø°|€gU@B€0.ÿþ+@`V>¼"/</ —4B€0.ÿþ// N¹-*ßü°|g3ü=$3ù>=&pÿ`xUÿ¿+|ÿÿÿÿRnÿþ n€e€B@0.îH=@ÿü>¼"B€0.ÿü//. B€0.ÿþ// N¹-*ßü°nÿüg3ü=$3ù>=&pÿ`B@0.ÿüÑnÿþ>.ÿüïOßnÿúB€0Ñ­B@0H@B@H@Ñ® ŸnJnc -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`D>¼!/</ —4B€0.ÿþ// N¹-*ßü°|g3ü=$3ù>=&pÿ``>®/. / —4N¹68PU@B€0.ÿþ+@B@0.ÑnÿúB€0.Ñ­B@0.H@B@H@Ñ® -°­ o+m B@0.ÿúJŸLß €N^NuNVÿðB®ÿúBnÿô n(H€>€N¹3=@ÿø=|ÿþ`.®?<N¹¢T n!n 0 ®oB@09<àÀ|`f nÿþoR9<ág ®op` .=@ÿþ` ®€o <€` .=@ÿþRnÿô0nÿþ.ˆ?<,N¹¢T.®—?.N¹¢T=@ÿöJnÿög@ nÿþo(9<ág09>r â`=@ÿþ` 09>à@=@ÿþ`Bnÿþ0.ÿþHÀÑ®ÿú`20.ÿþHÀÑ® 0.ÿþHÀ‘®0.ÿþHÀÑ®ÿú0.ÿþï@HÀÑ®J®nþä>®ÿø n(H€?N¹3bTJnÿôg.¼?<,N¹¢T .ÿúN^NuNVÿüB—?< N¹¢T3ù><âB@09<â`tyd<à`~B—?<£N¹¢T09>`$y<ày@<à`,y<àyä<à`°|"gÞ°|1gа| gä°|1gÖ`Üa*`$yä<à```HÀ |<är°˜WÉÿü hNÐN^NuNVÿüB—?<DN¹¢T yÿÿ>gJy>gy<àB@``pÿN^NuNVÿh=|ÿrBnÿp n(g -|1Fÿt` n(g-|1ÿt n(g .м16) /* 7C -- TEST , key. */ GROUP(2,17) /* 7D -- HELP . */ GROUP(0,0 ) /* 7E -- ENTER key. */ RTN(IGNORE,0) /* 7F -- Ignore it. */ }; /* * NOTE: DUE TO A COMPILER BUG WE ARE UNABLE TO INITIALIZE * CHAR VARIABLES AS MEMBERS OF A STRUCTURE, SO WE HAVE DECLARED * THE TABLES AS CONTIGUOUS CHAR ARRAYS AND ASSIGN THE ORIGINAL * STRUCTURE ARRAY AS A PTR TO THE CHAR ARRAY OF INITIALIZED * DATA. THIS WAS FELT TO BE THE MOST DIRECT SOLUTION. */ static sc_tbl *scan_code_tbl = (sc_tbl *)c_scan_code_tbl; /****************************************************************************** GROUP 0 CHARACTER TABLE -- KEYS UNAFFECTED BY MODE KEYS FUNCTION: This table contains the characters to return for scan codes which fall into group 0. Use the parameter obtained from the scan code table as an index into this table. A value of 0 will cause no character to result. Table TBL.___ is used regardless of any mode keys. ******************************************************************************/ /* element # */ static char tbl___[] = { /* --------- */ 0x0d, /* 0 -- CR (from the ENTER key). */ 0xc0, /* 1 -- Home. */ 0x0b, /* 2 -- VT (from the uparrow key). */ 0x08, /* 3 -- BS (from the leftarrow key). */ 0x0c, /* 4 -- FF (from the rightarrow key).*/ 0xdb, /* 5 -- Backtab. */ 0x0a, /* 6 -- LF (from the downarrow key). */ 0x09, /* 7 -- HT (from the tab key on the */ }; /****************************************************************************** GROUP 1 CHARACTER TABLES -- KEYS AFFECTED BY SHIFT AND CTRL KEYS. FUNCTION: These tables contain the characters to return for scan codes which fall into group 1. Use the parameter obtained from the scan code table as an index into these tables. A value of 0 will cause no character to result. Table TBL.NN_ is used when we're in neither SHIFT nor CTRL . Table TBL.XY_ is used when we're in CTRL mode (SHIFTed or ). Table TBL.YN_ is used when we're in SHIFT but not CTRL mode. ******************************************************************************/ /* element # */ static char tblnn_[] = { /* --------- */ '`' , /* 0. */ '1' , /* 1. */ '3' , /* 2. */ '4' , /* 3. */ '5' , /* 4. */ '6' , /* 5. */ '7' , /* 6. */ '8' , /* 7. */ '9' , /* 8. */ '0' , /* 9. */ '-' , /* 10. */ '=' , /* 11. */ 0x7F , /* 12 -- DEL. */ 0x09 , /* 13 -- HT (tab key on keyboard). */ '[' , /* 14. */ ']' , /* 15. */ '\\' , /* 16. */ ';' , /* 17. */ 0x27 , /* 18 -- Apostrophe. */ 0x0D , /* 19 -- CR (from return key). */ ',' , /* 20. */ '.' , /* 21. */ '/' , /* 22. */ ' ' , /* 23. */ }; /* element # */ static char tblxy_[] = { /* --------- */ 0 , /* 0. */ 0 , /* . */ 0 , /* 2. */ 0 , /* 3. */ 0 , /* 4. */ 0x1e , /* 5 -- CTRL ^. */ 0 , /* 6. */ 0 , /* 7. */ 0 , /* 8. */ 0 , /* 9. */ 0x1f , /* 10 -- CTRL _. */ 0 , /* 11. */ 0 , /* 12. */ 0 , /* 13. */ 0x1b , /* 14 -- CTRL [. */ 0x1d , /* 15 -- CTRL ]. */ 0x1c , /* 16 -- CTRL \. */ 0 , /* 17. */ 0 , /* 18. */ 0 , /* 19. */ 0 , /* 20. */ 0 , /* 21. */ 0 , /* 22. */ 0 , /* 23.  */ }; static char tblyn_[] = { /* element # */ /* --------- */ '~' , /* 0. */ '!' , /* 1. */ '#' , /* 2. */ '$' , /* 3. */ '%' , /* 4. */ '^' , /* 5. */ '&' , /* 6. */ '*' , /* 7. */ '(' , /* 8. */ ')' , /* 9. */ '_' , /* 10. */ '+' , /* 11. */ 0x7f , /* 12 -- DEL. */ 0x09 , /* 13 -- HT (tab key on main keyboard)*/ '{' , /* 14./</ —4/.ÿü/ N¹-*ßü°|g3ü=$3ù>=&pÿ`|+nÿü&M -À|HÀ×À×ü4`ÛS‡R­ м´·ÀdJ‡nèJ‡f -°­ o+m .ÿô`,R®ÿüB† î€-@ÿøJ®ÿøo >¼!/.ÿø/ /.ÿü/ N¹-*ßüHÀ,Ý®ÿü ï€Ñ­ € ï€ÙÀ -°­ o+m ¼®ÿøgU .ÿô‡`¼J‡f .ÿô`°-gD>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`fUÿ¿>¼!/</ —4/.ÿü/ N¹-*ßü°|g U .ÿô‡`,+nÿüß­Gí4`ÛS‡J‡nø -°­ o+m .ÿôJŸLß8ÀN^NuNVþöHç *n n(g .¼;N¹6 nÿdB@0.`0<ÿ=@þúB@0.þú@þþ nþúf&B—?<N¹¢T@ÿ|þÿ . ÿfB.þÿ`.Ž—ÿÿþþ?< N¹¢T.þÿH€À|ÿ=@þüB@0.þü°nþúd.¼ ?<N¹¢TIîÿ`& f nP "Ò¼ÿÿÿ`.ÜSnSnþüJncJnþübÎJncü RŒ "Ò¼ÿÿÿJŸLß0N^NuNVHç>.*n ¾|ÿÿfpÿ`.-g$J­g -°­cS­0"m€Rm 0`pÿJŸLß €N^NuNVHçN¹&À>¾|ÿÿfpÿ`’>‡N¹'H0Áü´*@Ûü>8JnfU.¼8…/.N¹7XJ@f U0`R`.¼8Š/.N¹7XJ@fU0`2>¼/.?N¹1è\J@g3ü#=$3ù>=&pÿ`U0JŸLß €N^NuNVÿüBW?. /.aÿ:\N^NuNVÿüBW?. /.aÿ"\N^NuNVÿü>¼?. /.aÿ\N^NuNVÿüN¹>®N¹ÆN^NuNVHçBG`0Áüм;.€N¹PRG¾|mäJŸL߀N^NuNVHç*n0-À|g*.N¹Ú-g .­N¹"–B@HÀ+@+@Bm mÿ€>•N¹¨JŸLß N^NuNVHç>.>‡N¹'¶*@ f3ü =$3ù>=&pÿ`ðBF0À|f¶-g6-f. -°­ l>¼B§?N¹²\>¼/<8?N¹&$\-g,>¼"/</ —4/-/ N¹-*ßü°|g|ÿ-H€>€N¹3:.—?<N¹¢TÀ|ÿ°|ÿf|ÿ>…-H€?N¹3bT>‡N¹'H>‡N¹' JFf0``3ü=$3ù>=&pÿJŸLß àN^NuNVÿüN^NuNVHç*n0-À| °|f, -­<o >†/-?N¹&$\>¼Gg mpÿ`J-gJ­g-g;| `;|ÿ `>¼0- D@HÀ/?N¹²\Bm +mB@JŸLß ÀN^NuNVHçN¹&À>¾|ÿÿfpÿ`Ð>‡N¹'H0Áü´*@Ûü>8Jn fUJnfU.¼8…/.N¹7XJ@f U0`†`.¼8Š/.N¹7XJ@fU0`d>¼/.?N¹1è\J@g>‡N¹' 3ü=$3ù>=&pÿ`0U>¼B§-H€?N¹²\BWB§-H€?N¹²\0JŸLß €N^NuNVÿüBW?. /.aþü\N^NuNVÿüBW?. /.aþä\N^NuNVÿü>¼?. /.aþÊ\N^NuNVHç>®N¹'¶*@ f3ü =$3ù>=&pÿ`v0.`F+n `P . Ñ­`F>®N¹x+@ - Ю +@`*3ü=$3ù>=&pÿ`*`J@g¶°|g¸°|g¼`ÖUÿßJ­l+|ÿÿÿÿ -JŸLß N^NuNVÿü>¼B§?.aÿB\N^NuNVHç>®N¹'¶*@ fpÿ`^0À|gB€`P-g +m `0-H€>€N¹3<.—?<#N¹¢T>†-H€?N¹3bT <ÿÿÿÁ­0.-0S‡-gÖJ‡mʾ­gŽ-gF>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`–Uÿ¿>¼!/</ —4// N¹-*ßü°|g3ü=$3ù>=&pÿ`R+G ï€+@Ií4Gí´`RŒ¹Ëd fô " Ò¼4Ñ­`B­` R€ï€+@+m U -JŸLß8ÀN^NuNVýäHç*nBnýìJ® gh``BE-n ÿò`R®ÿòRE nÿòJg nÿò %fèJEo.®?/. N¹ˆ\-nÿò Ûnýì n %@ÀR® DÀfBnýê n H€°|-@ÀR® DÀf n R® Rnýê| ÿö¾<0fGÿö n R® =|ÿÿýð¾<*f-Mÿø nÿø=PýðT n R® `8`*JnýðlBnýðH€2.ýðÃü ÐAÐ|ÿÐ=@ýð n R® ¾<0m¾<9oÊ|ÿ¾<.f BF n R® ¾<*f-Mÿø nÿø<T n R® `*`H€2Ãü ÐA<Ü|ÿÐ n R® ¾<0m¾<9oØBnýè¾<lg¾<LfRnýè n R® Aîýò-HÿòH€` RnýèJnýèg <$–` <%L#À>4.¹>4?<?< /—ÿÿýò/ N¹$$ßü Jnýègp`pHÀÛÀ`ÎRnýèJnýèg <$–` <%L#À>4.¹>4Bg?< /—ÿÿýò/ N¹$$ßü Jnýègp`pHÀÛÀ`zRnýèJnýèg <$–` <%L#À>4.¹>4Bg?</—ÿÿýò/ N¹$$ßü Jnýègp`pHÀÛÀ`&RnýèJnýèg <$–` <%L#À>4.¹>4Bg?</—ÿÿýò/ N¹$$ßü Jnýègp`pHÀÛÀ`Ò-Mÿü nÿü-PÿòX`À-Mÿø nÿø0À|ÿ@ýòB.ýóT`¤H€>€?/—ÿÿýò/ N¹Nßü X|ÿ`~H€>€?/—ÿÿýò/ N¹bßü X|ÿ`XH€>€?/—ÿÿýò/ N¹vßü X|ÿ`4.®H€?N¹øTRnýì`Ö`|C°|5bÚå@0@Ñü;ø PNÐ.®ÿòN¹6ì:¼ElJFm:0.ýðE=@ýîJnýêfX .0ÿöf* nÿò -f SE.® nÿòH€?N¹øTR®ÿòRnýì`.®.ÿöH€?N¹øTRnýì0.ýîSnýîJ@nÜ.®?/.ÿòN¹ˆ\Ûnýì`.®.ÿöH€?N¹øTRnýì0.ýîSnýîJ@nÜ`û 0.ýìJŸLß àN^NuNVHç *n>. (n,g$Bl >‡/ ?N¹&$\°Gg lpÿ`*B@`&`.ŒH€?N¹øT°|ÿÿfpÿ` 0SGJ@fÞB@JŸLß0€N^NuNVHç. *n Sm mH€"m€À|ÿR­``.H€?N¹>TJŸLß €N^NuNVÿþHç. *n BF:-fpÿ`$J­fV-fN>¼N¹!+@+@fm`2m>•N¹ ŒJ@gm@`;|þ H€"m€R­`È-gAîÿþ+H +@ m‡R­-g  */ '}' , /* 15. */ '|' , /* 16. */ ':' , /* 17. */ '"' , /* 18. */ 0x0d , /* 19 -- CR (from return key). */ '<' , /* 20. */ '>' , /* 21. */ '?' , /* 22. */ ' ' , /* 23. */ }; /****************************************************************************** GROUP 2 CHARACTER TABLES -- KEYS AFFECTED ONLY BY FUNC/PAD KEY. FUNCTION: These tables contain the characters to return for scan codes which fall into group 2. Use the parameter obtained from the scan code table as an index into these tables. A value of 0 will cause no character to result. Table TBL.__N is used when we're not in PAD mode. Table TBL.__Y is used when we are in PAD mode. These tables contain characters associated with the hexpad. Note, however, that the ENTER key is not in these tables. ******************************************************************************/ static char tbl__n[] = { /* element # */ /* --------- */ 0 , /* 0. */ 0xD0 , /* 1 -- ICHR. */ 0xD6 , /* 2 -- ILINE. */ 0 , /* 3. */ 0 , /* 4. */ 0 , /* 5. */ 0 , /* 6. */ 0 , /* 7. */ 0xD5 , /* 8 -- EOL. */ 0xD4 , /* 9 -- EOP. */ 0xD1 , /* 10 -- DCHR. */ 0xD7 , /* 11 -- DLINE. */ 0 , /* 12 -- PMODE. */ 0 , /* 13. */ 0 , /* 14. */ 0 , /* 15. */ 0  , /* 16. */ 0 , /* 17. */ }; /* element # */ static char tbl__y[] = { /* --------- */ '0' , /* 0. */ '1' , /* 1. */ '2' , /* 2. */ '3' , /* 3. */ '4' , /* 4. */ '5' , /* 5. */ '6' , /* 6. */ '7' , /* 7. */ '8' , /* 8. */ '9' , /* 9. */ 'A' , /* 10. */ 'B' , /* 11. */ 'C' , /* 12. */ 'D' , /* 13. */ 'E' , /* 14. */ 'F' , /* 15. */ ',' , /* 16. */ '.' , /* 17. */ }; /* * grp_tbl_ptr is used when the group/routine index for a scan code is * positive ( >=0 ). As mode keys are pressed, the address in the table * may get replaced. */ static char *grp_tbl_ptr[3] = { tbl___, /* Group 0: no mode keys affect these.*/ tblnn_, /* Group 1: SHIFT and CTRL affect */ tbl__n /* Group 2: PAD affects these. */ }; /* table of offsets for group 1. One is selected based on CTRL and SHIFT keys*/ static char *grp1_off[] = { tblnn_, /* no SHIFT, no CTRL */ tblxy_, /* no SHIFT, CTRL */ tblyn_, /* SHIFT, no CTRL */ tblxy_, /* SHIFT, CTRL */ }; /* delay for a multiple of 4 usecs; which is the time it takes to * traverse the loop once on MC68010 * * since the CP/M compiler doesn't support blocked variables * we need to declare a register int in the function * itself */ #define DELAY(n) delayvar=n; do; while(--delayvar); /****************************************************************************** keybd_init -- INITIALIZE THE VME/10 KEYBOARD FUNCTION: This routine, which is XDEFed, resets the keyboard, configures the 2661 so we can communicate with the keyboard, selects the keyboard, and disables keyboard interrupts. Currently, however, we are not checking the self-test status, and therefore there is no possibility of an error return. The hooks are left in to facilitate later enhancements. ******************************************************************************/ keybd_init() { register LONG delayvar; /* req'd for DELAY macro!!! */ register epci_map *epci_base; register cr2_map *cr2_base; register char cr2_state; register char cr; /* to hold contents of control reg. */ int reg; /* dummy to hold data register value */ epci_base = (epci_map *)EPCI_ADDR; cr2_base = (cr2_map *)CR `8l¤ hB…N¹8\`FCLEAR68K V02.00, Copyright(c) 1984, Digital Research XXXX-0000-654321 o#È>"hÓè#É>E耀ÿ?/ ÎN¹žNùÆ o Aè¿ÈdpÿNu#À>B€NuNV0/"/ NB¿ù>d0< Aù8l"NB0<NBN^Nu o2/0/ HÀS€oÁQÈÿüB€Nu o0/JfB€Nu°fô S€NuNVÿú.¼8N¹œ.¼8±N¹œ.¼8åN¹œ.¼9N¹œ.¼9MN¹œ.¼9€N¹œ.ŽU—/<9¦N¹ÞXJnÿþm nÿþo>®ÿþ/<9©N¹œX`"9ñÁÅH€À|ð€nÿþÀñÁÅ.¼9ÖN¹œN^NuNVÿÞHç BWN¹%º#À>#À> By>.¼8{a>*n`v`RJgH€HÀм=: @fæJgZ "g 'fFH€>€/ R—N¹ìX(@ f.¼9ò/ a~X HÀ> M2GÑÉBRG.R—aÆ`BG`RG M2GÑÉJg5pH€HÀм=: @gÞJ5pg M2GÑÉBRGH€`°BWN¹¨BW/ R—N¹€XJ@g.R—/<:aøX`”>¼N¹¨ ->f@>¼/ T—N¹€X°|f>¼B§?<N¹²\°|ÿÿf.R—/<:a¤X`$BW/ R—N¹ÔX°|g.R—/<: a~X`.aØ`°|gÿr`æÚÇJfþˆB—a¶Sy>.¹> N¹†°|ÿÿf.¼:>/<:/a*XB—/9>?9>N¹\>€N¹JŸLß0ÀN^NuNVÿ|.®/—ÿÿÿ€N¹6ÊX.® /—ÿÿÿ€N¹6 X.¼:?/—ÿÿÿ€N¹6 X.Ž—ÿÿÿ€?< N¹¢T>¼ÿÿN¹N^NuNVHç*n y> X¹> Ry>JŸLß N^NuNVÿüN^NuNVÿüN^NuNVÿü.¹:DN¹6N^NuNVÿü.¹:DN¹6N^NuNVÿü.¹:DN¹6N^NuNVÿü.¹:DN¹6N^NuNVHçN¹'&BW/<8…N¹hX>¼/<8…N¹hX>¼/<8…N¹hX n2n ÑÉB*n`&H€HÀм=: @g H€Ð| `H€€RJfÖ>® /.N¹¬XJŸLß N^NuNVÿ4.¼:X/—ÿÿÿ8N¹6ÊX.®/—ÿÿÿ8N¹6 X.¼:x/—ÿÿÿ8N¹6 X.Ž—ÿÿÿ8?< N¹¢T>¼ÿÿN¹ÆN^NuNVÿü.Ž— /./<;&N¹üPN^NuNVÿü.Ž—/. /.N¹üPN^NuNVÿü.Ž— /./<;N¹ PN^NuNVÿü.Ž—/. /.N¹ PN^NuNVý`Hç*nBnÿð`¢H€HÀм=: @gT n R® H€HÀм=: @fâ.N¹ 2<¼|ÿÿfpÿ`r0FÑü=:fÜ.?N¹´TJgN¾<%g8.N¹ 2<¼|ÿÿfpÿ`6H€¼@g.?N¹´T0.ÿð``þ` n R® Bnÿþ¾<*fRnÿþ n R® :<ÿ`$º|ÿfBEH€2Ãü ÐA:Ú|ÿÐ n R® ¾<0m¾<9oÐBnÿøBnÿö¾<lfRnÿø n R® `¾<hfRnÿö n R® H€`T=| ÿò`=|ÿò`=|ÿòH€HÀм=: @gRnÿø.N¹ 2<¼|ÿÿfpÿ`>0FÑü=:fÜJnÿþg Aîÿè-Hýä` n-PýäX®Bnÿü¼|+g¼|-f"¼|-fRnÿüSE.N¹ 2<¼|ÿÿfpÿ`âB®ÿìBnÿú`ž0FÑü=:g0Ð|ÿà`0<=Fÿô n0ÿôm€ nFÿônv n9ÿôo nAÿômdn0ÿô n ÿôo 0.ÿô_@=@ÿô0.ÿô°nÿòlBRnÿú/.ÿì0nÿò/N¹7ŒP2.ÿôHÁÐ-@ÿì.N¹ 2<¼|ÿÿfpÿ`:0SEJ@nÿ\.?N¹´TJnÿúf0.ÿð`Jnÿüg .ÿìD€-@ÿìJnÿøg nýä ®ÿì`Jnÿög .ÿì"nýä2€` .ÿì"nýä2€JnÿþfRnÿð`´.N¹ 2<¼|ÿÿfpÿ`¶¾<sf<-|; ý``.N¹ 2<¼|ÿÿfpÿ`BW/.ý`?aŽ\J@fØ=|ÿü`‚¾<cf-|;ý`º|ÿfz=|ÿü`bBnÿü n H€°|^@ÀR® DÀf=|ÿü n R® Aîýd-Hý`` ný`‡R®ý` n R® Jg¾<]fâ ný`BAîýd-Hý`Jnÿþg Aîýè-Hýä` n-PýäX®`"0"nýä€R®ýä.N¹ 2<¼|ÿÿfpÿ`´0SEJ@o>®ÿü/.ý`?a¨\J@fÂ.?N¹´T¾<cg nýäBJnÿþfRnÿð`ZH€HÀм=: @gRnÿø.N¹ 2<¼|ÿÿfpÿ`D0FÑü=:fÜJnÿþg Aîÿè-Hýä` n-PýäX®Aîýd-Hý``L0"ný`€R®ý`¼|0m¼|9o¼|.g¼|eg¼|Eg ¼|-g¼|+f.N¹ 2<¼|ÿÿfpÿ`Ä0SEJ@n¬.?N¹´TS®ý` ný`BJnÿøg/.ýä/—ÿÿýdN¹ŠX _ €`/.ýä/—ÿÿýdN¹ŠX _ €JnÿþfRnÿð`H.N¹ 2<¼|ÿÿfpÿ`LH€¼@g.?N¹´T0.ÿð`2``HÀ |:’r°˜WÉÿü h8NÐ n H€R® J@fúN0.ÿðJŸLß àN^NuNVHç. H€>€/. N¹ìX>Jng JGgB@`p`0JŸL߀N^NuNVHç*nSm m mH€À|ÿR­` `.N¹ jJŸLß N^NuNVHç*n-fpÿ`Ô-g m pÿ`ÀJ­f&-f>¼N¹!+@fm`m-g0HÀм>$+@»ü;f9;)g .¼;&N¹Ú-g>¼`>¼/-?N¹ `\;@ Jm n mÿÿ fm0`m pÿ`Sm +m mH€À|ÿR­JŸLß N^NuNVHç>®N¹'¶*@ fpÿ`‚-gB@`t-g3ü =$3ù>=&pÿ`T-g>®/. / N¹¦P`8-gB€0..€/. / N¹P``B€0..€/. / N¹VPJŸLß N^NuNVÿöHç*n(n ..-Gÿö` -î€-@ÿú -°®ÿúgŽ-gF>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`ÊUÿ¿>¼!/</ —4/.ÿú/ N¹-*ßü°|gU .ÿö‡`Ž+nÿú&M -À|HÀ×À×ü4`FSÿþ .ÿþfU -°­ o+m .ÿö‡`H` . ÿþfR‹R­` îÿþS‡R‹R­ м´·ÀdJ‡nªJ‡nþî -°­ o+m .ÿöJŸLß8€N^NuNVÿôHç*n(n ..-Gÿô -î€-@ÿü -À¼gò -°®ÿüg˜-gF>¼"/</ —4/-/ N¹-*ßü°|g3ü=$3ù>=&pÿ`ÂUÿ¿>¼! 2_ADDR; /* reset the keyboard */ cr2_base->cr2 &= (char)(~KB_ENABLE); /* disable keyboard interrupts */ cr2_base->cr2 &= (~KB_RESET); /* set RESET line to keyboard */ DELAY(2); /* need to wait about 5 usecs */ cr2_base->cr2 |= KB_RESET; DELAY(100000); /* allow keyboard to get it's act together; about 1/2 second */ /* Initialize the 2661. Because 2661 mode register is really two registers and the one you're writing to depends upon sequence of prior writes, we must do this with interrupts disabled. */ cr = epci_base->command; /* read command register, which causes the mode reg. to point to reg 1. */ epci_base->mode = MODE1_INIT; /* initialize mode register 1 */ epci_base->mode = MODE2_INIT; /* initialize mode register 2 */ epci_base->command = COMM_INIT; /* initialize the command register */ /* Select the keyboard. */ epci_base->data = SELECT_KB; /* send command to select keyboard */ for (;!(epci_base->status & CHAR_AVAIL);) /* wait for reception of char */ ; reg = epci_base->data; /* Read response; if it's not an ACK (0) the keyboard failed its self-test; ignore the status since it is possible that the self-test failed 'cause someone was holding down a key  and we don't want such a minor thing to prevent the system from booting.*/ epci_base->data = READ_KB; /* send a READ command so keyboard will send us first scan code */ } /****************************************************************************** keybd_read -- ROUTINE TO GET A CHAR FROM THE KEYBOARD FUNCTION: This routine is called when a we want to read a code from the 2661. It gets the code from the 2661, sends another READ to the keyboard, and either JMPs to a routine or converts the scan code into a char, depending on the scan code. ******************************************************************************/ char keybd_read(status) int *status; /* used to indicate a brk was struck */ { register epci_map *epci_base; /* pointer to the keyboard registers */ register char scn_code; /* scan code recieved from keyboard */ register char scn_tbl_arg; /* save the scan table argument field */ register char group_x; /* group/routine index from scan table*/ register rtn_index rtn_x; /* index in switch statement */ register char rv; /* return value */ epci_base = (epci_map *)EPCI_ADDR; /* Get scan code and check for errors. */ /* * if we just make a mode change, we immediately * try again to read a character. we don't pass any * SHIFT codes and such up. */ if (!(epci_base->status & ANY_ERROR))/* NO errors from the keyboard */ { scn_code = epci_base->data; /* get scan code from the keyboard */ /* save arg from the scan table entry for later use */ scn_tbl_arg = scan_code_tbl[scn_code].arg; if (scn_code >= 0) /* Verify that bit 8 is 0 */ { epci_base->data = READ_KB; /* send another READ to the keyboard */ group_x = scan_code_tbl[scn_code].grp_rout_x; /* Use scan code to get group/routine index and parameter. */ rv = 0; /* initialize return value here */ *status = NOCHAR; /* initialize status to not character returned to the caller */ if (group_x < 0) /* negative group_x indicates a switch routine is invoked */ { /* ROUTINE TO INTERPRET SCAN CODE */ rtn_x = (rtn_index)(group_x);/* negate to get switch index */ rtn_x = -rtn_x; /* compiler BUG work around */ if (-group_x <= (char)NONLOCKABLE) /* routine affected by front panel lock */  ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé/* @(#)config.c 3.1 */ /* * this program sets up the baud rate of * the lst: serial port. */ #define BAUDCTL ((char *)0xf1c1c5) main() { int baudval; printf("\n\rBaud rate selection options:\n\r"); printf(" 0 = 50, 1 = 75, 2 = 110, 3 = 134,\n\r"); printf(" 4 = 150, 5 = 300, 6 = 600, 7 = 1200,\n\r"); printf(" 8 = 1800, 9 = 2000, 10 = 2400, 11 = 3600,\n\r"); printf(" 12 = 4800, 13 = 7200, 14 = 9600, 15 = 19200\n\r"); printf("\n\rEnter number of desired baud rate: "); scanf("%d",&baudval); if ( (baudval < 0) || (baudval > 15) ) { printf("\n\rError: %d is not a valid baud selection.\n\r",baudval); return; } *BAUDCTL = (*BAUDCTL & 0xf0) | baudval; printf("\n\rBaud rate reconfigured.\n\r"); } \n\r",baudval); return; } *BAUDCTL = (*BAUDCTL & 0xf0) | baudval; printf("\n\rBéééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé  { if (!(*((char *)STATUS_REG) & KBD_UNLOCK)) rtn_x = IGNORE; /* if lock is on then ignore keystroke*/ } switch ((int)rtn_x) { case TWO_AT : /* TWO_AT -- HANDLE THE 2 @ KEY. This code is entered when the 2 @ key is pressed. Its purpose is to generate the appropriate character code depending on the state of the SHIFT and CTRL mode keys. The reason this key can't be handled by the tables is that if CTRL is pressed, a NUL ($00) character must be generated. A value of 0 in the tables is reserved to mean NO CHARACTER. */ if (!(modes & CTRL)) /* is the CTRL key down? */ { /* No, so look further */ if (modes & SHIFT) /* is one of SHIFT keys down */ rv = '@'; /* return @ character */ else rv = '2'; /* return 2 character */ } *status = IN_CHAR; break; case ESC_RESET : /* ESC_RESET -- HANDLE ESC RESET KEY. This code is entered when the ESC RESET key is pressed. Its purpose is to generate the appropriate character code depending on the state of the SHIFT mode keys. */ if (modes & SHIFT) /* is a SHIFT key down */ /*reset_screen()*/; /* NOT IMPLEMENTED YET */ else { rv = 0x1b; /* character is an esc */ *status = IN_CHAR; } break; case BREAK_CLEAR :  /* BREAK_CLEAR -- HANDLE BREAK CLEAR KEY This code is entered when the BREAK CLEAR key is pressed. Its purpose is to generate the appropriate character code depending on the state of the SHIFT mode keys. */ if (modes & SHIFT) /*clear_screen()*/; /* NOT IMPLEMENTED YET */ else *status = BREAK; /* tell caller break was hit */ break; case GEN_ALPHA : /* GEN_ALPHA -- HANDLE ALPHABETIC KEYS. This code is entered when an alphabetic key is pressed. Its purpose is to generate the appropriate character code depending on the state of the SHIFT, ALPHA LOCK, and CTRL mode keys. */ if (modes & CTRL) rv = scn_tbl_arg - ('A' - 1); else if (!(modes & ALOCK_OR_SHIFT)) /* is a shift key down? */ rv = scn_tbl_arg + ('a' -'A'); /* lower case letter */ else rv = scn_tbl_arg; /* vanilla upper case letter*/ *status = IN_CHAR; break; case FNKEY : /* FNKEY -- HANDLE FUNCTION KEYS. This code is entered when a function key is pressed. Its purpose is to generate the appropriate character code depending on the state of the SHIFT mode keys. */ if (modes & SHIFT) rv = scn_tbl_arg + FNKEY_S1 - 1; else rv = scn_tbl_arg + FNKEY_F1 - 1; *status = IN_CHAR; break; case SET_SHIFT :  /* SET_SHIFT AND CLR_SHIFT -- SET OR CLEAR 1 OF THE 2 SHIFT KEYS. Use these routines when a shift key is pressed or released to update the SHIFT_KEYS byte and make a mode change for SHIFT if necessary. */ shift_keys |= scn_tbl_arg; /* which shift keys was hit */ modes |= SHIFT; mode_chg(); break; case CLR_SHIFT : shift_keys &= (~scn_tbl_arg); /* clear previous key */ if (shift_keys == 0) /* both shift keys released */ { modes &= (~SHIFT); /* clear the shift mode */ mode_chg(); } break; case SET_MODE : /* SET_MODE AND CLR_MODE -- SET OR CLEAR A MODE (E.G., SHIFT). Use these routines when a mode key is pressed or released to update the MODES byte and set the appropriate table offsets in the GRP_TBL. */ modes |= scn_tbl_arg; mode_chg(); break;    case CLR_MODE : modes &= (~scn_tbl_arg); /* Clear the specified mode */ mode_chg(); break; case IGNORE : break; } /* end of switch ((int)rtn_x)*/ return(rv); } else /* It's not a routine, it's a group, so use the parameter to get the char from the table currently in effect for that group. */ { /* CHARACTER DESIGNATED BY SCAN CODE */ if ((*(char *)STATUS_REG) & KBD_UNLOCK) /* is keyboard locked */  { rv = (grp_tbl_ptr[group_x])[scn_tbl_arg]; *status = IN_CHAR; return(rv); } else /* if keyboard is locked, ignore code */ { *status = KYBD_LOCKED; /* tell caller the keyboard is locked*/ return(0); } } } } /* Some kind of error was detected in getting the scan code--try again. */ epci_base->data; /* read char if haven't done it yet */ epci_base->command = COMM_INIT; /* reset the error in the 2661 */ epci_base->data = AGAIN_KB; /* tell keyboard to send last scan code again; just ignore the present one */ return(0); } VOID mode_chg() { int i; /* used as index into grp1_off */ i = (modes & 0x6) >> 1; /* use SHIFT and CTRL bits in mode as an index to reference grp1_off */ grp_tbl_ptr[1] = grp1_off[i]; if (modes & PAD) /* is PAD key down */ grp_tbl_ptr[2] = tbl__y; /* get address of table for Pad chars*/ else grp_tbl_ptr[2] = tbl__n; /* get address of table for no PAD */ return; } /************************************************************************/ /* VME-10 input status */ /************************************************************************/ cons_stat() { register char ret; int status; register epci_map *epci_base; /* * first check to see if a character is already available * in one character buffer and hasn't been picked up. */ if( char_avail ) return(0xff); /* * no char was already available so check if there * is something from the keyboard. */ epci_base = (epci_map *)EPCI_ADDR; if ( !(epci_base->status & CHAR_AVAIL) ) return(0x00); ret = keybd_read(&status); /* * there are four status returns from keybd_read() * * BREAK - a break character was returned * return 0x00. * IN_CHAR - we have a character returned * return 0xff. * NOCHAR - there is no character currently * available from the keyboard. * KYBD_LOCKED - there is no character available * as the keyboard lock is on. */ if( status == NOCHAR ) return(0x00); else if( status == KYBD_LOCKED ) return(0x00); else if( status == BREAK ) return(0x00); else if( status == IN_CHAR ) { in_char = ret; char_avail = 0xff; return(0xff); } } /* * end of keyboard code */ /************************************************************************/ /* */ /* BIOS Interface to keyboard functions */ /* */ /************************************************************************/ /************************************************************************/ /* VME-10 Keyboard Input */ /************************************************************************/ BYTE cons_in() { while( ! cons_stat() ) /* wait for input */ ; char_avail = 0; return( in_char ); } #endif /* ! LOADER */ /************************************************************************/ /* VME-10 Console output */ /************************************************************************/ /* assembly language routine "cons_out" in biosa.s */ /************************************************************************/ /* Error procedure for BIOS */ /************************************************************************/ #if ! LOADER bioserr(errmsg) REG BYTE *errmsg; { printstr("\n\rBIOS ERROR   -- "); printstr(errmsg); printstr(".\n\r"); } printstr(s) /* used by bioserr */ REG BYTE *s; { while (*s) cons_out(*s++); } #else bioserr() /* minimal error procedure for loader BIOS */ { l : goto l; } #endif /************************************************************************/ /* Disk I/O Procedures and Definitions */ /************************************************************************/ /************************************************************************/ /* Define Disk I/O Addresses and Related Constants */ /************************************************************************/ #define DSKCNTL ((struct dio *) 0xf1c0d1) /* controller address */ #define LSCTSZ 128 /* logical sector size - 128 bytes */ #define DCXFER 128 /* bytes per dsk controller transfer request */ #define FDRM 127 /* floppy disk directory maximum */ #define FDSM96 313 /* floppy disk storage maximum - 96 tpi */ #define FDSM48 153 /* floppy disk storage maximum - 48 tpi */ #if DISKC == 5 #define HDRMC 1023 /* hard disk C: directory maximum */ #define HDSMC 1215 /* hard disk C: storage maximum - 5 MB */ #define CMCYL 305 /* hard disk C: maximum cylinder */ #define CMHD 1 /* hard disk C: maximum head */ #endif #if DISKC == 15 #define HDRMC 2047 /* hard disk C: directory maximum */ #define HDSMC 3655 /* hard disk C: storage maximum - 15 MB */ #define CMCYL 305 /* hard disk C: maximum cylinder */ #define CMHD 5 /* hard disk C: maximum head */ #endif #if DISKD == 5 #define HDRMD 1023 /* hard disk D: directory maximum */ #define HDSMD 1215 /* hard disk D: storage maximum - 5 MB */ #define DMCYL 305 /* hard disk D: maximum cylinder */ #define DMHD 1 /* hard disk D: maximum head */ #endif #if DISKD == 15 #define HDRMD 2047 /* hard disk D: directory maximum */ #define HDSMD 3655 /* hard disk D: storage maximum - 15 MB */ #define CMCYL 305 /* hard disk D: maximum cylinder */ #define DMHD 5 /* hard disk D: maximum head */ #endif #define FCSVSIZE ((FDRM / 4) + 1) /* floppy csv size */ #define FALVSIZE ((FDSM96 / 8) + 1) /* floppy alv size */ #define HCSVSIZC ((HDRMC / 4) + 1) /* hard C: csv size */ #define HALVSIZC ((HDSMC / 8) + 1) /* hard C: alv size */ #define HCSVSIZD ((HDRMD / 4) + 1) /* hard D: csv size */ #define HALVSIZD ((HDSMD / 8) + 1) /* hard D: alv size */ #define TKBUFSZ (32 * 128) /* number of bytes in track buffer */ /* at least as large as a floppy track */ #define DSKSTAT 0x00 /* commands */ #define DSKRECAL 0x01 #define DSKDFRMT 0x04 /* format disk */ #define DSKTFRMT 0x06 /* format track */ #define DSKREAD 0x08 #define DSKSCAN 0x09 #define DSKWRITE 0x0a #define DSKCONFG 0xc0 #define CTL512DD 0x34 /* default command control byte: 48 tpi */ /* IBM sn, DD, 512 bps, DS, no ci, blk drq */ #define CTL128SD 0x04 /* command control byte: 48 tpi */ /* IBM sn, SD, 128 bps, DS, no ci, blk drq */ #define BUSY 0x80 /* status bits */ #define DRQ 0x08 /* data request - can xfer DCXFER bytes */ #define RST 0x80 /* sense status bit - reset */ #define RDY 0x08 /* sense status bit - drive ready */ #define NOERR 0x00 /* sense error code - no error */ #define IDNTFND 0x06 /* sense error code - ID header not found */ #define CORRDER 0x13 /* sense error code - correctable read error */ #define TPI96 0x80 #define TPI48 0 #if ! MEMDSK #define NUMDSKS 4 /* number of disks defined */ #else #define NUMDSKS 5 #endif /* default number of logical sectors per physical sector for each drive */ WORD lperp[NUMDSKS] = { 512/LSCTSZ, 512/LSCTSZ, 256/LSCTSZ, 256/LSCTSZ}; /************************************************************************/ /* BIOS Table Definitions */ /************************************************************************/ /* Disk Parameter Block Structure */ struct dpb { WORD spt; BYTE bsh; BYTE blm; BYTE exm; BYTE dpbjunk; WORD dsm; WORD drm; BYTE al0; BYTE al1; WORD cks; WORD off; }; / * Disk Parameter Header Structure */ struct dph { BYTE *xltp; WORD dphscr[3]; BYTE *dirbufp; struct dpb *dpbp; BYTE *csvp; BYTE *alvp; }; /************************************************************************/ /* Directory Buffer for use by the BDOS */ /************************************************************************/ BYTE dirbuf[LSCTSZ]; #if ! LOADER /************************************************************************/ /* CSV's */ /************************************************************************/ BYTE csv0[FCSVSIZE]; #if DISKB BYTE csv1[FCSVSIZE]; #endif BYTE csv2[HCSVSIZC]; #if DISKD BYTE csv3[HCSVSIZD]; #endif #if MEMDSK BYTE csv4[16]; #endif /************************************************************************/ /* ALV's */ /************************************************************************/ BYTE alv0[FALVSIZE]; #if DISKB BYTE alv1[FALVSIZE]; #endif BYTE alv2[HALVSIZC]; #if DISKD BYTE alv3[HALVSIZD]; #endif #if MEMDSK BYTE alv4[48]; /* (dsm4 / 8) + 1 */ #endif #endif /************************************************************************/ /* Disk Parameter Blocks */ /************************************************************************/ /************* spt, bsh, blm, exm, jnk, dsm, drm, */ /* al0, al1, cks, off */ #if MEMDSK struct dpb dpb3 = /* memory disk */ { 32, 4, 15, 0, 0, 191, 63, 0, 0, 0, 0}; #endif struct dpb dpb96 = /* 96 tpi floppy disk - BLS = 2048 */ { 32, 4, 15, 0, 0, FDSM96, FDRM, 0xc0, 0, FCSVSIZE, 2}; struct dpb dpb48 = /* 48 tpi floppy disk - BLS = 2048 */ { 32, 4, 15, 1, 0, FDSM48, FDRM, 0xc0, 0, FCSVSIZE, 2}; struct dpb dpbwdc = /* winchester disk C: - BLS = 4096 */ { 32, 5, 31, 1, 0, HDSMC, HDRMC, 0xff, 0, HCSVSIZC, 4}; #if DISKD struct dpb dpbwdd = /* winchester disk D: - BLS = 4096 */ { 32, 5, 31, 1, 0, HDSMD, HDRMD, 0xff, 0, HCSVSIZD, 4}; #endif /************************************************************************/ /* Sector Translate Table for Floppy Disks */ /************************************************************************/ /* No translation for 5-1/4" floppy disks */ /************************************************************************/ /* Disk Parameter Headers */ /* */ /* Four disks are defined : dsk a: diskno=0, (Motorola's #fd02) */ /* : dsk b: diskno=1, (Motorola's #fd03) */ /* : dsk c: diskno=2, (Motorola's #hd00) */ /* : dsk d: diskno=3, (Motorola's #hd01) */ /* */ /************************************************************************/ #if ! LOADER /* Disk Parameter Headers */ struct dph dphtab[] = { { NULL, 0, 0, 0, dirbuf, &dpb96, csv0, alv0}, /* dsk a */ #if DISKB { NULL, 0, 0, 0, dirbuf, &dpb96, csv1, alv1}, /* dsk b */ #else { NULL, 0, 0, 0, dirbuf, &dpb96, NULL, NULL}, /* dsk b */ #endif { NULL, 0, 0, 0, dirbuf, &dpbwdc, csv2, alv2}, /* dsk c */ #if DISKD { NULL, 0, 0, 0, dirbuf, &dpbwdd, csv3, alv3}, /* dsk d */ #else { NULL, 0, 0, 0, dirbuf, NULL, NULL, NULL}, /* dsk d */ #endif #if MEMDSK { 0L, 0, 0, 0, dirbuf, &dpb3, csv4, alv4} /*dsk e*/ #endif }; #else struct dph dphtab[4] = { { NULL, 0, 0, 0, dirbuf, &dpb96, NULL, NULL}, /* dsk a */ { NULL, 0, 0, 0, dirbuf, &dpb96, NULL, NULL}, /* dsk b */ { NULL, 0, 0, 0, dirbuf, &dpbwdc, NULL, NULL}, /* dsk c */ #if DISKD { NULL, 0, 0, 0, dirbuf, &dpbwdd, NULL, NULL}, /* dsk d */ #endif }; #endif /************************************************************************/ /* Currently Selected Disk Stuff */ /************************************************************************/ WORD settrk, setsec, setdsk; /* Currently set track, sector, disk */ BYTE *setdma; /* Currently set dma address */ /* 48/96 tpi flags for floppies: 0x80-> 96 tpi, 0-> 48 tpi */ WORD tkflg[NUMDSKS]; /* last psn referenced on each drive - used to speed up determination */ /* of floppy da0H€>€a&¾op`¾lpÿ` JfØJfÔB@JŸLß0ÀN^NuNVHç>.¾|am ¾|znÞ|ÿà0JŸL߀N^NuNVÿüBBJ®lD®RBJ® lD® RB0. Àî-@ÿü0.Àî2. Âî ÐAÐnÿü=@ÿü .ÿügD€N^NuNVHç..,. J†f#ü€>( <€€ü`H¼‡c #Ç>(B€`:¾†fzB‡`(x¾†e 〼€bã†ã„`îB…J„g¾†eŠ„ž†âŒâŽ`î#Ç>( JŸLßðN^NuJ…g .¼ÿÿÿÿ‹üNuStack Overflow$C runtimeCON:LST: CCP/M-86 file transfer insert disk for transfer into drive A then type c (configure for CCP/M-86) and return or type r (restore to CP/M-68K) and return: %s select error disk parameter block configured for CCP/M-86. disk parameter block reconfigured for CP/M-68K. : unmatched quoteCannot open Cannot append Cannot create Stack Overflow $:¶floating pointC RTL - program not linked for Program terminating $%DEFOX[cdefosx > . .&. Ô Ô . .& Ô. > Raw I/O   °LÌò:::::::ö:::ž:¢::J::::::::::°PÌò:::::::ú:::ž:¦::N=>ÿÿ=>"1001 "0"/ô/ê/†/†/’/ô/ô/ô=š<>.,=:|[]* !!!!"CP/M-68K(tm), Version 1.2, Copyright (c) 1983, Digital Research XXXX-0000-654321iskette type when logging a new diskette */ LONG lstpsn[NUMDSKS]; /* flag indicating configuration has been done */ WORD config = 0; #if LOADER /* disk that booter was loaded from - set by booter - load cpm.sys from it */ WORD bootdsk = 2; /* disk number is controller lun (first fd) */ #endif /************************************************************************/ /* Track Buffering Definitions and Variables */ /************************************************************************/ #if ! LOADER #define NUMTB 3 /* Number of track buffers -- must be at least 3 */ /* for the algorithms in this BIOS to work properly */ /* Define the track buffer structure */ struct tbstr { struct tbstr *nextbuf; /* form linked list for LRU */ BYTE buf[TKBUFSZ]; /* at least fd trk */ WORD dsk; /* disk for this buffer */ WORD trk; /* track for this buffer */ BYTE valid; /* buffer valid flag */ BYTE dirty; /* true if a BIOS write has  */ /* put data in this buffer, */ /* but the buffer hasn't been */ /* flushed yet. */ }; struct tbstr *firstbuf; /* head of linked list of track buffers */ struct tbstr *lastbuf; /* tail of ditto */ struct tbstr tbuf[NUMTB]; /* array of track buffers */ #else /* the loader bios uses only 1 track buffer */ BYTE buf1trk[TKBUFSZ]; /* at least fd trk */ BYTE bufvalid; WORD buftrk; #endif /************************************************************************/ /* Define the number of disks supported and other disk stuff */ /************************************************************************/ #define MAXDSK (NUMDSKS-1) /* maximum disk number */ BYTE cnvdsk[NUMDSKS] = { 2, 3, 0, 1 }; /* convert CP/M dsk# to Motorola */ BYTE rcnvdsk[NUMDSKS] = { 2, 3, 0, 1 }; /* and vice versa */ /************************************************************************/ /* Disk I/O Packets and Variables */ /************************************************************************/ struct dio /* disk controller registers */ { BYTE cmdsns; /* command/sense byte */ BYTE diofl1; /* fill byte */ BYTE intstt; /* interrupt/status byte */ BYTE diofl2; /* fill byte */ BYTE rst; /* reset */ BYTE diofl3; /* fill byte */ BYTE ntusd; /* not used */ BYTE diofl4; /* fill byte */ BYTE data; /* data */ }; struct snsstr /* sense packet */ { BYTE ercode; /* error code */ BYTE lun; /* CP/M logical unit number */ BYTE status; /* status includes controller lun */ WORD pcylnm; /* physical cylinder number */ BYTE headnm; /* head number */ BYTE sectnm; /* sector number */ BYTE n; /* number sectors left to process */ BYTE snsbt6; /* sense packet byte 6 */ BYTE snsbt7; /* sense packet byte 7 */ BYTE snsbt8; /* sense packet byte 8 */ BYTE snsbt9; /* sense packet byte 9 */ }; struct snsstr sns; /* last sense packet read form disk */ /************************************************************************/ /* Send disk command packet */ /************************************************************************/ sndcmd(dsk, psn, n, ctl, cmd) REG WORD dsk, n, ctl, cmd; REG LONG psn; { /* write the packet to the controller */ /* the DSKCNTL references must NOT be reordered */ /* update last psn referenced */ switch (cmd) { case DSKREAD: case DSKWRITE: case DSKSCAN: case DSKTFRMT: lstpsn[dsk] = psn; break; case DSKRECAL: lstpsn[dsk] = 0; break; } /* correction for reading or writing track 0 */ /* track 0 is sd, 128 bytes/sector, 16 sectors */ /* correction assumes reads and writes are done on a track basis */ if ( (dsk < 2) && ((cmd == DSKREAD) || (cmd == DSKWRITE)) ) if ( psn == 0 ) { ctl = CTL128SD; n = 16; } DSKCNTL->cmdsns = cmd; /* command - byte 0 */ /* following line assumes psn <= 21 bits long */ DSKCNTL->cmdsns = (cnvdsk[dsk] << 5) | (psn >> 16); /* byte 1 */ DSKCNTL->cmdsns = (psn >> 8); /* byte 2 */ >‡aRG¾|môJŸL߀N^NuNVHç 0.Áü´*@Ûü>¦0.@BUB-+|ÿÿÿÿB­B­ >¼ Bg/ —N¹Ð\>¼ ?< / —N¹Ð\JŸLß0N^NuNVHç>.¾|e3ü =’3ù>†=”B€`0B@0Àü´*@Ûü>¦-f3ü =’3ù>†=”B€` JŸLß €N^NuNVÿðHç*n(n >.B€0-@ÿôB`r -î€-@ÿü -°®ÿüg²-gF>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`Uÿ¿ -À¼ÿÿÿ€"- S¼ÿÿÿ€°nB>¼!/</ —4/.ÿü/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`¸+nÿü&M -À|HÀ×À×ü4B€0-@ÿð`  f ¼< g< `SGÆR­ м´·ÀdJGbÔ Ð¼´·Àe6>¼"/</ —4/.ÿü/ N¹-Üßü°|g .ÿô®ÿð`&`U@JGf -°­ o+m .ÿô`JGbþŒJŸLß8ÀN^NuNVHç*n>. `B0SGJ@nöJŸLß €N^NuNVÿøHç*nBnÿú -î€=@ÿþB€0.ÿþ°­gÒ-gB>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`Ð -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`F>¼!/</ —4B€0.ÿþ// N¹-Üßü°|g3ü=’3ù>†=”pÿ`XUÿ¿B€0.ÿþ+@ -À¼=@ÿø><€žnÿø¾nc>.`¾|€fBGJGc´>‡/. B2.ÿøÐ/—4N¹6êPßnÿúB€0Ñ­B@0H@B@H@Ñ® ŸnB@0Ðnÿø°|€gU@B€0.ÿþ+@`V>¼"/</ —4B€0.ÿþ// N¹-Üßü°|g3ü=’3ù>†=”pÿ`xUÿ¿+|ÿÿÿÿRnÿþ n€e€B@0.îH=@ÿü>¼"B€0.ÿü//. B€0.ÿþ// N¹-Üßü°nÿüg3ü=’3ù>†=”pÿ`B@0.ÿüÑnÿþ>.ÿüïOßnÿúB€0Ñ­B@0H@B@H@Ñ® ŸnJnc -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`D>¼!/</ —4B€0.ÿþ// N¹-Üßü°|g3ü=’3ù>†=”pÿ``>®/. / —4N¹6êPU@B€0.ÿþ+@B@0.ÑnÿúB€0.Ñ­B@0.H@B@H@Ñ® -°­ o+m B@0.ÿúJŸLß €N^NuNVÿðB®ÿúBnÿô n(H€>€N¹3Ä=@ÿø=|ÿþ`.®?<N¹¢T n!n 0 ®oB@09=NÀ|`f nÿþoR9=Og ®op` .=@ÿþ` ®€o <€` .=@ÿþRnÿô0nÿþ.ˆ?<,N¹¢T.®—?.N¹¢T=@ÿöJnÿög@ nÿþo(9=Og09>†r â`=@ÿþ` 09>†à@=@ÿþ`Bnÿþ0.ÿþHÀÑ®ÿú`20.ÿþHÀÑ® 0.ÿþHÀ‘®0.ÿþHÀÑ®ÿú0.ÿþï@HÀÑ®J®nþä>®ÿø n(H€?N¹4TJnÿôg.¼?<,N¹¢T .ÿúN^NuNVÿüB—?< N¹¢T3ù>†=PB@09=P`tyd=N`~B—?<£N¹¢T09>†`$y=Ny@=N`,y=Nyä=N`°|"gÞ°|1gа| gä°|1gÖ`Üa*`$yä=N```HÀ |=Rr°˜WÉÿü hNÐN^NuNVÿüB—?<DN¹¢T yÿÿ>†gJy>†gy=NB@``pÿN^NuNVÿh=|ÿrBnÿp n(g -|1øÿt` n(g-|1´ÿt n(g .м-@ÿl nÿl0(À| =@ÿpBnÿz=nÿþ`ê=|ÿü`¶ n  f.=|ÿÿÿzJnÿrg 0.ÿüR@°|€l¢ N2nÿüÑÉ| ÿ|Rnÿü`\ n  fRJnÿpgLp2.ÿzÂ|A=@ÿx0.ÿüÐnÿx°|€l^0.ÿxÑnÿz` N2nÿüÑÉ| ÿ|Rnÿü0.ÿxSnÿxJ@fâR® ` N2nÿüÑÉ"n Qÿ|R® RnÿüSnÿþRnÿz n€ÿülJnÿþfÿ>0.ÿüS@@ÿ|/—ÿÿÿ| nÿtNXJnÿþfÿB@0.N^NuNVÿþHç*nH‡Î|ÿ=Gÿþ`H€HÀ.€?<N¹¢T0SGJ@nä0.ÿþJŸLß €N^NuNVÿúHç*nH€=@ÿþ M2nÿþÑɼ$BG-Mÿú`H M2GÑÉ $f: nÿú $g.®ÿú?< N¹¢T.¼$?<N¹¢T 2HÁÐR€-@ÿúRG¾nÿþm² 2HÁа®ÿúg.®ÿú?< N¹¢T0.ÿþJŸLß €N^NuNVÿüHç*n 0.Áü´Ð¼>¦-@ÿü(nÿüÙüBG.Œ/ N¹4BXJ€g3ü=’3ù>†=”pÿ`ÐJ,g nÿül nf,>¼?/ R—N¹ìXJ@g3ü=’3ù>†=”pÿ`Œ nÿü(H€>€N¹3Ä< nf.Œ?<N¹¢T nf nÿü(g,€.Œ?.N¹¢T>>† nÿü(H€?N¹4T ng nf0` ¾|nB@`pÿJŸLß8ÀN^NuNVHçJnfB@`4.¼ÿ?< N¹¢T>RG¾ng0.S@HÀ.€?< N¹¢T0JŸL߀N^NuNVÿüJng 0.°n g0. S@HÀ.€?< N¹¢TN^NuNVÿàHç*n>¼ Bg/. N¹Ð\>¼ ?< /. R—N¹Ð\>¼ /—ÿÿÿà/ a‚P*@ :f6.Ž—ÿÿÿà/. a°X°|ÿÿfpÿ`>¼ /—ÿÿÿàR/ aFP*@ *f>¼?<?/. R—N¹Ð\R>¼/. R—/—ÿÿÿàa¾P .fT>¼ /—ÿÿÿàR/ aòP*@ *f>¼?<?/. — N¹Ð\R>¼/. — /—ÿÿÿàabP ;f2>¼ /—ÿÿÿàR/ a˜P*@>¼/. —/—ÿÿÿàa*PH€`B€``J@gö°| gð°| gêpÿJŸLß N^NuNVHç *n(n >.`(H€HÀм=¨ @g H€Ð|ÿà`H€ÀRSGJgJGfÐJŸLß0€N^NuNVHç *n(n >.`ÝSGJgH€>€/9=–N¹ìXJ@fJGfÜB JŸLß0€N^NuNVHç*n BG`Ïü H€Þ@Þ|ÿÐ0R@"n@H€HÀм=¨ @fÒJg.H€HÀм=¨ @g H€Ð|ÿà`H€Ð|ÿÀ"n€RJf n (n n opÿ`B@JŸLß €N^NuNVÿü .°® d"` n"n ‘R® R®0.SnJ@fâ`40.HÀÑ®0.HÀÑ® `S®S® n"n ‘0.SnJ@fâN^NuNVHç *n (n`RŒJfúÝfü .JŸLß0N^NuNVHç *n (nÝfü .JŸLß0N^NuNVHç *n(M`RŒJfú HÀJŸLß0N^NuNVÿüN^NuNVHç *n(n `$H€>€ DSKCNTL->cmdsns = psn; /* byte 3 */ DSKCNTL->cmdsns = n; /* byte 4 */ DSKCNTL->cmdsns = ctl | tkflg[dsk]; /* byte 5 */ } /************************************************************************/ /* Send disk configuration packet */ /************************************************************************/ sndcnf(dsk, mxhd, mxcl, prcmp) REG WORD dsk, mxhd, mxcl, prcmp; { WORD zero; zero = 0; /* so clr.b won't be generated for byte 5 */ /* write the configuration packet to the controller */ /* the DSKCNTL references must NOT be reordered */ DSKCNTL->cmdsns = DSKCONFG; /* command - byte 0 */ DSKCNTL->cmdsns = (cnvdsk[dsk] << 5); /* byte 1 */ /* following line assumes mxcl <= 13 bits long */ DSKCNTL->cmdsns = (mxhd << 5) | (mxcl >> 8); /* byte 2 */ DSKCNTL->cmdsns = mxcl; /* byte 3 */ DSKCNTL->cmdsns = prcmp; /* byte 4 */ DSKCNTL->cmdsns = zero; /* byte 5 */ /* performs automatic recalibration - set last psn to 0 */ lstpsn[dsk] = 0; } /************************************************************************/ /* Get disk sense */ /************************************************************************/ gtsns() { /* read the sense block from the controller */ /* the DSKCNTL references must NOT be reordered */ while ( DSKCNTL->intstt & BUSY ) ; /* wait while controller busy */ sns.ercode = DSKCNTL->cmdsns; sns.status = DSKCNTL->cmdsns; sns.lun = rcnvdsk[(sns.status >> 5) & 0x3]; sns.pcylnm = DSKCNTL->cmdsns; sns.pcylnm = (sns.pcylnm << 8) + DSKCNTL->cmdsns; sns.headnm = DSKCNTL->cmdsns; sns.sectnm = sns.headnm & 0x1f; sns.headnm = sns.headnm >> 5; sns.n = DSKCNTL->cmdsns; sns.snsbt6 = DSKCNTL->cmdsns; sns.snsbt7 = DSKCNTL->cmdsns; sns.snsbt8 = DSKCNTL->cmdsns; sns.snsbt9 = DSKCNTL->cmdsns; } #if NO_ASM_SUPPORT /************************************************************************/ /* Disk read data transfer */ /************************************************************************/ rddat(bp) REG BYTE *bp; { /* This routine should be written in assembly language later. */ REG WORD cnt; for ( cnt = DCXFER; cnt; cnt-- ) *bp++ = DSKCNTL->data; } /************************************************************************/ /* Disk write data transfer */ /************************************************************************/ wrdat(bp) REG BYTE *bp; { /* This routine should be written in assembly language later. */ REG WORD cnt; for ( cnt = DCXFER; cnt; cnt-- ) DSKCNTL->data = *bp++; } #endif /* NO_ASM_SUPPORT */ /************************************************************************/ /* Translate track number to physical sector number */ /************************************************************************/ LONG tk2psn(dsk, trk) REG WORD dsk, trk; { REG struct dpb *pp; REG WORD ttrks; pp = dphtab[dsk].dpbp; if ( dsk >= 2 ) return(trk*((pp->spt)/lperp[dsk])); ttrks = 80; if ( pp == &dpb96 ) ttrks = 160; if ( trk < ttrks/2 ) return(trk*((pp->spt)/lperp[dsk])*2); return(((ttrks-trk)*2-1)*(pp->spt/lperp[dsk])); } /************************************************************************/ /* Disk Read with error correction */ /************************************************************************/ WORD rddsk(dsk, psn, pscnt, bufp) REG WORD dsk, pscnt; REG LONG psn; REG BYTE *bufp; { LONG erofst; /* offset from bp of location to correct */ BYTE *bp; /* address of last sector read - for correction */ sndcmd(dsk, psn, pscnt, CTL512DD, DSKREAD); while ( 1 ) { while ( DSKCNTL->intstt & BUSY ) if ( DSKCNTL->intstt & DRQ ) { rddat(bufp); bufp += DCXFER; } gtsns(); /* check for error */ if ( sns.ercode != CORRDER ) return (sns.ercode); else { /* correct the data - winchester only */ erofst = (sns.snsbt6 << 8) + sns.snsbt7; bp = (BYTE *)((LONG)bufp - 256); bp[erofst] ^= sns.snsbt8; bp[erofst+1] ^= sns.snsbt9; if ( sns.n ) /* more to rea>¼B§-H€?N¹d\BWB§-H€?N¹d\0JŸLß €N^NuNVÿüBW?. /.aþü\N^NuNVÿüBW?. /.aþä\N^NuNVÿü>¼?. /.aþÊ\N^NuNVHç>®N¹(h*@ f3ü =’3ù>†=”pÿ`v0.`F+n `P . Ñ­`F>®N¹*+@ - Ю +@`*3ü=’3ù>†=”pÿ`*`J@g¶°|g¸°|g¼`ÖUÿßJ­l+|ÿÿÿÿ -JŸLß N^NuNVÿü>¼B§?.aÿB\N^NuNVHç>®N¹(h*@ fpÿ`^0À|gB€`P-g +m `0-H€>€N¹3Ä<.—?<#N¹¢T>†-H€?N¹4T <ÿÿÿÁ­0.-0S‡-gÖJ‡mʾ­gŽ-gF>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`–Uÿ¿>¼!/</ —4// N¹-Üßü°|g3ü=’3ù>†=”pÿ`R+G ï€+@Ií4Gí´`RŒ¹Ëd fô " Ò¼4Ñ­`B­` R€ï€+@+m U -JŸLß8ÀN^NuNVýäHç*nBnýìJ® gh``BE-n ÿò`R®ÿòRE nÿòJg nÿò %fèJEo.®?/. N¹:\-nÿò Ûnýì n %@ÀR® DÀfBnýê n H€°|-@ÀR® DÀf n R® Rnýê| ÿö¾<0fGÿö n R® =|ÿÿýð¾<*f-Mÿø nÿø=PýðT n R® `8`*JnýðlBnýðH€2.ýðÃü ÐAÐ|ÿÐ=@ýð n R® ¾<0m¾<9oÊ|ÿ¾<.f BF n R® ¾<*f-Mÿø nÿø<T n R® `*`H€2Ãü ÐA<Ü|ÿÐ n R® ¾<0m¾<9oØBnýè¾<lg¾<LfRnýè n R® Aîýò-HÿòH€` RnýèJnýèg <%H` <%þ#À>¢.¹>¢?<?< /—ÿÿýò/ N¹$Ößü Jnýègp`pHÀÛÀ`ÎRnýèJnýèg <%H` <%þ#À>¢.¹>¢Bg?< /—ÿÿýò/ N¹$Ößü Jnýègp`pHÀÛÀ`zRnýèJnýèg <%H` <%þ#À>¢.¹>¢Bg?</—ÿÿýò/ N¹$Ößü Jnýègp`pHÀÛÀ`&RnýèJnýèg <%H` <%þ#À>¢.¹>¢Bg?</—ÿÿýò/ N¹$Ößü Jnýègp`pHÀÛÀ`Ò-Mÿü nÿü-PÿòX`À-Mÿø nÿø0À|ÿ@ýòB.ýóT`¤H€>€?/—ÿÿýò/ N¹ßü X|ÿ`~H€>€?/—ÿÿýò/ N¹ßü X|ÿ`XH€>€?/—ÿÿýò/ N¹(ßü X|ÿ`4.®H€?N¹ªTRnýì`Ö`|C°|5bÚå@0@Ñü. (n,g$Bl >‡/ ?N¹&Ö\°Gg lpÿ`*B@`&`.ŒH€?N¹ªT°|ÿÿfpÿ` 0SGJ@fÞB@JŸLß0€N^NuNVHç. *n Sm mH€"m€À|ÿR­``.H€?N¹ðTJŸLß €N^NuNVÿþHç. *n BF:-fpÿ`$J­fV-fN>¼N¹!º+@+@fm`2m>•N¹!>J@gm@`;|þ H€"m€R­`È-gAîÿþ+H +@ m‡R­-gz>…/-?N¹&Ö\<Bm `n-g>¾< g -м°­b" -­:>…/-?N¹&Ö\<+mBm `( -­:>…/-?N¹&Ö\<;|ÿ +mºFg mpÿ`H€À|ÿJŸLß àN^NuNVHç>®N¹(h*@ fB@`-fB@`pJŸLß N^NuNVHç>®N¹(h*@ fB@`0À|JŸLß N^NuNVÿü>®a–J@g <97`B€N^NuNVHç>.^GæORG>‡a*@ fB€` >‡/ a†XJŸLß €N^NuNVHç (y=F*T`ZB@0-BA2-³@F@J@g>¼N¹$ÎB€`:B@0-°ne `*»ù=Ff>®a¦*@ f>¼N¹$ÎB€`(M*U`¤JŸLß0N^NuNVHç n*PB@0. X@°me n •`F(MB@0. çHH@B@H@ÙÀB@0-n 9@B@0,F@9@(• n Œ;n B@0-F@;@#î=F P€JŸLß0N^NuNVHç >.Þ|?ìGíG0ç@>€N¹&l*@»üÿÿÿÿfB€`* R€À¼ÿÿÿþ*@(M9GB@0,F@9@.ŒP—a 9=FJŸLß0€N^NuNVHç *nQB@0-BA2-³@F@J@g>¼N¹$Îpÿ`Ä(y=F»Ìe»Ôe¹Ôe»Ôc»Ìd(T`è»Ìe2 BA2-çIHABAHAÐ" BB4,çJHBBBHBÒ‚°b #Ì=FB@`n BA2-çIHABAHAа”f T0(ÑmB@0-F@;@ T*`*” BA2,çIHABAHAлÀfB@0-ÑlB@0,F@9@(•`(#Ì=FB@JŸLß0N^NuNVÿüHç *n.aþò>. ^GæORG>‡aýˆ-@ÿüfB€`J nÿü(PPŒ»Ìg2¹Íd`ÝSn Jn fô`B€0. ÙÀB€0. ÛÀ`%Sn Jn fô>‡/.ÿüaý®XJŸLß0€N^NuNVÿüN^NuNVÿüN^NuNVÿðHç /—ÿÿÿð?.?./— /. nNßü*@ мÿÿÿð»ÀfB(n `%H‡Þ|0¾|9o^GÇ мÿÿÿð»ÀfâB JŸLß0€N^NuNVÿüHç-|>(ÿü*n<.HÆ n. nfz` À|Àè‡SEJ‡gJEfì`h nf$z ` À|Àæ‡SEJ‡gJEfìJEf-ÿÿ`*n<.JngJGlB@0D@> n P¼-"n R‘`B€0€ÆH@ÀB€0€Æ>JGfê JŸLß ÀN^NuNVHç >.HÇμÿÿgR‡*y>‚(GÙù>‚.ŒN¹†°|ÿÿf3ü =’3ù>†=”pÿ`>®Bg/ N¹Ð\ JŸLß0€N^NuNVHç>®N¹(h*@ fpÿ`vJnfB@`j-g3ü =’3ù>†=”pÿ`L0À|g>®/. / N¹0JP`0-g>®/. / N¹(ÊP``>®/. / N¹*’PJŸLß N^NuNVHç|BG` À¹=Jf ¹=J0`ã†RG¾|mâ3ü=’3ù>†=”pÿJŸLßÀN^NuNVÿüp2.ã`F@HÀÁ¹=JB@N^NuNVHçBG`d - reissue command */ sndcmd(dsk, psn+pscnt-sns.n, sns.n, CTL512DD, DSKREAD); else return (0); /* done - no error to report */ /* Should probably check for consistent correctable error (snsbt6-9 same twice) then write corrected sector back to disk. Refer to Winchester Disk Controller User's Manual section 4.3 Disk Error Recovery page 4-15. */ } } } /************************************************************************/ /* Disk Transfer */ /************************************************************************/ dskxfer(dsk, trk, bufp, cmd) REG WORD dsk, trk, cmd; REG BYTE *bufp; { WORD rcnt; /* retry count */ LONG psn; /* physical sector number */ WORD pscnt; /* physical sector count */ WORD scnt; /* # of xfer blocks (= # logical sectors) */ BYTE *bp; /* buffer pointer for retries */ WORD error; /* error flag */ /* set up */ psn = tk2psn(dsk, trk); scnt = dphtab[dsk].dpbp->spt; pscnt = scnt/lperp[dsk]; /* # phys sctrs */ bp = bufp; /* save buffer addr */ rcnt = 10; /* retry count */ do /* error retry loop */ { /* handle command */ switch (cmd) { case DSKREAD: error = rddsk(dsk, psn, pscnt, bufp); break; case DSKWRITE: sndcmd(dsk, psn, pscnt, CTL512DD, cmd); while ( DSKCNTL->intstt & BUSY ) if ( (DSKCNTL->intstt & DRQ) && scnt ) { wrdat(bufp); bufp += DCXFER; scnt--; } gtsns(); error = sns.ercode; break; default: sndcmd(dsk, psn, pscnt, CTL512DD, cmd); gtsns(); error = sns.ercode; break; } bufp = bp; /* restore buffer addr */ } while (error && --rcnt); /* return pass/fail indication */ if (error) return(0); /* failure */ else return(1); /* success */ } #if ! LOADER /************************************************************************/ /* Mark all buffers for a disk as not valid */ /************************************************************************/ setinvld(dsk) REG WORD dsk; { REG struct tbstr *tbp; tbp = firstbuf; while ( tbp ) { if ( tbp->dsk == dsk ) tbp->valid = 0; tbp = tbp->nextbuf; } } #endif /************************************************************************/ /* BIOS Select Disk Function */ /************************************************************************/ struct dph *slctdsk(dsk, logged) REG BYTE dsk; BYTE logged; { REG struct dph *dphp; REG LONG psn; setdsk = dsk; /* Record selected disk number */ #if ! LOADER if ( (dsk > MAXDSK) #if ! DISKB || (dsk == 1) #endif #if ! DISKD || (dsk == 3) #endif ) { printstr("\n\rBIOS ERROR -- DISK "); cons_out('A'+dsk); printstr(" NOT SUPPORTED\n\r"); return(0L); } #endif dphp = &dphtab[dsk]; #if MEMDSK if (setdsk == MEMDSK) return(dphp); #endif if ( ! (logged & 0x1) ) { /* determine disk type and size */ switch ( dsk ) { case 0: case 1: /* floppy disk */ #if ! LOADER setinvld(dsk);  #endif /* assume 96 tpi */ if ( tkflg[dsk] == TPI48 ) { lstpsn[dsk] *= 2; /* correct to 96 */ tkflg[dsk] = TPI96; } /* lstpsn assumes 16 sct/cyl */ psn = lstpsn[dsk] / 16; if ( psn == 0 ) psn = 1; /* skip track 0 */ psn = psn * 16; /* sector to test */ /* scan a sector at an odd cyl to check */ /* track density */ sndcmd(dsk, psn, 1, CTL512DD, DSKSCAN); gtsns(); switch (sns.ercode) { case NOERR: dphp->dpbp = &dpb96; break; case IDNTFND: dphp->dpbp = &dpb48; tkflg[dsk] = TPI48; break; default: /* other error */ dphp = NULL; break; } break; case 2: case 3: /* hard disk */ break; default: #if ! LOADER printstr("\n\rBIOS ERROR -- DISK "); cons_out('A'+dsk); printstr(" NOT SUPORTED\n\r"); #endif return(NULL); } } return(dphp); } /************************************************************************/ /* HBnÿøBnÿö¾<lfRnÿø n R® `¾<hfRnÿö n R® H€`T=| ÿò`=|ÿò`=|ÿòH€HÀм=¨ @gRnÿø.N¹ ä<¼|ÿÿfpÿ`>0FÑü=¨fÜJnÿþg Aîÿè-Hýä` n-PýäX®Bnÿü¼|+g¼|-f"¼|-fRnÿüSE.N¹ ä<¼|ÿÿfpÿ`âB®ÿìBnÿú`ž0FÑü=¨g0Ð|ÿà`0<=Fÿô n0ÿôm€ nFÿônv n9ÿôo nAÿômdn0ÿô n ÿôo 0.ÿô_@=@ÿô0.ÿô°nÿòlBRnÿú/.ÿì0nÿò/N¹8>P2.ÿôHÁÐ-@ÿì.N¹ ä<¼|ÿÿfpÿ`:0SEJ@nÿ\.?N¹fTJnÿúf0.ÿð`Jnÿüg .ÿìD€-@ÿìJnÿøg nýä ®ÿì`Jnÿög .ÿì"nýä2€` .ÿì"nýä2€JnÿþfRnÿð`´.N¹ ä<¼|ÿÿfpÿ`¶¾<sf<-|;xý``.N¹ ä<¼|ÿÿfpÿ`BW/.ý`?aŽ\J@fØ=|ÿü`‚¾<cf-|;|ý`º|ÿfz=|ÿü`bBnÿü n H€°|^@ÀR® DÀf=|ÿü n R® Aîýd-Hý`` ný`‡R®ý` n R® Jg¾<]fâ ný`BAîýd-Hý`Jnÿþg Aîýè-Hýä` n-PýäX®`"0"nýä€R®ýä.N¹ ä<¼|ÿÿfpÿ`´0SEJ@o>®ÿü/.ý`?a¨\J@fÂ.?N¹fT¾<cg nýäBJnÿþfRnÿð`ZH€HÀм=¨ @gRnÿø.N¹ ä<¼|ÿÿfpÿ`D0FÑü=¨fÜJnÿþg Aîÿè-Hýä` n-PýäX®Aîýd-Hý``L0"ný`€R®ý`¼|0m¼|9o¼|.g¼|eg¼|Eg ¼|-g¼|+f.N¹ ä<¼|ÿÿfpÿ`Ä0SEJ@n¬.?N¹fTS®ý` ný`BJnÿøg/.ýä/—ÿÿýdN¹€/. N¹ìX>Jng JGgB@`p`0JŸL߀N^NuNVHç*nSm m mH€À|ÿR­` `.N¹ JŸLß N^NuNVHç*n-fpÿ`Ô-g m pÿ`ÀJ­f&-f>¼N¹!º+@fm`m-g0HÀм>’+@»ü;†f9;—g .¼;”N¹Œ-g>¼`>¼/-?N¹\;@ Jm n mÿÿ fm0`m pÿ`Sm +m mH€À|ÿR­JŸLß N^NuNVHç>®N¹(h*@ fpÿ`‚-gB@`t-g3ü =’3ù>†=”pÿ`T-g>®/. / N¹XP`8-gB€0..€/. / N¹ºP``B€0..€/. / N¹PJŸLß N^NuNVÿöHç*n(n ..-Gÿö` -î€-@ÿú -°®ÿúgŽ-gF>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`ÊUÿ¿>¼!/</ —4/.ÿú/ N¹-Üßü°|gU .ÿö‡`Ž+nÿú&M -À|HÀ×À×ü4`FSÿþ .ÿþfU -°­ o+m .ÿö‡`H` . ÿþfR‹R­` îÿþS‡R‹R­ м´·ÀdJ‡nªJ‡nþî -°­ o+m .ÿöJŸLß8€N^NuNVÿôHç*n(n ..-Gÿô -î€-@ÿü -À¼gò -°®ÿüg˜-gF>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`ÂUÿ¿>¼!/</ —4/.ÿü/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`|+nÿü&M -À|HÀ×À×ü4`ÛS‡R­ м´·ÀdJ‡nèJ‡f -°­ o+m .ÿô`,R®ÿüB† î€-@ÿøJ®ÿøo >¼!/.ÿø/ /.ÿü/ N¹-ÜßüHÀ,Ý®ÿü ï€Ñ­ € ï€ÙÀ -°­ o+m ¼®ÿøgU .ÿô‡`¼J‡f .ÿô`°-gD>¼"/</ —4/-/ N¹-Üßü°|g3ü=’3ù>†=”pÿ`fUÿ¿>¼!/</ —4/.ÿü/ N¹-Üßü°|g U .ÿô‡`,+nÿüß­Gí4`ÛS‡J‡nø -°­ o+m .ÿôJŸLß8ÀN^NuNVþöHç *n n(g .¼;~N¹è nÿdB@0.`0<ÿ=@þúB@0.þú@þþ nþúf&B—?<N¹¢T@ÿ|þÿ . ÿfB.þÿ`.Ž—ÿÿþþ?< N¹¢T.þÿH€À|ÿ=@þüB@0.þü°nþúd.¼ ?<N¹¢TIîÿ`& f nP "Ò¼ÿÿÿ`.ÜSnSnþüJncJnþübÎJncü RŒ "Ò¼ÿÿÿJŸLß0N^NuNVHç>.*n ¾|ÿÿfpÿ`.-g$J­g -°­cS­0"m€Rm 0`pÿJŸLß €N^NuNVHçN¹'r>¾|ÿÿfpÿ`’>‡N¹'ú0Áü´*@Ûü>¦JnfU.¼97/.N¹7ÌXJ@f U0`R`.¼9¼/.?N¹2š\J@g3ü#=’3ù>†=”pÿ`U0JŸLß €N^NuNVÿüBW?. /.aÿ:\N^NuNVÿüBW?. /.aÿ"\N^NuNVÿü>¼?. /.aÿ\N^NuNVÿüN¹Ð>®N¹ÆN^NuNVHçBG`0Áüм;†.€N¹RG¾|mäJŸL߀N^NuNVHç*n0-À|g*.N¹Œ-g .­N¹#HB@HÀ+@+@Bm mÿ€>•N¹ZJŸLß N^NuNVHç>.>‡N¹(h*@ f3ü =’3ù>†=”pÿ`ðBF0À|f¶-g6-f. -°­ l>¼B§?N¹d\>¼/<9A?N¹&Ö\-g,>¼"/</ —4/-/ N¹-Üßü°|g|ÿ-H€>€N¹3Ä:.—?<N¹¢TÀ|ÿ°|ÿf|ÿ>…-H€?N¹4T>‡N¹'ú>‡N¹'¼JFf0``3ü=’3ù>†=”pÿJŸLß àN^NuNVÿüN^NuNVHç*n0-À| °|f, -­<o >†/-?N¹&Ö\>¼Gg mpÿ`J-gJ­g-g;| `;|ÿ `>¼0- D@HÀ/?N¹d\Bm +mB@JŸLß ÀN^NuNVHçN¹'r>¾|ÿÿfpÿ`Ð>‡N¹'ú0Áü´*@Ûü>¦Jn fUJnfU.¼97/.N¹7ÌXJ@f U0`†`.¼9¼/.?N¹2š\J@g>‡N¹'¼3ü=’3ù>†=”pÿ`0Uome Disk */ /************************************************************************/ homedsk() { settrk = 0; sndcmd(setdsk, (LONG)0, 0, CTL512DD, DSKRECAL); while ( DSKCNTL->intstt & BUSY ) /* wait while controller busy */ ; /* assume no errors */ } /************************************************************************/ /* Disk Initialization */ /************************************************************************/ initvdsks() { REG WORD i; if ( config ) return; /* only init once */ /* turn off controller interrupts */ DSKCNTL->intstt = 0; /* set up initial disk assumptions */ for ( i = 0; i < NUMDSKS; i++ ) { tkflg[i] = TPI96; lstpsn[i] = 0; } /* configure controller for disks */ sndcnf(0, 1, 79, 40); /* a: fd, 96 tpi, ds */ while ( DSKCNTL->intstt & BUSY ) /* wait while controller busy */ ; /* assume no errors */ #if DISKB sndcnf(1, 1, 79, 40); /* b: fd, 96 tpi, ds */ while ( DSKCNTL->intstt & BUSY ) /* wait while controller busy */ ; /* assume no errors */ #endif sndcnf(2, CMHD, CMCYL, 255); /* c: wd */ while ( DSKCNTL->intstt & BUSY ) /* wait while controller busy */ ; /* assume no errors */ #if DISKD sndcnf(3, DMHD, DMCYL, 255); /* d: wd */ while ( DSKCNTL->intstt & BUSY ) /* wait while controller busy */ ; /* assume no errors */ #endif config = 1; /* set configuration flag */ } #if ! LOADER /************************************************************************/ /* Write one disk buffer */ /************************************************************************/ flush1(tbp) struct tbstr *tbp; { REG WORD ok; if ( tbp->valid && tbp->dirty ) ok = dskxfer(tbp->dsk, tbp->trk, tbp->buf, DSKWRITE); else ok = 1; tbp->dirty = 0; /* even if error, mark not dirty */ tbp->valid &= ok; /* otherwise system has trouble */ /* continuing. */ return(ok); } /************************************************************************/ /* Write all disk buffers */ /************************************************************************/ flush() { REG struct tbstr *tbp; REG WORD ok; ok = 1; tbp = firstbuf; while (tbp) { if ( ! flush1(tbp) ) ok = 0; tbp = tbp->nextbuf; } return(ok); } /*************************************************************************/ /* Fill the indicated disk buffer with the current track and sector */ /*************************************************************************/ fill(tbp) REG struct tbstr *tbp; { REG WORD ok; if ( tbp->valid && tbp->dirty ) ok = flush1(tbp); else ok = 1; if (ok) ok = dskxfer(setdsk, settrk, tbp->buf, DSKREAD); tbp->valid = ok; tbp->dirty = 0; tbp->trk = settrk; tbp->dsk = setdsk; return(ok); } /************************************************************************/ /* Return the address of a track buffer structure containing the */ /* currently set track of the currently set disk. */ /************************************************************************/ struct tbstr *gettrk() { REG struct tbstr *tbp; REG struct tbstr *ltbp; REG struct tbstr *mtbp; /* Does not check for disk on-line. Doing so causes floppy */ /* disk I/O to be extremely slow. We will catch the disk */ /* problem the next time we try to read or write the disk. */ /* Search through buffers to see if the required stuff */ /* is already in a buffer */ tbp = firstbuf; ltbp = 0; mtbp = 0; while (tbp) { if ( (tbp->valid) && (tbp->dsk == setdsk) && (tbp->trk == settrk) ) { if (ltbp) /* found it -- rearrange LRU links */ { ltbp->nextbuf = tbp->nextbuf; tbp->nextbuf = firstbuf; firstbuf = tbp; } return ( tbp ); } else { mtbp = ltbp; /* move along to next buffer */ ltbp = tbp; tbp = tbp->nextbuf; } } /* The stuff we need is not in a buffer, we must make a buffer */ /* available, and fill it with the desired track */ if (mtbp) bsh = BSH68K; ldpbp->blm = BLM68K; ldpbp->exm = EXM68K; ldpbp->dsm = DSM68K; ldpbp->drm = DRM68K; ldpbp->cks = CKS68K; ldpbp->off = OFF68K; printf("\n\rdisk parameter block reconfigured for CP/M-68K.\n\r"); } } dpbpééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé`9` hB…N¹9`FCLEAR68K V02.00, Copyright(c) 1984, Digital Research XXXX-0000-654321 o#È>~"hÓè#É>‚E耀ÿ?/ ÎN¹PNùÆ o Aè¿ÈdpÿNu#À>‚B€NuNV0/"/ NB¿ù>‚d0< Aù9"NB0<NBN^Nu o2/0/ HÀS€oÁQÈÿüB€Nu o0/JfB€Nu°fô S€NuNVÿ¤.¼9BN¹N.¼9]N¹N.¼9ŠN¹N.¼9ºN¹N.Ž—ÿÿÿ¨/<9æN¹X .cÿ¨g .rÿ¨fÂB—B§?< N¹N\-@ÿüf .¼9éN¹NJ®ÿügŽ .cÿ¨f^ nÿü-hÿø nÿø| nÿø| nÿø| nÿø1| nÿø1|? nÿø1| nÿø1|.¼9úN¹N`\ nÿü-hÿø nÿø| nÿø| nÿø| nÿø1|™ nÿø1| nÿø1| nÿø1|.¼:,N¹NN^Nu0/"/$/ NCNuNVÿÞHç BWN¹&l#À>Š#À>ŽBy>ˆ.¼9-a>*n`v`RJgH€HÀм=¨ @fæJgZ "g 'fFH€>€/ R—N¹ìX(@ f.¼:`/ a~X HÀ> M2GÑÉBRG.R—aÆ`BG`RG M2GÑÉJg5pH€HÀм=¨ @gÞJ5pg M2GÑÉBRGH€`°BWN¹ZBW/ R—N¹2XJ@g.R—/<:raøX`”>¼N¹Z ->f@>¼/ T—N¹2X°|f>¼B§?<N¹d\°|ÿÿf.R—/<:a¤X`$BW/ R—N¹†X°|g.R—/<:Ža~X`.aØ`°|gÿr`æÚÇJfþˆB—a¶Sy>ˆ.¹>ŽN¹†°|ÿÿf.¼:¬/<:a*XB—/9>Š?9>ˆN¹\>€N¹¸JŸLß0ÀN^NuNVÿ|.®/—ÿÿÿ€N¹7|X.® /—ÿÿÿ€N¹7RX.¼:­/—ÿÿÿ€N¹7RX.Ž—ÿÿÿ€?< N¹¢T>¼ÿÿN¹¸N^NuNVHç*n y>Ž X¹>ŽRy>ˆJŸLß N^NuNVÿüN^NuNVÿüN^NuNVÿü.¹:²N¹èN^NuNVÿü.¹:²N¹èN^NuNVÿü.¹:²N¹èN^NuNVÿü.¹:²N¹èN^NuNVHçN¹'ØBW/<97N¹X>¼/<97N¹X>¼/<97N¹X n2n ÑÉB*n`&H€HÀм=¨ @g H€Ð| `H€€RJfÖ>® /.N¹^XJŸLß N^NuNVÿ4.¼:Æ/—ÿÿÿ8N¹7|X.®/—ÿÿÿ8N¹7RX.¼:æ/—ÿÿÿ8N¹7RX.Ž—ÿÿÿ8?< N¹¢T>¼ÿÿN¹ÆN^NuNVÿü.Ž— /./<;”N¹®PN^NuNVÿü.Ž—/. /.N¹®PN^NuNVÿü.Ž— /./<;†N¹ÒPN^NuNVÿü.Ž—/. /.N¹ÒPN^NuNVý`Hç*nBnÿð`¢H€HÀм=¨ @gT n R® H€HÀм=¨ @fâ.N¹ ä<¼|ÿÿfpÿ`r0FÑü=¨fÜ.?N¹fTJgN¾<%g8.N¹ ä<¼|ÿÿfpÿ`6H€¼@g.?N¹fT0.ÿð``þ` n R® Bnÿþ¾<*fRnÿþ n R® :<ÿ`$º|ÿfBEH€2Ãü ÐA:Ú|ÿÐ n R® ¾<0m¾<9oÐmtbp->nextbuf = 0; /* detach lru buffer */ ltbp->nextbuf = firstbuf; firstbuf = ltbp; if (flush1(ltbp) && fill(ltbp)) mtbp = ltbp; /* success */ else mtbp = 0L ; /* failure */ return (mtbp); } /************************************************************************/ /* Bios READ Function -- read one sector */ /************************************************************************/ read() { REG BYTE *p; REG BYTE *q; REG WORD i; REG struct tbstr *tbp; #if MEMDSK  if(setdsk != MEMDSK) { #endif tbp = gettrk(); /* locate track buffer with sector */ if ( ! tbp ) return(1); /* failure */ /* locate sector in buffer and copy contents to user area */ p = (tbp->buf) + (setsec << 7); /* multiply by shifting */ #if MEMDSK } else p = memdsk + (((LONG)(settrk) << 12L) + ((LONG)setsec << 7L)); #endif q = setdma; i = 128; do {*q++ = *p++; i -= 1;} while (i); /* this generates good code */ return(0); } /************************************************************************/ /* BIOS WRITE Function -- write one sector */ /************************************************************************/ write(mode) BYTE mode; { REG BYTE *p; REG BYTE *q; REG WORD i; REG struct tbstr *tbp; /* locate track buffer containing sector to be written */ #if MEMDSK if(setdsk != MEMDSK) { #endif tbp = gettrk(); if ( ! tbp ) return (1); /* failure */ /* locate desired sector and do copy the data from the user area */ p = (tbp->buf) + (setsec << 7); /* multiply by shifting */ #if MEMDSK } else { p = memdsk + (((LONG)(settrk) << 12L) + ((LONG)setsec << 7L)); q = setdma; i = 128; do {*p++ = *q++; i -= 1;} while (i); /* this generates good code */ return(0); } #endif q = setdma; i = 128; do {*p++ = *q++; i -= 1;} while (i); /* this generates good code */ tbp->dirty = 1; /* the buffer is now "dirty" */ /* The track must be written if this is a directory write */ if ( mode == 1 ){if ( flush1(tbp) ) return(0); else return(1);} else return(0); } #else /************************************************************************/ /* Read and Write functions for the Loader BIOS */ /************************************************************************/ read() { REG BYTE *p; REG BYTE *q; REG WORD i; if ( ( (! bufvalid) || (buftrk != settrk) ) && ( ! dskxfer(setdsk, settrk, buf1trk, DSKREAD) ) ) {return(1);} bufvalid = 1; buftrk = settrk; p = buf1trk + (setsec << 7); q = setdma; i = 128; do { *q++ = *p++; i-=1; } while(i); return(0); } #endif /************************************************************************/ /* BIOS Sector Translate Function */ /************************************************************************/ WORD sectran(s, xp) REG WORD s; REG BYTE *xp; { if (xp) return (WORD)xp[s]; else return (s+1); } /************************************************************************/ /* BIOS Set Exception Vector Function */ /************************************************************************/ /* exception vector base address */ LONG *vbase = ((LONG *)0); LONG setxvect(vnum, vval) WORD vnum; LONG vval; { REG LONG oldval; REG LONG *vloc; vloc = &vbase[vnum]; oldval = *vloc; /* TENBUG used the illegal instruction, trace, TRAP #15 and user vector 78 (Abort button on console) so don't allow these to be clobbered while debugging. Also we use TRAP #15 to do screen output. */ if ( #ifdef DEBUG (vnum != 4) && /* illegal instruction */ (vnum != 9) && /* trace vector */ #endif (vnum != 47) && /* TRAP #15 vector */ (vnum != 78)) /* user trap (trap # 78) */ *vloc = vval; return(oldval); } #if ! LOADER /****************************************************************/ /* */ /* This function is included as an undocumented, */ /* unsupported method for VME/10 users to format *éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé/* @(#)xfer86.c 3.1 */ /* * this program modifies the disk parameter block * so that files may be transferred between CP/M-68K * and CCP/M-86. it requires that a disk be inserted * so that it can be selected in order to obtain the * address of the disk parameter block. */ #include "biostyps.h" /* defines portable variable types */ LONG BIOS(); #define MBIOS(a,b,c) BIOS((WORD)a,(LONG)b,(LONG)c) #define BSH86 4 #define BLM86 15 #define EXM86 1 #define DSM86 157 #define DRM86 63 #define CKS86 ((DRM86 / 4) + 1) #define OFF86 1 #define BSH68K 4 #define BLM68K 15 #define EXM68K 1 #define DSM68K 153 /* assumes 48 tpi disk */ #define DRM68K 127 #define CKS68K ((DRM68K / 4) + 1) #define OFF68K 2 #define SELECT 9 /* disk parameter block structure */ struct dpb { WORD spt; BYTE bsh; BYTE blm; BYTE exm; BYTE dpbjunk; WORD dsm; WORD drm; BYTE al0; BYTE al1; WORD cks; WORD off; }; /* disk parameter header structure */ struct dph { BYTE *xltp; WORD sphscr[3]; BYTE *dirbufp; struct dpb *dpbp; BYTE *csvp; BYTE *alvp; }; main() { struct dph *dphp; struct dpb *ldpbp; char line[80]; printf("\n\rCCP/M-86 file transfer\n\r"); do { printf("\n\rinsert disk for transfer into drive A then"); do { printf("\n\rtype c (configure for CCP/M-86) and return or"); printf("\n\rtype r (restore to CP/M-68K) and return: "); scanf("%s",line); } while ( !( (line[0] == 'c') || (line[0] == 'r') ) ); if ( (dphp = MBIOS(SELECT,0,0)) == 0L ) { printf("\n\rselect error\n\r"); } } while ( !dphp ); if ( line[0] == 'c' ) { ldpbp = dphp->dpbp; ldpbp->bsh = BSH86; ldpbp->blm = BLM86; ldpbp->exm = EXM86; ldpbp->dsm = DSM86; ldpbp->drm = DRM86; ldpbp->cks = CKS86; ldpbp->off = OFF86; printf("\n\rdisk parameter block configured for CCP/M-86.\n\r"); } else { /* reconfigure for CP/M-68K */ ldpbp = dphp->dpbp; ldpbp->/ /* disks. It is not a part of CP/M-68K proper, and */ /* is only included here for convenience, since the */ /* Motorola disk controller is somewhat complex to */ /* program, and the BIOS contains supporting routines. */ /* */ /****************************************************************/ format(dsk) REG WORD dsk; { if ( ! slctdsk( (BYTE)dsk, (BYTE) 1 ) ) return(0); #if MEMDSK if (setdsk == MEMDSK) return(1); #endif tkflg[dsk] = TPI96; sndcmd(dsk, (LONG)0, 0, CTL512DD, DSKDFRMT); gtsns(); if ( sns.ercode ) return(0); sndcmd(dsk, (LONG)0, 0, CTL128SD, DSKTFRMT); gtsns(); if ( sns.ercode ) return(0); return(1); } #endif /************************************************************************/ /* */ /* Bios initialization. Must be done before any regular BIOS */ /* calls are performed. */ /* */ /************************************************************************/ biosinit() { #if ! LOADER c_init(); m400init();  #if MVME410 m410_init(); #endif #endif initdsks(); } initdsks() { REG WORD i; #if ! LOADER for ( i = 0; i < NUMTB; ++i ) { tbuf[i].valid = 0; tbuf[i].dirty = 0; if ( (i+1) < NUMTB ) tbuf[i].nextbuf = &tbuf[i+1]; else tbuf[i].nextbuf = 0; } firstbuf = &tbuf[0]; lastbuf = &tbuf[NUMTB-1]; #else bufvalid = 0; #endif initvdsks(); } #if ! LOADER /********************************************************************** * Driver for MVME400 Dual RS-232C Serial Port Module ************************************************************************ * WARNING: DO NOT OPTIMIZE THIS DRIVER !!!!!!! * It contains redundant stores to the serial controller * that are necessary for proper operation. */ /* 7201 control register 0 operations */ #define SELREG1 1 #define SELREG2 2 #define SELREG3 3 #define SELREG4 4 #define SELREG5 5 #define SELREG6 6 #define SELREG7 7 #define ABRTSDLC 8 #define REXSTINT 0x10 #define CHANRST 0x18 #define INTNXTRC 0x20 #define RSTTXINT 0x28 #define ERRRST 0x30 #define EOINT 0x38 #define RSTRXCRC 0x40 #define RSTTXCRC 0x80 #define RSTTXUR 0xC0 /* 7201 control register 1 operations */ #define EXINTEN 1 #define TXINTEN 2 #define STATAFV 4 #define RXINTDS 0 #define RXINT1 8 #define RXINTALP 0x10 #define RXINTANP 0x18 #define WAITRXTX 0x20 #define WAITEN 0x80 #define INTDSMSK 0xE4 /* 7201 control register 2A operations (2B is int vector) */ #define BOTHINT 0 #define ADMABINT 1 #define BOTHDMA 2 #define PRIAGB 0 #define PRIRGT 4 #define M8085M 0 #define M8085S 8 #define M8086 0x10 #define NONVEC 0 #define INTVEC 0x20 #define RTSBP10 0 #define SYNCBP10 0x80 /* 7201 control register 3 operations */ #define RXENABLE 1 #define SYNLDIN 2 #define ADRSRCH 4 #define RXCRCEN 8 #define ENTHUNT 0x10 #define AUTOENA 0x20 #define RX5BITS 0 #define RX7BITS 0x40 #define RX6BITS 0x80 #define RX8BITS 0xC0 #define RXSZMSK 0x3F /* 7201 control register 4 operations */ #define PARENAB 1 #define EVENPAR 2 #define ODDPAR 0 #define SYNCMODE 0 #define SBIT1 4 #define SBIT1P5 8 #define SBIT2 0xC #define SBITMSK 0xF3 #define SYN8BIT 0 #define SYN16BIT 0x10 #define SDLCMODE 0x20 #define EXTSYNC 0x30 #define CLKX1 0 #define CLKX16 0x40 #define CLKX32 0x80 #define CLKX64 0xC0 /* 7201 control register 5 operations */ #define TXCRCEN 1 #define RTS 2 #define CRC16 4 #define CRCCCITT 0 #define TXENABLE 8 #define SENDBRK 0x10 #define TX5BITS 0 #define TX7BITS 0x20 #define TX6BITS 0x40 #define TX8BITS 0x60 #define TXSZMSK 0x9F #define DTR 0x80 /* 7201 control register 6 = sync bits 0-7 */ /* 7201 control register 7 = sync bits 8-15 */ /* 7201 status register 0 */ #define RXCHAR 1 /*Recieve character available */ #define INTPNDNG 2 #define TXBUFEMP 4 /*Transmit register is empty */ #define DCD 8 #define SYNCHUNT 0x10 #define CTS 0x20 #define TXUNDER 0x40 #define BRKABRT 0x80  /* 7201 status register 1 */ #define PARERR 0x10 #define RXOVRUN 0x20 #define CRCFRMER 0x40 #define EOFRAME 0x80 /* 7201 status register 2 = int vector */ #define FALSE 0 #define TRUE 1 /* Macro to WRITE information to the 7201's control registers */ #define WRITE(y,x,z,w) *y = x;\ *y = aux_state[z].w #define M400_1 0 /* table indices for the 2 auxillary ports */ #define M400_2 1 #define AUX M400_1 /* Auxllary Serial Device */ #define LST M400_2 /* List Device (line printer) */ /* baud rate control values 0 for 0 , 0 for 50 , 1 for 75 , 2 for 110 , 3 for 134 , 4 for 150 , 4 for 200 , 5 for 300 , 6 for 600 , 7 for1200 , 8 for1800 , 10 for2400 , 12 for4800 , 14 for9600 , 15 forEXTA , 15 forEXTB EXTA & EXTB = 19.2K */ typedef struct { BYTE cr1; BYTE cr2; BYTE cr3; BYTE cr4; BYTE cr5; BYTE baud; /*baud rate for the port */ BYTE char_size; /*size of character: 0x20 = 7 0x40 = 6 0x60 = 8 */ } mstate; /*following is the actual variable which holds the state of the MVME400 board. It is referenced in the code below using the pointer variable "aux_state" defined above. The array dimesion expression forces even byte alignment at the end of each element of mstate(of which there are 2). All of this foolishness is necessary because the C compiler will not initialize char variables. */ BYTE init_state[] = { (0), /* A cr1 */ (BOTHINT|PRIRGT|M8086|RTSBP10), /* A cr2 */ (AUTOENA|RX8BITS|RXENABLE), /* A cr3 */ (SBIT1|CLKX16), /* A cr4 */ (TXENABLE|TX8BITS|RTS|DTR), /* A cr5 */ (14), /* A baud rate = 9600*/ (TX8BITS), /* A character size */ (0), /* Dummy fill char */ (STATAFV), /* B cr1 */ (0), /* B cr2 */ (AUTOENA|RX8BITS|RXENABLE), /* B cr3 */ (SBIT1|CLKX16), /* B cr4 */ (TXENABLE|TX8BITS|RTS|DTR), /* B cr5 */ (7), /* A baud rate = 1200*/ (TX8BITS), /* A character size */ 0 /* Dummy fill char */ }; /* State of the MVME400 board; one set of information for each of the ports on the board */ mstate *aux_state = (mstate *)init_state; /* * Structure of MVME400 hardware registers. * Assumes an odd starting address. */ typedef struct { BYTE m4_piaad; /* pia a data */ BYTE m4_fill0; /* fill */ BYTE m4_piaac; /* pia a control */ BYTE m4_fill1; /* fill */ BYTE m4_piabd; /* pia b data */ BYTE m4_fill2; /* fill */ BYTE m4_piabc; /* pia b control */ BYTE m4_fill3; /* fill */ BYTE m4_7201d[3]; /* 7201 a data */ /* BYTE m4_fill4; fill */ /* BYTE m4_72bd; 7201 b data */ BYTE m4_fill5; /* fill */ BYTE m4_7201c[3]; /* 7201 a control */ /* BYTE m4_fill6; fill */ /* BYTE m4_72bc; 7201 b control */ } m4_map; /* MVME400 BASE ADDRESS */ #define M400_ADDR ((m4_map *)0xf1c1c1) /* Macro to dereference VME/10 control register #6 */ #define IOCHANRG (*(BYTE *)0xF19F11) #define CHN3EN 0x20 /********************************************************************* ** Initialize both ports on the mvme400 card **********************************************************************/ m400init() { REG BYTE *caddra, *caddrb; REG m4_map *addr; IOCHANRG &= ~CHN3EN; /* disable I/O channel 3 interrupts */ aux_state = (mstate *)init_state;/*aux_state points at initialized array*/ if ( no_device((LONG)M400_ADDR) ) return; addr = M400_ADDR; caddra = &addr->m4_7201c[0]; /* address of A side control register*/ caddrb = &addr->m4_7201c[2]; /* address of B side control register*/ addr->m4_piaac = 0; /* set up pia data direction regs */ addr->m4_piaad = 0x18; addr->m4_piaac = 4; addr->m4_piabc = 0; addr->m4_piabd = 0xff; addr->m4_piabc = 4; addr->m4_piaad = 0; /* fail led off */ /* set the baud rate for both ports */ addr->m4_piabd = (aux_state[M400_1].baud << 4) /* A port */ | aux_state[M400_2].baud; /* B port */ *caddra = CHANRST; /* reset channels */ linit1: /* label to force generation of next line */ *caddra = CHANRST; /* write twice so */ *caddrb = CHANRST; /* it is sure to be */ linit2: *caddrb = CHANRST; /* written to cr0 */ /* Initialize the control registers NEC 7201 Communiciations controller chip */ WRITE(caddra,SELREG2,M400_1,cr2); WRITE(caddrb,SELREG2,M400_2,cr2); WRITE(caddra,SELREG4,M400_1,cr4); WRITE(caddra,SELREG3,M400_1,cr3); WRITE(caddra,SELREG5,M400_1,cr5); WRITE(caddra,SELREG1|RSTTXINT,M400_1,cr1); WRITE(caddrb,SELREG4,M400_2,cr4); WRITE(caddrb,SELREG3,M400_2,cr3); WRITE(caddrb,SELREG5,M400_2,cr5); WRITE(caddrb,SELREG1|RSTTXINT,M400_2,cr1); } /********************************************************************* ** Read a character from one of the asynchronous ports on the mvme400 **********************************************************************/ BYTE m400_in(port) REG WORD port; { m4_map *addr; while (!(((M400_ADDR)->m4_7201c[port*2]) & RXCHAR));/*wait for char. ready*/ return((M400_ADDR)->m4_7201d[port*2]); /* get the char */ } /********************************************************************* ** Write a character to one of the asynchronous ports on the mvme400 **********************************************************************/ VOID m400_out(port, ch) REG WORD port; REG BYTE ch; { /*wait till ready to send */ while (!(((M400_ADDR)->m4_7201c[port*2]) & TXBUFEMP)); (M400_ADDR)->m4_7201d[port*2] = ch; /* output the character */ return; } #endif #if ! LOADER #if MVME410 /*********************************************************************** * m410 driver for the VME/10. * * ROUTINES: * * m410_init() - initialize mvme410 card. * m410_stat() - check the status of the mvme410 card. * m410_out() - put a character out on the mvme410 card. * */ /* * base address of the mvme410 * control block. */ #define M410BASE ((struct m410_ctl_blk *) 0xF1C1E0) struct m410_ctl_blk { char pad0; char data_a; char pad1; char ctl_a; char pad2; char data_b; char pad3; char ctl_b; }; /* * define some simple aliases for structure members * above. */ #define stat_a ctl_a #define stat_b ctl_b #define ddr_a data_a /* ddr - data direction register */ #define ddr_b data_b #define prdy data_b #define strobe ctl_a #define acknowledge ctl_a #define ready data_b /* * some control values - bit positions. */ #define PAPEROUT 0x2 #define SELECT 0x1 /* * data strobe low and high following write. */ #define STROBELOW 0x34 #define STROBEHIGH 0x3C /* * data acknowledge is set after printer accepts * character. */ #define DATA_ACK 0x80 /* * m410_stat return values. */ #define NOTREADY 0x00 #define READY 0xFF /* * Initialization values. */ #define INITDDR 0x38 #define INITCTL 0x3C #define OUTPUT 0xFF #define INPUT 0x00 /* * m410_init() * * initialize the mvme 410 board for use as parallel * printer interface. */ m410_init() { register struct m410_ctl_blk *m410_base; m410_base = M410BASE; /* * test if a 410 card is available before performing * initialization. */ if ( no_device((LONG)&(M410BASE->data_a)) ) return; /* * initialize a side of controller to output. */ m410_base->ctl_a = INITDDR; m410_base->ddr_a = OUTPUT; m410_base->ctl_a = INITCTL; /* * initialize b side of controller to input. */ m410_base->ctl_b = INITDDR; m410_base->ddr_b = INPUT; m410_base->ctl_b = INITCTL; } /* * m410_stat() * * determine status of mvme 410 board. Is the device ready to write to. * * returns: * * $FF - if ready * $00 - if not ready */ m410_stat() { register struct m410_ctl_blk *m410_base; register short status; m410_base = M410BASE; status = m410_base->prdy & (PAPEROUT|SELECT); if( status != SELECT ) return( NOTREADY ); return( READY ); } /* * m410_out() * * wait until device is ready, * write a single character 'c' to the 410 card, * wait for acknowledgement. */ m410_out(c) register char c; { register struct m410_ctl_blk *m410_base; while( m410_stat() == NOTREADY ) ; m410_base = M410BASE; m410_base->data_a = c; /* write character out */ c = m410_base->data_a; /* dummy read to clear acknowledge */ m410_base->strobe = STROBELOW; m410_base->strobe = STROBEHIGH; /* * wait for data acknowledge */ while( (m410_base->acknowledge & DATA_ACK) == 0 ) ; return; } /**************************************************************************/ #endif /* MVME410 */ #endif /* ! LOADER */ /************************************************************************/ /* */ /* BIOS MAIN ENTRY -- Branch out to the various functions. */ /* */ /************************************************************************/ LONG cbios(d0, d1, d2) REG WORD d0; REG LONG d1, d2; { switch(d0) { case 0: biosinit(); /* INIT */ break; #if ! LOADER case 1: flush(); /* WBOOT */ initdsks(); wboot(); /* break; */ case 2: return(cons_stat()); /* CONST */ /* break; */ case 3: return(cons_in()); /* CONIN */ /* break; */ #endif case 4: cons_out((char)d1); /* CONOUT */ break; #if ! LOADER #if MVME410 case 5: m410_out((char)d1); /* LIST */ break; #else case 5: m400_out(M400_2, (char)d1); /* LIST */ break; #endif case 6: m400_out(M400_1, (char)d1); /* PUNCH */ break; case 7: return(m400_in(M400_1)); /* READER */ /* break; */ #endif case 8: homedsk(); /* HOME */ break; case 9: #if LOADER d1 = rcnvdsk[bootdsk]; /* disk booter was loaded from */ #endif return((LONG)slctdsk((char)d1, (char)d2)); /* SELDSK */ /* break; */ case 10: settrk = (int)d1; /* SETTRK */ break; case 11: setsec = ((int)d1-1); /* SETSEC */ break; case 12: setdma = (BYTE *)d1; /* SETDMA */ break; case 13: return(read()); /* READ */ /* break; */ #if ! LOADER case 14: return(write((char)d1)); /* WRITE */ /* break; */ case 15: #if MVME410 return(m410_stat()); #else /* auxiliary input status */ break; #endif /* MVME410 */ #endif /* ! LOADER */ case 16: return(sectran((int)d1, d2)); /* SECTRAN */ /* break; */ #if ! LOADER case 18: return((LONG)&memtab); /* GMRTA */ /* break; */ case 19: return(iobyte); /* GETIOB */ /* break; */ case 20: iobyte = (int)d1; /* SETIOB */ break; case 21: if (flush()) return(0L); /* FLUSH */ else return(0xffffL); /* break; */ #endif case 22: return(setxvect((int)d1,d2)); /* SETXVECT */ /* break; */ #if ! LOADER /**********************************************************/ /* This function is not part of a standard BIOS. */ /* It is included only for convenience, and will */ /* not be supported in any way, nor will it */ /* necessarily be included in future versions of */ /* CP/M-68K */ /**********************************************************/ case 63: return( ! format((int)d1) ); /* Disk Formatter */ /* break; */ #endif default: return(0L); break; } /* end switch */  } /* END OF BIOS */ /* End of C Bios */  */ #endif default: return(0L); break; } /* end switch */ éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé * @(#)biosa.s 2.3 .text * * Global Code addresses * .globl _init .globl _biosinit .globl _flush .globl _wboot .globl _cbios .globl _setimask .globl _ccp .globl cpm * Lowest addr of CP/M .globl _end * Highest addr of CP/M * * Global data addresses * .globl _memtab * memory region table .globl _dpb3 * RAM disk dpb address .globl _memdsk * -> First memory disk location * * Vector Addresses * trap3: .equ $8c * Trap 3 vector buserr: .equ $8 * Bus error vector * * _init: lea entry,a0 move.l a0,trap3 * * Auto-Size TPA * lea _memtab,a0 * a0 -> Memory region table move.w #1,(a0)+ * 1 region move.l #$b00,(a0)+ * TPA starts at b00 move.l #cpm-$b08,(a0)+ * Ends where CP/M begins * * Auto-Size RAM disk * move.l buserr,-(sp) * Push bus err vector lea _end,a0 * a0 -> Last location in CP/M add.l #cpm,a0 * Linker doesn't reloc this!! move.l a0,_memdsk * -> first location in RAM disk move.l #quit,buserr * set up vector -> ourselves loop: tst.w (a0)+ * Find bra loop * End of memory quit: add.l #58,a7 * Clear buserr gorp move.l (a7)+,buserr * Pop buserr vector sub.l #_end,a0 * a0 = # bytes in RAM disk sub.l #cpm,a0 * Relocation bug move.l a0,d0 * Into D reg for shift move.l #11,d1 * Load shift count lsr.l d1,d0 * Divide by 2048 move.w d0,_dpb3+6 * Load DRM field of dpb move #$2000,sr jsr _biosinit clr.l d0 rts * _wboot: clr.l d0 jmp _ccp * entry: move.l d2,-(a7) move.l d1,-(a7) move.w d0,-(a7) jsr _cbios add #10,a7 rte * _setimask: move sr,d0 lsr #8,d0 and.l #7,d0 move sr,d1 ror.w #8,d1 and.w #$fff8,d1 add.w 4(a7),d1 ror.w #8,d1 move d1,sr rts * .globl _rddat .globl _wrdat * * without considering wait states movep.l makes * the faster loop. however, accounting for wait * states makes the 68010 loop mode faster. * _rddat: move.l 4(sp),a0 move.w #127,d0 move.l #$f1c0d9,a1 rdlp: move.b (a1),(a0)+ dbf d0,rdlp rts * _wrdat: move.l 4(sp),a0 move.w #127,d0 move.l #$f1c0d9,a1 wrlp: move.b (a0)+,(a1) dbf d0,wrlp rts * .globl _no_device * _no_device: move.l 4(sp),a0 move.l buserr,-(sp) move.l #ndber,buserr move.b (a0),d0 moveq.l #0,d0 move.l (sp)+,buserr rts ndber: moveq.l #1,d0 add.l #58,sp move.l (sp)+,buserr rts .end (a0),d0 moveq.l #0,d0 move.l (sp)+,buserr rts ndberééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé 2HÁÐR€-@ÿúRG¾nÿþm² 2HÁа®ÿúg.®ÿú?< N¹¢T0.ÿþJŸLß €N^NuNVÿüHç*n 0.Áü´Ð¼Åž-@ÿü(nÿüÙüBG.Œ/ N¹9ÎXJ€g3üDd3ùEXDfpÿ`ÐJ,g nÿül nf,>¼?/ R—N¹ìXJ@g3üDd3ùEXDfpÿ`Œ nÿü(H€>€N¹9P< nf.Œ?<N¹¢T nf nÿü(g,€.Œ?.N¹¢T>>† nÿü(H€?N¹9 T ng nf0` ¾|nB@`pÿJŸLß8ÀN^NuNVHçJnfB@`4.¼ÿ?< N¹¢T>RG¾ng0.S@HÀ.€?< N¹¢T0JŸL߀N^NuNVÿüJng 0.°n g0. S@HÀ.€?< N¹¢TN^NuNVÿàHç*n>¼ Bg/. N¹Ð\>¼ ?< /. R—N¹Ð\>¼ /—ÿÿÿà/ a‚P*@ :f6.Ž—ÿÿÿà/. a°X°|ÿÿfpÿ`>¼ /—ÿÿÿàR/ aFP*@ *f>¼?<?/. R—N¹Ð\R>¼/. R—/—ÿÿÿàa¾P .fT>¼ /—ÿÿÿàR/ aòP*@ *f>¼?<?/. — N¹Ð\R>¼/. — /—ÿÿÿàabP ;f2>¼ /—ÿÿÿàR/ a˜P*@>¼/. —/—ÿÿÿàa*PH€`B€``J@gö°| gð°| gêpÿJŸLß N^NuNVHç *n(n >.`(H€HÀмDz @g H€Ð|ÿà`H€ÀRSGJgJGfÐJŸLß0€N^NuNVHç *n(n >.`ÝSGJgH€>€/9DhN¹ìXJ@fJGfÜB JŸLß0€N^NuNVHç*n BG`Ïü H€Þ@Þ|ÿÐ0R@"n@H€HÀмDz @fÒJg.H€HÀмDz @g H€Ð|ÿà`H€Ð|ÿÀ"n€RJf n (n n opÿ`B@JŸLß €N^NuNVÿü .°® d"` n"n ‘R® R®0.SnJ@fâ`40.HÀÑ®0.HÀÑ® `S®S® n"n ‘0.SnJ@fâN^NuNVHç *n (n`RŒJfúÝfü .JŸLß0N^NuNVHç *n (nÝfü .JŸLß0N^NuNVHç *n(M`RŒJfú HÀJŸLß0N^NuNVÿüN^NuNVHç *n(n `$H€>€a0H€>€a&¾op`¾lpÿ` JfØJfÔB@JŸLß0ÀN^NuNVHç>.¾|am ¾|znÞ|ÿà0JŸL߀N^NuNVHç..,. J†f#ü€Dú <€€ü`H¼‡c #ÇDúB€`:¾†fzB‡`(x¾†e 〼€bã†ã„`îB…J„g¾†eŠ„ž†âŒâŽ`î#ÇDú JŸLßðN^NuJ…g .¼ÿÿÿÿ‹üNuStack Overflow$C runtimeCON:LST: OPEN: file = w lose elp pen uit r HJ terminal/download/upload program - 3.5 Commands are ^A followed by another character.  Local (from keyboard) commands are: Remote (from host) commands are: pen (download file) lose (download file) pload Commands 'o' and 'u' expect a CP/M filename. Upload terminates with ^D (normal) or ^C (error). O ((((((((0000000088888888@@@@@@@@HHHHHHHHOOOOOOOODscreen driver 3.6  >à  Ô tACHIJKY ê   2 `   ´ Ö: unmatched quoteCannot open Cannot append Cannot create Stack Overflow $Bfloating pointC RTL - program not linked for Program terminating $Raw I/O   #<!Ø#X#~#¢#Æ#Æ#Æ#Æ#Æ#Æ#Æ"‚#Æ#Æ#Æ#*#Æ".#Æ#Æ"Ö#Æ#Æ#Æ#Æ#Æ#Æ#Æ#Æ#Æ#Æ#<!Ü#X#~#¢#Æ#Æ#Æ#Æ#Æ#Æ#Æ"†#Æ#Æ#Æ#*#Æ"2#Æ#Æ"ÚDÿÿD"1001 "0"5€5v5555€5€5€Dl<>.,=:|[]* !!!!"CP/M-68K(tm), Version 1.2, Copyright (c) 1983, Digital Research XXXX-0000-654321/* @(#)biostyps.h 1.1 */ /************************************************/ /* */ /* Portable type definitions for use */ /* with the C BIOS according to */ /* CP/M-68K (tm) standard usage. */ /* */ /************************************************/ #define LONG long #define ULONG unsigned long #define WORD short int #define UWORD unsigned short #define BYTE char #define UBYTE unsigned char #define VOID #define REG register #define LOCAL auto #define MLOCAL static #define GLOBAL extern #define EXTERN extern /************************************************/ to #define MLOCAL static #deféééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé /* @(#)vt52.c 3.6 */ /* Copyright 1984, Motorola Inc. */ /****************************************************************************** Function Name: cons_out Description: Main entry point for the VME/10 screen driver. This VME/10 screen driver is an implementation of the VT52. It supports the following functions: carriage return - cursor is placed at column 0 on the current line. How Recognized : = 0D(hex) line feed - cursor is placed at the same column on the next line. How Recognized : = 0A(hex) backspace - cursor will move 1 column to the left on the screen. If the cursor is already at column zero then it will be placed at the last column of the previous line. If the cursor is currently on the top line of the display at column zero; it will remain where it is. How Recognized : = 08(hex) tab - cursor moves to next tab stop on current line. Cursor moves to end of line if there are no more tab stop on the line. Tab stops are set every eight columns. How Recognized : = 09(hex) clear to end of screen - blanks are written to the cursor and all positions on the screen following the cursor. The cursor will remain in its current position. How Recognized : J = 1B 4A (hex) clear to end of line - blanks are written to the cursor and all positions on the line following the cursor. The cursor will remain in its current position. How Recognized : K = 1B 4B (hex) home cursor - cursor will be placed on the first line at the first column on the screen. How Recognized : H = 1B 48 (hex) move cursor right - cursor will be moved one character position right without affecting the character at that position. The cursor will not move past the right margin. How Recognized : C = 1B 43 (hex) move cursor up - cursor will be moved one up one line. If the cursor is on the top line then it will stay there. How Recognized *U`¤JŸLß0N^NuNVHç n*PB@0. X@°me n •`F(MB@0. çHH@B@H@ÙÀB@0-n 9@B@0,F@9@(• n Œ;n B@0-F@;@#îD P€JŸLß0N^NuNVHç >.Þ|?ìGíG0ç@>€N¹+ø*@»üÿÿÿÿfB€`* R€À¼ÿÿÿþ*@(M9GB@0,F@9@.ŒP—a 9DJŸLß0€N^NuNVHç *nQB@0-BA2-³@F@J@g>¼N¹*Zpÿ`Ä(yD»Ìe»Ôe¹Ôe»Ôc»Ìd(T`è»Ìe2 BA2-çIHABAHAÐ" BB4,çJHBBBHBÒ‚°b #ÌDB@`n BA2-çIHABAHAа”f T0(ÑmB@0-F@;@ T*`*” BA2,çIHABAHAлÀfB@0-ÑlB@0,F@9@(•`(#ÌDB@JŸLß0N^NuNVÿüHç *n.aþò>. ^GæORG>‡aýˆ-@ÿüfB€`J nÿü(PPŒ»Ìg2¹Íd`ÝSn Jn fô`B€0. ÙÀB€0. ÛÀ`%Sn Jn fô>‡/.ÿüaý®XJŸLß0€N^NuNVÿüN^NuNVÿüN^NuNVÿðHç /—ÿÿÿð?.?./— /. nNßü*@ мÿÿÿð»ÀfB(n `%H‡Þ|0¾|9o^GÇ мÿÿÿð»ÀfâB JŸLß0€N^NuNVÿüHç-|Dúÿü*n<.HÆ n. nfz` À|Àè‡SEJ‡gJEfì`h nf$z ` À|Àæ‡SEJ‡gJEfìJEf-ÿÿ`*n<.JngJGlB@0D@> n P¼-"n R‘`B€0€ÆH@ÀB€0€Æ>JGfê JŸLß ÀN^NuNVHç >.HÇμÿÿgR‡*yET(GÙùET.ŒN¹†°|ÿÿf3ü Dd3ùEXDfpÿ`>®Bg/ N¹Ð\ JŸLß0€N^NuNVHç>®N¹-ô*@ fpÿ`vJnfB@`j-g3ü Dd3ùEXDfpÿ`L0À|g>®/. / N¹5ÖP`0-g>®/. / N¹.VP``>®/. / N¹0PJŸLß N^NuNVHç|BG` À¹Df ¹D0`ã†RG¾|mâ3üDd3ùEXDfpÿJŸLßÀN^NuNVÿüp2.ã`F@HÀÁ¹DB@N^NuNVHçBG`>‡aRG¾|môJŸL߀N^NuNVHç 0.Áü´*@ÛüÅž0.@BUB-+|ÿÿÿÿB­B­ >¼ Bg/ —N¹Ð\>¼ ?< / —N¹Ð\JŸLß0N^NuNVHç>.¾|e3ü Dd3ùEXDfB€`0B@0Àü´*@ÛüÅž-f3ü Dd3ùEXDfB€` JŸLß €N^NuNVÿðHç*n(n >.B€0-@ÿôB`r -î€-@ÿü -°®ÿüg²-gF>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`Uÿ¿ -À¼ÿÿÿ€"- S¼ÿÿÿ€°nB>¼!/</ —4/.ÿü/ N¹3hßü°|g3üDd3ùEXDfpÿ`¸+nÿü&M -À|HÀ×À×ü4B€0-@ÿð`  f ¼< g< `SGÆR­ м´·ÀdJGbÔ Ð¼´·Àe6>¼"/</ —4/.ÿü/ N¹3hßü°|g .ÿô®ÿð`&`U@JGf -°­ o+m .ÿô`JGbþŒJŸLß8ÀN^NuNVHç*n>. `B0SGJ@nöJŸLß €N^NuNVÿøHç*nBnÿú -î€=@ÿþB€0.ÿþ°­gÒ-gB>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`Ð -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`F>¼!/</ —4B€0.ÿþ// N¹3hßü°|g3üDd3ùEXDfpÿ`XUÿ¿B€0.ÿþ+@ -À¼=@ÿø><€žnÿø¾nc>.`¾|€fBGJGc´>‡/. B2.ÿøÐ/—4N¹¼"/</ —4B€0.ÿþ// N¹3hßü°|g3üDd3ùEXDfpÿ`xUÿ¿+|ÿÿÿÿRnÿþ n€e€B@0.îH=@ÿü>¼"B€0.ÿü//. B€0.ÿþ// N¹3hßü°nÿüg3üDd3ùEXDfpÿ`B@0.ÿüÑnÿþ>.ÿüïOßnÿúB€0Ñ­B@0H@B@H@Ñ® ŸnJnc -À¼ÿÿÿ€"- S¼ÿÿÿ€°o>¼€Bg/ —4N¹Ð\`D>¼!/</ —4B€0.ÿþ// N¹3hßü°|g3üDd3ùEXDfpÿ``>®/. / —4N¹€N¹9P=@ÿø=|ÿþ`.®?<N¹¢T n!n 0 ®oB@09D À|`f nÿþoR9D!g ®op` .=@ÿþ` ®€o <€` .=@ÿþRnÿô0nÿþ.ˆ?<,N¹¢T.®—?.N¹¢T=@ÿöJnÿög@ nÿþo(9D!g09EXr â`=@ÿþ` 09EXà@=@ÿþ`Bnÿþ0.ÿþHÀÑ®ÿú`20.ÿþHÀÑ® 0.ÿþHÀ‘®0.ÿþHÀÑ®ÿú0.ÿþï@HÀÑ®J®nþä>®ÿø n(H€?N¹9 TJnÿôg.¼?<,N¹¢T .ÿúN^NuNVÿüB—?< N¹¢T3ùEXD"B@09D"`tydD `~B—?<£N¹¢T09EX`$yD y@D `,yD yäD `°|"gÞ°|1gа| gä°|1gÖ`Üa*`$yäD ```HÀ |D$r°˜WÉÿü hNÐN^NuNVÿüB—?<DN¹¢T yÿÿEXgJyEXgyD B@``pÿN^NuNVÿh=|ÿrBnÿp n(g -|7„ÿt` n(g-|7@ÿt n(g .м-@ÿl nÿl0(À| =@ÿpBnÿz=nÿþ`ê=|ÿü`¶ n  f.=|ÿÿÿzJnÿrg 0.ÿüR@°|€l¢ N2nÿüÑÉ| ÿ|Rnÿü`\ n  fRJnÿpgLp2.ÿzÂ|A=@ÿx0.ÿüÐnÿx°|€l^0.ÿxÑnÿz` N2nÿüÑÉ| ÿ|Rnÿü0.ÿxSnÿxJ@fâR® ` N2nÿüÑÉ"n Qÿ|R® RnÿüSnÿþRnÿz n€ÿülJnÿþfÿ>0.ÿüS@@ÿ|/—ÿÿÿ| nÿtNXJnÿþfÿB@0.N^NuNVÿþHç*nH‡Î|ÿ=Gÿþ`H€HÀ.€?<N¹¢T0SGJ@nä0.ÿþJŸLß €N^NuNVÿúHç*nH€=@ÿþ M2nÿþÑɼ$BG-Mÿú`H M2GÑÉ $f: nÿú $g.®ÿú?< N¹¢T.¼$?<N¹¢T: A = 1B 41 (hex) reverse line feed - move the cursor up one line. If the cursor was already on the top line the screen will be scrolled down one line. The line at the top of the screen will be cleared. The cursor will remain in the same column. How Recognized : I = 1B 49 (hex) position cursor - cursor will be moved to the specified line and column. If either value is beyond the edge of the screen then the maximum value for that argument will be used. The line position is sent before the column position. Both values are added to the ASCII space character value so that the values received are printable characters. How Recognized : Y = 1B 59 (hex) place character - will place any printable character (i.e. 20 - 7E (hex)) at the present cursor position on the screen. How Recognized : any printable character (which is not part of a control function sequence). Inputs: char - a 7-bit ascii character. Outputs: None. External variables: None ******************************************************************************/ #define MAXCOLS 79 /*last column on physical screen */ #define MAXLINES 23 /*last line on physical screen */ #define ESC 0x1b /* character */ #define TAB 0x09 /* character */ #define CR 0x0d /* carriage return */ #define LF 0x0a /* line feed */ #define BS 0x08 /* back space */ #define INITATTR 0x4400 /*default attributes in character RAM*/ #define FALSE 0 #define TRUE 1 #define UP 0 /*indicates scroll screen up */ #define DOWN 1 /*indicates scroll screen down */ /* states in which the screen driver can exist whenever a character is received. Basically indicates possible previous sequences of characters which have been received. */ #define any_char 0 /* ready to receive any character */ #define esc 1 /* last character was an */ #define curs_line 2 /* next char is encoded cursor line pos */ #define curs_col 3 /* next char is encoded cursor column pos */ /* Logical Screen Control Block - contains information on each logical screen (i.e., window) which is available on the physical screen of the VME/10 (the first version only supports 1 logical screen and it is mapped to all but the last line of the physical screen. */ typedef struct { short cur_line; /*current line cursor is on */ short cur_col; /*current column cursor is at  */ short cur_cursor; /*current offset of cursor on the screen; first position = 0; */ short base_line; /*first line of the logical screen */ short base_col; /*first column of the logical screen */ short max_line; /*last line on screen relative to base*/ short max_col; /*last col on screen relative to base*/ char tabstop[MAXCOLS+1];/*the element corresponding to each column on the screen contains the column where the next tabstop is located. */  } lscb; /* chr_map describes the word in the character and attribute RAM which corresponds to a character on the screen. Note that the chr field in the declaration is 8 bits. This assumes that software attribute bit 2 is not being used. */ typedef struct { char attr; /*attributes of character: bit 7 - software attribute 1 bit 6 - don't display character bit 5 - blink character bit 4 - underline character bit 3 - inverse video  bit 2 - color or intensity bit 1 bit 1 - color or intensity bit 2 bit 0 - color or intensity bit 3 */ char chr; /* 7 - bit ascii character */ } chr_map; /* attribute and character RAM area maps the VME/10 screen for regular character I/O */ #define SCRN_ADDR ((short (*)[80])0xf17000) /*address of character RAM*/ /* information necessary to access the CRTC (the screen controller) */ typedef struct /*map of the registers for the CRTC */ { char addr_re *n n(g .¼BPN¹ nÿdB@0.`0<ÿ=@þúB@0.þú@þþ nþúf&B—?<N¹¢T@ÿ|þÿ . ÿfB.þÿ`.Ž—ÿÿþþ?< N¹¢T.þÿH€À|ÿ=@þüB@0.þü°nþúd.¼ ?<N¹¢TIîÿ`& f nP "Ò¼ÿÿÿ`.ÜSnSnþüJncJnþübÎJncü RŒ "Ò¼ÿÿÿJŸLß0N^NuNVHçN¹,þ>¾|ÿÿfpÿ`’>‡N¹-†0Áü´*@ÛüÅžJnfU.¼>o/.N¹=XXJ@f U0`R`.¼>t/.N¹=XXJ@fU0`2>¼/.?N¹8&\J@g3ü#Dd3ùEXDfpÿ`U0JŸLß €N^NuNVÿüBW?. /.aÿ:\N^NuNVÿüBW?. /.aÿ"\N^NuNVÿü>¼?. /.aÿ\N^NuNVÿüN¹>®N¹ÆN^NuNVHçBG`0ÁüмBX.€N¹6RG¾|mäJŸL߀N^NuNVHç*n0-À|g*.N¹À-g .­N¹(ÔB@HÀ+@+@Bm mÿ€>•N¹ŽJŸLß N^NuNVHç>.>‡N¹-ô*@ f3ü Dd3ùEXDfpÿ`ðBF0À|f¶-g6-f. -°­ l>¼B§?N¹˜\>¼/<>y?N¹,b\-g,>¼"/</ —4/-/ N¹3hßü°|g|ÿ-H€>€N¹9P:.—?<N¹¢TÀ|ÿ°|ÿf|ÿ>…-H€?N¹9 T>‡N¹-†>‡N¹-HJFf0``3üDd3ùEXDfpÿJŸLß àN^NuNVÿüN^NuNVHç*n0-À| °|f, -­<o >†/-?N¹,b\>¼Gg mpÿ`J-gJ­g-g;| `;|ÿ `>¼0- D@HÀ/?N¹˜\Bm +mB@JŸLß ÀN^NuNVHçN¹,þ>¾|ÿÿfpÿ`Ð>‡N¹-†0Áü´*@ÛüÅžJn fUJnfU.¼>o/.N¹=XXJ@f U0`†`.¼>t/.N¹=XXJ@fU0`d>¼/.?N¹8&\J@g>‡N¹-H3üDd3ùEXDfpÿ`0U>¼B§-H€?N¹˜\BWB§-H€?N¹˜\0JŸLß €N^NuNVÿüBW?. /.aþü\N^NuNVÿüBW?. /.aþä\N^NuNVÿü>¼?. /.aþÊ\N^NuNVHç>®N¹-ô*@ f3ü Dd3ùEXDfpÿ`v0.`F+n `P . Ñ­`F>®N¹^+@ - Ю +@`*3üDd3ùEXDfpÿ`*`J@g¶°|g¸°|g¼`ÖUÿßJ­l+|ÿÿÿÿ -JŸLß N^NuNVÿü>¼B§?.aÿB\N^NuNVHç>®N¹-ô*@ fpÿ`^0À|gB€`P-g +m `0-H€>€N¹9P<.—?<#N¹¢T>†-H€?N¹9 T <ÿÿÿÁ­0.-0S‡-gÖJ‡mʾ­gŽ-gF>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`–Uÿ¿>¼!/</ —4// N¹3hßü°|g3üDd3ùEXDfpÿ`R+G ï€+@Ií4Gí´`RŒ¹Ëd fô " Ò¼4Ñ­`B­` R€ï€+@+m U -JŸLß8ÀN^NuNVÿòHçKîÿò;|ÿ .+@+@;|‚:¼ÿÿ.Ž—/. / N¹ :P>.BgN¹%6T0JŸLß €N^NuNVýäHç*nBnýìJ® gh``BE-n ÿò`R®ÿòRE nÿòJg nÿò %fèJEo.®?/. N¹$Æ\-nÿò Ûnýì n %@ÀR® DÀfBnýê n H€°|-@ÀR® DÀf n R® Rnýê| ÿö¾<0fGÿö n R® =|ÿÿýð¾<*f-Mÿø nÿø=PýðT n R® `8`*JnýðlBnýðH€2.ýðÃü ÐAÐ|ÿÐ=@ýð n R® ¾<0m¾<9oÊ|ÿ¾<.f BF n R® ¾<*f-Mÿø nÿø<T n R® `*`H€2Ãü ÐA<Ü|ÿÐ n R® ¾<0m¾<9oØBnýè¾<lg¾<LfRnýè n R® Aîýò-HÿòH€` RnýèJnýèg <*Ô` <+Š#ÀEx.¹Ex?<?< /—ÿÿýò/ N¹*bßü Jnýègp`pHÀÛÀ`ÎRnýèJnýèg <*Ô` <+Š#ÀEx.¹ExBg?< /—ÿÿýò/ N¹*bßü Jnýègp`pHÀÛÀ`zRnýèJnýèg <*Ô` <+Š#ÀEx.¹ExBg?</—ÿÿýò/ N¹*bßü Jnýègp`pHÀÛÀ`&RnýèJnýèg <*Ô` <+Š#ÀEx.¹ExBg?</—ÿÿýò/ N¹*bßü Jnýègp`pHÀÛÀ`Ò-Mÿü nÿü-PÿòX`À-Mÿø nÿø0À|ÿ@ýòB.ýóT`¤H€>€?/—ÿÿýò/ N¹¶ßü X|ÿ`~H€>€?/—ÿÿýò/ N¹Êßü X|ÿ`XH€>€?/—ÿÿýò/ N¹Þßü X|ÿ`4.®H€?N¹%6TRnýì`Ö`|C°|5bÚå@0@ÑüC8 PNÐ.®ÿòN¹=*:¼ElJFm:0.ýðE=@ýîJnýêfX .0ÿöf* nÿò -f SE.® nÿòH€?N¹%6TR®ÿòRnýì`.®.ÿöH€?N¹%6TRnýì0.ýîSnýîJ@nÜ.®?/.ÿòN¹$Æ\Ûnýì`.®.ÿöH€?N¹%6TRnýì0.ýîSnýîJ@nÜ`û 0.ýìJŸLß àN^NuNVHç *n>. (n,g$Bl >‡/ ?N¹,b\°Gg lpÿ`*B@`&`.ŒH€?N¹%6T°|ÿÿfpÿ` 0SGJ@fÞB@JŸLß0€N^NuNVHç. *n Sm mH€"m€À|ÿR­``.H€?N¹%|TJŸLß €N^NuNVÿþHç. *n BF:-fpÿ`$J­fV-fN>¼N¹'F+@+@fm`2m>•N¹&ÊJ@gm@`;|þ H€"m€R­`È-gAîÿþ+H +@ m‡R­-gz>…/-?N¹,b\<Bm `n-g>¾< g -м°­b" -­:>…/-?N¹,b\<+mBm `( -­:>…/-?N¹,b\<;|ÿ +mºFg mpÿ`H€À|ÿJŸLß àN^NuNVHç>®N¹-ô*@ fB@`-fB@`pJŸLß N^NuNVHç>®N¹-ô*@ fB@`0À|JŸLß N^NuNVÿü>®a–J@g <>o`B€N^NuNVHç>.^GæORG>‡a*@ fB€` >‡/ a†XJŸLß €N^NuNVHç (yD*T`ZB@0-BA2-³@F@J@g>¼N¹*ZB€`:B@0-°ne `*»ùDf>®a¦*@ f>¼N¹*ZB€`(Mg; /*address register selects which register to write in register file */ char fill2, reg_file;/*data to registers goes here */ } crtc_map; #define CRTC_ADDR ((crtc_map *)0xf1a021) /*address of the CRTC */ #define CURHIGH 14 #define CURLOW 15 /* VARIABLE DECLARATIONS */ static int state; /* current state of screen driver */ static lscb scrn_tbl = { /* Logical Screen Control Table */ MAXLINES, /* current line */ 0, /* current column  */ 0, /* current cursor */ 0, /* base line */ 0, /* base column */ MAXLINES, /*max line on screen relative to base*/ MAXCOLS, /*max col for screen relative to base*/ /* tab stops */ 8, 8, 8, 8, 8, 8, 8, 8, 16, 16, 16, 16, /* 0-11 */ 16, 16, 16, 16, 24, 24, 24, 24, 24, 24, 24, 24, /* 12-23 */ 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, /* 24-35 */ 40, 40, 40, 40, 48, 48, 48, 48, 48, 48, 48, 48, /* 36-47 */ 56, 56, 56, 56, 56, 56, 56, 56, 64, 64, 64, 64, /* 48-59 */ 64, 64, 64, 64, 72, 72, 72, 72, 72, 72, 72, 72, /* 60-71 */ 79, 79, 79, 79, 79, 79, 79, 79 /* 72-79 */ }; static short mcurslin; /* move cursor - line position */ static short char_mask = {INITATTR};/*attribute & character mask */ char scrver[] = "screen driver 3.6"; cons_out(chr) char chr; /*7-bit ascii character */ { chr &= 0x7f; /*strip the high order bit */ switch ((int)state) /*perform action based on the current*/ { /*state of the screen handler. */ case any_char: /*waiting to accept any character (i.e. are not processing control sequence*/ switch (chr) { case ESC: /*received an character */ state = esc; break; case TAB: /*received a character */ scrn_tbl.cur_col = scrn_tbl.tabstop[scrn_tbl.cur_col]; pos_cursor(FALSE); break; case CR: /*received a carriage return */ scrn_tbl.cur_col = 0; pos_cursor(FALSE); /*position cursor per scrn_tbl*/ break; case LF: /*received a line feed */ /*at end of screen?*/ if (scrn_tbl.cur_line == scrn_tbl.max_line) scroll(UP, MAXCOLS); /* scroll up 1 line */ else scrn_tbl.cur_line++; /* cursor down 1 line */ pos_cursor(FALSE); /*position cursor per scrn_tbl*/ break; case BS: /*received a back space character */ /*at beginning of a line? */ if (scrn_tbl.cur_col == 0) { if (scrn_tbl.cur_line != 0) { /* not at first line of display */ /*place cursor at last column of previous line */ scrn_tbl.cur_line--; scrn_tbl.cur_col = scrn_tbl.max_col; } else break; /* at first line of display */ } else /* not at beginning of a line */ scrn_tbl.cur_col--; pos_cursor(FALSE); /*position cursor per scrn_tbl */ break; default: { /* character and attributes for RAM */ register short chr_attr; if (chr >= ' ') /* printable character? */ { /* chr in 16-bit template */ chr_attr = char_mask | (short)chr; /*place character on the screen */ (SCRN_ADDR[scrn_tbl.base_line+scrn_tbl.cur_line] [scrn_tbl.base_col+scrn_tbl.cur_col])=chr_attr; pos_cursor(TRUE); /* put cursor at next pos */ } } } /* end of switch(chr) */ break; case esc: /* process a control function sequence */ state = any_char; /* except position cursor is special */ switch (chr) { case 'A': /* cursor up a line */ if ( scrn_tbl.cur_line != scrn_tbl.base_line ) scrn_tbl.cur_line--; pos_cursor(FALSE); break; case 'C': /* nondestructive space */ pos_cursor(TRUE); break; case 'H': /* home cursor */ scrn_tbl.cur_col = scrn_tbl.base_col; scrn_tbl.cur_line = scrn_tbl.base_line; pos_cursor(FALSE); /* position the cursor */ break; case 'I': /* reverse line feed */ if ( scrn_tbl.cur_line != scrn_tbl.base_line ) scrn_tbl.cur_line--; else scroll(DOWN, MAXCOLS); pos_cursor(FALSE); break; c.ÿþH€>€aù|`ÿ|N^Nu#ùE€#ü|#ù”E„#üž”#ùE|#üVNu#ùE€#ùE„”#ùE|NuHçÿþNVÿüN¹|N^LßÿNs0<NDNu0<NDNu2Â|øÿ‚@>Ns0/ |ñŸã@ÐÀ0/NENu€Ns0/"/$/ NCNuNVÿþHç. 09EZ`~. H€`î3üEZ`ø0y@Ð"|@Î0˜H€3À@ÐBWan`ÖBy@ÐBWa^`Æ09@ΰy@Øf>¼OBgaøT`Ry@ÎBWa2`šJy@Ðf Jy@ÎgSy@Î3ù@Ú@Ð``t`Sy@ÐBWaú`b . mB>9A,. H€Ž@09@ÔÐy@ÎÁü 29@ÖÒy@ÐãAHÁÐмñp @0‡>¼a®`HÀ |A@r°˜WÉÿü hNÐ`ˆByEZ. H€`Ø09@ΰy@ÔgSy@ÎBWah`Ð>¼a\`Ä3ù@Ö@Ð3ù@Ô@ÎBWa>`¦09@ΰy@ÔgSy@Î`>¼O?<aÎTBWa`x=y@Îÿþ>¹@Ð?.ÿþadTRnÿþ`>¹@Ö?.ÿþaNTRnÿþ09@ذnÿþlà`6>¹@Ð?9@Îa*T`"3üEZ``HÀ |Apr°˜WÉÿü hNÐ`ˆ. H€Ð|ÿà3ÀE\ yE\o3üE\3üEZ`Z3ùE\@Î. H€Ð|ÿà@ .O o|O . H€3À@ÐBWa.ByEZ``J@gý€°|gþˆ°|g€°|g¦JŸL߀N^NuNVHçJng09@аy@ÚgRy@Ð>9@ÔÞy@ÎÏüPÞy@ÖÞy@Ðüñ !0H€Àñ #üñ !0à@H€Àñ #JŸL߀N^NuNVHç>9A,Ž| <9@ÚRFœn 0.Áü *@0. ã@HÀÛÀÛüñp:ÇSFfúJŸLß ÀN^NuNVHç JnfV:9@Ô>9@Ø<9@ÚRF0Áü *@09@Öã@HÀÛÀÛüñpRE0Áü (@09@Öã@HÀÙÀÙüñp:ÜSFfúSGf¸`T:9@Ø>9@Ø<9@ÚRF0Áü *@09@Öã@HÀÛÀÛüñpSE0Áü (@09@Öã@HÀÙÀÙüñp:ÜSFfúSGf¸89A,ˆ| 0Áü *@09@Öã@HÀÛÀÛüñp<9@ÚRF:ÄSFfúJŸLß0ðN^NuNVÿÞHç BWN¹+ø#ÀE`#ÀEdByE^.¼>ea>*n`v`RJgH€HÀмDz @fæJgZ "g 'fFH€>€/ R—N¹ìX(@ f.¼A°/ a~X HÀ> M2GÑÉBRG.R—aÆ`BG`RG M2GÑÉJg5pH€HÀмDz @gÞJ5pg M2GÑÉBRGH€`°BWN¹ŽBW/ R—N¹fXJ@g.R—/<AÂaøX`”>¼N¹Ž ->f@>¼/ T—N¹fX°|f>¼B§?<N¹˜\°|ÿÿf.R—/<AÏa¤X`$BW/ R—N¹ºX°|g.R—/<AÞa~X`.aØ`°|gÿr`æÚÇJfþˆB—a¶SyE^.¹EdN¹†°|ÿÿf.¼Aü/<Aía*XB—/9E`?9E^N¹¢\>€N¹ìJŸLß0ÀN^NuNVÿ|.®/—ÿÿÿ€N¹=X.® /—ÿÿÿ€N¹<ÞX.¼Aý/—ÿÿÿ€N¹<ÞX.Ž—ÿÿÿ€?< N¹¢T>¼ÿÿN¹ìN^NuNVHç*n yEd X¹EdRyE^JŸLß N^NuNVÿüN^NuNVÿüN^NuNVÿü.¹BN¹N^NuNVÿü.¹BN¹N^NuNVÿü.¹BN¹N^NuNVÿü.¹BN¹N^NuNVHç*n(n BG`¾|lRG0Áü&@×üBX0+À|fà¾|mB€`Ô wg Wf>®?</ N¹ì\<`p ag Af>>®?</ N¹Z\<l>®?</ N¹ì\<`>¼B§?N¹˜\`$ rg Rf>®Bg/ N¹Z\<`B€`@JFlB€`8Bk 6†B€'@'@ rg Rf7|`7|Jnfk JŸLß8ÀN^NuNVÿüBW/. /.aþÔPN^NuNVÿüBW/. /.aþ¼PN^NuNVÿü>¼/. /.aþ¢PN^NuNVHçN¹-dBW/<>oN¹NX>¼/<>oN¹NX>¼/<>oN¹NX n2n ÑÉB*n`&H€HÀмDz @g H€Ð| `H€€RJfÖ>® /.N¹ XJŸLß N^NuNVÿ4.¼B/—ÿÿÿ8N¹=X.®/—ÿÿÿ8N¹<ÞX.¼B6/—ÿÿÿ8N¹<ÞX.Ž—ÿÿÿ8?< N¹¢T>¼ÿÿN¹ÆN^NuNVHç*nSm m mH€À|ÿR­` `.N¹¢JŸLß N^NuNVHç*n-fpÿ`Ô-g m pÿ`ÀJ­f&-f>¼N¹'F+@fm`m-g0HÀмEh+@»üBXf9Big .¼BfN¹À-g>¼`>¼/-?N¹˜\;@ Jm n mÿÿ fm0`m pÿ`Sm +m mH€À|ÿR­JŸLß N^NuNVHç>®N¹-ô*@ fpÿ`‚-gB@`t-g3ü Dd3ùEXDfpÿ`T-g>®/. / N¹ÞP`8-gB€0..€/. / N¹@P``B€0..€/. / N¹ŽPJŸLß N^NuNVÿöHç*n(n ..-Gÿö` -î€-@ÿú -°®ÿúgŽ-gF>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`ÊUÿ¿>¼!/</ —4/.ÿú/ N¹3hßü°|gU .ÿö‡`Ž+nÿú&M -À|HÀ×À×ü4`FSÿþ .ÿþfU -°­ o+m .ÿö‡`H` . ÿþfR‹R­` îÿþS‡R‹R­ м´·ÀdJ‡nªJ‡nþî -°­ o+m .ÿöJŸLß8€N^NuNVÿôHç*n(n ..-Gÿô -î€-@ÿü -À¼gò -°®ÿüg˜-gF>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`ÂUÿ¿>¼!/</ —4/.ÿü/ N¹3hßü°|g3üDd3ùEXDfpÿ`|+nÿü&M -À|HÀ×À×ü4`ÛS‡R­ м´·ÀdJ‡nèJ‡f -°­ o+m .ÿô`,R®ÿüB† î€-@ÿøJ®ÿøo >¼!/.ÿø/ /.ÿü/ N¹3hßüHÀ,Ý®ÿü ï€Ñ­ € ï€ÙÀ -°­ o+m ¼®ÿøgU .ÿô‡`¼J‡f .ÿô`°-gD>¼"/</ —4/-/ N¹3hßü°|g3üDd3ùEXDfpÿ`fUÿ¿>¼!/</ —4/.ÿü/ N¹3hßü°|g U .ÿô‡`,+nÿüß­Gí4`ÛS‡J‡nø -°­ o+m .ÿôJŸLß8ÀN^NuNVþöHçase 'J': /* clear display from cursor */ { int line; line = scrn_tbl.cur_line; clr_line(line++,scrn_tbl.cur_col); while ( line <= scrn_tbl.max_line ) clr_line(line++,scrn_tbl.base_col); } break; case 'K': /* clear line from cursor */ clr_line(scrn_tbl.cur_line,scrn_tbl.cur_col); break; case 'Y': /* position cursor */ state = curs_line; /* next comes cursor line */ break; } break; case curs_line: mcurslin = chr - ' '; /* save new line position */ if ( mcurslin > MAXLINES ) mcurslin = MAXLINES; /* limit it */ state = curs_col; /* next comes cursor column */ break; case curs_col: scrn_tbl.cur_line = mcurslin; /* update cursor position */ chr = chr - ' '; if ( chr > MAXCOLS ) chr = MAXCOLS; /* limit position */ scrn_tbl.cur_col = chr; pos_cursor(FALSE); /* move it */ state = any_char; break; } /* end of switch(state) */ } pos_cursor(incr) short incr; { register short curpos; /*byte offset to cursor postion */ if (incr) /*bump cursor 1 postion or does screen table already have correct position?*/ { /*bump cursor */ if (scrn_tbl.cur_col != scrn_tbl.max_col) /*end of line?*/ scrn_tbl.cur_col++; /*no, bump cursor position*/ } curpos = (scrn_tbl.base_line + scrn_tbl.cur_line) * (MAXCOLS + 1) + (scrn_tbl.base_col + scrn_tbl.cur_col); CRTC_ADDR->addr_reg = CURLOW; CRTC_ADDR->reg_file = (char)curpos; CRTC_ADDR->addr_reg = CURHIGH; CRTC_ADDR->reg_file = (char)(curpos >> 8); } clr_line(line,col) /* clear to end of line starting at col */ int line, col; { register short chr_attr; /* attribute & character */ register int j; register short *p; /* address of character */ /*set up to move blanks to screen RAM*/ chr_attr = char_mask | 0x0020; j = scrn_tbl.max_col + 1 - col; /*decremented for each char */ /*address of 1st charactr*/ p = &(SCRN_ADDR[line][col]); do { /*write blanks to line */ *p++ = chr_attr; /*write blank to a char pos*/ } while (--j); } scroll(direction, num_chrs) int direction; /*direction to scroll the screen */ int num_chrs; /*number of characters to scroll */ { register int i, j, line; register short chr_attr; /*attribute & character */ register short *p1, *p2; /*address of character */ if (direction == UP) /*scroll screen text up */ { line = scrn_tbl.base_line; /*used to step down lines */ i = scrn_tbl.max_line; /*decremented for each line */ do { j = scrn_tbl.max_col + 1; /*decremented for each char */ /*address of 1st charactr*/ p1 = &(SCRN_ADDR[line++][scrn_tbl.base_col]); p2 = &(SCRN_ADDR[line][scrn_tbl.base_col]); do { /*move a line at a time */ *p1++ = *p2++; /*move character up a line */ } while (--j); } while (--i); } else /*direction == DOWN*/ { line = scrn_tbl.max_line; /*used to step up lines */ i = scrn_tbl.max_line; /*decremented for each line */ do { j = scrn_tbl.max_col + 1; /*decremented for each char */ /*address of 1st charactr*/ p1 = &(SCRN_ADDR[line--][scrn_tbl.base_col]); p2 = &(SCRN_ADDR[line][scrn_tbl.base_col]); do { /*move a line at a time */ *p1++ = *p2++; /*move character up a line */ } while (--j); } while (--i); } chr_attr = char_mask | 0x0020; /*move blanks to screen RAM*/ /*address of 1st character */ p1 = &(SCRN_ADDR[line][scrn_tbl.base_col]); j = scrn_tbl.max_col + 1; /*decremented for each char */ do { /*write blanks to a line */ *p1++ = chr_attr; /*write blank to a char pos*/ } while (--j); } r each char */ do { /*write blanks to a line */ *p1++ = chr_attr; /*write blanééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééation */ cr6 = VME_CR6; ibpins = ibuff; ibpext = ibuff; ichar = NO; oblkd = NO; iblkd = NO; flag = NO; setivecs(); /* enable interrupts */ AUX_CTL = 1; /* select ser port cr1 */ AUX_CTL = RXINTEN; /* enable RX interrupts */ setvmecr(6, cr6 | INT3EN); /* enable I/O chan INT3 */ /* main loop */ while (YES) { if ( ichar ) { c = sgetc(); if ( c == CMD ) rcmd(); else if ( flag ) fputc(c,ochan); else cons_out(c); } else if ( MBIOS(CONS_ST,0,0) ) { if ( (c = kgetc()) == CMD ) cmd(); else sendc(c); } } } s_out(c); } else if ( MBIOS(CONS_ST,0,0) ) { éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé`>Vú‹ŽB…N¹>F`FCLEAR68K V02.00, Copyright(c) 1984, Digital Research XXXX-0000-654321 o#ÈEP"hÓè#ÉETE耀ÿ?/ ÎN¹lNùÆ o Aè¿ÈdpÿNu#ÀETB€NuNV0/"/ NB¿ùETd0< Aù>V"NB0<NBN^Nu o2/0/ HÀS€oÁQÈÿüB€Nu o0/JfB€Nu°fô S€NuNVÿú`F .\ÿþf0 nH€@ÿþ°|n@ÀR®DÀf| ÿþ` .rÿþf| ÿþ.ÿþH€>€N¹² nH€@ÿþR®J@f¦N^NuNVÿü . g . gJyŘfø9ñÁÍH€À|gòî ñÁÉN^NuNVÿúJyEŒgZ 9Å”°¹Eˆd* <ÿ"9Eˆ’¹Å”°¼ôo >¼aŽByEŒ`" 9Å”¹Eˆ°¼ôo>¼aÿlByEŒJyEŽgø yÅ”PÿþN¹l 9Å”°¼Å“@ÀR¹Å”DÀf #üE”Å” 9Å”°¹EˆfByEŽN¹t.ÿþH€N^NuNVÿüB—B§?<N¹¢\N^NuNVÿú`ÞyñÁÉÿþ .ÿþf 3üŘ`Z .ÿþfByŘ`JJyEŽg 9Å”°¹Eˆg4 yEˆ®ÿþ 9Eˆ°¼Å“@ÀR¹EˆDÀf #üE”Eˆ3üEŽJyEŒf` 9Å”°¹Eˆd. <ÿ"9Eˆ’¹Å”°¼,l>¼aþ:3üEŒ`$ 9Å”¹Eˆ°¼,l>¼aþ3üEŒ9ñÁÍH€À|fÿü8ñÁÍN^NuNVÿú nN@ÿþ n ®ÿþR® . ÿþg . ÿþgSnfÔS® n BN^NuNVÿ„JyÅœfŒ .°¼df .¼>zaý*>¼(/—ÿÿÿØ/.aŒP.¼>Š/—ÿÿÿØN¹"XHÀ#ÀEf .¼>Œaüì`>3üÅœ.Ž—ÿÿÿØ/<>¨/—ÿÿÿˆN¹âP.Ž—ÿÿÿˆaü¸` .¼>¾aü¬N^NuNVÿü yÅœf*ByÅœ.¹EN¹6.¹EN¹À.¼>×aür` .¼>ðaüfN^NuNVÿüüñÁÍB9ñÁÍ>¹Åš?<N¹ˆTN¹6BWN¹ìN^NuNVÿü.¼? aü.¼?$aüN^NuNVÿúaýfÀ|_@ÿþ.ÿþH€`a”`0.¼daþž`$aÿ>`a´``°|Cgî°|Hgî°|OgÖ°|QgÌN^NuNVÿ|>¼(/—ÿÿÿØ/< aþP.¼?//—ÿÿÿØN¹"XHÀ-@ÿ€f6.Ž—ÿÿÿØ/<?1/—ÿÿÿˆN¹âP.Ž—ÿÿÿˆaû\>¼aû¸` .Ž—ÿÿÿØ/<?N/—ÿÿÿˆN¹âP.Ž—ÿÿÿˆaû&.®ÿ€N¹j@ÿ†` .ÿ†H€>€aûnnÿ†ÿ„.®ÿ€N¹j@ÿ† .ÿÿÿ†g .ÿ†fÐ . ÿ„g . ÿ„g>¼aû2>¼aû*.®ÿ€N¹6.¼?iaú²N^NuNVÿúaû@À|_@ÿþ.ÿþH€`.¼ aý@` aýà`aþÂ``°|Cgì°|OgÚ°|UgæN^NuNVÿú.¼?€aúX.¼?…aúN.¼?°aúD.¼?ãaú:aþ .¼@ aú,.¼@,aú".¼@^aú.¼@iaú.¼@˜aú9ñŸH€3ÀÅš#üE”Eˆ#üE”Å”ByEŽByŘByEŒByÅœN¹øüñÁÍüñÁÍ>¹ÅšW ?<N¹ˆT`„JyEŽgFaú(@ÿþ .ÿþfaþÒ`.JyÅœg.¹E.ÿþH€?N¹%6T`.ÿþH€>€N¹²`4B—B§?<N¹¢\J€g aú’@ÿþ°|faý` * @(#)booter.s 1.6 * ************************************** * Information to go on track 0 and * * start of boot of a VME/10 * ************************************** .text first: .dc.l 'CP/M' * volume identifier .dc.l 0 * user number .dc.w 1 * garbage .dc.w 1 * length of SAT .dc.l 2 * secondary directory start .dc.l 0 * primary directory PSN list start .dc.l 8 * start of boot loader .dc.w 32 * length of boot loader .dc.l $0 * boot execution address .dc.l $1300 * boot load address .dc.b '9/30' * generation date .dc.b 'CP/M-68K of 9/30/82 ' * volume descriptor .dc.b '0020' * version/revision .dc.w $0a484 * checksum (god help us) .dc.l $0f1e2d3c * diagnostic test pattern .dc.l $4b5a6978 .dc.l $8796a5b4 .dc.l $c3d2e1f0 .dc.l $0f1e2d3c * diagnostic test pattern .dc.l $4b5a6978 .dc.l $8796a5b4 .dc.l $c3d2e1f0 .dc.l $f1f2f4f8 * diagnostic test pattern .dc.l $f9fafcfe .dc.l $ff7fbfdf .dc.l $ef6fafcf .dc.l $4f8f0f07 * diagnostic test pattern .dc.l $0b0d0e06 .dc.l $0a0c0408 .dc.l $04020100 .dc.l 0 * diagnostic test area directory .dc.l 0 * start of dump area .dc.w 0 * length of dump area .dc.l 0 * start of sector lockout table .dc.w 0 * length of sector lockout table .dc.l 1 * configuration parameters sector .dc.b 1 * length of config area (sectors) .dc.b 0,0,0 * unused reserved .dc.l 0,0,0,0,0 * unused, reserved .dc.l 0,0,0,0,0,0 .dc.l 0,0,0,0,0,0,0 .dc.l 0,0,0,0,0,0 .dc.b 'EXORMACS' * let's hear it for Motorola * * end of volume id * * begin configuration area * .dc.l 0,0 * reserved .dc.w $0f * attributes word .dc.w 0 * reserved .dc.l 0,0,0 .dc.b 8 * sectors per track on disk .dc.b 2 * sides on disk .dc.w 80 * cylinders on disk .dc.w 0 * reserved * * WARNING: the following word is modified by * putboot for the hard disk. It must remain * at this offset. * .dc.w 512 * sector size .dc.l 0 * reserved .dc.w 40 * precompensation cylinder .dc.l 0 * reserved * * end configuration area * .ds.b $800-(*-first) * skip rest of first track * * begin boot info proper * .globl _bootdsk .even .dc.l $4000 * stack pointer .dc.l start * program counter start: move #$2700,sr move.w d0,_bootdsk and.b #$fc,$f19f05 move.b #$10,$f19f09 clr.b $f19f0b move.b #$80,$f19f11 .end : move #$2700,sr move.w d0,_bootdsk and.bééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé( (long)(ibpext - ibpins) > 500 ) { sendc(XON); iblkd = NO; } while ( !ichar ) ; ch = *ibpext; seti(); if ( ibpext++ == ibuff + SIZE ) ibpext = ibuff; if ( ibpext == ibpins ) ichar = NO; clri(); return(ch); } /* get character from keyboard */ char kgetc() { return(MBIOS(CONS_IN,0,0)); } /* serial port interrupt handler */ /* assumes only input interrupts */ serint() { char ch; while ( AUX_ST & RXCHAR ) { ch = AUX_CH; if ( ch == XOFF ) oblkd = YES; else if ( ch == XON ) oblkd = NO; else if ( !ichar || (ibpext != ibpins) ) { /* if buffer was full we lose char */ *ibpins = ch; if ( ibpins++ == ibuff + SIZE ) ibpins = ibuff; ichar = YES; } if ( !iblkd ) /* WARNING: sending char with ints disabled could lose input? */ if ( ibpext < ibpins ) { if ( SIZE - (long)(ibpins - ibpext ) < 300 ) { sendc(XOFF); iblkd = YES; } } else if ( (long)(ibpext - ibpins) < 300 ) {  sendc(XOFF); iblkd = YES; } } /* send end of interrupt to ser port */ AUX_CTL = EOI; } /* get string */ lgets(lgetc,fn,i) char (*lgetc)(); char *fn; { char c; do { c = (*lgetc)(); *fn++ = c; } while ( (c!=CR) && (c!=LF) && (--i) ); *(--fn) = 0; } /* open buffer */ opn(lgetc) char (*lgetc)(); { char fname[40]; char ostr[80]; if (flag == NO) { if ( lgetc == kgetc ) lprint("\n\rOPEN: file = "); lgets(lgetc,fname,40); if ( !(ochan = fopen(fname,"w")) ) { lprint("\n\r\n\r"); return; } flag = YES; sprintf(ostr,"\n\r\n\r",fname); lprint(ostr); } else lprint("\n\r\n\r"); } /* close file */ clos() { if (flag == YES) { flag = NO; fclose(ochan); fflush(ochan); lprint("\n\r\n\r"); } else lprint("\n\r\n\r"); } /* quit */ quit() { /* disable interrupts */ AUX_CTL = 1; /* select ser port cr1 */ AUX_CTL = NOSINTS; /* disable ser port ints */ setvmecr(6,cr6); /* restore vme/10 cr6 */ resvecs(); /* restore interrupt vectors */ exit(0); } /* help */ help() { lprint("\n\rlose\n\relp\n\rpen"); lprint("\n\ruit\n\r"); /* lprint("ransmit\n\r");*/ } /* get and process keyboard command */ cmd() { char c; c = kgetc() & 0x5f; /* make it UC */ switch ( c ) { case 'Q': quit(); break; case 'O': opn(kgetc); break; case 'C': clos(); break; /* case 'T': xmit(); break;*/ case 'H': help(); break; } } /* upload to remote */ up() { char fname[40]; char ostr[80]; char c, lastc; long chan; lgets(sgetc,fname,40); if ( !(chan = fopen(fname,"r")) ) { sprintf(ostr,"\n\r\n\r",fname); lprint(ostr); sendc(0x03); /* ^C to end upload */ return; } sprintf(ostr,"\n\r\n\r",fname); lprint(ostr); c = fgetc(chan); while ( !((c == -1) || (c == 0x1a /* ^Z */)) ) { sendc(c); lastc = c; c = fgetc(chan); } if ( !((lastc == 0x0a) || (lastc == 0x0d)) ) sendc(0x04); /* takes 2 ^D's to end */ sendc(0x04); /* ^D to end upload */ fclose(chan); lprint("\n\r\n\r"); } /* get and process remote command */ rcmd() { char c; c = sgetc() & 0x5f; /* make it UC */ switch ( c ) { case 'O': opn(sgetc); break; case 'C': clos(); break; case 'U': up(); break; } } /* main terminal loop */ main() { char c; lprint("\033H\033J"); /* home, clear */ lprint("\n\rterminal/download/upload program - 3.5\n\r"); lprint("\n\rCommands are ^A followed by another character.\n\r"); lprint("\n\rLocal (from keyboard) commands are:"); help(); lprint("\n\rRemote (from host) commands are:"); lprint("\n\rpen (download file)\n\rlose (download file)"); lprint("\n\rpload"); lprint("\n\rCommands 'o' and 'u' expect a CP/M filename."); lprint("\n\rUpload terminates with ^D (normal) or ^C (error).\n\r"); /* initializ`dH r>Ì*NùLNùF CP/M-68K V1.2 COPYRIGHT (C) 1982,1984, Digital Research B9nºOùvzB9nºN¹J83Ào>B9v B9o@B9oBü¬²ByoÀByoÂN¹IæN¹)²0< B9o>NBB€0<B29o>AÿNBOùvzN¹"`òpr$<BHçàNCLßRAX‚ Afr A"gì A#gæ A0mÖpNC @JX"$Ô&9¬†(9ª^p o#Èo¨²b´c¶b ¸cBJ˜QÈÿâNua–a’aîaêaæaâa¸aÚaÖaÒaÎaÊaÆaÂa¾aºa¶a²a®aªa¦a¢ažaša–a’aŽaŠa†a‚a~azavaranajafab/o*?o .o./o0?o4?o6/o8?o <ßü*`(H瀀 o0@ÿÀ @@ÀfPLßJŸNsLßBgH瀀 / ¼F @$o @Xm( @tn @0 yo¨ÐÀJf` @(m@0Þüä@ @lLßJ_T@ @oP@?AùdHa 0a¾AùdWa ašAùdja€B€NBNs @m0/ f’/P Nh!/1/N`Lß/oBo \OWÿNs/ fÿd/P Nh!/1/!/!/N`Lß/oBoÞüWÿNsBg/BgNsBgpNB`òNu?H@a0?àHa0?èHa0@ @ m02pNBNu0/"/NBNu"<oÂ0<?NB#ùoÄo°#ùoÈo´#ü­bo¬p;"<o¬NBJ@f’29¬Šp NBB"9o¸Ò|€"ApNB$IR‰ yw’B€ g !gØR@`/<­b?<N¹ ’\B€p\a>/<­b?<N¹ ’\B€p8a& yo¼"yo¸! !<lN` iNùBNupNBйo¸ @"|­bB€p#ÙQÈÿüNuNVÿü.¼ ?<N¹”T.¼ ?<N¹”TN^NuNVHç *n(n ÝfüJŸLß0N^NuNVHç *n(n `H€°op`H€°lpÿ`RRŒJfàJfB@`pÿJŸLß0N^NuNVHç*n&|¨äJ9¬´g(|w˜`ÜJfúü B9¬´`ÝJg !fôBJŸLß8N^NuNVÿüHç.¼ÿ?< N¹”T<B—?<N¹”T>Þ|AaþòJFgB¼| e|1ÿüB@0Ð|&@ÿý|$ÿþ`B@0Ð|0@ÿü|$ÿý.ŽY—?< N¹”TB€0.€?<N¹”T.¼>?<N¹”TJŸLßÀN^NuNVHç*n>. ¾|fJ9nºgJ9¬²faÿ0`H€HÀ.€?<N¹”TJg !fâJGf.¼??<N¹”T`aþJŸLß €N^NuNVHç*nBG`.*n Bx ` M“É2DÑÉBRD¸|#cîx` M“É2DÑɼ RD¸| cìJ9­^g<?`< Byc„(MB@0Àüмw˜B29c„Ð @Jf8RŒz`ÆREº| cöB—?<N¹”TR@€J9­^gp `|`B@`tB@0Àüмw˜B29c„Ð @ (:fpÈ0yc„BA2ÂüÒ¼w˜0H€Ð|ÿÀ€Tyc„B@0Àüмw˜B29c„Ð @Jf(Iíz`ÆREº| cöJ9­^gp `ì`B@`ä`B—?<N¹”TR@€(MRŒz`"B@0Àüмw˜B29c„Ð.€aþRÀREº|cØ`Ryc„B@0Àüмw˜B29c„Ð.€aýàJ@gØB@0Àüмw˜B29c„Ð @ .f2Ryc„z`"B@0Àüмw˜B29c„Ð.€aýÖÀREº|cØBDz` M“É2EÑÉ ?fRDREº| cèB@0JŸLß0ðN^NuNVÿüJ9wÔg$.¼eœ?< N¹”TBW/<wÔaù(Xp`B@N^NuNVHçBG`RG |w˜J0pgÈ0GÑüw˜ (:fàB@0JŸL߀N^NuNVÿü |w˜“É2nÑÉ (:f. nf 9Aw¶m 9Pw¶oBW/<w¶aø XB@`pN^NuNVÿøHç?>.BnÿøB.ÿþaÿ,J@fðaÿX6>ƒaŠJ@gà.¼­b?<aüÜT9­bH€Ð|@=@ÿú.¼­b?<N¹”T<¼|ÿf.¼e ?< N¹”T8ëLRDBE`LJGgÈ0DÑüx( fJGf:È0DÑüx( f(J.ÿþgaöTB.ÿþJEfB€0.ÿú.€?<N¹”T`=|ÿø>¼N¹”<8ëLRD`ÜëNRF.¼:?<N¹”T.¼ ?<N¹”Tv`<¶| f.¼ ?<N¹”T |x0`H€À|HÀ.€?<N¹”TRFRC¶| c¾.¼ ?<N¹”T>¼N¹”<¼|ÿgPRE8ëLRDº|f:BEJGgÈ0DÑüx( fJGfÈ0DÑüx( faõH`|ÿþ¼|ÿfþ°Jnÿøg.aõ.JGg.¼d¦?< N¹”T`.¼dª?< N¹”TJŸLßøN^NuNVHçJ9w¶f$.¼dÀ?< N¹”T.¼/<w¶aøXaüöJ@fîaý">>‡aýTJ@gÜ.¼ .globl _init _init: .equ $1b000 * 0 length bios .globl _init _init: .equ $1b000 * 0 length bios ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé /* @(#)term.c 3.5 */ /* * terminal/download/upload program * * this version uses interrupts on the serial input. * it also uses a vt52 emulator to display characters on the screen. * the pen commands have been changed to accept a file name. * saved input is now sent directly to CP/M without term buffering. */ /* interface to BIOS */ long BIOS(); #define MBIOS(a,b,c) BIOS((int)a,(long)b,(long)c) #define CONS_ST 2 #define CONS_IN 3 /* aux port status reg and char available flag */ #define AUX_ST (*(char *)0xf1c1cd) #define RXCHAR 1 #define TXMPTY 4 /* aux port control reg */ #define AUX_CTL (*(char *)0xf1c1cd) #define EOI 0x38 #define RXINTEN 0x18 #define NOSINTS 0 /* aux port I/O */ #define AUX_CH (*(char *)0xf1c1c9) /* VME/10 control register 6 */ #define VME_CR6 (*(char *)0xf19f11) #define INT3EN 0xa0 #define CR 13 #define LF 10 #define CMD 01 #define XON 0x11 #define XOFF 0x13 #define YES 1 #define NO 0 #define SIZE 32767 int flag; /* saving to file */ long ochan; /* output channel saving to */ char ibuff[SIZE]; /* serial input buffer */ char *ibpins, *ibpext; /* insert into and extract from buffer pointers */ int ichar; /* flag indicating character available in buffer */ int oblkd; /* flag blocking serial output */ int iblkd; /* flag indicating serial input blocked */ int cr6; /* original vme/10 cr6 contents */ /* local print string */ lprint(str) char *str; { char c; while ( c = *str++ ) { if ( c == '\\' ) {  if ( (c = *str++) == 'n' ) c = 0x0a; else if ( c == 'r' ) c = 0x0d; } cons_out(c); } } /* send character to serial port */ sendc(ch) char ch; { if ( !((ch == XON) || (ch == XOFF)) ) while ( oblkd ) ; while ( !(AUX_ST & TXMPTY) ) ; AUX_CH = ch; } /* get character from serial buffer */ char sgetc() { char ch; if ( iblkd ) if ( ibpext < ibpins ) { if ( SIZE - (long)(ibpins - ibpext) > 500 ) { sendc(XON); iblkd = NO; } } else if ­b?<aú¤T>JGf’J9w¶gˆ.¼­b?<N¹”T°|bn`.Ž—ÿÿÿÜ?<a÷ºT>.¼­b?<a÷¨T<JGfJFfú.ÿÜH€°9­bg> 9:w·f 9:wóg îÿÜ­b` 9:w·g 9:wóf y­bÿÜ`x .ÿÜm .ÿÜoxJDf..Ž—ÿÿÿÜ?<N¹”T°|ÿg.¼dö?< N¹”T`fBE~`È0GÑü­b"N•Ê4EÓÊ©ÿÜRERG¾|#càJ9­bm 9­boxJDf(.¼­b?<N¹”TJ@c.¼e ?< N¹”T`.¼e?< N¹”TJDg.¼e.?< N¹”TJŸLßðN^NuNVHçJ9w¶f$.¼dÀ?< N¹”T.¼/<w¶aóüXJ9w¶gaøXJ@føaø„>>‡aø¶J@gæ 9:w·fJ9w¸fBW/<w¶añrX`Â.¼­b?<aõâT>JGcxJ9o@fn.¼eL?< N¹”TB—?<N¹”TÀwÔ 9awÔm 9zwÔn9wÔH€Ð|ÿà`9wÔH€ÀwÔaïn 9NwÔg 9YwÔf2 9NwÔg(.¼­b?<N¹”TJ@c.¼e ?< N¹”TJŸL߀N^NuNVHçJ9w¶f$.¼e\?< N¹”T.¼/<w¶aò´XJ9w¶fp`€a÷ J@gp`r 90w¶m 99w¶oB@`X9w¶H‡Þ|ÿо| cB@`BJ9w·gÎü 9w·H€Þ@Þ|ÿо|dJ9w¸fB€0.€?< N¹”T`B@`pJŸL߀N^NuNVÿôHç B9­^üv B.ÿþB.ÿøB.ÿúB.ÿü.¼ÿ?< N¹”T3À¬ŠB—?<N¹”T3Àw– n fBG`~.¼­b?aóðT>JGc.¼e?< N¹”TB@`ˆ(|p*T 9 ­kf,`B@@ @Ùü TJfê9­bH€S@HÀ.€?<N¹”Tü?­bB9­n.¼­b?<N¹”T>`òëOÈ0GÑüxJg |x0pH€°y¬ŠfÀ| `È0GÐÆÑüxRF¼| cèÈ0GÑüxB( (|p`„.¼­k/aí"XB@0H@B@H@мx.€R—/<­caí XJ@fJ|ÿø |x0pH€°y¬Šf|`|  n f./aìâXJ@f J,g|ÿþÙü TJfÿx>¼N¹”>¾|ÿgJ.ÿþgÿJ.ÿøfD nf.¼en?< N¹”Tü­^B9v B€09w–.€?<N¹”TB@`Ô n f.¼­bBgaòT`.¼­b?<añöT(|p`,J,fJ, g n g.¼f¾/aìXJ@g Ùü TJfÎ TJg"J,fB—?< N¹”T.¼­k/aë¸XB€09w–.€?<N¹”T`.¼­b?<N¹”T°|bÊ| `È0FÑü­bRF¼| cê 9S­kf’ 9U­lf† 9B­mfz|ÿú.¼ÿ?< N¹”T3À¨âJ9o@g ü­R`üª\BG`È0GÑü©f’É2GÓü­b‘RG¾|$eâ n fB9¬´üo@B9¬¸` ng|ÿü`*`$.¼ÿ?< N¹”TJ@gB—?< N¹”T`þøJ.ÿügÂ.¹­@aíšJ.ÿøf&(|p`.¼­k/aê„XJ@g Ùü TJfâ TJg-lÿô`-| ÿô/9­@ nÿôNX`P.¼e²?< N¹”T`P.¼eÚ?< N¹”T`<.¼eö?< N¹”T`(.¼f?< N¹”T`°|gª°|g¸°|gÆ`ØJ.ÿúf nf.¼en?< N¹”TB€09¬Š.€?< N¹”Tü­^B9v B9oBJ.ÿúf J.ÿüfB@`pJŸLß0ÀN^NuNVÿü.¼©f?<N¹”TJ@g ü¬¸B@`pN^NuNVHç? >.<. *n 89vˆ¾|€eBGa°J@fB@0`È0GÑüªb 0m¶È0GÑüªb 9n¤ |ªb0pH€6Ö|ÿÐ(M Sf& Uf Bf Mf If Tf  fRC(Mz``RŒ  gJfô  fRŒREºCcä`*¼|fÈ0DÑü¬ºœRD`H€HÀ.€?<N¹”T  g Jg¸|€eÆRG`<¼|fÈ0DÑü¬º¼$RD`.¼$?<N¹”TÈ0GÑüªb $fRG3Ävˆ¾|€eBGaþ’B@0JŸLß0øN^NuNVHç>.*n BFaè€`@È0GÑüªb $fRG.Bg?aþ|X>` |ªb0pH€HÀ.€?<N¹”TRG¾|€d È0GÑüªb gÈ0GÑüªb  fš¾|€f.È0GÑüªb gÈ0GÑüªb  gBGaýÚJ@f|`*È0GÑüªb  fTG¾|€eBGaý´`ü¬¸|JFgÿ6B@0JŸLß ÀN^NuNVHç *nBG:9vˆ`ú |ªb0PH€`Ô.?aþâT:`ÚJGcÈ0GÑü¬º’É2EÓüªb‘RERG`REº|€d È0EÑüªb  gèÈ0EÑüªb  gغ|€eBEaýJ@f``Â`zRE3Çvˆ.?<?aýX:>9vˆ`XREº|€eBEaüÎ`Hü¬¸`>È0GÑü¬º’É2EÓüªb‘RERGº|€eBEaüœ`HÀ |f¼aì˜`&aî¦`aïÒ`aó*`aôjJ@f.¼e„?< N¹”T`ð9w˜H€Ð|ÿ¿HÀ.€?<N¹”T`Ð|J9w¶f†.¼dÀ?< N¹”T.¼/<ªbaææXBG`È0GÑüw˜’É2GÓüªbQRGÈ0GÑüªb  g |ªbJ0pg¾|eÄÈ0GÑüw˜B(JGg ü¬´``@`B9¬´`| >†aôZJ@f*¼|g$BW/<w˜aäX`°| bêå@0@Ñüft PNÐJŸLß ÀN^NuNVHçü­^.¼x?<N¹”TJ9v g2B€09w–.€?<N¹”TB€09¬Š.€?< N¹”TB9v J¹¨¶g(*y¨¶R M"y¨¶HÂ|ÿHÁÑÁBB¹¨¶`®J9oBg`J9o@g:*|¬º.¼¨äaüØ`"J9¬¸g*y¬¤B9o@`` .¼¨äaü´JgÚ`*y¬¤B9oBJg >¼/ aãX`DaâX*|n»J9nºg J9¬²g>¼/<n»aâÜXB9¬²`.¼€/<n»aåX`Þ#Í­@.aæJ9w˜g 9;w˜g .¼w˜aýDJ9o@f .aå¨*@`’*|¬ºJ9ª\fJ9­RgPJ9¬´g .¼ªbaád` .¹­@aáXJ9ª\g.¹­@aå\#À¬¤.¼¨äaû¶B@À­RÀª\`B`"J9¬¸g*y¬¤B9o@`` .¼¨äaû€JgÚJg >¼/ aáâXJfÿ JŸLß N^Nu @>g,Hçþ @2g/??N¹?|HÀPOLßþNs A0LØNC`îW Ns$/` 4/`"/`2/0/HçNCLßxøNu/áH/Nu /€ï o H@0€B@H@NuNVÿüJ9v¢gp` >¼N¹$ŽN^NuNVHçB>¼N¹$ŽJ@gr>¼N¹$ް|f >¼N¹*V¾<f<`D¾<fB`:¾<fJ9v¤gB@`pÀv¤` 9~v¢l yw ‡R¹w R9v¢JfJŸLßÀN^NuNVHç. aÿ^H€>€?<N¹$ŠTJ9v¤gH€>€?<N¹$ŠT¾< eRyv¦`¾< fByv¦` ¾<fSyv¦JŸL߀N^NuNVHç. ¾< f>¼ aÿzB@09v¦À|fê` H€>€aÿ`JŸL߀N^NuNVHç. ¾< f H€>€a¨`¾< d >¼^aÿ,Ž<@H€>€aÿJŸL߀N^NuNVHçJ9v¢g4 ywR¹wS9v¢J9v¢f <w#Àw #ÀwH€` >¼N¹$ŽJŸL߀N^NuNVHçaž>€aþª¾<fJ9v¤gB@`pÀv¤H€JŸL߀N^NuNVHç>.¾|ÿfaÿZ`"` ¾|þfaý¬``>‡Wÿ?<N¹$ŠTJŸL߀N^NuNVHç*n` H€>€aþ”H€°9v£fêJŸLß N^NuNVHç>.>¼ aýü>¼ aýô` >¼ aýêSGJGfòJŸL߀N^NuNVHç *n>. J-gS--H…Ê|ÿIí`¼< fPGÎ|ÿø` ¼< dTG`RG0SEJ@fÜ`>¼aý‚>¼ aýz>¼aýr¾yv¦eàJŸLß0àN^NuNVÿþHç *n=yv¦ÿþB-`baþ.°|fJ-f>¼aýÖ>¼N¹*V`:¾< g¾< f>¼ aý`:`¾<f>®ÿþ/ aÿX`¾<f>J9v¥g&J-g-H€S@@<Ì|ÿ5`H€>€aü¸` >®ÿþ/ aþÔX`ľ<fJ9v¤gB@`pÀv¤`¦¾<f>®ÿþ/ aþ XJ-fî`о<f >®ÿþaþP`x¾<f>¼#aüL>®ÿþaþ6B-`Z¾<f2>¼#aü0>®ÿþaþBF`5`H€>€aüÄRF-H€À|ÿ¼@eä`"H€"M-H‚Ä|ÿHÂÓÂ@>€aü”R--H€À|ÿHÂ|ÿ°AmþŠJŸLß0àN^NuNVHç.¼$@?<"?<N¹$xXB9v¢ <w#Àw#Àw ü$v£B9v¤üv¥B¹¨¶>¼ N¹?|>¼N¹$Ž*@ -#À¬†#À¬® -鬆#Àª^#À¬Œ.¼vÂN¹ÆJŸLß N^NuNVÿü ngB@09¬¨F@ÁyvŠ`p9v¨Hã`ÁyvŠBy¬¨BywJngB@ÀoBÀo@üÿv¨#ù¬†¬®#ùª^¬Œ.¼vÂN¹Æ>¼N¹$ŽN^NuNVÿü.®N¹'6.¼g3N¹'69v¨H€>€WAN¹%rN^NuNVÿü.®aÄ>¼aÿ8N^NuNVHç. .® a¦.¹fÊN¹'6.¼grN¹'6Jg .¼gœN¹'6.¼g½N¹'6N¹&¸Ì<_.¼gÁN¹'6H€` >¼aþÈ>¼aþÀJgp`"`B@``°|gÚ°|Agܰ|CgÞ°|Rgâ`€JŸLßÀN^NuNVHç *n(M.¼gÅN¹'6~RŒH€>€WN¹%rSGfê>¼.N¹%r~RŒH€>€WN¹%rSGfê.¼gÝN¹'6.¹fÊN¹'6.¼gíN¹'6N¹&¸Ì<_.¼h,N¹'6H€`<>¼aýî>¼aýæ- >¼/ /<8¦N¹/PP0. ä@>€N¹.¦``°|g¾°|AgÀ°|CgÂ`†JŸLß0ÀN^NuNVÿü.¼h0N¹'6B@0.`J.¼h>?<aþDT`L.¼hD?<aþ2T`:.¼hKaþ.¼hSBgaþT` .¼h[aýô`°|bå@0@ÑüfÎ PNÐN^NuNVHç*n>UG¾| g¾|!fpÿ`H¾|m ¾|%nž|`JGm¾| o0<ÿ`&0GÑÈÑÈÑüv¢+h 0GÑÈÑÈÑüv¢!m B@JŸLß €N^NuNVHç*n-g.#í¬®#í¬Œ-g#ù¬®¬†#ù¬Œª^`+y¬®+y¬ŒJŸLß N^NuNVÿîHç>.yv¨ÿñJGg0pH€@ÿî0S@H€@ÿïp.ÿñHã`Ày¬¨g >¼N¹,¼`pH€@ÿîB@H€@ÿï-nÿò-n ÿø-yv¬ÿü`JGg>¼`BWN¹,¼J@f.Ž—ÿÿÿîN¹DJ@fØB@JŸL߀N^NuNVÿüBW/9v°0n/aÿJPN^NuNVHç>.>¼/9v°0G/aÿ&P< yv´¾h d0G"yv¬"iÑÉ/a _€B@0JŸLßÀN^NuNVHç*yv°B‡| ÞSFJFfø râ Þ€ à€Þ€ À¼ÿH€JŸLß ÀN^NuNVHç?*n >.(yv´8<ÿg B@09v¸R@`B@<`ä¼lbøB@0À|fˆ:äM>…aÿºl dvB€0&@ yv¬ (×ÀgaÿP€`TaÿH°gL yv¬1lv9 _submit 19F80 global bss _morecmd 19F82 global bss _autost 19EFA global bss _usercmd 19EFB global bss _ccp 150B8 global text _patch 19F84 global bss cpm 15000 global text _bdos 150C6 global text _load68k 150D2 global text flags 19FFC global bss TPAB 19FFE global bss _cmd_tbl 199CE global data _msg 199FE global data _msg2 19A18 global data _msg3 19A2A global data _msg4 19A3C global data _msg5 19A4E global data _msg6 19A64 global data _msg7 19A6E global data _msg8 19A86 global data _msg9 19AA4 global data _msg10 19AB4 global data _msg11 19AC6 global data _msg12 19ADC global data _msg13 19AF4 global data _lderr1 19B0A global data _lderr2 19B32 global data _lderr3 19B4E global data _lderror 19B70 global data _del 19B84 global data _cr_lf 151BC global text _cpy 151E8 global text _strcmp 15206 global text _copy_cm 1524C global text _prompt 15298 global text _echo_cm 15340 global text _decode 153B0 global text _fill_fc 157C4 global text _delim 1574C global text _check_c 15502 global text _get_cmd 15584 global text _scan_cm 15662 global text _get_par 1569E global text _true_ch 1578E global text _too_man 159F0 global text _find_co 15A26 global text _chk_col 15A60 global text _dir_cmd 15AAE global text _type_cm 15CC4 global text _ren_cmd 15DF8 global text _era_cmd 16158 global text _user_cm 162A0 global text _cmd_fil 1636A global text _sub_rea 16886 global text _dollar 168B2 global text _comment 16A04 global text _transla 16AF4 global text _submit_ 16CCC global text _execute 16DF0 global text _main 16F4A global text _bios1 171C0 global text _bios2 171BC global text _bios3 171B6 global text _bios4 171B0 global text _bios5 171AA global text _bios6 171C0 global text _traphnd  17172 global text _swap 171D0 global text _udiv 171DC global text _constat 171F2 global text _conbrk 17210 global text _conout 172A4 global text _tabout 17312 global text _cookdou 17350 global text _getch 17392 global text _conin 173EA global text _rawconi 17424 global text _prt_lin 17468 global text _newline 17496 global text _backsp 174CC global text _readlin 17546 global text _copyrt 19C1A global data _serial 19C1E global data _bdosini 176E4 global text _warmboo 17788 global text _prt_err 1780E global text _abrt_er 17840 global text _warning 19C22 global data _ext_err 17856 global text _ro_err 178FE global text _error 179EE global text _setexc 17A68 global text _set_tpa 17ADA global text _rdwrt 17B36 global text _dir_rd 17BD8 global text _dir_wr 17BF4 global text _dchksum 17C46 global text _dirscan 17C82 global text _setaloc 17DC2 global text _clraloc  17E12 global text _chkaloc 17E68 global text _getaloc 17EA8 global text _alloc 17F0A global text _seldsk 17F84 global text _move 180C6 global text _match 180F0 global text _openfil 18176 global text _flushit 181D4 global text _close 18212 global text _close_f 18360 global text _alltrue 18390 global text _matchit 1839A global text _search 183B4 global text _create 18440 global text _delete 184C2 global text _rename 18560 global text _set_att 185D8 global text _extsize 18628 global text _setran 1865E global text _fsize 1869C global text _getsize 186F4 global text _free_sp 18764 global text _blkindx 187E6 global text _blknum 1882E global text _setblk 1886A global text _do_io 188BE global text _new_ext 1890C global text _calcext 18A22 global text _get_rc 18A8A global text _bdosrw 18AD2 global text __bdos 18CAE global text _tmp_sel 190EC global text _do_phio !v¨H€ákB@0Àywg‡y¬¨` B@0F@ÁyvŠ9v¨H€>€N¹2R`ÿ|3Æv¸?B@0À|ëHH@B@H@йv°// nNßü J@ggBD` B@0À|`"RFfÿ yv¬B@0(R@¼@cÿB@0JŸLß8øN^NuNVHç>. yv´¾hb.0<€BA2Â|â`? yv¬ hBA2æIHABAHAÑÁ€_€JŸL߀N^NuNVHç>.JGc< yv´¾hb00<€BA2Â|â`F@? yv¬ hBA2æIHABAHAÑÁÀ_€JŸL߀N^NuNVHç>.B@0æH0@"yv¬"i0˜H€F@2<€BB4Ä|äaÀAJŸL߀N^NuNVHç>. yv´8(:|ÿ`$JGgSG>‡ašJ@g<`ºDdRE>…aˆJ@g<`JGfغDeÔ¼|ÿÿg>†aþÈB@0JŸLßðN^NuNVHç*n H€À|ÿ°|lV yv¬1nBG yv´ hd5pH€>€WÿN¹0RG¾|oæ`0GÑÈ>µˆN¹$ž>€N¹0RG¾|oâJŸLß €N^NuNVÿìHç. B@09vŠHâhF@Ê<¾9v¨fJgxB.ÿîH€@ÿñÀv¨H€À|ÿ°|o >¼N¹,¼H€r³@@ÿï.Ž—ÿÿÿîN¹D#îÿüv¬f>¼N¹,¼J@gÚ yv¬#è v° yv¬#èv´JgŽ yv´<(>†N¹0à0SFJ@fð.Ž—ÿÿÿì yv´(H€R@å@? yv´B@0(R@H@B@H@/N¹$ª\<JnÿìgRFSF>†N¹0JFfò>¼B§/<1ØN¹/PPpHã`yvŠJŸLßàN^NuNVHç *n(n >.`Ý0SGJ@föJŸLß0€N^NuNVHç *n(n ~  ?H€H³@À|gJgB@`LSGJGfÜJ.g> ?g H€H³@"yv´)HFAÀAgB@`TTŒH€H³@À|?gB@`pJŸLß0ÀN^NuNVHç*n>¼/. / aÿbPg0- >¼ / /. aÿ PG -€p9v¨Hã`ywH€JŸLß ÀN^NuNVÿîHç|ÿî`>¼N¹,¼J@f.Ž—ÿÿÿîN¹D>fàB@0JŸL߀N^NuNVÿüHç*n(n >¼/ / aþÄPJ@g GíAì-Hÿü yv´ hd:~ nÿüJgJg nÿüH€°fÒ` nÿü` nÿü“R‹R®ÿüSGJGfÊ`8~ nÿüJPgJSg nÿüB@0°Sf˜` nÿü6` nÿü0“T‹T®ÿüSGJGfÊ.N¹<ð<, H…Ê|¼Eb¼Ef*-H€À|ÿ,HÂ|ÿ°AomB@0À|ÿ@ m , g>®/ N¹+ÌX, 0.ä@>€N¹.Âp`p9v¨Hã`y¬¨B@``B@JŸLß8àN^NuNVÿüaþn n(gB@`BW/./<4àN¹/PPN^NuNVÿüpN^NuNVÿü>¼/. /.aýDPN^NuNVHç*n>. ?f$9v©H€>€aû®>‡/ /<6^N¹/PP<`..®N¹Cº -? gB- B->‡/ /<6hN¹/PP<>¼€/9vº/9v°aü˜PB@0JŸLß ÀN^NuNVHç*n(n >. ågB@`pgPGí|BSFJFfø>¼ / / aüJP0ä@>€N¹. yv¬¾hc yv¬1Gp9v¨Hã`ywH€JŸLß8àN^NuNVHç *n(n >.BW/ / aüPgl, g >‡/ N¹+ÌX¼å0ä@>€N¹. yv´ hd|SF4`H€>€WÿN¹0àJFfè`|SF0FÑÈ>´ˆN¹$ž>€N¹0àJFfäH€JŸLß0àN^NuNVÿüHç*n(n >.BW/ / aûtPgF, g >‡/ N¹+ÌXGíAì-Hÿü| H€À|"nÿü€R®ÿüSFJFfè0ä@>€N¹.ÂH€JŸLß8àN^NuNVHç *n(n >.BW/ / aúüPg>¼ / R—/ R—aú¼P0ä@>€N¹.ÂH€JŸLß0ÀN^NuNVHç*n- H€À|HÀï€-HÂ|?HÁt å¡€JŸLß N^NuNVÿüHç*n.aº- HÂ|ÿHÁÐ-@ÿünÿý!nÿþ"nÿÿ#JŸLß N^NuNVÿüHç *n(n BW/ / aú‡/ /<9jN¹/PP°|ÿeÄnÿý!nÿþ"nÿÿ#JŸLß €N^NuNVÿüHç. H€>€aøB‡ yv¬*hBFBD`.JFf <<€B@0F@:B@0ÀFg yv´(H€R@HÀÞ€âNRD yv´¸hcÆ-Gÿü>¼/9vº/Y—aøîPJŸLß ðN^NuNVHç *n(yv´,H†- H‡,H€Î@pFág0- HÂ|ÿ4äaÐAJŸLß0ÀN^NuNVHç*n>. Jng0GÑÈ>µˆN¹$ž` ` 5pH€À|ÿJŸLß €N^NuNVHç*n>. <.-Jng>†N¹$ž? M2GÓÉÑÉ1_`B@0À|ÿ"M4GÓÊ@JŸLß ÀN^NuNVHç>. *yv´B†<.-H€á¦-H€. HÀAHÀÜ€>‡/9vº/N¹.PJŸLß ÀN^NuNVHç*nJng,-!é-"H€è@‚-"Ì<ã-#gŒ<`-Î<?- R¼< mBR¾<@mp`¬H€-HÂ|?°Af,H€- H³@"yv´)HFAÀAÀ|f F B@`n.N¹6.°|ÿep`Z-- GF BW/ /<4DN¹/PP°|ÿe0J. g ED p` >¼/ /<7N¹/PP°|ÿep`B@JŸLß ðN^NuNVHç *n~Ií J$fSGJGfö yv´ hÿcâOp"yv´)HAàoB@0"yv´)HFA- H‚ÂBÂ|€AJŸLß0€N^NuNVHç*n.aˆ>- H€¾@f-H€À|ÿ``- H€¾@c0<€``B@JŸLß €N^NuNVÿüHç? *n. yv´6(Æ|ÿJf - g yv° h>¨/ N¹+ÌXJng2>¼H€?/ aýä\=@ÿþg B@0.ÿþ`j-#H€À|@ `& -€ fBWH€?/ aý¬\J@gp`8B- mÿü.aÿ- HÂ|ÿ°AbJgp`-- H€R@@ÿü.aü::>ƒ?/ aüv\<JFgJgB@`p8`¢Jgp`Ê>ƒJEg?SW`Bg/ aü@\>€N¹1v<¼|ÿÿfp`ž>†??/ aüXPx nfR(yvº#ùv°vº:<€SE0EÑùvºBJEfðBE`>„0H€??aüjXxRE yv´(H€º@oÜ#Ìvº>„- H€??aü>X=@ÿþJnÿþfnÿüJnfR- B@0.ÿþJŸLß0øN^NuNVÿúHç>.<. *n B.ÿû-MÿüBE0`ðBWN¹*VN¹&¸`B@0À|ÿ>€N¹%à`Þ>¼N¹$Ž`ÞB@0À|ÿ>€?<N¹! 2572 global text _swap 25D0 global text _udiv 25DC global text _constat 25F2 global text _conbrk 2610 global text _conout 26A4 global text _tabout 2712 global text _cookdou 2750 global text _getch 2792 global text _conin 27EA global text _rawconi 2824 global text _prt_lin 2868 global text _newline 2896 global text _backsp 28CC global text _readlin 2946 global text _copyrt 501A global data _serial 501E global data _bdosini 2AE4 global text _warmboo 2B88 global text _prt_err 2C0E global text _abrt_er 2C40 global text _warning 5022 global data _ext_err 2C56 global text _ro_err 2CFE global text _error 2DEE global text _setexc 2E68 global text _set_tpa 2EDA global text _rdwrt 2F36 global text _dir_rd 2FD8 global text _dir_wr 2FF4 global text _dchksum 3046 global text _dirscan 3082 global text _setaloc 31C2 global text _clraloc  3212 global text _chkaloc 3268 global text _getaloc 32A8 global text _alloc 330A global text _seldsk 3384 global text _move 34C6 global text _match 34F0 global text _openfil 3576 global text _flushit 35D4 global text _close 3612 global text _close_f 3760 global text _alltrue 3790 global text _matchit 379A global text _search 37B4 global text _create 3840 global text _delete 38C2 global text _rename 3960 global text _set_att 39D8 global text _extsize 3A28 global text _setran 3A5E global text _fsize 3A9C global text _getsize 3AF4 global text _free_sp 3B64 global text _blkindx 3BE6 global text _blknum 3C2E global text _setblk 3C6A global text _do_io 3CBE global text _new_ext 3D0C global text _calcext 3E22 global text _get_rc 3E8A global text _bdosrw 3ED2 global text __bdos 40AE global text _tmp_sel 44EC global text _do_phio  4538 global text _pgmld 466A global text _initexc 4B18 global text gouser 4D2C global text _load_tb 5452 global bss init_tbl 4D7C global text stack 5ABA global bss _init 6000 equ global abs _sub_ind 5ABC global bss _log_dsk 5ABE global bss _load_tr 5AC0 global bss _gbls 5AC2 global bss _crit_ds 5BB0 global bss _tail 5BB2 global bss _cur_dis 5BB6 global bss _parm 5BB8 global bss _dma 5C30 global bss _chainp 5CB4 global bss _sub_use 5CB8 global bss _save_su 5CBA global bss _subfcb 5D3C global bss _first_s 5D60 global bss _subdma 5D62 global bss _tpa_hp 5DE2 global bss _user 5DE6 global bss _tpa_lp 5DE8 global bss _tpa_ht 5DEC global bss _user_pt 5DF0 global bss _ro_dsk 5DF4 global bss _tpa_lt 5DF6 global bss _autorom 5DFA global bss _subprom 5DFC global bss _end_of_ 5DFE global bss _subcom 5E00 global bss _glb_ind 5E82 global bss _chain_s 5E86 global bss _index 5E88 global bss _dirflag 5E8A global bss _cmdfcb 5E8C global bss cpmlo.sys:18894+1324+2998=23216 (5AB0 ) stack size = 0 obal bss _dirflag 5E8A global bss _cmdfcb 5ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé"$ŠT`¶B@0À|ÿ>€?<N¹$ŠT`œ>†N¹&ò`ž>¼N¹$Ž`>†?<N¹$ŠT`p.N¹'6`d.N¹(`XN¹$À`\0< "`TByvŠBy¬¨Bywüÿv¨B9v©`"B@0À|ÿ>€N¹2RB@0À|ÿÀv©`.Ž]—aB- B-BW/ /<4DN¹/PP:`Ø.Ž]—aè.N¹6.:`Â#Ív¾.Ž]—Bg/ N¹6‚\:`¦*yv¾-Mÿü.Ž]—?</ N¹6‚\:`„.Ž]—a”>¼/ /<7N¹/PP:`b.Ž]—arBW?</ N¹= \:`D.Ž]—aTBWBg/ N¹= \:`(.Ž]—a8B- B- B-B->¼/ /<7N¹/PP:`ö.Ž]—a>¼/ /<8.N¹/PP:`ÔB@09vŠ`Ö9v©H€À|ÿ`Æ#Ívº`®p9v©Hã`y¬¨`˜B@09¬¨`š.Ž]—aœ>¼/ /<8¦N¹/PP:`j9v¨H€°9v©g9v©H€>€N¹2R>¼/ /9v´N¹3”P`2B@0À|ÿ°|bB@0À|ÿÀvª9vªH€À|ÿ`.Ž]—a>¼?</ N¹= \:`æ.Ž]—aö>¼Bg/ N¹= \:`È.Ž]—aØ.N¹9Â`´.Ž]—aÄ.N¹9,` B@0F@<ÍyvŠÍy¬¨Íyw`‚.Ž]—a’>¼Bg/ N¹= \:`d>†N¹:2`Z#ùvº¨¶BWN¹*VN¹4¢`N.¹vº/ N¹E8X`<.N¹-6`2.N¹-¨`pÿ`$`°|?bôå@0@Ñühd PNÐJ.ÿûg®ÿúB@0JŸLß àN^NuNVHç *n(mH€€Jg H€>€SW` 9v©H€>€N¹2R¹vª|JŸLß0€N^NuNVÿþHç*nBGH€`ôíoÌ-H€>€9oÌH€??< N¹$~X+@`â-H€°9oÌgBW-H€ÀoÌ??< N¹$~X(m&l.ŽU—?/-N¹$ª\>€B@0+ÑW?< N¹$ŠT.”?.ÿþ?<N¹$xX>€?< N¹$ŠT.­ ?< N¹$„T f>¼ N¹$Ž>`-H€>€?<N¹$ŠT>`*>¼N¹$Ž>`J@gÿ °|gÿ0°|gÿ(°|gÖB@0JŸLß8€N^NuHçþ o<d y`oÎgQG3Çp3üp$yoò$9oÐBƒ69p¶‚m&a`H”ƒaŠ&<€´ƒm" aý„aýpJAfV”ƒÕü€`äJ‚g"9oþaýdaýPJAf63Ãp&aÿH$yoö$9oÔSypf’$yoú$9oØgBS‚fúNupNu>GãONûp``"` ````` pNu‚JZNuÂJZNu‚f<ÜE4ÆNuJb,Ü…$ÆNu"9oþaüÎ.9pŽü€<HG69p–GlC€RF&yoþÖü€–ÃâK` aüŒJAfÿrQÎÿô*9oò$Eš¹oä(9oÐ3üpB‚âŒ`SCjaüXJAfÿ>&yoþ6<?aÿ4S„J„fÞ$yoö(9oÔSypfÄNu!yoþ .9pÞ¹oà‡!G"yoþ"è"è"ùoò"ùoÐ"ùoö"ùoÔ"ùoú"¹oØ.(,)ÿüÜ™,|oòzB¹oú¼–b¾–c.JžQÍÿòž†"Ç$hfpNBR@ÀB€Nu#üidp#üihp#üilp&#üipp0#ü p#ü p #ü p*#ü p4NuAùJº#ÈŒAù©Š0ü ü üÿÿôø/9Aù­†Ñü#Ȭª#üJ€JX`üßü:#ß‘ü­†‘ü r â¨3ÀlNFü N¹^öB€NuB€Nù¸//?N¹aæÞü Ns@ÀàHÀ¼@ÁàYÂ|ÿøÒoàYFÁNu o0<"|ñÀÙÑQÈÿüNu o0<"|ñÀÙ˜QÈÿüNu o/9#üK4p#ßNupßü:#ßNuNVÿþHç. 09v|`~. H€`î3üv|`ø0yiv"|it0˜H€3ÀivBWan`ÖByivBWa^`Æ09it°yi~f>¼OBgaøT`RyitBWa2`šJyivf JyitgSyit3ùi€iv``t`SyivBWaú`b . mB>9iÒ. H€Ž@09izÐyitÁü 29i|ÒyivãAHÁÐмñp @0‡>¼a®`HÀ |iær°˜WÉÿü hNÐ`ˆByv|. H€`Ø09it°yizgSyitBWah`Ð>¼a\`Ä3ùi|iv3ùizitBWa>`¦09it°yizgSyit`>¼O?<aÎTBWa`x=yitÿþ>¹iv?.ÿþadTRnÿþ`>¹i|?.ÿþaNTRnÿþ09i~°nÿþlà`6>¹iv?9ita*T`"3üv|``HÀ |jr°˜WÉÿü hNÐ`ˆ. H€Ð|ÿà3Àv~ yv~o3üv~3üv|`Z3ùv~it. H€Ð|ÿà@ .O o|O . H€3ÀivBWa.Byv|``J@gý€°|gþˆ°|g€°|g¦JŸL߀N^NuNVHçJng09iv°yi€gRyiv>9izÞyitÏüPÞyi|Þyivüñ !0H€Àñ #üñ !0à@H€Àñ #JŸL߀N^NuNVHç>9iÒŽ| <9i€RFœn 0.Áü *@0. ã@HÀÛÀÛüñp:ÇSFfúJŸLß ÀN^NuNVHç JnfV:9iz>9i~<9i€RF0Áü *@09i|ã@HÀÛÀÛüñpRE0Áü (@09i|ã@HÀÙÀÙüñp:ÜSFfúSGf¸`T:9i~>9i~<9i€RF0Áü *@09i|ã@HÀÛÀÛüñpSE0Áü (@09i|ã@HÀÙÀÙüñp:ÜSFfúSGf¸89iÒˆ| 0Áü *@09i|ã@HÀÛÀÛüñp<9i€RF:ÄSFfúJŸLß0ðN^NuNVÿüüÝñŸ aN^NuNVÿþHç *|ñ 1(|ñŸ 0<ÿH€Âÿï~S‡fü"63657074696F6E202400206174207573657220616464726573732024002E2062 S224019EE02041626F727465642E0036384B002020200053554200000000000000000000004A S9030000FC 573657220616464726573732024002E2062 S224019EE02041626F727465642E0036384B00202020005355420000000000ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé_submit 5380 global bss _morecmd 5382 global bss _autost 52FA global bss _usercmd 52FB global bss _ccp 4B8 global text _patch 5384 global bss cpm 400 global text _bdos 4C6 global text _load68k 4D2 global text flags 53FC global bss TPAB 53FE global bss _cmd_tbl 4DCE global data _msg 4DFE global data _msg2 4E18 global data _msg3 4E2A global data _msg4 4E3C global data _msg5 4E4E global data _msg6 4E64 global data _msg7 4E6E global data _msg8 4E86 global data _msg9 4EA4 global data _msg10 4EB4 global data _msg11 4EC6 global data _msg12 4EDC global data _msg13 4EF4 global data _lderr1 4F0A global data _lderr2 4F32 global data _lderr3 4F4E global data _lderror 4F70 global data _del 4F84 global data _cr_lf 5BC global text _cpy 5E8 global text _strcmp 606 global text _copy_cm 64C global text _prompt 698 global text _echo_cm 740 global text _decode 7B0 global text _fill_fc BC4 global text _delim B4C global text _check_c 902 global text _get_cmd 984 global text _scan_cm A62 global text _get_par A9E global text _true_ch B8E global text _too_man DF0 global text _find_co E26 global text _chk_col E60 global text _dir_cmd EAE global text _type_cm 10C4 global text _ren_cmd 11F8 global text _era_cmd 1558 global text _user_cm 16A0 global text _cmd_fil 176A global text _sub_rea 1C86 global text _dollar 1CB2 global text _comment 1E04 global text _transla 1EF4 global text _submit_ 20CC global text _execute 21F0 global text _main 234A global text _bios1 25C0 global text _bios2 25BC global text _bios3 25B6 global text _bios4 25B0 global text _bios5 25AA global text _bios6 25C0 global text _traphnd #.<† S‡fü-|^|{|¼€-gøH€=@ÿþ¼ JŸLß0àN^NuNVHç?*|ñ 1-H€À|8füH€0@ÑÈÑùk‚(Jmâ¼ H€0@ÑÈÑùk‚B nBPJlxH„0D@8H€D@rH°An9ñŸ…H€À|fx 0`,9v€f9v€g<@`<2 n0¼`9v€g` < n0¼`ü9v€g` n0¼`ä9v€gÖ<ÿÀ`9v€H€À|fÖ< ` n0¼`®9v€gÖ<¯`Ö<Ÿ n0¼`ŠH€9v‚9v€aÚ`pH€F@9v‚ÂÁv‚J9v‚f 9ÿûv€a®`DH€9v€až`4H€F@9v€ÂÁv€a„```S@°| bå@0@Ñül PNÐH€`V`H9ñŸ…H€À|g.H€HÀH2AÓÉÓÉÓükú"Ð @ n0¼H€`` n0¼B@` |¼ÐB@JŸLß øN^NuNVÿú9v€H€À|â@=@ÿþ0nÿþÑÈÑÈÑül#Ðkþ9v€g #ükèl` #ükÖlN^NuNVÿþHçJ9j€g0<ÿ`^*|ñ 1-fB@`L.ŽU—aýXJnÿþfB@`8`6 nÿþfB@`*`( nÿþfB@`` nÿþfÇj~üÿj€0<ÿJŸLß €N^NuNVÿüaÿ|J@gøB9j€9j~H€N^NuNVHç*n.¼nXa.a.¼nia JŸLß N^NuNVHç*n` H€>€N¹KDJfðJŸLß N^NuNVHç?>.&. <.:.8.0`&0GÑÈÑÈÑüvŒ ƒ`,0GÑÈÑÈÑüvŒ ¼``S@°| bå@0@Ñüm PNо|l¸|g¸| fJƒfz|ÄñÀÑ |m 0pH€ë@HÀ"tä¡€ÀñÀÑ à€ÀñÀÑÃñÀÑÆñÀÑ02GÓÉÓü­T2€AÀñÀÑJŸLßøN^NuNVÿþHç>.<. :. 8.BnÿþüÀñÀÑ |m 0pH€ë@ÀñÀÑ0ë@2àA€AÀñÀÑÅñÀÑÄñÀÑ0.ÿþÀñÀÑ0GÑÈÑÈÑüvŒ ¼JŸLßðN^NuNVÿü9ñÀÓH€À|€fòùñÀÑ­DùñÀÑ­F9­FH€ê@À|HÀмm @ЭE9ñÀÑH€3À­H09­Há@9ñÀÑHÐA3À­HùñÀÑ­J9­JH€À|À­K9­JH€ê@À­JùñÀÑ­LùñÀÑ­MùñÀÑ­NùñÀÑ­OùñÀÑ­PN^NuNVHç>.<. 0Áüмlˆ @*h¾|m02HÁ4GÕÊÕül>ƒÒÁÁ`NzP»ülXf:< 0HÀü¼@l02HÁ4GÕÊÕül>ƒÒÁÁã@HÀ`0Fã@S@2HÁ4GÕÊÕül>ƒÒÁÁJŸLß àN^NuNVÿøHç>.*. <.*n>¼?<4?/?aý,ßü `Ú`9ñÀÓH€À|g.N¹JèÛü€9ñÀÓH€À|€fÖaþ< 9­Dg9­DH€`˜`9­MH€á@9­NHÐAHÀ-@ÿü мÿÿÿ-@ÿø9­OH€"nÿøÓîÿü±9­PH€"nÿøÓîÿüR‰±J9­Lg6>¼?<49­LH€? 2HÁÐ9­LHHÁ/?aüVßü `B@``ÿ&JŸLß àN^NuNVÿðHç>.<. *n :.>†?aþ2T-@ÿú0Áü @"|lˆ p˜=Pÿö0.ÿöHÀ2GÓÉÓül>Ñ=@ÿø-Mÿò=| ÿþ0`¬.?.ÿø/.ÿú?aþvP=@ÿð`¤>…?<4?.ÿø/.ÿú?aû¬ßü `&9ñÀÓH€À|gJnÿög.N¹JþÛü€Snÿö9ñÀÓH€À|€fÌaü¶9­DH€=@ÿð`@>…?<4?.ÿø/.ÿú?aûJßü aüŠ9­DH€=@ÿð``°|gÿP°| gÿb`À*nÿòJnÿðgSnÿþfÿ.JnÿðgB@``pJŸLß àN^NuNVHç>.*y¬ ` ¾mfB-*U fðJŸLß €N^NuNVHç. H€3À­>¾<n ¾<g¾<f*.¼nmaúlH€>€WAN¹KD.¼nƒaúRB€`RH€Áü*@Ûülˆ y­>f `2. f&H€`H€>€aÿFH€0@ÑÈÑü­TJPf(H€0@ÑÈÑÈÑüvŒ 〠€H€0@ÑÈÑü­T0¼€/<H€0@ÑÈÑÈ"|vŒ/0˜N¹cªP,J†f|é†>¼ ?<4?</H€?aùºßü aúú9­DH€`*+|lX`,+|lhH€0@ÑÈÑü­TBP`›Í`` J@gÒ°|gÖ`î`H`F.¼n”aù:H€>€WAN¹KD.¼nªaù B€` `J@gþü°|gþô°|gÀ°|gº`º JŸLß ÀN^NuNVÿüBy­`>¼?<4BgB§?9­>aøúßü 9ñÀÓH€À|€fòN^NuNVHçJym f‚B9ñÀÓBG`"0GÑÈÑü­T0¼€0GÑÈÑÈÑüvŒ ¼RG¾|mØ>¼(?<O?<Bgaù\\9ñÀÓH€À|€fò>¼ÿ?<1?<?<aù8\9ñÀÓH€À|€fò3üm JŸL߀N^NuNVHç nJ(g. nJ( g$>¼ /.X— n?( n?(aûÒP>`~ nB( ? n(À_@0JŸL߀N^NuNVHç~*y¬ ` .a„J@fBG*U fð0JŸLß €N^NuNVHç*nJ-gJ- g .aÿP>`~JGg>¼/ X—?9­`?9­>aû8P>GB- ;y­`;y­>0JŸLß €N^NuNVHç*y¬ ™Ì—Ë`f$0-°y­`f g(•*¹¬ #ͬ  `:`&L(M*U fÀ gB“(¹¬ #̬ .ŒaþšJ@g.Œaÿ$J@g&L`—Ë JŸLß8N^NuNVHç y­>g aÿ`&@ fp`F*K09¬¶ï@HÀÛÀX` 09­`HÀr ã *@09¬¶HÀï€ÛÀÛù¬ª(y¬‚><€ÝSGJGføB@JŸLß8€N^NuNVHç y­>g"aþð&@ fp`‚*K09¬¶ï@HÀÛÀX`609­`HÀr ã *@09¬¶HÀï€ÛÀÛù¬ª(y¬‚><€ÜSGJGføB@`8(y¬‚><€ÜSGJGfø| . f.‹aýzJ@gB@` `p``B@JŸLß8€N^NuNVHç>.*n g 5pH€``0R@JŸLß €N^NuNVHç0.å@HÀ*@Ûùm@. n/g nNg*® JŸLß €N^NuNVHç>.pH€>€0H€?aú\TJ€fB@`p y­>fp``0GÑÈÑü­T0¼€>¼?<4BgB§?aôæßü aö&J9­DgB@`*>¼?<BgB§?aô¾ßü aõþJ9­DgB@`pJŸL߀N^NuNVÿüaðªa¤a*aN^NuNVHçBG`d0Áü мx˜ @B(0Áü мx˜ @B( 0R@°|l 0R@Áü мx˜2Ãü Ò¼x˜"A"€`0Áü мx˜ @ ¼RG¾|m–#üx˜¬ #ü˜¬x”aûJŸL߀N^NuNVHç9ÿßñŸ#ümDmT.¼ñÁÁN¹KJ@fê&|ñÁÁKë IëB+¼#000A90BC000197980C400024B5 S2240198406F0000160C4000586D0000280C4000746E0000200440003020790001A04ED0C06A S2240198604A90660000600C4000286D00000606400030DEFC000EE4400C4000026C00000619 S2240198804CDF03004A5F54400C4000176F00000450403F0041F900019EBC61000096301FD7 S2240198A0610000B441F900019ECB61000086201F6100009041F900019EDE61000076428082 S2240198C04E424E730C4000086D00002C082F000D000E66922F50000A4E68212F0010312FFB S2240198E0000E4E604CDF01012F6F000200085C4F02577FFF4E73082F000D00166600FF6867 S2240199002F50000A4E68212F0018312F0016212F0012212F000E4E604CDF01012F6F0002E9 S2240199200010DEFC000E02577FFF4E732F0842674E73428112186700000870024E4260F240 S2240199404E753F00484061000004301F3F00E04861000004301F3F00E84861000004301F85 S2240199600240000F0C40000A6D0000060600000706000030320070024E424E7523FC00016D S2240199809EEA0001A05223FC00019EEE0001A05C23FC00019EF20001A06623FC00019EF632 S2240199A00001A07023FC000150D20001A05623FC000150D20001A06023FC000150D20001D1 S2240199C0A06A23FC000150D20001A0744E7500019BF4000000019BF8000900019BFD000196 S2240199E000019C02000200019C06000300019C0A000400019C0F000600000000FFFF4E4F22 S224019A004E2D53595354454D2046494C452853292045584953542400456E7465722046695E S224019A206C656E616D653A202400456E746572204F6C64204E616D653A202400456E746548 S224019A4072204E6577204E616D653A20240046696C6520616C726561647920657869737456 S224019A60732400004E6F2066696C652400004E6F2077696C64636172642066696C656E61F2 S224019A806D657324000053796E7461783A2052454E204E657766696C653D4F6C6466696C10 S224019AA065240000436F6E6669726D28592F4E293F202400456E7465722055736572204E74 S224019AC06F3A202400002E5355422066696C65206E6F7420666F756E64240000557365724B S224019AE020232072616E6765206973205B302D31355D2400546F6F206D616E7920617267D4 S224019B00756D656E74733A202400496E73756666696369656E74206D656D6F7279206F7284 S224019B20206261642066696C6520686561646572240052656164206572726F72206F6E2088 S224019B4070726F6772616D206C6F616424004261642072656C6F636174696F6E20696E666F S224019B606F726D6174696F6E206269747324000050726F6772616D206C6F6164206572727F S224019B806F7224003E3C2E2C3D5B5D3B7C262F28292B2D5C000000090000000A0000001AB3 S224019BA000000020000000240000003B0000000000016B2C00016BAC00016BBC00016B2CB0 S224019BC000016B8C00016B1C00016BC600016E0600016E1C00016E2400016E2C00016E34FC S224019BE000016E5200016E7200016F1C00016F0A00016E104449520044495253005459502A S224019C00450052454E004552410055534552005355424D4954005355420000019C3A000167 S224019C209C7A00019C9D00017A0600017A1800017A2A00017A3400017A4443502F4D2D3635 S224019C40384B28746D292C2056657273696F6E20312E322C20436F70797269676874202819 S224019C60632920313938342C204469676974616C20526573656172636800585858582D3048 S224019C803030302D36353433323100206572726F72206F6E2064726976652024000D0A5799 S224019CA041524E494E47202D2D20446F206E6F7420617474656D707420746F206368616E45 S224019CC06765206469736B7324000A0D446F20796F752077616E7420746F3A202041626FA0 S224019CE07274202841292C202052657472792028522924002C206F7220436F6E74696E7530 S224019D006520776974682062616420646174612028432924003F2024000D0A240043502FA3 S224019D204D204469736B2066696C65206572726F723A20240020697320726561642D6F6EDB S224019D406C792E24000D0A446F20796F752077616E7420746F3A204368616E676520697405 S224019D6020746F20726561642F7772697465202843292C206F722041626F72742028412919 S224019D803F2024000D0A24000D0A43502F4D204469736B2024007265616424007772697464 S224019DA065240073656C656374240073656C65637424006368616E676524000000018CD2E3 S224019DC000018CDA00018CE400018CF800018D0600018D2000018D3A00018D4600018D5460 S224019DE000018D6600018D7200018D7E00018D8800018D9000018DB400018DD600018DFEF7 S224019E0000018E1400018E3000018E5200018E7400018E9200018EAE00018EE000018F0297 S224019E2000018F0E00018F1E000190BA00018F2800018F3E00018F4A00018F6C00018FA4F5 S224019E4000018FD000018FF00001900E0001902200019036000190BA000190BA0001905488 S224019E60000190BA000190BA000190BA000190BA000190BA000190700001907A0001908C3C S224019E80000190BA000190BA000190BA000190BA000190BA000190BA000190BA000190BA64 S224019EA0000190BA000190BA00019094000190BA000190A6000190BA000190B00D0A0A456D S224019EC078$|B+|ÿ|B ymT(H€é@"ymT) H€A@¼¼¼¼¼ ymT¨¼ ymT¨ ¼ ymT¨¼ ymT¨¼ ymT¨¼) ymT¼ ymT¨ ¼ ymT¨ ¼ ymT¨ ¼) ymT¨JŸLß8N^NuNVÿüHç>.0GÐÈÑüñÁÍgð |ñÁÉ2GÒÉ0H€JŸL߀N^NuNVHç>.. 0GÐÈÑüñÁÍgð0GÐÈÑüñÁɆJŸLßÀN^NuNVHç*|ñÁà.¼ñÁáN¹KJ@f"|8|ÿ|<|8B-|<JŸLß N^NuNVHç*|ñÁà-H‡Î|¾|gB@`0<ÿJŸLß €N^NuNVHç. aÂJ@gú*|ñÁàG-|4|<-gøJŸLß €N^NuNVHç>.,. *.0`€N¹KD` H€>€aÿf` H€>€Bgaþ¦T`öBWaþdHÀ`êaø`â H€>€ H€?aöPT`Ì3Æ­`` S@3À¬¶`´#Ƭ‚`ªaú,HÀ`  H€>€aúŒHÀ`aþ¶HÀ`†.… ?aûTHÀ`t <©Š`j09­€aû4J@gB@`pHÀ`B€```°|?bòå@0@ÑümX PNÐJŸLßàN^NuNVHç*n. ` JfB€`R¾fò JŸLß €N^NuNVHç*n. H€>€/ aºXJŸLß €N^NuNVÿþHç?BCB…..,. f#ü€v„ <€ü`hlD†RCJ‡lD‡RC¼‡n8fzB‡`0¾¼l ŽÆ:HGHÇ`x¾†eã†ã„`öJ„g¾†eŠ„ž†âŒâŽ`î¶|fD‡#Çv„ D€`#Çv„ JŸLßøN^Nu Exception $ at user address $. Aborted.fœf  f¥fªf®f²f·ÿÿNON-SYSTEM FILE(S) EXIST$Enter Filename: $Enter Old Name: $Enter New Name: $File already exists$No file$No wildcard filenames$Syntax: REN Newfile=Oldfile$Confirm(Y/N)? $Enter User No: $.SUB file not found$User # range is [0-15]$Too many arguments: $Insufficient memory or bad file header$Read error on program load$Bad relocation information bits$Program load error$><.,=[];|&/()+-\  $;úzŠúZê” Ô ê ò ú!! !@!ê!Ø ÞDIRDIRSTYPERENERAUSERSUBMITSUBfâg"gE,Ô,æ,ø--CP/M-68K(tm), Version 1.2, Copyright (c) 1984, Digital ResearchXXXX-0000-654321 error on drive $ WARNING -- Do not attempt to change disks$ Do you want to: Abort (A), Retry (R)$, or Continue with bad data (C)$? $ $CP/M Disk file error: $ is read-only.$ Do you want to: Change it to read/write (C), or Abort (A)? $ $ CP/M Disk $read$write$select$select$change$? ?¨?²?Æ?Ô?î@@@"@4@@@L@V@^@‚@¤@Ì@â@þA ABA`A|A®AÐAÜAìCˆAöB BB:BrBžB¾BÜBðCCˆCˆC"CˆCˆCˆCˆCˆC>CHCZCˆCˆCˆCˆCˆCˆCˆCˆCˆCˆCbCˆCtCˆC~68K SUBO ((((((((0000000088888888@@@@@@@@HHHHHHHHOOOOOOOODscreen driver 3.6 KÐKrK¤K”KfLACHIJKYL|LšL¦LÄLòM2MFMhCopyright 1984, Motorola Inc.BIOS 2.15öööööööøúúøø øöø÷öÿ üQüWüEüAüSüDüZüXùöûûûüRüTüYüFüGüCüVüBùöûûûüUüIüHüJüKüNüM÷öûû   üOüPüLö÷ öû û û û  ýö÷÷û ûûûþ ööö    öj‚ À  Û `134567890-= []\;' ,./ ~!#$%^&*()_+ {}|:" <>? ÐÖÕÔÑ×0123456789ABCDEF,.k†kŽkÖkŽk¦k¾k¦P®PØPôQ QBQfQ€QªQºQÔ ¿? 9À  ™À  ¿ÿÿªâlX«b¨ºªâlXªâlx«‚©”ªâªâlH¬ª,SÀSìSìSìSìS°SìS°S°S°áDê`áDê`mDbbbb b*b:bHbZbfbnb„bŽbœb¦b°bÀbÊc2bÜbæbðbøcc2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c2c BIOS ERROR -- . BIOS ERROR -- DISK NOT SUPPORTED BIOS ERROR -- DISK NOT SUPORTED _submit¡o@_morecmd¡oB_autost¡nº_usercmd¡n»_ccp¢¸_patch¡oDcpm¢_initexc¢Ægouser¢Bm68010¢B_bdos¢”_load68k¢ flags¡oÀTPAB¡oÂ_cmd_tbl¤dv_msg¤d¦_msg2¤dÀ_msg3¤dÒ_msg4¤dä_msg5¤dö_msg6¤e _msg$000171B0588F286D000E266C000E2E8E55973F132F2D00044EB9000171DC5C8FC3 S2240191C03E804240302B000ED1573F3C000A4EB9000171BC548F2E943F2EFFFE3F3C001064 S2240191E04EB9000171AA588F3E803F3C000B4EB9000171BC548F2EAD000A3F3C000C4EB990 S224019200000171B6548F0C150001660E3EBC000D4EB9000171C03E006016102D00014880AD S2240192203E803F3C000E4EB9000171BC548F3E00602A3EBC00154EB9000171C03E00601CFF S2240192404A406700FF0AB07C00016700FF30B07C00026700FF28B07C000367D6424030076A S2240192604A9F4CDF38804E5E4E7548E77FFE206F003C428061544A40662A610001084A40B1 S2240192806622610002584A40661A2E390001A020BEB90001A02E6704610003504A406604FA S2240192A0610003E8222F004061164CDF7FFE4E752F002228000070144E422200201F4E7538 S2240192C02F00701A4E42201F4E752228000461F061DE4A4166147E122A6800042C7C00018B S2240192E0A00A3CDD51CFFFFC4E7570024E754281247C0001A02E267C0001A00C2E32200091 S224019300BEB230006C0CDEB32000BEB230006E104E752E323000DEB33000BEB220006F024B S22401932072014E752C025346E54A2E2800082A7C0001A02E2C7C0001A00C9EB620000887D0 S22401934000002B872000BEA800046DD44283619E58834A8156CEFFF84E752A02538523C556 S2240193600001A046E58A42842C390001A0462A7C0001A02E2E35400061B458844A8157CD87 S224019380FFE84E753C390001A00A0246FFFE0C46601A6600012023F90001A0180001A042AD S2240193A02E3C0000010023C70001A01845F90001A01CBE526D0224870C79601B0001A00AC9 S2240193C067084A790001A024670C23F90001A0200001A02E604008280000001566162E28BA S2240193E00004DEBC000001010887000023C70001A02E60222E2800089EB90001A00C9EB944 S2240194000001A0109EB90001A01459870887000023C70001A02E0C79601B0001A00A66163A S22401942023F90001A0260001A03223F90001A02A0001A036602A2E390001A02EDEB900015A S224019440A00C52870887000023C70001A032DEB90001A01052870887000023C70001A036C4 S22401946074036100FEF64A81670A74036100FEB64A81664074046100FEAC4A81670A7404AA S2240194806100FED84A81662C2A7C0001A02E2C7C0001A00C428276042E352000BEA800043D S2240194A06D12DEB62000BEA800086E08588251CBFFE84E7570014E7522790001A03A2C3CDD S2240194C0000000809C790001A04CD2C697790001A04C600214D951CBFFFC4E757E3F2A68F7 S2240194E000042C790001A03A3CDD51CFFFFC3E3C00640C79601A0001A00A6702514733C72B S2240195000001A04C33FC00020001A04A24790001A02E24390001A00C428336390001A04CA5 S224019520B6826D062602619060489483618A263C00000080B4836D18220A6100FD846100AA S224019540FD704A4166569483D5FC0000008060E44A82671E22390001A03A6100FD646100FB S224019560FD504A41663633C30001A04C26026100FF4824790001A03224390001A010537974 S2240195800001A04A669224790001A03624390001A0146706421A538266FA4E7570024E7566 S2240195A03E1B02470007E34F4EFB7002601460226020601E6006601260026006201F7003C9 S2240195C04E75088200004A5A4E7508C200004A5A4E750882000066083C12DC4534C64E757C S2240195E04A622C12DC8524C64E7522390001A03A6100FCCE2E390001A0428EFC00803C0775 S224019600484736390001A04C96476C0606430080524626790001A03AD6FC008096C3E24B57 S224019620600A6100FC8C4A416600FF7251CEFFF42A390001A02E24459AB90001A02028394D S2240196400001A00C33FC00020001A04A4282E28C601E53436A146100FC584A416600FF3E94 S22401966026790001A03A363C003F6100FF3453844A8466DE24790001A03228390001A010BA S22401968053790001A04A66C44E7521790001A03A000C2E390001A03EDEB90001A01C088776 S2240196A000002147001022790001A03A22E8000422E8000822F90001A02E22F90001A00CE4 S2240196C022F90001A03222F90001A01022F90001A03622B90001A0142E2800082C29FFFC9A S2240196E0DC992C7C0001A02E7A0442B90001A036BC966206BE9663022E164A9E51CDFFF27A S2240197009E8622C7246800001012660670194E42524012C042804E7570167202243C0001BF S224019720979448E7E0004E434CDF0007524158820C4100186600000472200C41002267EC96 S2240197400C41002367E60C4100306DD670124E4320404A5822182401D49026390001A9E8BD S22401976028390001A9E27011206F000423C80001A04EB29062000014B4906300000EB69055 S2240197806200000AB8906300000442904A9851C8FFE24E7561000096610000926100008E5E S2240197A06100008A61000086610000826100007E6100007A61000076610000726100006EBB S2240197C06100006A61000066610000626100005E6100005A61000056610000526100004E9B S2240197E06100004A61000046610000426100003E6100003A61000036610000326100002E7B S2240198006100002A61000026610000226100001E6100001A61000016610000126100000E5A S2240198206100000A610000064E714E71426748E78080202F%7¤e_msg8¤e._msg9¤eL_msg10¤e\_msg11¤en_msg12¤e„_msg13¤eœ_lderr1¤e²_lderr2¤eÚ_lderr3¤eö_lderror¤f_del¤f,_cr_lf¢Š_cpy¢¶_strcmp¢Ô_copy_cm¢_prompt¢f_echo_cm¢_decode¢~_fill_fc¢ ’_delim¢ _check_c¢Ð_get_cmd¢R_scan_cm¢ 0_get_par¢ l_true_ch¢ \_too_man¢ ¾_find_co¢ ô_chk_col¢ ._dir_cmd¢ |_type_cm¢’_ren_cmd¢Æ_era_cmd¢&_user_cm¢n_cmd_fil¢8_sub_rea¢T_dollar¢€_comment¢Ò_transla¢Â_submit_¢š_execute¢ ¾_main¢"_bios1¢$Ž_bios2¢$Š_bios3¢$„_bios4¢$~_bios5¢$x_bios6¢$Ž_traphnd¢$@_swap¢$ž_udiv¢$ª_constat¢$À_conbrk¢$Þ_conout¢%r_tabout¢%à_cookdou¢&_getch¢&`_conin¢&¸_rawconi¢&ò_prt_lin¢'6_newline¢'d_backsp¢'š_readlin¢(_copyrt¤fÂ_serial¤fÆ_bdosini¢)²_warmboo¢*V_prt_err¢*Ü_abrt_er¢+_warning¤fÊ_ext_err¢+$_ro_err¢+Ì_error¢,¼_setexc¢-6_set_tpa¢-¨_rdwrt¢._dir_rd¢.¦_dir_wr¢.Â_dchksum¢/_dirscan¢/P_setaloc¢0_clraloc¢0à_chkaloc¢16_getaloc¢1v_alloc¢1Ø_seldsk¢2R_move¢3”_match¢3¾_openfil¢4D_flushit¢4¢_close¢4à_close_f¢6._alltrue¢6^_matchit¢6h_search¢6‚_create¢7_delete¢7_rename¢8._set_att¢8¦_extsize¢8ö_setran¢9,_fsize¢9j_getsize¢9Â_free_sp¢:2_blkindx¢:´_blknum¢:ü_setblk¢;8_do_io¢;Œ_new_ext¢;Ú_calcext¢<ð_get_rc¢=X_bdosrw¢= __bdos¢?|_tmp_sel¢Cº_do_phio¢D_pgmld¢E8_load_tb¡pinit_tbl¢Iæstack¡vz_end ­†_init¢J8_wboot¢J²_setimas¢JÌ_rddat¢Jè_wrdat¢Jþ_no_devi¢K_scrver¤iÔ_cons_ou¢KD_pos_cur¢Mü_scroll¢N²_clr_lin¢Nj_copyrig¤jV_biosrev¤jt_in_char¤j~_char_av¤j€_c_init¢O¦_keybd_i¢O¸_keybd_r¢P(_mode_ch¢RT_cons_st¢R¢_cons_in¢S _bioserr¢S>_printst¢Sh_lperp¤l>_dpb3¤lH_dpb96¤lX_dpb48¤lh_dpbwdc¤lx_dphtab¤lˆ_config¤m _cnvdsk¤m _rcnvdsk¤m_sndcmd¢S_sndcnf¢T`_gtsns¢TÚ_tk2psn¢U¦_rddsk¢V<_dskxfer¢WV_setinvl¢Xž_slctdsk¢XÌ_homedsk¢Zx_initvds¢Z°_flush1¢[L_flush¢[²_fill¢[à_gettrk¢\H_read¢\Ô_write¢]D_sectran¢]ð_vbase¤m@_setxvec¢^_format¢^V_biosini¢^ö_m400ini¢_¤_m410_in¢a._initdsk¢_ _init_st¤mD_aux_sta¤mT_m400_in¢`Â_m400_ou¢`ø_m410_st¢ax_m410_ou¢a¨_cbios¢aæ_strchr¢cX_index¢c„_ldiv¢cªldiv¢cª_ldivr¡v„_sub_ind¡vˆ_log_dsk¡vŠ_lstpsn¡vŒ_load_tr¡v _gbls¡v¢_crit_ds¡w_tail¡w’_cur_dis¡w–_parm¡w˜_dma¡x_lastbuf¡x”_tbuf¡x˜_chainp¡¨¶_alv0¡¨º_sub_use¡¨â_save_su¡¨ä_subfcb¡©f_memtab¡©Š_alv2¡©”_alv4¡ª,_first_s¡ª\_tpa_hp¡ª^_subdma¡ªb_dirbuf¡ªâ_csv0¡«b_csv2¡«‚_setdma¡¬‚_tpa_lp¡¬†_user¡¬Š_tpa_ht¡¬Œ_csv4¡¬_firstbu¡¬ _user_pt¡¬¤_ro_dsk¡¬¨_memdsk¡¬ª_tpa_lt¡¬®_autorom¡¬²_subprom¡¬´_setsec¡¬¶_end_of_¡¬¸_subcom¡¬º_iobyte¡­<_setdsk¡­>_glb_ind¡­@_sns¡­D_chain_s¡­R_tkflg¡­T_dirflag¡­^_settrk¡­`_cmdfcb¡­b%8F4A6E000E67323EBC0001100743 S224018B2048803F002F0D6100FDE45C8F3D40FFFE670A4240302EFFFE6000016A102D0023CC S224018B404880C07C007F1B40002060260C2D00800020661E4257100748803F002F0D6100DA S224018B60FDAC5C8F4A406706700160000138422D00201D6D000FFFFC2E8D6100FF0E122DCF S224018B8000204881C27C00FFB041621C4A076706700160000110022D007F000E102D002081 S224018BA0488052401D40FFFC2E8D6100FC3A3A003E833F052F0D6100FC765C8F3C004A46A6 S224018BC067104A0767044240600270013800600000A24A0767067001600000CA3E834A4524 S224018BE067063F055357600242672F0D6100FC405C8F3E804EB900017EA83C00BC7CFFFFE7 S224018C00660670026000009E3E863F033F052F0D6100FC58508F78030C6E0002000E66529B S224018C2028790001A6DA23F90001A6D00001A6DA3A3C008053453045D1F90001A6DA421058 S224018C404A4566F0424560143E84300548803F003F066100FC6A588F780152452079000193 S224018C60A6D4102800034880BA406FDC23CC0001A6DA3E84102D002048803F003F066100F0 S224018C80FC3E588F3D40FFFE4A6EFFFE66101B6EFFFC000F4A6E000E6604522D0020424024 S224018CA0302EFFFE4A9F4CDF30F84E5E4E754E56FFFA48E70F043E2E00083C2E000A2A6E49 S224018CC0000C422EFFFB2D4DFFFC42453007600003F042574EB9000177884EB9000173EA8D S224018CE06000040042403006C07C00FF3E804EB900017312600003DE3EBC00074EB9000182 S224018D0071C0600003DE42403006C07C00FF3E803F3C00064EB9000171BC548F600003B678 S224018D2042403006C07C00FF3E803F3C00054EB9000171BC548F6000039C3E864EB9000119 S224018D4074246000039E3EBC00134EB9000171C0600003903E863F3C00144EB9000171BCB3 S224018D60548F600003702E8D4EB900017468600003642E8D4EB900017546600003584EB991 S224018D80000171F26000035C303C20226000035442790001A6BE42790001A9F44279000110 S224018DA0A7B013FC00FF0001A6C842390001A6C96000032242403006C07C00FF3E804EB9B1 S224018DC000017F8442403006C07C00FF13C00001A6C9600003002E8E5D9761000310422D5D S224018DE0000C422D000E42572F0D2F3C000181764EB900017C82508F3A00600002D82E8E97 S224018E005D97610002E82E8D4EB9000183603A00600002C223CD0001A6DE2E8E5D9742673B S224018E202F0D4EB9000183B45C8F3A00600002A62A790001A6DE2D4DFFFC2E8E5D973F3CBC S224018E4000012F0D4EB9000183B45C8F3A00600002842E8E5D97610002943EBC00022F0DA6 S224018E602F3C000184C24EB900017C82508F3A00600002622E8E5D976100027242573F3CBE S224018E8000012F0D4EB900018AD25C8F3A00600002442E8E5D9761000254425742672F0D7B S224018EA04EB900018AD25C8F3A00600002282E8E5D9761000238422D000C422D000D422DE8 S224018EC0000E422D000F3EBC00082F0D2F3C000184404EB900017C82508F3A00600001F61C S224018EE02E8E5D97610002063EBC00022F0D2F3C000185604EB900017C82508F3A0060004B S224018F0001D4424030390001A6BE600001D610390001A6C94880C07C00FF600001C623CD1C S224018F200001A6DA600001AE700112390001A6C94881E36081790001A9F460000198424050 S224018F4030390001A9F46000019A2E8E5D976100019C3EBC00022F0D2F3C000185D84EB953 S224018F6000017C82508F3A006000016A10390001A6C84880B0390001A6C96710103900016E S224018F80A6C948803E804EB900017F843EBC00102F0D2F390001A6D44EB9000180C6508F75 S224018FA06000013242403006C07C00FFB07C000F620E42403006C07C00FF13C00001A6CA43 S224018FC010390001A6CA4880C07C00FF600001142E8E5D97610001163EBC00013F3C0001BA S224018FE02F0D4EB900018AD25C8F3A00600000E62E8E5D97610000F63EBC000142672F0D79 S2240190004EB900018AD25C8F3A00600000C82E8E5D97610000D82E8D4EB9000186F4600013 S22401902000B42E8E5D97610000C42E8D4EB90001865E600000A04240300646403C00CD793A S2240190400001A6BECD790001A9F4CD790001A7B0600000822E8E5D97610000923EBC0002A2 S22401906042672F0D4EB900018AD25C8F3A0060643E864EB900018764605A23F90001A6DAAA S2240190800001A8B442574EB9000177884EB9000181D4604E2EB90001A6DA2F0D4EB9000116 S2240190A0926A588F603C2E8D4EB900017A6860322E8D4EB900017ADA601A70FF60246014FC S2240190C0B07C003F62F4E5403040D1FC00019DBC20504ED04A2EFFFB67041AAEFFFA42405F S2240190E030054A9F4CDF20E04E5E4E754E56000048E7030C2A6E0008286D000210144880AD S2240191001A801E004A07670A100748803E805357600A10390001A6C948803E804EB90001D7 S2240191207F8418B90001A6CA1B7C000100014A9F4CDF30804E5E4E754E56FFFE48E7031C29 S2240191402A6E0008424710154880600000F413ED00030001A008102D000148803E801039E6 S2240191600001A00848803F003F3C00094EB9000171B0588F2B40000E600000E2102D0003AA S2240191804880B0390001A008671C4257102D0003488013C00001A0083F003F3C00094EB905 S2240191A0&&803007E4403E804EB900017BF420790001A6CCBE680004630A20790001A6CC31471F S2240184A00004700112390001A6C84881E36081790001A7B0100548804A9F4CDF38E04E5E74 S2240184C04E754E56000048E70F0C2A6E0008286E000C3E2E001042572F0C2F0D6100FC12A8 S2240184E0508F1A00676C082C00070009670C3E872F0D4EB9000178FE588F18BC00E530079D S224018500E4403E804EB900017BF420790001A6D40C6801000006641C7C1053461034601014 S22401852048803E80025700FF4EB900017E124A4666E8601E7C0853463046D1C83EB48810AD S2240185404EB9000171D03E804EB900017E124A4666E4100548804A9F4CDF30E04E5E4E752C S2240185604E56FFFC48E70F1C2A6E0008286E000C3E2E001042572F0C2F0D6100FB74508F7F S2240185801A006746082C00070009670C3E872F0D4EB9000178FE588F47ED001141EC00017E S2240185A02D48FFFC7C0B101B4880C07C007F226EFFFC128052AEFFFC53464A4666E830074A S2240185C0E4403E804EB900017BF4100548804A9F4CDF38E04E5E4E754E56000048E7070CDE S2240185E02A6E0008286E000C3E2E001042572F0C2F0D6100FAFC508F1C00671E3EBC000BCB S2240186002F0C52972F0D52976100FABC508F3007E4403E804EB900017BF4100648804A9FBE S2240186204CDF30C04E5E4E754E56000048E701042A6E0008102D000C4880C07C001F48C0BE S224018640EF80122D000E4881C27C003F48C1740CE5A180814A9F4CDF20004E5E4E754E56BB S224018660FFFC48E701042A6E00082E8D61BA122D00204881C27C00FF48C1D0812D40FFFC28 S2240186801B6EFFFD00211B6EFFFE00221B6EFFFF00234A9F4CDF20004E5E4E754E56FFFC9A S2240186A048E7030C2A6E0008286E000C42572F0C2F0D6100FA3C508F1E00672A2E8C6100E4 S2240186C0FF68122C000F4881C27C00FF48C1D0812D40FFFC1B6EFFFD00211B6EFFFE0022CA S2240186E01B6EFFFF0023100748804A9F4CDF30804E5E4E754E56FFF848E703042A6E000847 S22401870042AEFFFC424742AEFFF860241D6D0021FFF91D6D0022FFFA1D6D0023FFFB202E37 S224018720FFF8B0AEFFFC6F062D6EFFF8FFFC7E013E872F0D2F3C0001869C4EB900017C82CD S224018740508FB07C00FF65C41B6EFFFD00211B6EFFFE00221B6EFFFF00234A9F4CDF208034 S2240187604E5E4E754E56FFFC48E71F04102E000948803E806100F80E428720790001A6CC8A S2240187802A68001642464244602E4A46660C3C3C80004240301D46403A0042403005C04649 S2240187A0671220790001A6D4102800034880524048C0DE80E24E524420790001A6D4B86831 S2240187C0000663C62D47FFFC3EBC00042F390001A6DA2F0E59976100F8EE508F4A9F4CDFA7 S2240187E020F04E5E4E754E56000048E7070C2A6E000828790001A6D41C2C000248861E2DEF S224018800000C4887102C00044880CE4070079046E1673007122D00204881C27C00FF3406F6 S224018820E461D0414A9F4CDF30C04E5E4E754E56000048E703042A6E00083E2E000C4A6EBF S224018840000E67123047D1C83EB588104EB9000171D0600C600A103570104880C07C00FF09 S2240188604A9F4CDF20804E5E4E754E56000048E707042A6E00083E2E000C3C2E0010022D30 S224018880007F000E4A6E000E67183E864EB9000171D03F00204D3247D3C9D1C9315F0010F8 S2240188A0601242403006C07C00FF224D3447D3CA134000104A9F4CDF20C04E5E4E754E565C S2240188C0000048E707043E2E000C2A790001A6D442863C2E0008102D00024880E1A6102DBD S2240188E000034880122E000B4881C04148C0DC803E872F390001A6DA2F064EB900017B3692 S224018900508F4A9F4CDF20C04E5E4E754E56000048E71F042A6E00084A6E000E672C1E2DD5 S2240189200021E907102D00224880E840120782001E011C2D0022CC3C000FE306082D000770 S224018940002367048C3C0001600E1E2D000ECE3C003F1C2D000C5206BC3C00206D0442062C S2240189605207BE3C00406D067006600000AC10074880122D000E4881C27C003FB041662C74 S22401898010064880122D000C4881B34022790001A6D41229000448814641C041C07C001FEB S2240189A0660A1B46000C42406000006E2E8D4EB900018360B07C00FF65047003605A1A2DD6 S2240189C0000E182D000C1B47000E1B46000C42572F0D2F3C000181764EB900017C82508F38 S2240189E0B07C00FF65304A2E000D670C1B45000E1B44000C700460203EBC00082F0D2F3C43 S224018A00000184404EB900017C82508FB07C00FF65047005600242404A9F4CDF20F04E5EE9 S224018A204E754E56000048E7030C2A6E00087E0F49ED00204A24660653474A4766F620790E S224018A400001A6D40C6800FF00066302E24F700722790001A6D41229000248819041E06FD3 S224018A604240300722790001A6D41229000448814641142D000C4882C242C27C001F804159 S224018A804A9F4CDF30804E5E4E754E56000048E703042A6E00082E8D61883E00102D000CF8 S224018AA04880BE40660E102D000F4880C07C00FF60166014102D000C4880BE406308303C57 S224018AC000806004600242404A9F4CDF20804E5E4E754E56FFFC48E73F0C2A6E00081E2EA0 S224018AE0000D20790001A6D436280006C67CFF004A076620082D0007000967182079000175 S224018B00A6D02068000E3EA800082F0D4EB9000178FE58''001642413207E64948414241484154 S224017E00D1C11010805F10804A9F4CDF00804E5E4E754E56000048E703003E2E00084A475D S224017E20633C20790001A6D4BE6800066230303C008042413207C27C0007E26046403F00D7 S224017E4020790001A6CC2068001642413207E649484142414841D1C11010C05F10804A9FA8 S224017E604CDF00804E5E4E754E56000048E703003E2E000842403007E648304022790001A5 S224017E80A6CC226900161030980048804640323C008042423407C47C0007E461C0414A9F80 S224017EA04CDF00804E5E4E754E56000048E71F003E2E000820790001A6D4382800063A0781 S224017EC07CFF60244A47670E53473E87619A4A4067043C07601ABA44640E52453E856188D8 S224017EE04A4067043C0560084A4766D8BA4465D4BC7CFFFF67063E866100FEC84240300692 S224017F004A9F4CDF00F04E5E4E754E56000048E703042A6E000C10154880C07C00FFB07C16 S224017F2000106C5620790001A6CC316E00100004424720790001A6D40C6801000006641C12 S224017F401035701048803E80025700FF4EB900017DC25247BE7C000F6FE6601E3047D1C86C S224017F603EB588104EB9000171D03E804EB900017DC25247BE7C00076FE24A9F4CDF208043 S224017F804E5E4E754E56FFEC48E70F001E2E0009424030390001A6BE12074881E268464048 S224017FA01A00CA3C0001BE390001A6C866044A056778422EFFEE100748801D40FFF113C040 S224017FC00001A6C810074880C07C00FFB07C000F6F0A3EBC00024EB9000179EE1005488016 S224017FE07201B3401D40FFEF2E8E0697FFFFFFEE4EB90001913823EEFFFC0001A6CC660EC2 S2240180003EBC00034EB9000179EE4A4067DA20790001A6CC23E8000A0001A6D020790001F1 S224018020A6CC23E8000E0001A6D44A056700008E20790001A6D43C2800063E864EB90001A6 S2240180407E12300653464A4066F02E8E0697FFFFFFEC20790001A6D41028000348805240F0 S224018060E5403F0020790001A6D442403028000852404840424048402F004EB9000171DCF8 S2240180805C8F3C004A6EFFEC6702524653463E864EB900017DC24A4666F23EBC000E42A792 S2240180A02F3C00017F0A4EB900017C82508F700112074881E36081790001A6BE4A9F4CDFD7 S2240180C000E04E5E4E754E56000048E7030C2A6E0008286E000C3E2E0010600218DD30071D S2240180E053474A4066F64A9F4CDF30804E5E4E754E56000048E7070C2A6E0008286E000C9F S2240181007E0C1C150A06003F101D4880121C4881B340C07C007F67084A0667044240604C5D S22401812053474A4766DC4A2E0011673E0C15003F67201015488012144881B340227900014C S224018140A6D41229000448814641C04167044240601A548D548C1015488012144881B34018 S224018160C07C003F67044240600270014A9F4CDF30C04E5E4E754E56000048E707042A6ED5 S22401818000083EBC00012F2E000C2F0D6100FF62508F1C0067301E2D000C3EBC00202F0D30 S2240181A02F2E000C6100FF20508F1B47000C002D0080000E700112390001A6C84881E36091 S2240181C081790001A7B0100648804A9F4CDF20C04E5E4E754E56FFEE48E703001D7C0003A7 S2240181E0FFEE600E3EBC00014EB9000179EE4A4066122E8E0697FFFFFFEE4EB9000191389D S2240182003E0066E0424030074A9F4CDF00804E5E4E754E56FFFC48E70F1C2A6E0008286EE9 S224018220000C3EBC00012F0C2F0D6100FEC4508F4A406700012047ED001041EC00102D48B0 S224018240FFFC20790001A6D40C6801000006643A7E10206EFFFC4A10671C4A136710206E9A S224018260FFFC10104880B013660000D26006206EFFFC16906006206EFFFC1093528B52AE16 S224018280FFFC53474A4766CA60387E08206EFFFC4A50671C4A536710206EFFFC424030105F S2240182A0B053660000986006206EFFFC36906006206EFFFC3093548B54AEFFFC53474A4749 S2240182C066CA2E8D4EB900018A223C001A2C000C4885CA7C001FBC45621CBC45662A102DEC S2240182E0000F4880C07C00FF122C000F4881C27C00FFB0416F12196D000F000F4240300645 S224018300C07C00FF1940000C196D000D000D082C00070009670E3EAE00102F0D4EB900011E S22401832078FE588F022C007F000B302E0010E4403E804EB900017BF47001601A70011239B4 S2240183400001A6C84881E36081790001A9F442406004600242404A9F4CDF38E04E5E4E759F S2240183604E56FFFC6100FE6E206E000808280007000E67044240601442572F2E00082F3CE6 S224018380000182124EB900017C82508F4E5E4E754E56FFFC70014E5E4E754E56FFFC3EBCD6 S2240183A000012F2E000C2F2E00086100FD44508F4E5E4E754E56000048E707042A6E00087A S2240183C03E2E000C0C15003F662410390001A6C948803E806100FBAE3E872F0D2F3C00017F S2240183E083904EB900017C82508F3C00602E2EAE000E4EB9000190EC0C2D003F000C670458 S224018400422D000C422D000E3E872F0D2F3C0001839A4EB900017C82508F3C003EBC008039 S2240184202F390001A6DA2F390001A6D06100FC98508F424030064A9F4CDF20C04E5E4E757F S2240184404E56000048E70F1C2A6E0008286E000C3E2E00100C1400E5670442406002700195 S2240184601A00675047ED000F7C11421B53464A4666F83EBC00202F0C2F0D6100FC4A508F5A S2240184((7760D0B90001A9E823C00001A9E223C00001A9EC2EBC0001A6E24EB9000197184A9FED S2240177804CDF20004E5E4E754E56FFFC0C6E000200086712424030390001A9F44640C17944 S2240177A00001A6BE6012700112390001A6C84881E360C1790001A6BE42790001A9F4427902 S2240177C00001A7B04A6E0008670E424013C000019F8213C000019F8013FC00FF0001A6C82F S2240177E023F90001A9E80001A9F623F90001A9E20001A9EC2EBC0001A6E24EB900019718CD S2240178003EBC00014EB9000171C04E5E4E754E56FFFC2EAE00084EB9000174682EBC00016D S2240178209C8B4EB90001746810390001A6C848803E80065700414EB9000172A44E5E4E75CE S2240178404E56FFFC2EAE000861C43EBC00016100FF384E5E4E754E56000048E707001E2E52 S22401786000092EAE000A61A62EB900019C224EB9000174682EBC00019CCA4EB9000174684D S2240178804A07670C2EBC00019CF44EB9000174682EBC00019D154EB9000174684EB9000136 S2240178A073EA1C00CC3C005F2EBC00019D194EB9000174681006488060203EBC00016100A3 S2240178C0FEC83EBC00016100FEC04A07670470016022601E4240601C6018B07C000367DAAF S2240178E0B07C004167DCB07C004367DEB07C005267E260804A9F4CDF00C04E5E4E754E5690 S224017900000048E7070C2A6E0008284D2EBC00019D1D4EB9000174687E08528C1014488031 S2240179203E800257007F4EB9000172A4534766EA3EBC002E4EB9000172A47E03528C1014DA S22401794048803E800257007F4EB9000172A4534766EA2EBC00019D354EB9000174682EB933 S22401796000019C224EB9000174682EBC00019D454EB9000174684EB9000173EA1C00CC3C24 S224017980005F2EBC00019D844EB90001746810064880603C3EBC00016100FDEE3EBC0001D6 S2240179A06100FDE6022D007F00093EBC00022F0D2F3C000185D84EB900017C82508F302E82 S2240179C0000CE4403E804EB900017BD860166012B07C000367BEB07C004167C0B07C004319 S2240179E067C260864A9F4CDF30C04E5E4E754E56FFFC2EBC00019D884EB9000174684240EA S224017A00302E0008604A2EBC00019D963F3C00016100FE44548F604C2EBC00019D9C3F3CE5 S224017A2000016100FE32548F603A2EBC00019DA36100FE0E2EBC00019DAB42676100FE1846 S224017A40548F60202EBC00019DB36100FDF46014B07C0004620EE5403040D1FC00019C26F7 S224017A6020504ED04E5E4E754E56000048E703042A6E00083E155547BE7C00206706BE7C99 S224017A800021660470FF6048BE7C001E6D0CBE7C00256E069E7C001460104A476D06BE7CBE S224017AA000096F06303C00FF60263047D1C8D1C8D1FC0001A6C22B68002000063047D1C8A9 S224017AC0D1C8D1FC0001A6C2216D0002002042404A9F4CDF20804E5E4E754E56000048E7A9 S224017AE001042A6E0008082D00000001672E23ED00020001A9F623ED00060001A9EC082D7D S224017B0000010001671423F90001A9F60001A9E823F90001A9EC0001A9E260102B79000141 S224017B20A9F600022B790001A9EC00064A9F4CDF20004E5E4E754E56FFEE48E703003E2E8C S224017B4000101D790001A6C8FFF14A476730700248801D40FFEE3007534048801D40FFEF91 S224017B607001122EFFF14881E360C0790001A9F4670A3EBC00044EB9000179EE60107001BC S224017B8048801D40FFEE424048801D40FFEF2D6E0008FFF22D6E000CFFF82D790001A6CCED S224017BA0FFFC60164A4767063EBC0001600242574EB9000179EE4A4066122E8E0697FFFF92 S224017BC0FFEE4EB9000191384A4066D842404A9F4CDF00804E5E4E754E56FFFC42572F39F4 S224017BE00001A6D0306E00082F086100FF4A508F4E5E4E754E56000048E707003E2E0008E5 S224017C003EBC00022F390001A6D030472F086100FF26508F3C0020790001A6D4BE68000CEE S224017C206416304722790001A6CC22690012D1C92F086112205F1080424030064A9F4CDF83 S224017C4000C04E5E4E754E56000048E707042A790001A6D042877C20DE9D53464A4666F890 S224017C6020077210E2A0DE802007E080DE802007C0BC000000FF48804A9F4CDF20C04E5E86 S224017C804E754E56000048E73F1C2A6E000C3E2E001028790001A6D4383C00FF080700002F S224017CA0670C424030390001A6D85240600242403C00600000E4BC6C0008620000F84240DF S224017CC03006C07C0003660000883A06E44D3E856100FF06BA6C000C64000076428030059E S224017CE0264020790001A6CC20280012D7C00807000267086100FF50168060546100FF48F9 S224017D00B013674C20790001A6CC316C00080004760110390001A6C84880E16B424030033A S224017D20C0790001A7B0670887790001A9F46020424030034640C1790001A6BE10390001FB S224017D40A6C848803E804EB900017F846000FF7C33C60001A6D83F0642403006C07C00038F S224017D60EB48484042404840D0B90001A6D02F002F0D206E00084E90DFFC0000000A4A40EA S224017D8067140807000167044244600A42403006C07C000360225246080700036600FF1857 S224017DA020790001A6CC4240302800045240BC406300FF04424030044A9F4CDF38F84E5E39 S224017DC04E754E56000048E703003E2E000820790001A6D4BE680006622E303C0080424151 S224017DE03207C27C0007E2603F0020790001A6CC2068))390001AA8667504A390001A9FC670CC5 S2240170E02EBC0001A9626100E164600A2EB90001AA826100E1584A390001A96067102EB9EB S2240171000001AA826100E55C23C00001A9F02EBC0001A8BA6100FBB6424013C00001AA8638 S22401712013C00001A9606002421560224A390001A9FE67102A790001A9F0423900019F80B7 S2240171406010600A2EBC0001A8BA6100FB804A1567DA4A15670C3EBC00012F0D6100E1E259 S224017160588F4A156600FF204A9F4CDF20004E5E4E750C40003E672C48E77FFE0C40003254 S22401718067162F013F013F004EB900018CAE48C0504F4CDF7FFE4E73204130184CD8000698 S2240171A04E4360EE005720004E73242F0008600C342F00086006222F00066004322F0006F8 S2240171C0302F000448E71F1E4E434CDF78F84E75102F0005E148102F00044E75202F000425 S2240171E080EF0008206F000A48403080424048404E754E56FFFC4A390001A6C2670470010D S224017200600A3EBC00024EB9000171C04E5E4E754E56000048E7070042063EBC00024EB935 S224017220000171C04A40670000723EBC00034EB9000171C01E00B07C0003660A3EBC0002C4 S2240172404EB900017788BE3C001366061C3C00016044BE3C001166044206603ABE3C00104A S22401726066164A390001A6C4670442406002700113C00001A6C4601E0C39007E0001A6C2F6 S2240172806C1420790001A72A108752B90001A72A52390001A6C24A0666904A9F4CDF00C07B S2240172A04E5E4E754E56000048E703001E2E00096100FF5E100748803E803F3C00044EB94D S2240172C0000171BC548F4A390001A6C46712100748803E803F3C00054EB9000171BC548FFB S2240172E0BE3C0020650852790001A6C6601ABE3C000D660842790001A6C6600CBE3C000844 S224017300660653790001A6C64A9F4CDF00804E5E4E754E56000048E703001E2E0009BE3C9A S224017320000966183EBC00206100FF7A424030390001A6C6C07C000766EA600A1007488098 S2240173403E806100FF604A9F4CDF00804E5E4E754E56000048E703001E2E0009BE3C000978 S224017360660A100748803E8061A8601CBE3C0020640C3EBC005E6100FF2C8E3C00401007E6 S22401738048803E806100FF1E4A9F4CDF00804E5E4E754E56000048E703004A390001A6C21E S2240173A0673420790001A72E1E1052B90001A72E53390001A6C24A390001A6C26612203CF9 S2240173C00001A73223C00001A72A23C00001A72E10074880600A3EBC00034EB9000171C0E0 S2240173E04A9F4CDF00804E5E4E754E56000048E70300619E1E003E806100FEAABE3C0010C0 S22401740066144A390001A6C4670442406002700113C00001A6C4100748804A9F4CDF00808D S2240174204E5E4E754E56000048E703003E2E0008BE7C00FF66086100FF5A60226020BE7CF0 S22401744000FE66086100FDAC601460123E87025700FF3F3C00044EB9000171BC548F4A9F2D S2240174604CDF00804E5E4E754E56000048E701042A6E0008600A101D48803E806100FE9464 S22401748010154880B0390001A6C366EA4A9F4CDF20004E5E4E754E56000048E703003E2E71 S2240174A000083EBC000D6100FDFC3EBC000A6100FDF4600A3EBC00206100FDEA53474A4710 S2240174C066F24A9F4CDF00804E5E4E754E56000048E70F0C2A6E00083E2E000C4A2D0001CD S2240174E06704532D00011A2D00014885CA7C00FF49ED0002601C1C1CBC3C0009660850474E S224017500CE7CFFF8600CBC3C00206404544760025247300553454A4066DC60183EBC00088F S2240175206100FD823EBC00206100FD7A3EBC00086100FD72BE790001A6C665E04A9F4CDFA4 S22401754030E04E5E4E754E56FFFE48E70F0C2A6E00083D790001A6C6FFFE422D000160002B S22401756001626100FE2E1E00B07C0003661C4A2D000166163EBC00036100FDD63EBC000225 S2240175804EB9000177886000013ABE3C000D6706BE3C000A66103EBC000D6100FD08600088 S2240175A0013A6000011EBE3C000866103EAEFFFE2F0D6100FF18588F60000108BE3C007F2D S2240175C0663E4A390001A6C567264A2D0001671E102D0001488053401B4000013C00CC7C0F S2240175E000FF1035600248803E806100FCB8600C3EAEFFFE2F0D6100FED4588F600000C475 S224017600BE3C001066184A390001A6C4670442406002700113C00001A6C4600000A6BE3CF0 S224017620001866163EAEFFFE2F0D6100FEA0588F4A2D000166EE6000008ABE3C0005660C7E S2240176403EAEFFFE6100FE5060000078BE3C001566163EBC00236100FC4C3EAEFFFE610019 S224017660FE36422D0001605ABE3C001266323EBC00236100FC303EAEFFFE6100FE1A42466E S224017680600E1035600248803E806100FCC45246102D00014880C07C00FFBC4065E4602288 S2240176A010074880224D142D00014882C47C00FF48C2D3C2134000023E806100FC94522D09 S2240176C00001102D00014880C07C00FF12154881C27C00FFB0416D00FE8A4A9F4CDF30E02B S2240176E04E5E4E754E56000048E701042EBC000171723F3C00223F3C00164EB9000171AA1E S224017700588F42390001A6C2203C0001A73223C00001A72E23C00001A72A13FC00240001C0 S224017720A6C342390001A6C413FC00010001A6C542B90001A8B43EBC000D4EB900018CAED7 S2240177403EBC00124EB9000171C02A40202D000223C00001A9E823C00001A9F6202D0006DA S22401**016A400001A96210307000488048C02E803F3C00024EB9000150C6548F5247BE7C008025 S224016A60642090C83047D1FC0001A9620C10001A671090C83047D1FC0001A9620C10000D66 S224016A80669ABE7C0080662E90C83047D1FC0001A9620C10001A671E90C83047D1FC0001A2 S224016AA0A9620C10000D670E42476100FDDA4A4066027C01602A90C83047D1FC0001A962C5 S224016AC00C10000D66105447BE7C0080650642476100FDB4600813FC00010001A9FE7C0119 S224016AE04A466700FF36424030074A9F4CDF20C04E5E4E754E56000048E71F0C2A6E0008AA S224016B0042473A390001A6BC600000FA207C0001A962103050004880600000D42E8D3F0583 S224016B206100FEE2548F3A00600000DA4A47631A90C83047D1FC0001AA0092C93245D3FCC1 S224016B400001A96210915245524760025245BA7C0080642090C83045D1FC0001A9620C105D S224016B60002067E890C83045D1FC0001A9620C10000967D8BA7C0080650E42456100FD0880 S224016B804A406602600260C26000007A524533C70001A6BC2E8D3F3C00013F056100FD14BE S224016BA0588F3A003E390001A6BC60585245BA7C0080650642456100FCCE604813FC0001FA S224016BC00001A9FE603E90C83047D1FC0001AA0092C93245D3FC0001A962109152455247A4 S224016BE0BA7C0080650642456100FC9C601648C0207C00019B947206B09857C9FFFC206841 S224016C0000184ED04A390001A9FE6628BE7C0080642290C83045D1FC0001A9620C10000D70 S224016C20671290C83045D1FC0001A9620C1000216600FEDA90C83045D1FC0001A9620C10F2 S224016C40000D671090C83045D1FC0001A9620C100021666860025245BA7C0080643090C85E S224016C603045D1FC0001A9620C10000D67E890C83045D1FC0001A9620C10000A67D890C8E5 S224016C803045D1FC0001A9620C10002167C8BA7C0080660C42456100FBEE4A40671E601AB2 S224016CA090C83045D1FC0001A9620C10001A660813FC00010001A9FE6002609833C5000179 S224016CC0A6BC4A9F4CDF30F04E5E4E754E56000048E707042A6E00084247600E90C8304765 S224016CE0D1FC0001AA0042105247BE7C008063EC2EBC000000FF3F3C00204EB9000150C680 S224016D00548F3C00428030390001A8B82E803F3C00204EB9000150C6548F2EBC0001A96282 S224016D203F3C001A4EB9000150C6548F4A390001A96066084A390001AA8667224247600E88 S224016D4090C83047D1FC0001A96242105247BE7C008065EC6100FB3042790001A6BC4A3962 S224016D600001A9FE66062E8D6100FD8A4247604C90C83047D1FC0001AA000C1000616D22CE S224016D8090C83047D1FC0001AA000C10007A6E12207C0001AA00103070004880D07CFFE0A6 S224016DA0600C207C0001AA0010307000488092C93247D3FC0001AA0012805247BE7C00806F S224016DC065AE2EBC0001A8303F3C001A4EB9000150C6548F428030062E803F3C00204EB9F9 S224016DE0000150C6548F4A9F4CDF20C04E5E4E754E56000048E707042A6E00082E8D610096 S224016E00E5B06000012842576100ECA4600001323EBC00016100EC98600001266100EEA6D5 S224016E206000011E6100EFD2600001166100F32A6000010E6100F46A4A4066122EBC00019B S224016E409ADC3F3C00094EB9000150C6548F600000F010390001A7B84880D07CFFBF48C05E S224016E602E803F3C000E4EB9000150C6548F600000D07C074A390001A7D6660000862EBC4A S224016E8000019A183F3C00094EB9000150C6548F2EBC0000007F2F3C0001A9626100E6E6A7 S224016EA0588F4247601A90C83047D1FC0001A7B892C93247D3FC0001A9621151001E52471E S224016EC090C83047D1FC0001A9620C1000206712207C0001A9624A3070006706BE7C001DF9 S224016EE065C490C83047D1FC0001A7B84228001E4A47670A13FC00010001A9FC6002604025 S224016F00600642390001A9FC60027C0A3E866100F45A4A40662ABC7C0007672442572F3CA1 S224016F200001A7B86100E41A588F6014B07C000962EAE5403040D1FC00019BCC20504ED058 S224016F404A9F4CDF20C04E5E4E754E56000048E7010413FC00010001AA8A2EBC0001A830E8 S224016F603F3C001A4EB9000150C6548F4A390001A6C06732428030390001A7B62E803F3C40 S224016F80000E4EB9000150C6548F428030390001A9E62E803F3C00204EB9000150C6548FD7 S224016FA042390001A6C04AB90001A8B467282A790001A8B4528D204D22790001A8B4121193 S224016FC04881C27C00FF48C1D1C1421042B90001A8B4600000AE4A3900019F8267604A3963 S224016FE000019F80673A2A7C0001AA002EBC0001A8BA6100FCD860224A390001A9FE6710D3 S2240170002A790001A9F0423900019F806010600A2EBC0001A8BA6100FCB44A1567DA600654 S2240170202A790001A9F0423900019F824A15670C3EBC00012F0D6100E308588F604461002F S224017040E2582A7C00019EFB4A3900019EFA67204A390001A9FA67183EBC00012F3C000100 S2240170609EFB6100E2DC588F42390001A9FA60122EBC000000802F3C00019EFB6100E5061F S224017080588F600000DE23CD0001AA822E8D6100E60E4A390001A7B867140C39003B0001B9 S2240170A0A7B8670A2EBC0001A7B86100FD444A3900019F80660C2E8D6100E5A82A40600086 S2240170C000922A7C0001AA004A390001A96066084A++000150C6548F33C00001A7B60C6E000A2E S2240163C000086604424760027E012EBC0001AA8C3F076100F3F0548F3E004A4763182EBC19 S2240163E000019A6E3F3C00094EB9000150C6548F424060000488287C0001A0522A540C3941 S22401640000200001AA956600022C601042401940000919400008D9FC0000000A20544A1020 S22401642066EA10390001AA8C4880534048C02E803F3C000E4EB9000150C6548F13FC003F9D S2240164400001AA8C42390001AA982EBC0001AA8C3F3C00114EB9000150C6548F3E006000F5 S22401646000F2EB4F90C83047D1FC0001A8304A106716207C0001A830103070004880B07988 S2240164800001A9E6660000C07C09601290C83047D0C6D1FC0001A8300210007F5246BC7CDD S2240164A0000B63E890C83047D1FC0001A8304228000C287C0001A052600000842EBC00012F S2240164C0AA952F146100ED22588F42403007484042404840D0BC0001A8302E8052972F3C2B S2240164E00001AA8D6100ED20588F4A40664A1D7C0001FFF8207C0001A83010307000488051 S224016500B0790001A9E66608197C000100086006197C000100090C6E000A0008661A2E8DE4 S2240165202F146100ECE2588F4A40660C4A2C000867061D7C0001FFFED9FC0000000A20542B S2240165404A106600FF783EBC00124EB9000150C63E00BE7C00FF67084A2EFFFE6700FF040F S2240165604A2EFFF866440C6E0007000866122EBC00019AC63F3C00094EB9000150C6548F2B S22401658013FC00010001AA8A42390001A6C0428030390001A7B62E803F3C000E4EB9000106 S2240165A050C6548F4240600002D40C6E000A000866102EBC0001AA8C42676100F208548F1A S2240165C060102EBC0001AA8C3F3C00016100F1F6548F287C0001A052602C4A2C0008660670 S2240165E04A2C0009671A0C6E000A0008671E2EBC00019C162F146100EC0E588F4A40670C65 S224016600D9FC0000000A20544A1066CE20544A1067224A2C0008660E42973F3C00204EB9CF S224016620000150C6548F2EBC0001AA952F146100EBB8588F428030390001A7B62E803F3C50 S224016640000E4EB9000150C6548F600001082EBC0001AA8C3F3C000F4EB9000150C6548F10 S224016660B07C0003620000CA7C09601090C83046D1FC0001AA8C0210007F5246BC7C000B86 S22401668063EA0C3900530001AA95660000920C3900550001AA96660000860C390042000188 S2240166A0AA976600007A1D7C0001FFFA2EBC000000FF3F3C00204EB9000150C6548F33C0A8 S2240166C00001A8B84A3900019F80670A13FC00010001AA86600813FC00010001A9604247F3 S2240166E0601890C83047D1FC0001A93C92C93247D3FC0001AA8C10915247BE7C002465E2E1 S2240167000C6E000A0008660642390001A9FC13FC000100019F8042390001A9FE600E0C6E1F S2240167200007000867061D7C0001FFFC602A60242EBC000000FF3F3C00204EB9000150C692 S224016740548F4A40671242973F3C00204EB9000150C6548F6000FEF84A2EFFFC670000C2E6 S2240167602EB90001AA826100ED9A4A2EFFF86626287C0001A05260182EBC0001AA952F14A0 S2240167806100EA84588F4A40670CD9FC0000000A20544A1066E220544A1067082D6C000471 S2240167A0FFF460082D7C000150D2FFF42F390001AA82206EFFF44E90588F60502EBC000143 S2240167C09B0A3F3C00094EB9000150C6548F60502EBC00019B323F3C00094EB9000150C67F S2240167E0548F603C2EBC00019B4E3F3C00094EB9000150C6548F60282EBC00019B703F3CC2 S22401680000094EB9000150C6548F6014B07C000167AAB07C000267B8B07C000367C660D8D5 S2240168204A2EFFFA661A0C6E0007000866122EBC00019AC63F3C00094EB9000150C6548F90 S224016840428030390001A9E62E803F3C00204EB9000150C6548F13FC00010001AA8A42396D S2240168600001A6C0423900019F824A2EFFFA660A4A2EFFFC66044240600270014A9F4CDFE7 S22401688030C04E5E4E754E56FFFC2EBC0001A93C3F3C00144EB9000150C6548F4A40670C97 S2240168A013FC00010001A9FE4240600270014E5E4E754E56000048E73F0C3E2E00083C2E5A S2240168C0000A2A6E000C38390001A6BCBE7C00806510424761B04A40660842403007600056 S2240168E0011A90C83047D1FC0001A9620C1000306D0000B690C83047D1FC0001A9620C109C S22401690000396E0000A4207C0001A9621030700048803600D67CFFD0284D0C1C0053662633 S2240169200C1C005566200C1C0042661A0C1C004D66140C1C0049660E0C1C005466080C1486 S224016940002066025243284D7A0160186002528C0C14002067044A1466F40C140020660261 S224016960528C5245BA4363E4602ABC7C0001661090C83044D1FC0001AA00109C5244601425 S224016980101C488048C02E803F3C00024EB9000150C6548F0C140020670A4A146706B87C19 S2240169A0008065C65247603CBC7C0001661290C83044D1FC0001AA0010BC00245244601204 S2240169C02EBC000000243F3C00024EB9000150C6548F90C83047D1FC0001A9620C1000243D S2240169E06602524733C40001A6BCBE7C0080650642476100FE92424030074A9F4CDF30F8A2 S224016A004E5E4E754E56000048E707043E2E00082A6E000A42466100E880604090C830474D S224016A20D1FC0001A9620C100024661252472E8D42673F076100FE7C588F3E00601E207C62 S224,éé,24015D20FAA4548F3E004A47660000924A390001A7D6670000882EBC0001AA8C3F3C000F7A S224015D404EB9000150C6548FB07C0003626E603C4247603290C83047D1FC0001A8300C10F5 S224015D60001A671E207C0001A83010307000488048C02E803F3C00024EB9000150C6548F5D S224015D80600260085247BE7C007F63C82EBC0001AA8C3F3C00144EB9000150C6548F4A407B S224015DA067AE10390001AA8C488048C02E803F3C00254EB9000150C6548F60324A39000113 S224015DC0A7D6672A4A4763142EBC00019A6E3F3C00094EB9000150C6548F60122EBC0001D2 S224015DE09A643F3C00094EB9000150C6548F4A9F4CDF00804E5E4E754E56FFDC48E71F004A S224015E0042444A390001A7D6665E2EBC00019A2A3F3C00094EB9000150C6548F2EBC000013 S224015E20001D2F3C0001A8126100F75A588F4A390001A812670003182EBC00019A3C3F3C84 S224015E4000094EB9000150C6548F2EBC0000001D2F3C0001A7D66100F72C588F13FC003D8B S224015E600001A7F4600000C242476002524790C83047D1FC0001A7B80C28003D001E670CDC S224015E80207C0001A7B84A30701E66E090C83047D1FC0001A7B80C28003D001E661C4A4714 S224015EA06314207C0001A7B84A30701F67084A390001A7F467027801601C0C39003D0001F1 S224015EC0A7F466104A390001A7F566084A390001A812660278014A44664E90C83047D1FC20 S224015EE00001A7B80C28003D001E663C90C83047D1FC0001A7B84228001E52474246207CCA S224015F000001A7B81030701E488092C93246D3FC0001A7B81340005A524752464A4066DED7 S224015F2013FC003D0001A7F47C01600000AE42456002524591C8304542413206C2FC001E03 S224015F40D1C1D1FC0001A7B80C10003A671A91C8304542413206C2FC001ED1C1227C00010F S224015F60A7B84A30980066CABA7C0001631C91C8304542413206C2FC001ED1C1D1FC0001FF S224015F80A7B80C10003A660278014247604442403006C0FC001E2040227C0001A7B8103008 S224015FA098004880227C00019B84123170004881B041661C425742403006C0FC001ED0BC17 S224015FC00001A7B82F006100F378588F600001805247BE7C001065B65446BC7C000465005F S224015FE0FF4E4A44660001524A390001A7D6670001484A390001A8126700013E2E8E069719 S224016000FFFFFFDC3F3C00016100F7BA548F3E002EBC0001AA8C3F3C00036100F7A8548F70 S2240160203C004A47660001004A46660000FA102EFFDC4880B0390001AA8C673E0C39003A11 S2240160400001A7D766140C39003A0001A813670A13EEFFDC0001AA8C60200C39003A000182 S224016060A7D767140C39003A0001A813660A1D790001AA8CFFDC600278010C2E0001FFDCDD S2240160806D080C2E0010FFDC6F0278014A44662E2E8E0697FFFFFFDC3F3C00114EB900018E S2240160A050C6548FB07C00FF67142EBC00019A4E3F3C00094EB9000150C6548F6066424596 S2240160C07E10601A90C83047D1FC0001AA8C224E95CA3445D3CA10A9FFDC52455247BE7CFC S2240160E0002363E04A390001AA8C6D0A0C39000F0001AA8C6F0278014A4466282EBC000187 S224016100AA8C3F3C00174EB9000150C6548F4A4063122EBC00019A643F3C00094EB900013C S22401612050C6548F60122EBC00019A6E3F3C00094EB9000150C6548F4A4467122EBC000184 S2240161409A863F3C00094EB9000150C6548F4A9F4CDF00F04E5E4E754E56000048E703004B S2240161604A390001A7D666242EBC00019A183F3C00094EB9000150C6548F2EBC0000001D65 S2240161802F3C0001A7D66100F3FC588F4A390001A7D6670001026100F8584A40660000F8D5 S2240161A06100F8843E003E876100F8B64A40670000E60C39003A0001A7D7661A4A39000111 S2240161C0A7D8661242572F3C0001A7D66100F172588F600000C22EBC0001AA8C3F3C0001D6 S2240161E06100F5E2548F3E004A47630000784A3900019F80666E2EBC00019AA43F3C0009B0 S2240162004EB9000150C6548F42973F3C00014EB9000150C6548F13C00001A7F40C3900610C S2240162200001A7F46D180C39007A0001A7F46E0E10390001A7F44880D07CFFE060081039D7 S2240162400001A7F4488013C00001A7F46100EF6E0C39004E0001A7F4670A0C390059000168 S224016260A7F466320C39004E0001A7F467282EBC0001AA8C3F3C00134EB9000150C6548F77 S2240162804A4063122EBC00019A643F3C00094EB9000150C6548F4A9F4CDF00804E5E4E7588 S2240162A04E56000048E703004A390001A7D666242EBC00019AB43F3C00094EB9000150C69C S2240162C0548F2EBC0000001D2F3C0001A7D66100F2B4588F4A390001A7D6660670016000B9 S2240162E000806100F70C4A4067067001600000720C3900300001A7D66D0A0C390039000191 S224016300A7D66F04424060581E390001A7D64887DE7CFFD0BE7C00096304424060424A392F S2240163200001A7D76712CEFC000A10390001A7D74880DE40DE7CFFD0BE7C0010641C4A3967 S2240163400001A7D86614428030072E803F3C00204EB9000150C6548F600442406002700141 S2240163604A9F4CDF00804E5E4E754E56FFF448E7070C42390001AA8A13FC00010001A6C014 S224016380422EFFFE422EFFF8422EFFFA422EFFFC2EBC000000FF3F3C00204EB9000150C6AD S2240163A0548F33C00001A9E642973F3C00194EB9-`ΤT ÿÿCP/M 9/30CP/M-68K of 9/30/82 0020¤„-€?<N¹DTJfêJŸLß N^NuNVHç>.0`".¼%ðaºN¹0.¼%þa¬`.¼&a¢`J@gÚ°|gâ°|gæ.¼&-aˆN¹0JŸLßÀN^NuNVHç*n.¼,¤Bg?<N¹DX.Bg?<N¹DX°|ÿm>¼aÿjB- .Bg?<N¹DXJ@g>¼aÿJ&|,¤ S`fJkf>¼aÿ0(k.+Þ«>¼d/ /<,ÀN¹¬PÙüdž¼d`8.ŒBg?<N¹DX.Bg?<N¹DXJ@g>¼aþÖÙü€ž¼€J‡nÄ +JŸLß8€N^NuNVÿøBW?<N¹DTJ@gBWaþœ.¼%Îaþì-@ÿü.¼&5aþV.¼&\aþL nÿüNN^Nu$/` 4/`"/`2/0/HçN¹–LßxøNu/áH/Nu/ o /€ï 0ÀH@0€ _NuNVÿêpH€@ÿîB@H€@ÿï-nÿò-n ÿø-y,ˆÿü.Ž—ÿÿÿîN¹ÖN^NuNVÿü.¹,Œ0n/a´XN^NuNVHç *n (y,BG`RB@0À|f<äN>†aÀJ@gpÿ`B?B@0À|ëHH@B@H@й,Œ// nNßü J@g B@0À|` RG¾lc¨0<ÿJŸLß0ÀN^NuNVÿîHç. H€À|ÿ°|opÿ`FB.ÿîGÿñB.ÿï.Ž—ÿÿÿîN¹Ö#îÿü,ˆfpÿ` y,ˆ#è ,Œ y,ˆ#è,B@JŸLß ÀN^NuNVHç *n(n >.`Ý0SGJ@föJŸLß0€N^NuNVHç *n(n ~  ?H€H³@À|gJgB@`LSGJGfÜJ.g> ?g H€H³@"y,)HFAÀAgB@`TTŒH€H³@À|?gB@`pJŸLß0ÀN^NuNVHç*n>¼/. / aÿbPg- >¼ / /. aÿ PG H€JŸLß ÀN^NuNVHç *n(y,,H†- H‡,H€Î@pFág0- HÂ|ÿ4äaÐAJŸLß0ÀN^NuNVHç*n>. Jng0GÑÈ>µˆN¹L` ` 5pH€À|ÿJŸLß €N^NuNVÿüHç*y,B€0.-HHÁã -H. H‚ÂBHÁÐ-@ÿü.¹,”/.ÿüN¹pXJŸLß N^NuNVHç*n-Î<?- R¼< mBR¾<@mp``H€-HÂ|?°Af*H€- H³@"y,)HFAÀAÀ|fF B@`$GF ./<\N¹ÂX°|ÿep`B@JŸLß ÀN^NuNVHç *n~Ií J$fSGJGfö y, hÿcâOp"y,)HAàoB@0"y,)HFA- H‚ÂBÂ|€AJŸLß0€N^NuNVHç*n.aˆ>- H€¾@f-H€À|ÿ``- H€¾@c0<€``B@JŸLß €N^NuNVHç*n y,8(È|ÿ -€ f.aþ’J@gp`LB- .a€- HÂ|ÿ°Abp`2.aý–<>„?/ aýÒ\>JGfp`- H€>€?aýôTR- JŸLß ðN^NuNVHç>.<. *n 0`XB@0À|ÿ>€?<N¹4T`V>†N¹>`NBB- B-./<\N¹ÂX`2B.N¹¾`&#Í,”`pÿ``HÀ |&”r°˜WÉÿü hNÐB@JŸLß ÀN^NuNVÿüHç*n-0967EC200D4A9F4CDF20004E5E4E754E56D8 S2240156A0000048E7070C2A6E0008287C0001A7B842476004421C5247BE7C007865F6424784 S2240156C06000007042466022BC7C001D641A42403007C0FC001E42813206D081D0BC0001AB S2240156E0A7B8204010955246528D0C15002167100C150020670A0C15000967044A1566C83C S22401570091C8304642413207C2FC001ED1C1D1FC0001A7B8421052470C15002067060C15A3 S22401572000096602528DBE7C0001660623CD0001A7B24A15670C0C1500216706BE7C000463 S22401574065824A9F4CDF30C04E5E4E754E56000048E703042A6E00080C1500206E0470014B S224015760602242476016207C00019B84103070004880B01566047001600A5247BE7C001081 S22401578065E442404A9F4CDF20804E5E4E754E56000048E701042A6E00080C15002A6604E8 S2240157A0703F60162E8D61A44A40660C52790001AA8810154880600270204A9F4CDF2000F1 S2240157C04E5E4E754E56000048E71F0C3E2E00082A6E000A4215780C600C204D93C93244BA S2240157E0D1C942105244B87C002363EE7801600E204D93C93244D1C910BC00205244B87C03 S224015800000B63EC4A390001AA8A67061C3C003F60041C3C002042790001AA88284D4240AB S2240158203007C0FC001ED0BC0001A7B8428132390001AA88D08120404A106638528C7A0102 S224015840600418C65245BA7C000B63F642973F3C00194EB9000150C6548F52401A804A39B2 S2240158600001AA8A6708700B6000017C600642406000017442403007C0FC001ED0BC000149 S224015880A7B8428132390001AA88D08120400C28003A0001667090C830790001AA88424195 S2240158A03207C2FC001ED2BC0001A7B8103018004880D07CFFC0188054790001AA8842409A S2240158C03007C0FC001ED0BC0001A7B8428132390001AA88D08120404A10662849ED000194 S2240158E07A01600418C65245BA7C000B63F64A390001AA8A6708700B600000EC60064240DE S224015900600000E4601242973F3C00194EB9000150C6548F52401A80284D528C7A016022E1 S22401592042403007C0FC001ED0BC0001A7B8428132390001AA88D0812E806100FE5218C0F9 S2240159405245BA7C000863D8600652790001AA8842403007C0FC001ED0BC0001A7B842818B S22401596032390001AA88D0812E806100FDE04A4067D842403007C0FC001ED0BC0001A7B8FE S224015980428132390001AA88D08120400C10002E663252790001AA887A0160224240300759 S2240159A0C0FC001ED0BC0001A7B8428132390001AA88D0812E806100FDD618C05245BA7CE2 S2240159C0000363D842447A016012204D93C93245D1C90C10003F660252445245BA7C000B05 S2240159E063E8424030044A9F4CDF30F04E5E4E754E56FFFC4A390001A7F467242EBC0001C9 S224015A009AF43F3C00094EB9000150C6548F42572F3C0001A7F46100F928588F7001600291 S224015A2042404E5E4E754E56000048E70300424760025247207C0001A7B84A30701E671298 S224015A4090C83047D1FC0001A7B80C28003A001E66E0424030074A9F4CDF00804E5E4E75B6 S224015A604E56FFFC207C0001A7B893C9326E0008D1C90C28003A001E662E0C6E0001000844 S224015A8066140C3900410001A7D66D0A0C3900500001A7D66F1242572F3C0001A7D6610094 S224015AA0F8A0588F4240600270014E5E4E754E56FFF848E73F003E2E0008426EFFF8422E09 S224015AC0FFFE6100FF2C4A40660001F06100FF5836003E83618A4A40670001E02EBC0001FF S224015AE0AA8C3F3C00016100FCDC548F10390001AA8C4880D07C00403D40FFFA2EBC00019D S224015B00AA8C3F3C00114EB9000150C6548F3C00BC7C00FF66122EBC00019A643F3C000964 S224015B204EB9000150C6548F3806EB4C524442456000014C4A47671290C83044D1FC00017B S224015B40A83008280007000966164A47663A90C83044D1FC0001A83008280007000966283A S224015B604A2EFFFE67086100F654422EFFFE4A4566144280302EFFFA2E803F3C00024EB9CF S224015B80000150C6548F601C3D7C0001FFF83EBC00124EB9000150C63C003806EB4C524467 S224015BA0600000DCEB4E52462EBC0000003A3F3C00024EB9000150C6548F2EBC0000002026 S224015BC03F3C00024EB9000150C6548F7601603CB67C000966122EBC000000203F3C0002F4 S224015BE04EB9000150C6548F207C0001A830103060004880C07C007F48C02E803F3C0002D3 S224015C004EB9000150C6548F52465243B67C000B63BE2EBC000000203F3C00024EB9000163 S224015C2050C6548F3EBC00124EB9000150C63C00BC7C00FF675052453806EB4C5244BA7C39 S224015C400005663A42454A47671290C83044D1FC0001A83008280007000966164A476618CB S224015C6090C83044D1FC0001A83008280007000966066100F54860061D7C0001FFFEBC7C2D S224015C8000FF6600FEB04A6EFFF8672E6100F52E4A4767142EBC000199FE3F3C00094EB90A S224015CA0000150C6548F60122EBC00019A023F3C00094EB9000150C6548F4A9F4CDF00F85A S224015CC04E5E4E754E56000048E703004A390001A7D666242EBC00019A183F3C00094EB9C6 S224015CE0000150C6548F2EBC0000001D2F3C0001A7D66100F890588F6100FCF64A406600A1 S224015D0000EE6100FD223E003E876100FD544A40670000DC2EBC0001AA8C3F3C000161008F S2.H€`–-H€>€-H€??< N¹(X+@`~(m&l.ŽY—?/-N¹X\>®ÿüB@0+ÑW?< N¹4T.”?.ÿþ?<N¹"X>€?< N¹4T.­ ?< N¹.T>¼ N¹8`` J@gÿh°|g„B@JŸLß8N^NuNV//?N¹$fN^Nu@ÀàHÀ¼@ÁàYÂ|ÿøÒoàYFÁNu// Kï MíNO*_,_Nu o0<"|ñÀÙÑQÈÿüNu o0<"|ñÀÙ˜QÈÿüNu o/9#ü(p#ßNupßü:#ßNuNVÿü`þN^NuNVHç?>.&. <.:.8.0`&0GÑÈÑÈÑü,x ƒ`,0GÑÈÑÈÑü,x ¼``S@°| bå@0@Ñü'ê PNо|l¸|g¸| fJƒfz|ÄñÀÑ |'â0pH€ë@HÀ"tä¡€ÀñÀÑ à€ÀñÀÑÃñÀÑÆñÀÑ02GÓÉÓü=¼2€AÀñÀÑJŸLßøN^NuNVÿþHç>.<. :. 8.BnÿþüÀñÀÑ |'â0pH€ë@ÀñÀÑ0ë@2àA€AÀñÀÑÅñÀÑÄñÀÑ0.ÿþÀñÀÑ0GÑÈÑÈÑü,x ¼JŸLßðN^NuNVÿü9ñÀÓH€À|€fòùñÀÑ=®ùñÀÑ=°9=°H€ê@À|HÀм'æ @Ð=¯9ñÀÑH€3À=²09=²á@9ñÀÑHÐA3À=²ùñÀÑ=´9=´H€À|À=µ9=´H€ê@À=´ùñÀÑ=¶ùñÀÑ=·ùñÀÑ=¸ùñÀÑ=¹ùñÀÑ=ºN^NuNVHç>.<. 0Áüм'v @*h¾|m02HÁ4GÕÊÕü'>ƒÒÁÁ`NzP»ü'Ff:< 0HÀü¼@l02HÁ4GÕÊÕü'>ƒÒÁÁã@HÀ`0Fã@S@2HÁ4GÕÊÕü'>ƒÒÁÁJŸLß àN^NuNVÿøHç>.*. <.*n>¼?<4?/?aý,ßü `Ú`9ñÀÓH€À|g.N¹ÜÛü€9ñÀÓH€À|€fÖaþ< 9=®g9=®H€`˜`9=·H€á@9=¸HÐAHÀ-@ÿü мÿÿÿ-@ÿø9=¹H€"nÿøÓîÿü±9=ºH€"nÿøÓîÿüR‰±J9=¶g6>¼?<49=¶H€? 2HÁÐ9=¶HHÁ/?aüVßü `B@``ÿ&JŸLß àN^NuNVÿðHç>.<. *n :.>†?aþ2T-@ÿú0Áü @"|'v p˜=Pÿö0.ÿöHÀ2GÓÉÓü'>Ñ=@ÿø-Mÿò=| ÿþ0`¬.?.ÿø/.ÿú?aþvP=@ÿð`¤>…?<4?.ÿø/.ÿú?aû¬ßü `&9ñÀÓH€À|gJnÿög.N¹òÛü€Snÿö9ñÀÓH€À|€fÌaü¶9=®H€=@ÿð`@>…?<4?.ÿø/.ÿú?aûJßü aüŠ9=®H€=@ÿð``°|gÿP°| gÿb`À*nÿòJnÿðgSnÿþfÿ.JnÿðgB@``pJŸLß àN^NuNVHç. H€3À=ªH€Áü*@Ûü'v. føH€`ÔH€0@ÑÈÑü=¼JPf(H€0@ÑÈÑÈÑü,x 〠€H€0@ÑÈÑü=¼0¼€/<H€0@ÑÈÑÈ"|,x/0˜N¹%0P,J†f|é†>¼ ?<4?</H€?aú>ßü aû~9=®H€`*+|'F`,+|'VH€0@ÑÈÑü=¼BP`›Í`` J@gÒ°|gÖ`î`$`"B€` `J@gÿ*°|gÿ"°|gä°|gÞ`Þ JŸLß ÀN^NuNVÿüBy=Ä>¼?<4BgB§?9=ªaù¢ßü 9ñÀÓH€À|€fòN^NuNVHçJy'Þf‚B9ñÀÓBG`"0GÑÈÑü=¼0¼€0GÑÈÑÈÑü,x ¼RG¾|mØ>¼(?<O?<Bgaú\9ñÀÓH€À|€fò>¼ÿ?<1?<?<aùà\9ñÀÓH€À|€fò3ü'ÞJŸL߀N^NuNVHç J9,˜g09=¬°y=Äg$>¼/<-¨?9=Ä?9=ªaü|PJ@fp`8ü,˜3ù=Ä=¬09=¨ï@HÀ*@Ûü-¨(y-¤><€ÝSGJGføB@JŸLß0€N^NuNVHç>.*n g 5pH€``0R@JŸLß €N^NuNVHç0.å@HÀ*@Ûù(. n/g nNg*® JŸLß €N^NuNVÿüaN^NuNVHçB9,˜aþ`JŸL߀N^NuNVHç>.,. *.0`”a¾`¢ H€>€N¹Æ`’aýê`Š0y'à"|'æ0˜H€HÀ, H€>€ H€?aüŽT`^3Æ=Ä`V S@3À=¨`J#Æ-¤`BaþpHÀ`:.… ?aþæTHÀ`*.… ?aÿT`B€```°|bòå@0@Ñü( PNÐJŸLßàN^NuNVÿþHç?BCB…..,. f#ü€,t <€ü`hlD†RCJ‡lD‡RC¼‡n8fzB‡`0¾¼l ŽÆ:HGHÇ`x¾†eã†ã„`öJ„g¾†eŠ„ž†âŒâŽ`î¶|fD‡#Ç,t D€`#Ç,t JŸLßøN^NuCPM SYS Boot error. Open or Read error on Bad file format on CPM.SYS CP/M-68K(tm) Version 1.2 03/20/84 Copyright (c) 1984 Digital Research, Inc. &Ä'\t~š¦®CP/M-68K(tm), Version 1.1, Copyright (c) 1983, Digital ResearchXXXX-0000-654321Copyright 1984, Motorola Inc.BIOS 2.15 9À  ™À  ¿ÿÿ-$'F-$'F-$'fržžžžbžbbb$€% % % $†% % % $–$ž$È$Ð$Ü$ä% % $ì% % % % % $üé.S2240150004EF90001504C4EF9000150462043502F4D2D36384B2056312E3220434F505952FF S224015020494748542028432920313938322C313938342C204469676974616C2052657365DB S224015040617263682000423900019EFA4FF90001A6BA423900019EFA4EB90001B00033C010 S22401506000019F7E42390001A6C0423900019F80423900019F8213FC00010001A9FA427983 S22401508000019FFC427900019FFE4EB90001997C4EB9000176E4303C0020428112390001FB S2240150A09F7E4E424280303C000E4281323900019F7E024100FF4E424FF90001A6BA4EB933 S2240150C000016F4A60F2302F0004222F00064E424E75223C00019FFE303C003F4E4223F95E S2240150E00001A00000019FEC23F90001A00400019FF023FC0001AA8C00019FE8703B223C45 S22401510000019FE84E424A406600009232390001A9E670204E424281223900019FF4D27CD4 S22401512000802241701A4E422449528920790001A7B242800C100000670C0C100021670636 S22401514012D8524060EE148012BC00002F3C0001AA8C3F3C00014EB9000157C45C8F42802F S224015160705C613E2F3C0001AA8C3F3C00024EB9000157C45C8F4280703861262079000106 S2240151809FF8227900019FF42109213C0001519E4E60206900084EF90001992C4E7570004D S2240151A04E42D0B900019FF42040227C0001AA8C4280702310D951C8FFFC4E754E56FFFC53 S2240151C02EBC0000000D3F3C00024EB9000150C6548F2EBC0000000A3F3C00024EB90001DB S2240151E050C6548F4E5E4E754E56000048E7010C2A6E0008286E000C18DD66FC4A9F4CDFB4 S22401520030004E5E4E754E56000048E7010C2A6E0008286E000C601C10154880B0146F0427 S2240152207001601E10154880B0146C0470FF6012528D528C4A1566E04A1466044240600269 S22401524070FF4A9F4CDF30004E5E4E754E56000048E7011C2A6E0008267C0001A8BA4A390E S2240152600001A9FC6718287C0001A7B8600216DC4A1466FA16FC002042390001A9FC600238 S22401528016DD4A1567060C15002166F442134A9F4CDF38004E5E4E754E56FFFC48E70700C8 S2240152A02EBC000000FF3F3C00204EB9000150C6548F3C0042973F3C00194EB9000150C69C S2240152C0548F3E00DE7C00416100FEF24A466742BC7C000A651A1D7C0031FFFC4240300644 S2240152E0D07C00261D40FFFD1D7C0024FFFE601242403006D07C00301D40FFFC1D7C002468 S224015300FFFD2E8E59973F3C00094EB9000150C6548F428030072E803F3C00024EB900012E S22401532050C6548F2EBC0000003E3F3C00024EB9000150C6548F4A9F4CDF00C04E5E4E7585 S2240153404E56000048E703042A6E00083E2E000CBE7C000166144A3900019EFA67084A3992 S2240153600001A9FA66046100FF306014101D488048C02E803F3C00024EB9000150C6548FEC S2240153804A1567060C15002166E24A4766142EBC0000003F3F3C00024EB9000150C6548FFF S2240153A060046100FE184A9F4CDF20804E5E4E754E56000048E707042A6E00084247603C46 S2240153C042403007C0FC00062040227C000199CE2EB098002F0D6100FE2E588F4A40661AB6 S2240153E042403007C0FC00062040227C000199CE424030309804600001005247BE7C00070D S22401540065BE424760025247BE7C001D641090C83047D1FC0001A7B80C10003A66E8BE7C3A S2240154200001662A4A390001A7BA66224A390001A7D6661A0C3900410001A7B86D100C393F S22401544000500001A7B86E067005600000ACBE7C0001661A0C3900410001A7B86D0A0C3944 S22401546000500001A7B86F0670FF6000008CBE7C0001671690C83047D1FC0001A7B80C10D6 S224015480003A660670FF600000702EBC0001AA8C426761000330548F4A40630470FF6058C8 S2240154A0BE7C000166047E026002424742403007484042404840D0BC0001A7B82E80610090 S2240154C0028C4A40670470FF602E4246601690C83046D1FC0001A7B80C1000206C0470FF32 S2240154E060165246BC7C001D640C207C0001A7B84A30600066D870084A9F4CDF20C04E5EA7 S2240155004E754E56000048E701042A6E00086002528D4A1567060C15002166F40C1D002157 S224015520661E4A15671A13FC000100019F826002528D0C15002067F823CD0001A9F0603ACA S2240155404A3900019F80672C4A390001A9FE660A13FC000100019F826018423900019F802F S22401556020790001A9F04A10670813FC000100019F826006423900019F824A9F4CDF2000C0 S2240155804E5E4E754E56000048E7030C2A6E00082E2E000C200D5380DE8013FC00800001BE S2240155A0A8302EBC0001A8303F3C000A4EB9000150C6548F4A390001A831670E0C39003B72 S2240155C00001A83267046100FBF410390001A8314880C07C00FF48C0D0BC0001A83020403C S2240155E0117C000A00020C39003B0001A832660813FC000A0001A832287C0001A83260026E S224015600528C0C14002067F80C14000967F2603C0C1400616D100C14007A6E0A10144880ED S224015620D07CFFE06004101448801AC00C14002067060C1400096612528C204C0C1000203B S22401564067F60C14000967F06002528C0C14000A6704BBC765BA42154A9F4CDF30804E5E2A S2240156604E754E56000048E701042A6E00086002528D0C15002167044A1566F46002528D01 S2240156800C15002167F80C15002067F20C1500/ÿeccpif.o¶ø`ÆîPNùLNùF CP/M-68K V1.2 COPYRIGHT (C) 1982,1984, Digital Research B9OùB9N¹3À„B9B9†B9ˆüByByN¹N¹0< B9„NBB€0<B29„AÿNBOùN¹`ò_main¨_bdos¨flags¨_init¨stack¨TPAB¨_load_tb¨_bios1¨_load_tr¨_bdosini¨init_tbl¨_load68k¨_autorom¨_submit¡†_morecmd¡ˆ_autost¡_usercmd¡_ccp¢¸_patch¡Šcpm¢ccpstart‚Lccpclear‚Fcopy‚ dskuser„$Dd,TL$except10.o¶p`Î.Zpr$<|HçàNCLßRAX‚ Afr A"gì A#gæ A0mÖpNC @JX"$Ô&9(9p o#Ȳb´c¶b ¸cBJ˜QÈÿâNua–a’aîaêaæaâa¸aÚaÖaÒaÎaÊaÆaÂa¾aºa¶a²a®aªa¦a¢ažaša–a’aŽaŠa†a‚a~azavaranajafab/o*?o .o./o0?o4?o6/o8?o <ßü*`(H瀀 o0@ÿÀ @@ÀfPLßJŸNsLßBgH瀀 / ¼€ @$o @Xm( @tn @0 yÐÀJf` @(m@0Þüä@ @lLßJ_T@ @oP@?Aùa 0a¾Aùa ašAù"a€B€NBNs @m0/ f’/P Nh!/1/N`Lß/oBo \OWÿNs/ fÿd/P Nh!/1/!/!/N`Lß/oBoÞüWÿNsBg/BgNsBgpNB`òNu?H@a0?àHa0?èHa0@ @ m02pNBNu Exception $ at user address $. Aborted._tpa_hp¨_tpa_lp¨_initexc¢gouser¢|bgetsegÀbsetexcÀbuserrÀspuriousÀtrap0À trap2À"trap3À#endvecÀ0exchndlÂ@|init1‚ init2‚init3‚"evec_adrinit4‚Zdo_init‚rdontinit‚tm68010¢|berr‚excrtn0‚€except‚tprivviol‚Nnotsr‚pchkredir‚ dfltexc‚ºusrexc‚ supexc‚®nobusexc‚Ìlowexc‚Úexcmsg1„print‚„prtbyte‚¨excmsg2„prtlong‚”excmsg3„"addrexc‚Bprtdone‚’prtword‚žprtnib‚²lt10‚ ccpbdos.o¶D` 0/"/NBNu_bdos¢ccpload.o¶l`ê z"<0<?NB#ù#ù#üp;"<NBJ@f’29p NBB"9 Ò|€"ApNB$IR‰ yB€ g !gØR@`/<?<N¹\B€p\a>/<?<N¹\B€p8a& y"y ! !<ÌN` iNùNupNBй @"|B€p#ÙQÈÿüNu_tail¨gouser¨_user¨_fill_fc¨_cmdfcb¨_load68k¢flags¡TPAB¡rebootÀprintstrÀ setdmaÀchuserÀ pgmldfÀ;gettpaÀ?lowlowadrhighhiadrLPBlderr‚Êbaspag mvtail‚bdone‚tmovfcb‚Ðusrstkcmdrtn‚Ìmov1‚â$$$ $ccp.o¶k¬`¶L'ŠNVÿü.¼ ?<N¹T.¼ ?<N¹TN^NuNVHç *n(n Ý/72204669AC S1234E206C656E616D653A202400456E746572204F6C64204E616D653A202400456E746596 S1234E4072204E6577204E616D653A20240046696C6520616C7265616479206578697374A4 S1234E60732400004E6F2066696C652400004E6F2077696C64636172642066696C656E6140 S1234E806D657324000053796E7461783A2052454E204E657766696C653D4F6C6466696C5E S1234EA065240000436F6E6669726D28592F4E293F202400456E7465722055736572204EC2 S1234EC06F3A202400002E5355422066696C65206E6F7420666F756E642400005573657299 S1234EE020232072616E6765206973205B302D31355D2400546F6F206D616E792061726722 S1234F00756D656E74733A202400496E73756666696369656E74206D656D6F7279206F72D2 S1234F20206261642066696C6520686561646572240052656164206572726F72206F6E20D6 S1234F4070726F6772616D206C6F616424004261642072656C6F636174696F6E20696E66BD S1234F606F726D6174696F6E206269747324000050726F6772616D206C6F616420657272CD S1234F806F7224003E3C2E2C3D5B5D3B7C262F28292B2D5C000000090000000A0000001A01 S1234FA000000020000000240000003B0000000000001F2C00001FAC00001FBC00001F2C32 S1234FC000001F8C00001F1C00001FC6000022060000221C000022240000222C00002234B2 S1234FE000002252000022720000231C0000230A00002210444952004449525300545950F9 S1235000450052454E004552410055534552005355424D495400535542000000503A000003 S1235020507A0000509D00002E0600002E1800002E2A00002E3400002E4443502F4D2D369D S1235040384B28746D292C2056657273696F6E20312E322C20436F70797269676874202867 S1235060632920313938342C204469676974616C20526573656172636800585858582D3096 S12350803030302D36353433323100206572726F72206F6E2064726976652024000D0A57E7 S12350A041524E494E47202D2D20446F206E6F7420617474656D707420746F206368616E93 S12350C06765206469736B7324000A0D446F20796F752077616E7420746F3A202041626FEE S12350E07274202841292C202052657472792028522924002C206F7220436F6E74696E757E S12351006520776974682062616420646174612028432924003F2024000D0A240043502FF1 S12351204D204469736B2066696C65206572726F723A20240020697320726561642D6F6E29 S12351406C792E24000D0A446F20796F752077616E7420746F3A204368616E676520697453 S123516020746F20726561642F7772697465202843292C206F722041626F72742028412967 S12351803F2024000D0A24000D0A43502F4D204469736B20240072656164240077726974B2 S12351A065240073656C656374240073656C65637424006368616E6765240000000040D27E S12351C0000040DA000040E4000040F800004106000041200000413A000041460000415416 S12351E000004166000041720000417E0000418800004190000041B4000041D6000041FEAD S12352000000421400004230000042520000427400004292000042AE000042E0000043024D S12352200000430E0000431E000044BA000043280000433E0000434A0000436C000043A4AB S1235240000043D0000043F00000440E0000442200004436000044BA000044BA000044543E S1235260000044BA000044BA000044BA000044BA000044BA000044700000447A0000448CF2 S1235280000044BA000044BA000044BA000044BA000044BA000044BA000044BA000044BA1A S12352A0000044BA000044BA00004494000044BA000044A6000044BA000044B00D0A0A45D6 S12352C07863657074696F6E202400206174207573657220616464726573732024002E20B0 S12352E02041626F727465642E0036384B0020202000535542000000000000000000000098 S9030000FC 07573657220616464726573732024002E20B0 S12352E02041626F727465642E0036384B0020202000éé0füJŸLß0N^NuNVHç *n(n `H€°op`H€°lpÿ`RRŒJfàJfB@`pÿJŸLß0N^NuNVHç*n&|J9g(|`ÜJfúü B9`ÝJg !fôBJŸLß8N^NuNVÿüHç.¼ÿ?< N¹T<B—?<N¹T>Þ|AaþòJFgB¼| e|1ÿüB@0Ð|&@ÿý|$ÿþ`B@0Ð|0@ÿü|$ÿý.ŽY—?< N¹TB€0.€?<N¹T.¼>?<N¹TJŸLßÀN^NuNVHç*n>. ¾|fJ9gJ9faÿ0`H€HÀ.€?<N¹TJg !fâJGf.¼??<N¹T`aþJŸLß €N^NuNVHç*nBG`.*n Bx ` M“É2DÑÉBRD¸|#cîx` M“É2DÑɼ RD¸| cìJ9g<?`< By(MB@0ÀüмB29Ð @Jf8RŒz`ÆREº| cöB—?<N¹TR@€J9gp `|`B@`tB@0ÀüмB29Ð @ (:fpÈ0yBA2ÂüÒ¼0H€Ð|ÿÀ€TyB@0ÀüмB29Ð @Jf(Iíz`ÆREº| cöJ9gp `ì`B@`ä`B—?<N¹TR@€(MRŒz`"B@0ÀüмB29Ð.€aþRÀREº|cØ`RyB@0ÀüмB29Ð.€aýàJ@gØB@0ÀüмB29Ð @ .f2Ryz`"B@0ÀüмB29Ð.€aýÖÀREº|cØBDz` M“É2EÑÉ ?fRDREº| cèB@0JŸLß0ðN^NuNVÿüJ9<g$.¼&?< N¹TBW/<.BnÿøB.ÿþaÿ,J@fðaÿX6>ƒaŠJ@gà.¼?<aüÜT9H€Ð|@=@ÿú.¼?<N¹T<¼|ÿf.¼–?< N¹T8ëLRDBE`LJGgÈ0DÑü( fJGf:È0DÑü( f(J.ÿþgaöTB.ÿþJEfB€0.ÿú.€?<N¹T`=|ÿø>¼N¹<8ëLRD`ÜëNRF.¼:?<N¹T.¼ ?<N¹Tv`<¶| f.¼ ?<N¹T |0`H€À|HÀ.€?<N¹TRFRC¶| c¾.¼ ?<N¹T>¼N¹<¼|ÿgPRE8ëLRDº|f:BEJGgÈ0DÑü( fJGfÈ0DÑü( faõH`|ÿþ¼|ÿfþ°Jnÿøg.aõ.JGg.¼0?< N¹T`.¼4?< N¹TJŸLßøN^NuNVHçJ9f$.¼J?< N¹T.¼/<aøXaüöJ@fîaý">>‡aýTJ@gÜ.¼?<aú¤T>JGf’J9gˆ.¼?<N¹T°|bn`.Ž—ÿÿÿÜ?<a÷ºT>.¼?<a÷¨T<JGfJFfú.ÿÜH€°9g> 9:f 9:[g îÿÜ` 9:g 9:[f yÿÜ`x .ÿÜm .ÿÜoxJDf..Ž—ÿÿÿÜ?<N¹T°|ÿg.¼€?< N¹T`fBE~`È0GÑü"N•Ê4EÓÊ©ÿÜRERG¾|#càJ9m 9oxJDf(.¼?<N¹TJ@c.¼–?< N¹T`.¼ ?< N¹TJDg.¼¸?< N¹TJŸLßðN^NuNVHçJ9f$.¼J?< N¹T.¼/<aóüXJ9gaøXJ@føaø„>>‡aø¶J@gæ 9:fJ9 fBW/<añrX`Â.¼?<aõâT>JGcxJ9fn.¼0A4 S123476000005446E58A42842C39000054462A7C0000542E2E35400061B458844A8157CDBC S1234780FFE84E753C390000540A0246FFFE0C46601A6600012023F90000541800005442E2 S12347A02E3C0000010023C70000541845F90000541CBE526D0224870C79601B0000540AFE S12347C067084A7900005424670C23F9000054200000542E604008280000001566162E28EF S12347E00004DEBC000001010887000023C70000542E60222E2800089EB90000540C9EB92C S1234800000054109EB90000541459870887000023C70000542E0C79601B0000540A6616BC S123482023F9000054260000543223F90000542A00005436602A2E390000542EDEB900002A S1234840540C52870887000023C700005432DEB90000541052870887000023C70000543645 S123486074036100FEF64A81670A74036100FEB64A81664074046100FEAC4A81670A7404F8 S12348806100FED84A81662C2A7C0000542E2C7C0000540C428276042E352000BEA8000425 S12348A06D12DEB62000BEA800086E08588251CBFFE84E7570014E7522790000543A2C3C78 S12348C0000000809C790000544CD2C697790000544C600214D951CBFFFC4E757E3F2A68DF S12348E000042C790000543A3CDD51CFFFFC3E3C00640C79601A0000540A6702514733C713 S12349000000544C33FC00020000544A24790000542E24390000540C428336390000544C74 S1234920B6826D062602619060489483618A263C00000080B4836D18220A6100FD846100F8 S1234940FD704A4166569483D5FC0000008060E44A82671E22390000543A6100FD64610096 S1234960FD504A41663633C30000544C26026100FF482479000054322439000054105379A9 S12349800000544A66922479000054362439000054146706421A538266FA4E7570024E759B S12349A03E1B02470007E34F4EFB7002601460226020601E6006601260026006201F700317 S12349C04E75088200004A5A4E7508C200004A5A4E750882000066083C12DC4534C64E75CA S12349E04A622C12DC8524C64E7522390000543A6100FCCE2E39000054428EFC00803C075D S1234A00484736390000544C96476C0606430080524626790000543AD6FC008096C3E24B3F S1234A20600A6100FC8C4A416600FF7251CEFFF42A390000542E24459AB900005420283935 S1234A400000540C33FC00020000544A4282E28C601E53436A146100FC584A416600FF3E7C S1234A6026790000543A363C003F6100FF3453844A8466DE247900005432283900005410EF S1234A8053790000544A66C44E7521790000543A000C2E390000543EDEB90000541C0887F8 S1234AA000002147001022790000543A22E8000422E8000822F90000542E22F90000540C19 S1234AC022F90000543222F90000541022F90000543622B9000054142E2800082C29FFFC1C S1234AE0DC992C7C0000542E7A0442B900005436BC966206BE9663022E164A9E51CDFFF262 S1234B009E8622C7246800001012660670194E42524012C042804E7570167202243C00000E S1234B204B9448E7E0004E434CDF0007524158820C4100186600000472200C41002267EC30 S1234B400C41002367E60C4100306DD670124E4320404A5822182401D490263900005DE858 S1234B60283900005DE27011206F000423C80000544EB29062000014B4906300000EB6903D S1234B806200000AB8906300000442904A9851C8FFE24E7561000096610000926100008EAC S1234BA06100008A61000086610000826100007E6100007A61000076610000726100006E09 S1234BC06100006A61000066610000626100005E6100005A61000056610000526100004EE9 S1234BE06100004A61000046610000426100003E6100003A61000036610000326100002EC9 S1234C006100002A61000026610000226100001E6100001A61000016610000126100000EA8 S1234C206100000A610000064E714E71426748E78080202F000A90BC00004B980C40002450 S1234C406F0000160C4000586D0000280C4000746E0000200440003020790000544ED0C005 S1234C604A90660000600C4000286D00000606400030DEFC000EE4400C4000026C00000667 S1234C804CDF03004A5F54400C4000176F00000450403F0041F9000052BC61000096301F72 S1234CA0610000B441F9000052CB61000086201F6100009041F9000052DE6100007642806A S1234CC04E424E730C4000086D00002C082F000D000E66922F50000A4E68212F0010312F49 S1234CE0000E4E604CDF01012F6F000200085C4F02577FFF4E73082F000D00166600FF68B5 S1234D002F50000A4E68212F0018312F0016212F0012212F000E4E604CDF01012F6F000237 S1234D200010DEFC000E02577FFF4E732F0842674E73428112186700000870024E4260F28E S1234D404E753F00484061000004301F3F00E04861000004301F3F00E84861000004301FD3 S1234D600240000F0C40000A6D0000060600000706000030320070024E424E7523FC0000BC S1234D8052EA0000545223FC000052EE0000545C23FC000052F20000546623FC000052F69A S1234DA00000547023FC000004D20000545623FC000004D20000546023FC000004D20000EE S1234DC0546A23FC000004D2000054744E7500004FF4000000004FF8000900004FFD0001B1 S1234DE00000500200020000500600030000500A00040000500F000600000000FFFF4E4FA4 S1234E004E2D53595354454D2046494C452853292045584953542400456E74651Ö?< N¹TB—?<N¹TÀ< 9aJGc.¼ ?< N¹TB@`ˆ(|*T 9 f,`B@@ @Ùü TJfê9H€S@HÀ.€?<N¹Tü?B9 .¼?<N¹T>`òëOÈ0GÑüJg |0pH€°yfÀ| `È0GÐÆÑüRF¼| cèÈ0GÑüB( (|`„.¼ /aí"XB@0H@B@H@м.€R—/<aí XJ@fJ|ÿø |0pH€°yf|`| n f./aìâXJ@f J,g|ÿþÙü TJfÿx>¼N¹>¾|ÿgJ.ÿþgÿJ.ÿøfD nf.¼ø?< N¹TüB9B€09.€?<N¹TB@`Ô n f.¼BgaòT`.¼?<añöT(|`,J,fJ, g n g.¼H/aìXJ@g Ùü TJfÎ TJg"J,fB—?< N¹T.¼ /aë¸XB€09.€?<N¹T`.¼?<N¹T°|bÊ| `È0FÑüRF¼| cê 9S f’ 9U f† 9B fz|ÿú.¼ÿ?< N¹T3ÀJ9g ü`üBG`È0GÑü’É2GÓü‘RG¾|$eâ n fB9üB9` ng|ÿü`*`$.¼ÿ?< N¹TJ@gB—?< N¹T`þøJ.ÿügÂ.¹aíšJ.ÿøf&(|`.¼ /aê„XJ@g Ùü TJfâ TJg-lÿô`-|ÿô/9 nÿôNX`P.¼.<. *n 89¾|€eBGa°J@fB@0`È0GÑü 0m¶È0GÑü 9n¤ |0pH€6Ö|ÿÐ(M Sf& Uf Bf Mf If Tf  fRC(Mz``RŒ  gJfô  fRŒREºCcä`*¼|fÈ0DÑüœRD`H€HÀ.€?<N¹T  g Jg¸|€eÆRG`<¼|fÈ0DÑü¼$RD`.¼$?<N¹TÈ0GÑü $fRG3ľ|€eBGaþ’B@0JŸLß0øN^NuNVHç>.*n BFaè€`@È0GÑü $fRG.Bg?aþ|X>` |0pH€HÀ.€?<N¹TRG¾|€d È0GÑü gÈ0GÑü  fš¾|€f.È0GÑü gÈ0GÑü  gBGaýÚJ@f|`*È0GÑü  fTG¾|€eBGaý´`ü|JFgÿ6B@0JŸLß ÀN^NuNVHç *nBG:9`ú |0PH€`Ô.?aþâT:`ÚJGcÈ0GÑü’É2EÓü‘RERG`REº|€d È0EÑü  gèÈ0EÑü  gغ|€eBEaýJ@f``Â`zRE3Ç.?<?aýX:>9`XREº|€eBEaüÎ`Hü`>È0GÑü’É2EÓü‘RERGº|€eBEaüœ`HÀ |Ær°˜WÉÿü hNÐJ9f(¾|€d"È0EÑü  gÈ0EÑü !fþÚÈ0EÑü  gÈ0EÑü !fh`REº|€d0È0EÑü  gèÈ0EÑü  gØÈ0EÑü !gȺ|€f BEaûîJ@g`È0EÑü fü``˜3ÅJŸLß0ðN^NuNVHç*nBG`È0GÑüBRG¾|€cì.¼ÿ?< N¹T<B€09.€?< N¹T.¼?<N¹TJ9fJ9g"BG`È0GÑüBRG¾|€eìaû0ByJ9f.aýŠBG`LÈ0GÑü am"È0GÑü zn |0pH€Ð|ÿà` |0pH€’É2GÓü€RG¾|€e®.¼?<N¹TB€0.€?< N¹TJŸLß ÀN^NuNVHç*n.aå°`(BWaì¤`2>¼aì˜`&aî¦`aïÒ`aó*`aôjJ@f.¼?< N¹T`ð9H€Ð|ÿ¿HÀ.€?<N¹T`Ð|J9f†.¼J?< N¹T.¼/<aææXBG`È0GÑü’É2GÓüQRGÈ0GÑü  g |J0pg¾|eÄÈ0GÑüB(JGg ü``@`B9`| >†aôZJ@f*¼|g$BW/<aäX`°| bêå@0@Ñüþ PNÐJŸLß ÀN^NuNVHçü.¼?<N¹TJ9g2B€09.€?<N¹TB€09.€?< N¹TB9J¹g(*yR M"yHÂ|ÿHÁÑÁBB¹`®J9g`J9g:*|.¼aüØ`"J9g*yB9`` .¼aü´JgÚ`*yB9Jg >¼/ aãX`DaâX*|J9g J9g>¼/<aâÜXB9`.¼€/<aåX`Þ#Í.aæJ9g 9;g .¼aýDJ9f .aå¨*@`’*|J9fJ9gPJ9g .¼aád` .¹aáXJ9g.¹aå\#À.¼aû¶B@ÀÀ`B`"J9g*yB9`` .¼aû€JgÚJg >¼/ aáâXJfÿ JŸLß N^Nu&* /48<AÿÿNON-SYSTEM FILE(S) EXIST$Enter Filename: $Enter Old Name: $Enter New Name: $File alr140A0302EFFFE4A9F4CDF30F84E5E4E754E56FFFA48E70F043E2E00083C2E000A2A6E97 S12340C0000C422EFFFB2D4DFFFC42453007600003F042574EB900002B884EB9000027EA75 S12340E06000040042403006C07C00FF3E804EB900002712600003DE3EBC00074EB900001E S123410025C0600003DE42403006C07C00FF3E803F3C00064EB9000025BC548F600003B65F S123412042403006C07C00FF3E803F3C00054EB9000025BC548F6000039C3E864EB90000B5 S123414028246000039E3EBC00134EB9000025C0600003903E863F3C00144EB9000025BCE7 S1234160548F600003702E8D4EB900002868600003642E8D4EB900002946600003584EB979 S1234180000025F26000035C303C202260000354427900005ABE427900005DF44279000046 S12341A05BB013FC00FF00005AC8423900005AC96000032242403006C07C00FF3E804EB9E5 S12341C00000338442403006C07C00FF13C000005AC9600003002E8E5D9761000310422D45 S12341E0000C422D000E42572F0D2F3C000035764EB900003082508F3A00600002D82E8E7F S12342005D97610002E82E8D4EB9000037603A00600002C223CD00005ADE2E8E5D97426723 S12342202F0D4EB9000037B45C8F3A00600002A62A7900005ADE2D4DFFFC2E8E5D973F3CA4 S123424000012F0D4EB9000037B45C8F3A00600002842E8E5D97610002943EBC00022F0D41 S12342602F3C000038C24EB900003082508F3A00600002622E8E5D976100027242573F3CA6 S123428000012F0D4EB900003ED25C8F3A00600002442E8E5D9761000254425742672F0D16 S12342A04EB900003ED25C8F3A00600002282E8E5D9761000238422D000C422D000D422D83 S12342C0000E422D000F3EBC00082F0D2F3C000038404EB900003082508F3A00600001F604 S12342E02E8E5D97610002063EBC00022F0D2F3C000039604EB900003082508F3A00600033 S123430001D44240303900005ABE600001D6103900005AC94880C07C00FF600001C623CD04 S123432000005ADA600001AE7001123900005AC94881E360817900005DF460000198424085 S1234340303900005DF46000019A2E8E5D976100019C3EBC00022F0D2F3C000039D84EB93B S123436000003082508F3A006000016A103900005AC84880B03900005AC9671010390000A4 S12343805AC948803E804EB9000033843EBC00102F0D2F3900005AD44EB9000034C6508FF6 S12343A06000013242403006C07C00FFB07C000F620E42403006C07C00FF13C000005ACADE S12343C0103900005ACA4880C07C00FF600001142E8E5D97610001163EBC00013F3C000155 S12343E02F0D4EB900003ED25C8F3A00600000E62E8E5D97610000F63EBC000142672F0D14 S12344004EB900003ED25C8F3A00600000C82E8E5D97610000D82E8D4EB900003AF46000FB S123442000B42E8E5D97610000C42E8D4EB900003A5E600000A04240300646403C00CD79D5 S123444000005ABECD7900005DF4CD7900005BB0600000822E8E5D97610000923EBC0002D7 S123446042672F0D4EB900003ED25C8F3A0060643E864EB900003B64605A23F900005ADADF S123448000005CB442574EB900002B884EB9000035D4604E2EB900005ADA2F0D4EB9000099 S12344A0466A588F603C2E8D4EB900002E6860322E8D4EB900002EDA601A70FF6024601430 S12344C0B07C003F62F4E5403040D1FC000051BC20504ED04A2EFFFB67041AAEFFFA4240FA S12344E030054A9F4CDF20E04E5E4E754E56000048E7030C2A6E0008286D000210144880FB S12345001A801E004A07670A100748803E805357600A103900005AC948803E804EB9000073 S1234520338418B900005ACA1B7C000100014A9F4CDF30804E5E4E754E56FFFE48E7031C10 S12345402A6E0008424710154880600000F413ED000300005408102D000148803E80103981 S12345600000540848803F003F3C00094EB9000025B0588F2B40000E600000E2102D000392 S12345804880B03900005408671C4257102D0003488013C0000054083F003F3C00094EB9ED S12345A0000025B0588F286D000E266C000E2E8E55973F132F2D00044EB9000025DC5C8FAB S12345C03E804240302B000ED1573F3C000A4EB9000025BC548F2E943F2EFFFE3F3C0010FF S12345E04EB9000025AA588F3E803F3C000B4EB9000025BC548F2EAD000A3F3C000C4EB978 S1234600000025B6548F0C150001660E3EBC000D4EB9000025C03E006016102D0001488095 S12346203E803F3C000E4EB9000025BC548F3E00602A3EBC00154EB9000025C03E00601CE7 S12346404A406700FF0AB07C00016700FF30B07C00026700FF28B07C000367D642403007B8 S12346604A9F4CDF38804E5E4E7548E77FFE206F003C428061544A40662A610001084A40FF S12346806622610002584A40661A2E3900005420BEB90000542E6704610003504A406604E2 S12346A0610003E8222F004061164CDF7FFE4E752F002228000070144E422200201F4E7586 S12346C02F00701A4E42201F4E752228000461F061DE4A4166147E122A6800042C7C0000DA S12346E0540A3CDD51CFFFFC4E7570024E754281247C0000542E267C0000540C2E322000C5 S1234700BEB230006C0CDEB32000BEB230006E104E752E323000DEB33000BEB220006F0299 S123472072014E752C025346E54A2E2800082A7C0000542E2C7C0000540C9EB620000887B8 S123474000002B872000BEA800046DD44283619E58834A8156CEFFF84E752A02538523C52eady exists$No file$No wildcard filenames$Syntax: REN Newfile=Oldfile$Confirm(Y/N)? $Enter User No: $.SUB file not found$User # range is [0-15]$Too many arguments: $Insufficient memory or bad file header$Read error on program load$Bad relocation information bits$Program load error$><.,=[];|&/()+-\  $;pðpÐ` J`hpx–¶`NTDIRDIRSTYPERENERAUSERSUBMITSUB_load_tr¨_first_s¨_chain_s¨_end_of_¨_dirflag¨_subprom¨_sub_ind¨_index¨_sub_use¨_user¨_cur_dis¨_subcom¨‚_subdma¨€_user_pt¨_glb_ind¨_save_su¨‚_subfcb¨$_cmdfcb¨$_tail¨_autorom¨_dma¨„_parm¨x_chainp¨_bdosˆ_load_tb¨_morecmd¨_usercmd¨_load68kˆ_submit¨_autost¨_cmd_tbl¤L1„&L2„*L3„/L4„4L5„8L6„L55‚L56‚FL63‚LL62‚JL10006‚bL61‚bL64‚’L65‚’L66‚²L10007‚¬L67‚Î_fill_fc¢L68‚äL69‚îL70‚ð_delim¢L71‚L74‚(L75‚L76‚&L73‚&L10008‚:L72‚:_check_c¢F~~check_‚F~tcmdÐ L80‚VL79‚TL10009‚`L78‚`L81‚„L84‚vL83‚tL82‚|L85‚¾L86‚¸L87‚žL88‚¶L89‚¶L90‚¾L77‚¾_get_cmd¢È~~get_cm‚È~cmdÐ ~max_chaÐ~cÐ L92‚L93‚L332‚&L330‚L356‚ìL357‚ŠL360‚¨L361‚L364‚”L363‚’L10041‚žL362‚žL365‚300005ACC316E001000044247207900005AD40C6801000006641CFA S12333401035701048803E80025700FF4EB9000031C25247BE7C000F6FE6601E3047D1C807 S12333603EB588104EB9000025D03E804EB9000031C25247BE7C00076FE24A9F4CDF20802B S12333804E5E4E754E56FFEC48E70F001E2E00094240303900005ABE12074881E2684640E3 S12333A01A00CA3C0001BE3900005AC866044A056778422EFFEE100748801D40FFF113C0DB S12333C000005AC810074880C07C00FFB07C000F6F0A3EBC00024EB900002DEE10054880FE S12333E07201B3401D40FFEF2E8E0697FFFFFFEE4EB90000453823EEFFFC00005ACC660EAA S12334003EBC00034EB900002DEE4A4067DA207900005ACC23E8000A00005AD02079000027 S12334205ACC23E8000E00005AD44A056700008E207900005AD43C2800063E864EB90000DB S12334403212300653464A4066F02E8E0697FFFFFFEC207900005AD41028000348805240D7 S1233460E5403F00207900005AD442403028000852404840424048402F004EB9000025DCE0 S12334805C8F3C004A6EFFEC6702524653463E864EB9000031C24A4666F23EBC000E42A72D S12334A02F3C0000330A4EB900003082508F700112074881E360817900005ABE4A9F4CDF0C S12334C000E04E5E4E754E56000048E7030C2A6E0008286E000C3E2E0010600218DD30076B S12334E053474A4066F64A9F4CDF30804E5E4E754E56000048E7070C2A6E0008286E000CED S12335007E0C1C150A06003F101D4880121C4881B340C07C007F67084A0667044240604CAB S123352053474A4766DC4A2E0011673E0C15003F67201015488012144881B340227900009B S12335405AD41229000448814641C04167044240601A548D548C1015488012144881B340B2 S1233560C07C003F67044240600270014A9F4CDF30C04E5E4E754E56000048E707042A6E23 S123358000083EBC00012F2E000C2F0D6100FF62508F1C0067301E2D000C3EBC00202F0D7E S12335A02F2E000C6100FF20508F1B47000C002D0080000E7001123900005AC84881E3602C S12335C0817900005BB0100648804A9F4CDF20C04E5E4E754E56FFEE48E703001D7C000342 S12335E0FFEE600E3EBC00014EB900002DEE4A4066122E8E0697FFFFFFEE4EB90000453885 S12336003E0066E0424030074A9F4CDF00804E5E4E754E56FFFC48E70F1C2A6E0008286E37 S1233620000C3EBC00012F0C2F0D6100FEC4508F4A406700012047ED001041EC00102D48FE S1233640FFFC207900005AD40C6801000006643A7E10206EFFFC4A10671C4A136710206E35 S1233660FFFC10104880B013660000D26006206EFFFC16906006206EFFFC1093528B52AE64 S1233680FFFC53474A4766CA60387E08206EFFFC4A50671C4A536710206EFFFC42403010AD S12336A0B053660000986006206EFFFC36906006206EFFFC3093548B54AEFFFC53474A4797 S12336C066CA2E8D4EB900003E223C001A2C000C4885CA7C001FBC45621CBC45662A102D87 S12336E0000F4880C07C00FF122C000F4881C27C00FFB0416F12196D000F000F4240300693 S1233700C07C00FF1940000C196D000D000D082C00070009670E3EAE00102F0D4EB900006D S12337202CFE588F022C007F000B302E0010E4403E804EB900002FF47001601A700112399B S123374000005AC84881E360817900005DF442406004600242404A9F4CDF38E04E5E4E7587 S12337604E56FFFC6100FE6E206E000808280007000E67044240601442572F2E00082F3C34 S1233780000036124EB900003082508F4E5E4E754E56FFFC70014E5E4E754E56FFFC3EBCBE S12337A000012F2E000C2F2E00086100FD44508F4E5E4E754E56000048E707042A6E0008C8 S12337C03E2E000C0C15003F6624103900005AC948803E806100FBAE3E872F0D2F3C00001B S12337E037904EB900003082508F3C00602E2EAE000E4EB9000044EC0C2D003F000C67048C S1233800422D000C422D000E3E872F0D2F3C0000379A4EB900003082508F3C003EBC008021 S12338202F3900005ADA2F3900005AD06100FC98508F424030064A9F4CDF20C04E5E4E7567 S12338404E56000048E70F1C2A6E0008286E000C3E2E00100C1400E56704424060027001E3 S12338601A00675047ED000F7C11421B53464A4666F83EBC00202F0C2F0D6100FC4A508FA8 S12338803007E4403E804EB900002FF4207900005ACCBE680004630A207900005ACC314754 S12338A000047001123900005AC84881E360817900005BB0100548804A9F4CDF38E04E5E5C S12338C04E754E56000048E70F0C2A6E0008286E000C3E2E001042572F0C2F0D6100FC12F6 S12338E0508F1A00676C082C00070009670C3E872F0D4EB900002CFE588F18BC00E5300738 S1233900E4403E804EB900002FF4207900005AD40C6801000006641C7C10534610346010FC S123392048803E80025700FF4EB9000032124A4666E8601E7C0853463046D1C83EB4881048 S12339404EB9000025D03E804EB9000032124A4666E4100548804A9F4CDF30E04E5E4E7514 S12339604E56FFFC48E70F1C2A6E0008286E000C3E2E001042572F0C2F0D6100FB74508FCD S12339801A006746082C00070009670C3E872F0D4EB900002CFE588F47ED001141EC000119 S12339A02D48FFFC7C0B101B4880C07C007F226EFFFC128052AEFFFC53464A4666E8300798 S12339C0E4403E804EB900002FF4100548804A9F4CDF38E04E5E4E754E56000048E7070C79 S12339E02A6E4¦L359‚¦L358‚¬L368‚ØL367‚®L369‚ÄL370‚ØL10042‚èL366‚èL371‚(L372‚L373‚L374‚(L375‚:_comment¢H~~commen‚H~kÐ~com_indÐ ~doneÐL379‚^L382‚ L381‚`L383‚‚L384‚ L10043‚ÆL380‚ÆL385‚úL386‚øL387‚$L388‚L389‚L390‚"L378‚$L377‚*L376‚._transla¢8~~transl‚8~com_indÐ ~p1Ð ~jÐ~nÐ~kÐ~p_indexÐL394‚HL393‚PL396‚2L397‚`L395‚HL398‚pL399‚pL400‚ŽL401‚ŽL404‚’L403‚L10044‚¸L402‚¸L405‚ÌL406‚ÊL407‚ÌL408‚ÐL409‚ðL410‚þL411‚L412‚ L413‚0L414„ÆL415‚g,Hçþ @2g/??N¹HÀPOLßþNs A0LØNC`îW Ns$/` 4/`"/`2/0/HçNCLßxøNu/áH/Nu /€ï o H@0€B@H@Nu_dirscan¨_create¨_constat¨__bdos¨_bdosrw¨_bios1¢N_bios2¢J_bios3¢D_bios4¢>_bios5¢8_bios6¢N_traphnd¢_swap¢^_udiv¢jbiosfÀ2setsupfÀ>setsup‚2bioscall‚&bdone‚ conbdos.o¶P`òPNVÿüJ9gp` >¼N¹N^NuNVHçB>¼N¹J@gr>¼N¹°|f >¼N¹¾<f<`D¾<fB`:¾<fJ9gB@`pÀ` 9~l yh‡R¹hR9JfJŸLßÀN^NuNVHç. aÿ^H€>€?<N¹TJ9gH€>€?<N¹T¾< eRy`¾< fBy` ¾<fSyJŸL߀N^NuNVHç. ¾< f>¼ aÿzB@09À|fê` H€>€aÿ`JŸL߀N^NuNVHç. ¾< f H€>€a¨`¾< d >¼^aÿ,Ž<@H€>€aÿJŸL߀N^NuNVHçJ9g4 ylR¹lS9J9f <p#Àh#ÀlH€` >¼N¹JŸL߀N^NuNVHçaž>€aþª¾<fJ9gB@`pÀH€JŸL߀N^Nu64E754E56000048E71F0C2A6E0008F8 S1231F0042473A3900005ABC600000FA207C00005D62103050004880600000D42E8D3F056B S1231F206100FEE2548F3A00600000DA4A47631A90C83047D1FC00005E0092C93245D3FC5C S1231F4000005D6210915245524760025245BA7C0080642090C83045D1FC00005D620C1045 S1231F60002067E890C83045D1FC00005D620C10000967D8BA7C0080650E42456100FD081B S1231F804A406602600260C26000007A524533C700005ABC2E8D3F3C00013F056100FD1459 S1231FA0588F3A003E3900005ABC60585245BA7C0080650642456100FCCE604813FC000195 S1231FC000005DFE603E90C83047D1FC00005E0092C93245D3FC00005D62109152455247D9 S1231FE0BA7C0080650642456100FC9C601648C0207C00004F947206B09857C9FFFC2068DC S123200000184ED04A3900005DFE6628BE7C0080642290C83045D1FC00005D620C10000D58 S1232020671290C83045D1FC00005D620C1000216600FEDA90C83045D1FC00005D620C10DA S1232040000D671090C83045D1FC00005D620C100021666860025245BA7C0080643090C8F9 S12320603045D1FC00005D620C10000D67E890C83045D1FC00005D620C10000A67D890C8CD S12320803045D1FC00005D620C10002167C8BA7C0080660C42456100FBEE4A40671E601A4D S12320A090C83045D1FC00005D620C10001A660813FC000100005DFE6002609833C5000062 S12320C05ABC4A9F4CDF30F04E5E4E754E56000048E707042A6E00084247600E90C83047FF S12320E0D1FC00005E0042105247BE7C008063EC2EBC000000FF3F3C00204EB9000004C668 S1232100548F3C004280303900005CB82E803F3C00204EB9000004C6548F2EBC00005D62B7 S12321203F3C001A4EB9000004C6548F4A3900005D6066084A3900005E8667224247600EBD S123214090C83047D1FC00005D6242105247BE7C008065EC6100FB30427900005ABC4A394A S123216000005DFE66062E8D6100FD8A4247604C90C83047D1FC00005E000C1000616D22B6 S123218090C83047D1FC00005E000C10007A6E12207C00005E00103070004880D07CFFE08E S12321A0600C207C00005E0010307000488092C93247D3FC00005E0012805247BE7C008057 S12321C065AE2EBC00005C303F3C001A4EB9000004C6548F428030062E803F3C00204EB9E1 S12321E0000004C6548F4A9F4CDF20C04E5E4E754E56000048E707042A6E00082E8D610031 S1232200E5B06000012842576100ECA4600001323EBC00016100EC98600001266100EEA623 S12322206000011E6100EFD2600001166100F32A6000010E6100F46A4A4066122EBC0000EA S12322404EDC3F3C00094EB9000004C6548F600000F0103900005BB84880D07CFFBF48C092 S12322602E803F3C000E4EB9000004C6548F600000D07C074A3900005BD6660000862EBC32 S123228000004E183F3C00094EB9000004C6548F2EBC0000007F2F3C00005D626100E6E6DC S12322A0588F4247601A90C83047D1FC00005BB892C93247D3FC00005D621151001E524706 S12322C090C83047D1FC00005D620C1000206712207C00005D624A3070006706BE7C001DE1 S12322E065C490C83047D1FC00005BB84228001E4A47670A13FC000100005DFC600260400D S12323006006423900005DFC60027C0A3E866100F45A4A40662ABC7C0007672442572F3C3C S123232000005BB86100E41A588F6014B07C000962EAE5403040D1FC00004FCC20504ED040 S12323404A9F4CDF20C04E5E4E754E56000048E7010413FC000100005E8A2EBC00005C30D0 S12323603F3C001A4EB9000004C6548F4A3900005AC067324280303900005BB62E803F3C75 S1232380000E4EB9000004C6548F4280303900005DE62E803F3C00204EB9000004C6548F0C S12323A0423900005AC04AB900005CB467282A7900005CB4528D204D227900005CB4121115 S12323C04881C27C00FF48C1D1C1421042B900005CB4600000AE4A390000538267604A394B S12323E000005380673A2A7C00005E002EBC00005CBA6100FCD860224A3900005DFE671055 S12324002A7900005DF04239000053806010600A2EBC00005CBA6100FCB44A1567DA600689 S12324202A7900005DF04239000053824A15670C3EBC00012F0D6100E308588F6044610017 S1232440E2582A7C000052FB4A39000052FA67204A3900005DFA67183EBC00012F3C000036 S123246052FB6100E2DC588F423900005DFA60122EBC000000802F3C000052FB6100E50653 S1232480588F600000DE23CD00005E822E8D6100E60E4A3900005BB867140C39003B0000A2 S12324A05BB8670A2EBC00005BB86100FD444A3900005380660C2E8D6100E5A82A406000BA S12324C000922A7C00005E004A3900005D6066084A3900005E8667504A3900005DFC670C47 S12324E02EBC00005D626100E164600A2EB900005E826100E1584A3900005D6067102EB920 S123250000005E826100E55C23C000005DF02EBC00005CBA6100FBB6424013C000005E86BA S123252013C000005D606002421560224A3900005DFE67102A7900005DF042390000538039 S12325406010600A2EBC00005CBA6100FB804A1567DA4A15670C3EBC00012F0D6100E1E2F4 S1232560588F4A156600FF204A9F4CDF20004E5E4E750C40003E672C48E77FFE0C400032A2 S123258067162F013F013F004EB9000040AE48C0504F4CDF7FFE4E73204130184CD8000633 S12325A04E4360EE005720004E73242F00087NVHç>.¾|ÿfaÿZ`"` ¾|þfaý¬``>‡Wÿ?<N¹TJŸL߀N^NuNVHç*n` H€>€aþ”H€°9fêJŸLß N^NuNVHç>.>¼ aýü>¼ aýô` >¼ aýêSGJGfòJŸL߀N^NuNVHç *n>. J-gS--H…Ê|ÿIí`¼< fPGÎ|ÿø` ¼< dTG`RG0SEJ@fÜ`>¼aý‚>¼ aýz>¼aýr¾yeàJŸLß0àN^NuNVÿþHç *n=yÿþB-`baþ.°|fJ-f>¼aýÖ>¼N¹`:¾< g¾< f>¼ aý`:`¾<f>®ÿþ/ aÿX`¾<f>J9g&J-g-H€S@@<Ì|ÿ5`H€>€aü¸` >®ÿþ/ aþÔX`ľ<fJ9gB@`pÀ`¦¾<f>®ÿþ/ aþ XJ-fî`о<f >®ÿþaþP`x¾<f>¼#aüL>®ÿþaþ6B-`Z¾<f2>¼#aü0>®ÿþaþBF`5`H€>€aüÄRF-H€À|ÿ¼@eä`"H€"M-H‚Ä|ÿHÂÓÂ@>€aü”R--H€À|ÿHÂ|ÿ°AmþŠJŸLß0àN^Nu_chainp¨_gblsˆ_bios1ˆ_bios2ˆ_warmbooˆ_constat¢~~consta‚L10000‚L10002‚L1‚_conbrk¢~~conbrk‚~chÐ~stopÐL3‚¨L6‚8L7‚TL8‚`L9‚¤L10‚jL11‚¤L12‚†L10003‚|L10004‚~L13‚¤L14‚¤L5‚¤L4‚¨L2‚¨_conout¢²~~conout‚²~chÐL16‚îL17‚üL18‚L19‚ L20‚L21‚L15‚_tabout¢ ~~tabout‚ ~chÐL23‚JL26‚2L25‚:L24‚HL27‚TL22‚T_cookdou¢^~~cookdo‚^~chÐL29‚zL30‚–L31‚ŒL28‚–_getch¢ ~~getch‚ ~tempÐL33‚äL34‚ÞL32‚î_conin¢ø~~conin‚ø~chÐL36‚$L10005‚L10006‚L35‚(_rawconi¢2~~rawcon‚2~parmÐL38‚LL37‚lL39‚lL40‚ZL41‚l_prt_lin¢v~~prt_li‚v~pÐ L45‚ŽL44‚„L43‚šL42‚š_newline¢¤~~newlin‚¤~startcoÐL49‚ÌL48‚ÂL47‚ÐL46‚Ð_backsp¢Ú~~backsp‚Ú~bufpÐ ~colÐ~chÐ~iÐ~pÐ L51‚ôL54‚ L53‚L55‚L56‚ L57‚L58‚ L52‚(L61‚BL60‚*L59‚JL50‚J_readlin¢T~~readli‚T~pÐ ~chÐ~iÐ~jÐ~qÐ ~stcolÀÿÿÿþL65‚ÐL64‚pL66‚˜L67‚ÐL10007‚¤L68‚´L63‚èL69‚ÐL70‚ÊL71‚ÐL72‚L73‚þL74‚üL75‚ L76‚ÐL77‚,L10008‚ L10009‚"L78‚ÐL79‚HL82‚2L81‚>L80‚DL83‚ÐL84‚ZL85‚ÐL86‚vL87‚ÐL88‚®L91‚žL92‚L90‚œL89‚¬L93‚ÐL62‚è $                        $   7000004C6548F13FC003F85 S123184000005E8C423900005E982EBC00005E8C3F3C00114EB9000004C6548F3E00600077 S123186000F2EB4F90C83047D1FC00005C304A106716207C00005C30103070004880B07970 S123188000005DE6660000C07C09601290C83047D0C6D1FC00005C300210007F5246BC7CC5 S12318A0000B63E890C83047D1FC00005C304228000C287C00005452600000842EBC000018 S12318C05E952F146100ED22588F42403007484042404840D0BC00005C302E8052972F3C12 S12318E000005E8D6100ED20588F4A40664A1D7C0001FFF8207C00005C3010307000488039 S1231900B07900005DE66608197C000100086006197C000100090C6E000A0008661A2E8D7F S12319202F146100ECE2588F4A40660C4A2C000867061D7C0001FFFED9FC0000000A205479 S12319404A106600FF783EBC00124EB9000004C63E00BE7C00FF67084A2EFFFE6700FF04AA S12319604A2EFFF866440C6E0007000866122EBC00004EC63F3C00094EB9000004C6548F13 S123198013FC000100005E8A423900005AC04280303900005BB62E803F3C000E4EB900003C S12319A004C6548F4240600002D40C6E000A000866102EBC00005E8C42676100F208548F01 S12319C060102EBC00005E8C3F3C00016100F1F6548F287C00005452602C4A2C0008660658 S12319E04A2C0009671A0C6E000A0008671E2EBC000050162F146100EC0E588F4A40670C00 S1231A00D9FC0000000A20544A1066CE20544A1067224A2C0008660E42973F3C00204EB91D S1231A20000004C6548F2EBC00005E952F146100EBB8588F4280303900005BB62E803F3C85 S1231A40000E4EB9000004C6548F600001082EBC00005E8C3F3C000F4EB9000004C6548F45 S1231A60B07C0003620000CA7C09601090C83046D1FC00005E8C0210007F5246BC7C000B21 S1231A8063EA0C39005300005E95660000920C39005500005E96660000860C390042000071 S1231AA05E976600007A1D7C0001FFFA2EBC000000FF3F3C00204EB9000004C6548F33C08F S1231AC000005CB84A3900005380670A13FC000100005E86600813FC000100005D60424775 S1231AE0601890C83047D1FC00005D3C92C93247D3FC00005E8C10915247BE7C002465E2C9 S1231B000C6E000A00086606423900005DFC13FC000100005380423900005DFE600E0C6E54 S1231B200007000867061D7C0001FFFC602A60242EBC000000FF3F3C00204EB9000004C62D S1231B40548F4A40671242973F3C00204EB9000004C6548F6000FEF84A2EFFFC670000C281 S1231B602EB900005E826100ED9A4A2EFFF86626287C0000545260182EBC00005E952F14D5 S1231B806100EA84588F4A40670CD9FC0000000A20544A1066E220544A1067082D6C0004BF S1231BA0FFF460082D7C000004D2FFF42F3900005E82206EFFF44E90588F60502EBC00002C S1231BC04F0A3F3C00094EB9000004C6548F60502EBC00004F323F3C00094EB9000004C600 S1231BE0548F603C2EBC00004F4E3F3C00094EB9000004C6548F60282EBC00004F703F3CF7 S1231C0000094EB9000004C6548F6014B07C000167AAB07C000267B8B07C000367C660D870 S1231C204A2EFFFA661A0C6E0007000866122EBC00004EC63F3C00094EB9000004C6548F78 S1231C404280303900005DE62E803F3C00204EB9000004C6548F13FC000100005E8A4239A2 S1231C6000005AC04239000053824A2EFFFA660A4A2EFFFC66044240600270014A9F4CDFCF S1231C8030C04E5E4E754E56FFFC2EBC00005D3C3F3C00144EB9000004C6548F4A40670C7F S1231CA013FC000100005DFE4240600270014E5E4E754E56000048E73F0C3E2E00083C2EF5 S1231CC0000A2A6E000C383900005ABCBE7C00806510424761B04A406608424030076000F1 S1231CE0011A90C83047D1FC00005D620C1000306D0000B690C83047D1FC00005D620C1084 S1231D0000396E0000A4207C00005D621030700048803600D67CFFD0284D0C1C00536626CE S1231D200C1C005566200C1C0042661A0C1C004D66140C1C0049660E0C1C005466080C14D4 S1231D40002066025243284D7A0160186002528C0C14002067044A1466F40C1400206602AF S1231D60528C5245BA4363E4602ABC7C0001661090C83044D1FC00005E00109C52446014C0 S1231D80101C488048C02E803F3C00024EB9000004C6548F0C140020670A4A146706B87CB4 S1231DA0008065C65247603CBC7C0001661290C83044D1FC00005E0010BC0024524460129F S1231DC02EBC000000243F3C00024EB9000004C6548F90C83047D1FC00005D620C10002425 S1231DE06602524733C400005ABCBE7C0080650642476100FE92424030074A9F4CDF30F83D S1231E004E5E4E754E56000048E707043E2E00082A6E000A42466100E880604090C830479B S1231E20D1FC00005D620C100024661252472E8D42673F076100FE7C588F3E00601E207CFD S1231E4000005D6210307000488048C02E803F3C00024EB9000004C6548F5247BE7C00800D S1231E60642090C83047D1FC00005D620C10001A671090C83047D1FC00005D620C10000D4E S1231E80669ABE7C0080662E90C83047D1FC00005D620C10001A671E90C83047D1FC00003E S1231EA05D620C10000D670E42476100FDDA4A4066027C01602A90C83047D1FC00005D62AC S1231EC00C10000D66105447BE7C0080650642476100FDB4600813FC000100005DFE7C01B4 S1231EE04A466700FF36424030074A9F4CDF20C04E5E8bdosmisc.o¶<`R¢8NVHç.¼?<"?<N¹XB9 <p#Àl#Àhü$B9üB¹>¼ N¹>¼N¹*@ -#À#À -й#À#À.¼ N¹JŸLß N^NuNVÿü ngB@09F@Áy`p9Hã`ÁyByByJngB@ÀÀüÿ#ù#ù.¼ N¹>¼N¹N^NuNVÿü.®N¹.¼qN¹9H€>€WAN¹N^NuNVÿü.®aÄ>¼aÿ8N^NuNVHç. .® a¦.¹N¹.¼°N¹Jg .¼ÚN¹.¼ûN¹N¹Ì<_.¼ÿN¹H€` >¼aþÈ>¼aþÀJgp`"`B@``°|gÚ°|Agܰ|CgÞ°|Rgâ`€JŸLßÀN^NuNVHç *n(M.¼N¹~RŒH€>€WN¹SGfê>¼.N¹~RŒH€>€WN¹SGfê.¼N¹.¹N¹.¼+N¹N¹Ì<_.¼jN¹H€`<>¼aýî>¼aýæ- >¼/ /<N¹P0. ä@>€N¹``°|g¾°|AgÀ°|CgÂ`†JŸLß0ÀN^NuNVÿü.¼nN¹B@0.`J.¼|?<aþDT`L.¼‚?<aþ2T`:.¼‰aþ.¼‘BgaþT` .¼™aýô`°|bå@0@Ñü PNÐN^NuNVHç*n>UG¾| g¾|!fpÿ`H¾|m ¾|%nž|`JGm¾| o0<ÿ`&0GÑÈÑÈÑü+h 0GÑÈÑÈÑü!m B@JŸLß €N^NuNVHç*n-g.#í#í-g#ù#ù`+y+yJŸLß N^Nu `ƒ"4FP`CP/M-68K(tm), Version 1.2, Copyright (c) 1984, Digital ResearchXXXX-0000-654321 error on drive $ WARNING -- Do not attempt to change disks$ Do you want to: Abort (A), Retry (R)$, or Continue with bad data (C)$? $ $CP/M Disk file error: $ is read-only.$ Do you want to: Change it to read/write (C), or Abort (A)? $ $ CP/M Disk $read$write$select$select$change$_chainp¨_gblsˆ_bios1ˆ_bios5ˆ_log_dsk¨_bios6ˆ_dirscanˆ_crit_ds¨_morecmd¨_traphndˆ_initexcˆ_set_attˆ_dir_rdˆ_prt_linˆ_tpa_hp¨_tpa_lp¨_tpa_ht¨_ro_dsk¨_tpa_lt¨__bdosˆ_submit¨_conoutˆ_coninˆ_copyrt¤L1„ _serial¤L2„`_bdosini¢~~bdosin‚~segpÐ L3‚š_warmboo¢¤~~warmbo‚¤~parmÀL5‚ÂL6‚ÔL7‚ôL4‚&_prt_err¢*~~prt_er‚*~pÀL9„qL8‚X_abrt_er¢\~~abrt_e‚\~pÀL10‚n_warning¤L11„ƒ_ext_err¢r~~ext_er‚r~contÐ~pÀ ~chÐL15‚L16„°L17‚¬L18„ÚL19„ûL20„ÿL22‚öL23‚ÖL24‚ÞL25‚æL26‚îL12‚L21‚L27‚ðL14‚L13‚_ro_err¢~~ro_err‚~fcbpÐ ~dirindxÀ ~pÐ ~iÐ~chÐL29„L32‚6L31‚HL30‚LL35‚XL34‚jL33‚nL36„L39‚†L40„+L41„jL43‚ìL44‚°L45‚¸L46‚ÀL28‚L42‚þL38‚þL37‚_error¢ ~~error‚ ~errnumÀL48„nL50‚lL51‚"L52„|L47‚€L53‚4L54„‚L55‚FL56„‰L57‚PL58„‘L59‚`L60„™L49‚€L61„ _setexc¢„~~setexc‚„~epbpÐ ~iÐL10000‚ L63‚¤L62‚ìL64‚¶L65‚ÆL10001‚ÀL66‚Æ_set_tpa¢ö~~set_tp‚ö~pÐ L68‚8L69‚6L70‚HL67‚HL       œ,|”|t„ TŒ$ $Œ<D¤ |”t„ Tll ¬llll´ll¬¬¬lll´8000004C6548F45 S1231180600260085247BE7C007F63C82EBC00005E8C3F3C00144EB9000004C6548F4A4063 S12311A067AE103900005E8C488048C02E803F3C00254EB9000004C6548F60324A390000FC S12311C05BD6672A4A4763142EBC00004E6E3F3C00094EB9000004C6548F60122EBC000007 S12311E04E643F3C00094EB9000004C6548F4A9F4CDF00804E5E4E754E56FFDC48E71F0031 S123120042444A3900005BD6665E2EBC00004E2A3F3C00094EB9000004C6548F2EBC000048 S1231220001D2F3C00005C126100F75A588F4A3900005C12670003182EBC00004E3C3F3CB9 S123124000094EB9000004C6548F2EBC0000001D2F3C00005BD66100F72C588F13FC003D73 S123126000005BF4600000C242476002524790C83047D1FC00005BB80C28003D001E670CC4 S1231280207C00005BB84A30701E66E090C83047D1FC00005BB80C28003D001E661C4A47FC S12312A06314207C00005BB84A30701F67084A3900005BF467027801601C0C39003D0000DA S12312C05BF466104A3900005BF566084A3900005C12660278014A44664E90C83047D1FC54 S12312E000005BB80C28003D001E663C90C83047D1FC00005BB84228001E52474246207CB2 S123130000005BB81030701E488092C93246D3FC00005BB81340005A524752464A4066DEBF S123132013FC003D00005BF47C01600000AE42456002524591C8304542413206C2FC001E9E S1231340D1C1D1FC00005BB80C10003A671A91C8304542413206C2FC001ED1C1227C0000AB S12313605BB84A30980066CABA7C0001631C91C8304542413206C2FC001ED1C1D1FC00009A S12313805BB80C10003A660278014247604442403006C0FC001E2040227C00005BB81030EF S12313A098004880227C00004F84123170004881B041661C425742403006C0FC001ED0BCB2 S12313C000005BB82F006100F378588F600001805247BE7C001065B65446BC7C00046500FA S12313E0FF4E4A44660001524A3900005BD6670001484A3900005C126700013E2E8E069701 S1231400FFFFFFDC3F3C00016100F7BA548F3E002EBC00005E8C3F3C00036100F7A8548F0B S12314203C004A47660001004A46660000FA102EFFDC4880B03900005E8C673E0C39003AAC S123144000005BD766140C39003A00005C13670A13EEFFDC00005E8C60200C39003A0000B8 S12314605BD767140C39003A00005C13660A1D7900005E8CFFDC600278010C2E0001FFDC11 S12314806D080C2E0010FFDC6F0278014A44662E2E8E0697FFFFFFDC3F3C00114EB90000DD S12314A004C6548FB07C00FF67142EBC00004E4E3F3C00094EB9000004C6548F60664245CA S12314C07E10601A90C83047D1FC00005E8C224E95CA3445D3CA10A9FFDC52455247BE7C97 S12314E0002363E04A3900005E8C6D0A0C39000F00005E8C6F0278014A4466282EBC000070 S12315005E8C3F3C00174EB9000004C6548F4A4063122EBC00004E643F3C00094EB9000071 S123152004C6548F60122EBC00004E6E3F3C00094EB9000004C6548F4A4467122EBC0000B9 S12315404E863F3C00094EB9000004C6548F4A9F4CDF00F04E5E4E754E56000048E7030032 S12315604A3900005BD666242EBC00004E183F3C00094EB9000004C6548F2EBC0000001D9A S12315802F3C00005BD66100F3FC588F4A3900005BD6670001026100F8584A40660000F8BD S12315A06100F8843E003E876100F8B64A40670000E60C39003A00005BD7661A4A390000AD S12315C05BD8661242572F3C00005BD66100F172588F600000C22EBC00005E8C3F3C00010A S12315E06100F5E2548F3E004A47630000784A3900005380666E2EBC00004EA43F3C000998 S12316004EB9000004C6548F42973F3C00014EB9000004C6548F13C000005BF40C39006141 S123162000005BF46D180C39007A00005BF46E0E103900005BF44880D07CFFE0600810390C S123164000005BF4488013C000005BF46100EF6E0C39004E00005BF4670A0C39005900009E S12316605BF466320C39004E00005BF467282EBC00005E8C3F3C00134EB9000004C6548FF8 S12316804A4063122EBC00004E643F3C00094EB9000004C6548F4A9F4CDF00804E5E4E7570 S12316A04E56000048E703004A3900005BD666242EBC00004EB43F3C00094EB9000004C6D1 S12316C0548F2EBC0000001D2F3C00005BD66100F2B4588F4A3900005BD6660670016000A1 S12316E000806100F70C4A4067067001600000720C39003000005BD66D0A0C39003900002D S12317005BD66F04424060581E3900005BD64887DE7CFFD0BE7C00096304424060424A3916 S123172000005BD76712CEFC000A103900005BD74880DE40DE7CFFD0BE7C0010641C4A394F S123174000005BD86614428030072E803F3C00204EB9000004C6548F600442406002700129 S12317604A9F4CDF00804E5E4E754E56FFF448E7070C423900005E8A13FC000100005AC0FC S1231780422EFFFE422EFFF8422EFFFA422EFFFC2EBC000000FF3F3C00204EB9000004C648 S12317A0548F33C000005DE642973F3C00194EB9000004C6548F33C000005BB60C6E000A63 S12317C000086604424760027E012EBC00005E8C3F076100F3F0548F3E004A4763182EBCB4 S12317E000004E6E3F3C00094EB9000004C6548F424060000488287C000054522A540C3976 S1231800002000005E956600022C601042401940000919400008D9FC0000000A20544A10BB S123182066EA103900005E8C4880534048C02E803F3C000E4EB99l\4dl  ”„”|„t”„dskutil.o¶ 0`ÔjNVÿîHç>.yÿñJGg0pH€@ÿî0S@H€@ÿïp.ÿñHã`Àyg >¼N¹`pH€@ÿîB@H€@ÿï-nÿò-n ÿø-y ÿü`JGg>¼`BWN¹J@f.Ž—ÿÿÿîN¹J@fØB@JŸL߀N^NuNVÿüBW/90n/aÿJPN^NuNVHç>.>¼/90G/aÿ&P< y¾h d0G"y "iÑÉ/a _€B@0JŸLßÀN^NuNVHç*yB‡| ÞSFJFfø râ Þ€ à€Þ€ À¼ÿH€JŸLß ÀN^NuNVHç?*n >.(y8<ÿg B@09R@`B@<`ä¼lbøB@0À|fˆ:äM>…aÿºl dvB€0&@ y (×ÀgaÿP€`TaÿH°gL y 1lv9H€ákB@0Àyg‡y` B@0F@Áy9H€>€N¹`ÿ|3Æ?B@0À|ëHH@B@H@й// nNßü J@ggBD` B@0À|`"RFfÿ y B@0(R@¼@cÿB@0JŸLß8øN^NuNVHç>. y¾hb.0<€BA2Â|â`? y hBA2æIHABAHAÑÁ€_€JŸL߀N^NuNVHç>.JGc< y¾hb00<€BA2Â|â`F@? y hBA2æIHABAHAÑÁÀ_€JŸL߀N^NuNVHç>.B@0æH0@"y "i0˜H€F@2<€BB4Ä|äaÀAJŸL߀N^NuNVHç>. y8(:|ÿ`$JGgSG>‡ašJ@g<`ºDdRE>…aˆJ@g<`JGfغDeÔ¼|ÿÿg>†aþÈB@0JŸLßðN^Nu_chainp¨_gblsˆ_errorˆ_do_phioˆ_log_dsk¨_crit_ds¨_ro_dsk¨_seldskˆ_rdwrt¢~~rdwrt‚~parmÐ~secnumÀ~dmaÀ ~rwpktÀÿÿÿîL2‚HL3‚FL4‚XL7‚„L6‚nL10000‚xL10002‚zL5‚–L1‚˜_dir_rd¢¢~~dir_rd‚¢~secnumÀL8‚º_dir_wr¢¾~~dir_wr‚¾~secnumÐ~rtnÐL10‚_dchksum¢L9‚~~dchksu‚~pÐ ~lsumÐ~iÐL14‚"L13‚&L12‚*L11‚B_dirscan¢L~~dirsca‚L~fcbpÐ ~parmsÐ~funcpÀ~iÐ~dparmpÐ ~dirsecÐ~rtnÐ~pÐ ~bitvecÐL10003‚xL10005‚zL18‚bL17‚€L16‚~L19‚L20‚”L21‚L22‚ÆL23‚L24‚L25‚úL26‚L27‚`L28‚VL29‚`L15‚‚_setaloc¢Œ~~setalo‚Œ~bitnumÐL31‚ÒL30‚Ò_clraloc¢Ü~~clralo‚Ü~bitnumÐL33‚(L32‚(_chkaloc¢2~~chkalo‚2~iÐL34‚h_getaloc¢r~~getalo‚r~leftblkÐ~blkÐ~rtblkÐ~diskmaxÐL38‚²L37‚ŽL39‚ L40‚ L36‚ºL41‚²L42‚²L43‚ÆL35‚Ê 4           ,4$ <       942471F S1230AC06000007042466022BC7C001D641A42403007C0FC001E42813206D081D0BC0000FA S1230AE05BB8204010955246528D0C15002167100C150020670A0C15000967044A1566C8D6 S1230B0091C8304642413207C2FC001ED1C1D1FC00005BB8421052470C15002067060C153E S1230B2000096602528DBE7C0001660623CD00005BB24A15670C0C1500216706BE7C0004FE S1230B4065824A9F4CDF30C04E5E4E754E56000048E703042A6E00080C1500206E04700199 S1230B60602242476016207C00004F84103070004880B01566047001600A5247BE7C00101C S1230B8065E442404A9F4CDF20804E5E4E754E56000048E701042A6E00080C15002A660436 S1230BA0703F60162E8D61A44A40660C527900005E8810154880600270204A9F4CDF20008C S1230BC04E5E4E754E56000048E71F0C3E2E00082A6E000A4215780C600C204D93C9324408 S1230BE0D1C942105244B87C002363EE7801600E204D93C93244D1C910BC00205244B87C51 S1230C00000B63EC4A3900005E8A67061C3C003F60041C3C0020427900005E88284D424093 S1230C203007C0FC001ED0BC00005BB84281323900005E88D08120404A106638528C7A01EA S1230C40600418C65245BA7C000B63F642973F3C00194EB9000004C6548F52401A804A394D S1230C6000005E8A6708700B6000017C600642406000017442403007C0FC001ED0BC0000E5 S1230C805BB84281323900005E88D08120400C28003A0001667090C8307900005E884241C9 S1230CA03207C2FC001ED2BC00005BB8103018004880D07CFFC01880547900005E88424082 S1230CC03007C0FC001ED0BC00005BB84281323900005E88D08120404A10662849ED00017C S1230CE07A01600418C65245BA7C000B63F64A3900005E8A6708700B600000EC6006424079 S1230D00600000E4601242973F3C00194EB9000004C6548F52401A80284D528C7A0160227C S1230D2042403007C0FC001ED0BC00005BB84281323900005E88D0812E806100FE5218C0E1 S1230D405245BA7C000863D86006527900005E8842403007C0FC001ED0BC00005BB8428173 S1230D60323900005E88D0812E806100FDE04A4067D842403007C0FC001ED0BC00005BB8E6 S1230D804281323900005E88D08120400C10002E6632527900005E887A0160224240300741 S1230DA0C0FC001ED0BC00005BB84281323900005E88D0812E806100FDD618C05245BA7CCA S1230DC0000363D842447A016012204D93C93245D1C90C10003F660252445245BA7C000B53 S1230DE063E8424030044A9F4CDF30F04E5E4E754E56FFFC4A3900005BF467242EBC000065 S1230E004EF43F3C00094EB9000004C6548F42572F3C00005BF46100F928588F70016002C5 S1230E2042404E5E4E754E56000048E70300424760025247207C00005BB84A30701E671233 S1230E4090C83047D1FC00005BB80C28003A001E66E0424030074A9F4CDF00804E5E4E7551 S1230E604E56FFFC207C00005BB893C9326E0008D1C90C28003A001E662E0C6E00010008DF S1230E8066140C39004100005BD66D0A0C39005000005BD66F1242572F3C00005BD66100C9 S1230EA0F8A0588F4240600270014E5E4E754E56FFF848E73F003E2E0008426EFFF8422E57 S1230EC0FFFE6100FF2C4A40660001F06100FF5836003E83618A4A40670001E02EBC00004E S1230EE05E8C3F3C00016100FCDC548F103900005E8C4880D07C00403D40FFFA2EBC000085 S1230F005E8C3F3C00114EB9000004C6548F3C00BC7C00FF66122EBC00004E643F3C000998 S1230F204EB9000004C6548F3806EB4C524442456000014C4A47671290C83044D1FC000017 S1230F405C3008280007000966164A47663A90C83044D1FC00005C30082800070009662821 S1230F604A2EFFFE67086100F654422EFFFE4A4566144280302EFFFA2E803F3C00024EB91D S1230F80000004C6548F601C3D7C0001FFF83EBC00124EB9000004C63C003806EB4C52444F S1230FA0600000DCEB4E52462EBC0000003A3F3C00024EB9000004C6548F2EBC00000020C1 S1230FC03F3C00024EB9000004C6548F7601603CB67C000966122EBC000000203F3C00028F S1230FE04EB9000004C6548F207C00005C30103060004880C07C007F48C02E803F3C0002BB S12310004EB9000004C6548F52465243B67C000B63BE2EBC000000203F3C00024EB90000FF S123102004C6548F3EBC00124EB9000004C63C00BC7C00FF675052453806EB4C5244BA7C20 S12310400005663A42454A47671290C83044D1FC00005C3008280007000966164A47661866 S123106090C83044D1FC00005C3008280007000966066100F54860061D7C0001FFFEBC7CC8 S123108000FF6600FEB04A6EFFF8672E6100F52E4A4767142EBC00004DFE3F3C00094EB9A5 S12310A0000004C6548F60122EBC00004E023F3C00094EB9000004C6548F4A9F4CDF00F88F S12310C04E5E4E754E56000048E703004A3900005BD666242EBC00004E183F3C00094EB9AE S12310E0000004C6548F2EBC0000001D2F3C00005BD66100F890588F6100FCF64A40660089 S123110000EE6100FD223E003E876100FD544A40670000DC2EBC00005E8C3F3C000161002A S1231120FAA4548F3E004A47660000924A3900005BD6670000882EBC00005E8C3F3C000F62 S12311404EB9000004C6548FB07C0003626E603C4247603290C83047D1FC00005C300C10DD S1231160001A671E207C00005C3010307000488048C02E803F3C00024EB9:  fileio.o¶ä`ÜNVHç*n H€À|ÿ°|lV y 1nBG y hd5pH€>€WÿN¹RG¾|oæ`0GÑÈ>µˆN¹>€N¹RG¾|oâJŸLß €N^NuNVÿìHç. B@09HâhF@Ê<¾9fJgxB.ÿîH€@ÿñÀH€À|ÿ°|o >¼N¹H€r³@@ÿï.Ž—ÿÿÿîN¹#îÿü f>¼N¹J@gÚ y #è  y #èJgŽ y<(>†N¹0SFJ@fð.Ž—ÿÿÿì y(H€R@å@? yB@0(R@H@B@H@/N¹\<JnÿìgRFSF>†N¹JFfò>¼B§/<N¹PpHã`yJŸLßàN^NuNVHç *n(n >.`Ý0SGJ@föJŸLß0€N^NuNVHç *n(n ~  ?H€H³@À|gJgB@`LSGJGfÜJ.g> ?g H€H³@"y)HFAÀAgB@`TTŒH€H³@À|?gB@`pJŸLß0ÀN^NuNVHç*n>¼/. / aÿbPg0- >¼ / /. aÿ PG -€p9Hã`yH€JŸLß ÀN^NuNVÿîHç|ÿî`>¼N¹J@f.Ž—ÿÿÿîN¹>fàB@0JŸL߀N^NuNVÿüHç*n(n >¼/ / aþÄPJ@g GíAì-Hÿü y hd:~ nÿüJgJg nÿüH€°fÒ` nÿü` nÿü“R‹R®ÿüSGJGfÊ`8~ nÿüJPgJSg nÿüB@0°Sf˜` nÿü6` nÿü0“T‹T®ÿüSGJGfÊ.N¹<, H…Ê|¼Eb¼Ef*-H€À|ÿ,HÂ|ÿ°AomB@0À|ÿ@ m , g>®/ N¹X, 0.ä@>€N¹p`p9Hã`yB@``B@JŸLß8àN^NuNVÿüaþn n(gB@`BW/./<N¹PN^NuNVÿüpN^NuNVÿü>¼/. /.aýDPN^NuNVHç*n>. ?f$9H€>€aû®>‡/ /<†N¹P<`..®N¹ -? gB- B->‡/ /<N¹P<>¼€/9/9aü˜PB@0JŸLß ÀN^NuNVHç*n(n >. ågB@`pgPGí|BSFJFfø>¼ / / aüJP0ä@>€N¹ y ¾hc y 1Gp9Hã`yH€JŸLß8àN^NuNVHç *n(n >.BW/ / aüPgl, g >‡/ N¹X¼å0ä@>€N¹ y hd|SF4`H€>€WÿN¹JFfè`|SF0FÑÈ>´ˆN¹>€N¹JFfäH€JŸLß0àN^NuNVÿüHç*n(n >.BW/ / aûtPgF, g >‡/ N¹XGíAì-Hÿü| H€À|"nÿü€R®ÿüSFJFfè0ä@>€N¹H€JŸLß8àN^NuNVHç *n(n >.BW/ / aúüPg>¼ / R—/ R—aú¼P0ä@>€N¹H€JŸLß0ÀN^NuNVHç*n- H€À|HÀï€-HÂ|?HÁt å¡€JŸLß N^NuNVÿüHç*n.aº- HÂ|ÿHÁÐ-@ÿünÿý!nÿþ"nÿÿ#JŸLß N^NuNVÿüHç *n(n BW/ / aú‡/ /<’N¹P°|ÿeÄnÿý!nÿþ"nÿÿ#JŸLß €N^NuNVÿüHç. H€>€aøB‡ y *hBFBD`.JFf <<€B@0F@:B@0ÀFg y(H€R@HÀÞ€âNRD y¸hcÆ-Gÿü>¼/9/Y—aøîPJŸLß ðN^Nu_chainp¨_gblsˆ_errorˆ_udivˆ_swapˆ_clralocˆ_do_phioˆ_log_dsk¨_dirscanˆ_calcextˆ_crit_ds¨_setalocˆ_tmp_selˆ_ro_dsk¨_dir_wrˆ_ro_errˆ_alloc¢~~alloc‚~dirpÐ ~fcbpÀ~dirindxÀ~iÐL2‚pL3‚RL6‚6L5‚JL4‚PL7‚pL10‚RL9‚jL8‚pL1‚p_seldsk¢z~~seldsk‚z~dsknumÐ~selpktÀÿÿÿî~iÐ~jÀÿÿÿì~logflagÐL10000‚¨L12‚ L13‚ÒL16‚ÞL14‚L15‚öL17‚²L20‚0L19‚8L18‚@L21‚‚L24‚‚L23‚ŒL22‚L11‚²_move¢¼~~move‚¼~p1Ð ~p2Ð ~iÐL28‚ÔL27‚ÒL26‚ÜL25‚Ü_match¢æ~~match‚æ~p1Ð ~p2Ð ~chk_extÀ~iÐ~tempÐL32‚øL33‚L29‚bL31‚L30‚L34‚`L35‚HL36‚`_openfil¢l~~openfi‚l~fcbpÐ ~dirpÀ ~dirindxÀ~fcb_extÐ~rtnÐL38‚¼L37‚À_flushit¢Ê~~flushi‚Ê~rtnÐ~flushpkÀÿÿÿîL42‚èL41‚ÚL40‚úL39‚þ_close¢~~close‚~fcbpÐ ~dirpÐ ~dirindxÀ~iÐ~fpÐ ~dpÀÿÿÿü~fcb_extÐ~dir_extÐL44‚JL45‚€L48‚HL49‚lL50‚dL51‚2L52‚jL53‚rL47‚zL46‚:S12304004EF90000044C4EF9000004462043502F4D2D36384B2056312E3220434F505952E7 S1230420494748542028432920313938322C313938342C204469676974616C205265736529 S12304406172636820004239000052FA4FF900005ABA4239000052FA4EB90000600033C096 S12304600000537E423900005AC042390000538042390000538213FC000100005DFA427952 S1230480000053FC4279000053FE4EB900004D7C4EB900002AE4303C00204281123900007E S12304A0537E4E424280303C000E428132390000537E024100FF4E424FF900005ABA4EB967 S12304C00000234A60F2302F0004222F00064E424E75223C000053FE303C003F4E4223F946 S12304E000005400000053EC23F900005404000053F023FC00005E8C000053E8703B223C61 S1230500000053E84E424A4066000092323900005DE670204E4242812239000053F4D27C09 S123052000802241701A4E4224495289207900005BB242800C100000670C0C1000216706D1 S123054012D8524060EE148012BC00002F3C00005E8C3F3C00014EB900000BC45C8F428017 S1230560705C613E2F3C00005E8C3F3C00024EB900000BC45C8F42807038612620790000EF S123058053F82279000053F42109213C0000059E4E60206900084EF900004D2C4E757000CE S12305A04E42D0B9000053F42040227C00005E8C4280702310D951C8FFFC4E754E56FFFC3B S12305C02EBC0000000D3F3C00024EB9000004C6548F2EBC0000000A3F3C00024EB9000077 S12305E004C6548F4E5E4E754E56000048E7010C2A6E0008286E000C18DD66FC4A9F4CDF4E S123060030004E5E4E754E56000048E7010C2A6E0008286E000C601C10154880B0146F0475 S12306207001601E10154880B0146C0470FF6012528D528C4A1566E04A14660442406002B7 S123064070FF4A9F4CDF30004E5E4E754E56000048E7011C2A6E0008267C00005CBA4A39A9 S123066000005DFC6718287C00005BB8600216DC4A1466FA16FC0020423900005DFC60026D S123068016DD4A1567060C15002166F442134A9F4CDF38004E5E4E754E56FFFC48E7070016 S12306A02EBC000000FF3F3C00204EB9000004C6548F3C0042973F3C00194EB9000004C684 S12306C0548F3E00DE7C00416100FEF24A466742BC7C000A651A1D7C0031FFFC4240300692 S12306E0D07C00261D40FFFD1D7C0024FFFE601242403006D07C00301D40FFFC1D7C0024B6 S1230700FFFD2E8E59973F3C00094EB9000004C6548F428030072E803F3C00024EB90000CA S123072004C6548F2EBC0000003E3F3C00024EB9000004C6548F4A9F4CDF00C04E5E4E756C S12307404E56000048E703042A6E00083E2E000CBE7C000166144A39000052FA67084A392D S123076000005DFA66046100FF306014101D488048C02E803F3C00024EB9000004C6548FD4 S12307804A1567060C15002166E24A4766142EBC0000003F3F3C00024EB9000004C6548F9A S12307A060046100FE184A9F4CDF20804E5E4E754E56000048E707042A6E00084247603C94 S12307C042403007C0FC00062040227C00004DCE2EB098002F0D6100FE2E588F4A40661A51 S12307E042403007C0FC00062040227C00004DCE424030309804600001005247BE7C0007A8 S123080065BE424760025247BE7C001D641090C83047D1FC00005BB80C10003A66E8BE7CD5 S12308200001662A4A3900005BBA66224A3900005BD6661A0C39004100005BB86D100C3974 S1230840005000005BB86E067005600000ACBE7C0001661A0C39004100005BB86D0A0C392C S1230860005000005BB86F0670FF6000008CBE7C0001671690C83047D1FC00005BB80C10BE S1230880003A660670FF600000702EBC00005E8C426761000330548F4A40630470FF605863 S12308A0BE7C000166047E026002424742403007484042404840D0BC00005BB82E8061002B S12308C0028C4A40670470FF602E4246601690C83046D1FC00005BB80C1000206C0470FFCD S12308E060165246BC7C001D640C207C00005BB84A30600066D870084A9F4CDF20C04E5E42 S12309004E754E56000048E701042A6E00086002528D4A1567060C15002166F40C1D0021A5 S1230920661E4A15671A13FC0001000053826002528D0C15002067F823CD00005DF0603AB2 S12309404A3900005380672C4A3900005DFE660A13FC0001000053826018423900005380B1 S1230960207900005DF04A10670813FC00010000538260064239000053824A9F4CDF2000F5 S12309804E5E4E754E56000048E7030C2A6E00082E2E000C200D5380DE8013FC008000000D S12309A05C302EBC00005C303F3C000A4EB9000004C6548F4A3900005C31670E0C39003BF3 S12309C000005C3267046100FBF4103900005C314880C07C00FF48C0D0BC00005C30204071 S12309E0117C000A00020C39003B00005C32660813FC000A00005C32287C00005C326002A3 S1230A00528C0C14002067F80C14000967F2603C0C1400616D100C14007A6E0A101448803B S1230A20D07CFFE06004101448801AC00C14002067060C1400096612528C204C0C10002089 S1230A4067F60C14000967F06002528C0C14000A6704BBC765BA42154A9F4CDF30804E5E78 S1230A604E754E56000048E701042A6E00086002528D0C15002167044A1566F46002528D4F S1230A800C15002167F80C15002067F20C15000967EC200D4A9F4CDF20004E5E4E754E5626 S1230AA0000048E7070C2A6E0008287C00005BB842476004421C5247BE7C007865F6;~L54‚¸L57‚‚L58‚¦L59‚žL60‚¤L61‚¬L56‚´L55‚¸L10001‚ìL62‚þL63‚L43‚LL64‚L_close_f¢V~~close_‚V~fcbpÀL66‚nL65‚‚_alltrue¢†~~alltru‚†~p1À~p2À ~iÀL67‚Œ_matchit¢~~matchi‚~p1À~p2À ~iÀL68‚¦_search¢ª~~search‚ª~fcbpÐ ~dsparmÐ~pÀ~rtnÐL70‚äL71‚L72‚úL69‚,_create¢6~~create‚6~fcbpÐ ~dirpÐ ~dirindxÐ~pÐ ~iÐ~rtnÐL10002‚TL10003‚VL74‚ªL77‚`L76‚dL75‚hL78‚˜L73‚®_delete¢¸~~delete‚¸~fcbpÐ ~dirpÐ ~dirindxÐ~iÐ~rtnÐL80‚HL81‚ðL82‚*L85‚L84‚$L83‚(L86‚HL89‚,L88‚DL87‚HL79‚L_rename¢V~~rename‚V~fcbpÐ ~dirpÐ ~dirindxÐ~iÐ~pÐ ~qÀÿÿÿü~rtnÐL91‚ÀL92‚ŽL95‚œL94‚°L93‚´L90‚Ä_set_att¢Î~~set_at‚Î~fcbpÐ ~dirpÐ ~dirindxÐ~rtnÐL97‚L96‚_extsize¢~~extsiz‚~fcbpÐ L98‚J_setran¢T~~setran‚T~fcbpÐ ~randomÀÿÿÿüL99‚ˆ_fsize¢’~~fsize‚’~fcbpÐ ~dirpÐ ~dirindxÀ~rtnÐ~tempÀÿÿÿüL101‚ÜL100‚à_getsize¢ê~~getsiz‚ê~fcbpÐ ~maxrcdÀÿÿÿü~tempÀÿÿÿø~dsparmÐL105‚&L104‚L106‚$L103‚>L102‚P_free_sp¢Z~~free_s‚Z~dsknumÀ ~recordsÐ~alvecÐ ~bitmaskÐ~alvwordÐ~iÐ~tempÀÿÿÿüL110‚®L111‚€L112‚L113‚ªL109‚¬L108‚ºL107‚Ò  \$\<  4      ,  \D<  T4 L|t lD DdD  t   T|t ,$,|ttD; .text * * Global Code addresses * .globl _init .globl _biosinit .globl _flush .globl _wboot .globl _cbios .globl _dskia .globl _dskic .globl _setimask .globl _ccp .globl cpm * Lowest addr of CP/M .globl _end * Highest addr of CP/M * * Global data addresses * .globl _memtab * memory region table .globl _dpb3 * RAM disk dpb address .globl _memdsk * -> First memory disk location * * Vector Addresses * dskint: .equ $3fc * UDC Interrupt vector trap3: .equ $8c  * Trap 3 vector buserr: .equ $8 * Bus error vector * * _init: lea entry,a0 move.l a0,trap3 lea _dskia,a0 move.l a0,dskint * * Auto-Size TPA * lea _memtab,a0 * a0 -> Memory region table move.w #1,(a0)+ * 1 region move.l #$400,(a0)+ * TPA starts at 400 move.l #cpm-$408,(a0)+ * Ends where CP/M begins * * Auto-Size RAM disk * move.l buserr,-(sp) * Push bus err vector lea _end,a0 * a0 -> Last location in CP/M add.l #cpm,a0 * Linker doesn't reloc this!! move.l a0,_memdsk * -> first location in RAM disk move.l #quit,buserr * set up vector -> ourselves loop: tst.w (a0)+ * Find bra loop * End of memory quit: add.l #14,a7 * Clear buserr gorp move.l (a7)+,buserr * Pop buserr vector sub.l #_end,a0 * a0 = # bytes in RAM disk sub.l #cpm,a0 * Relocation bug move.l a0,d0 * Into D reg for shift move.l #11,d1 * Load shift count lsr.l d1,d0 * Divide by 2048 move.w d0,_dpb3+6 * Load DRM field of dpb move #$2000,sr jsr _biosinit clr.l d0 rts * _wboot: clr.l d0 jmp _ccp * entry: move.l d2,-(a7) move.l d1,-(a7) move.w d0,-(a7) jsr _cbios add.l #10,a7 rte * _dskia: link a6,#0 movem.l d0-d7/a0-a5,-(a7) jsr _dskic movem.l (a7)+,d0-d7/a0-a5 unlk a6 rte * _setimask: move sr,d0 lsr #8,d0 and.l #7,d0 move sr,d1 ror.w #8,d1 and.w #$fff8,d1 add.w 4(a7),d1 ror.w #8,d1 move d1,sr rts .data .globl BIOSDATA BIOSDATA: .dc.l 0,0 .end *************************************** * Information to go on the 256 byte * * boot sector of an ExorMacs * *************************************** .text .dc.l $4000 * starting stack pointer .dc.l start * starting program counter .dc.w 1 * garbage .dc.w 1 * length of SAT .dc.l 2 * secondary directory start .dc.l 0 * primary directory PSN list start .dc.l 0 * start of boot loader .dc.w 26 * length of boot loader .dc.l $0 * boot execution address .dc.l $0 * boot load address .dc.b '9/30' * generation date .dc.b 'CP/M-68K of 9/30/82 ' * volume descriptor .dc.b '0020' * version/revision .dc.w $0a484 * checksum (god help us) .dc.l $0f1e2d3c * diagnostic test pattern .dc.l $4b5a6978 .dc.l $8796a5b4 .dc.l $c3d2e1f0 .dc.l $0f1e2d3c * diagnostic test pattern .dc.l $4b5a6978 .dc.l $8796a5b4 .dc.l $c3d2e1f0 .dc.l $4f8f0f07 * diagnostic test pattern .dc.l $0b0d0e06 .dc.l $0a0c0408 .dc.l $04020100 .dc.l 00, 00, 00, 00 * diagnostic test pattern .dc.l 0 * diagnostic test area directory .dc.l 0 * start of dump area .dc.w 0 * length of dump area .dc.l 0 * start of sector lockout table .dc.w 0 * length of sector lockout table .dc.l 0,0,0,0,0,0,0 * unused, reserved .dc.l 0,0,0,0,0,0 .dc.l 0,0,0,0,0,0,0 .dc.l 0,0,0,0,0,0 .dc.b 'EXORMACS' * let's hear it for Motorola * * end of volume id * * begin boot info proper * .ds.b $300 * skip over exception vectors .even start: move #$2700,sr move.l #$8,a0 move.w #253,d0 exlp: move.l #expdef,(a0)+ dbf d0,exlp jmp grunt expdef: rte grunt: move #$2000,sr .end ve.l #$8,a0 move.w #2éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé<    bdosrw.o¶X`ȬNVHç *n(y,H†- H‡,H€Î@pFág0- HÂ|ÿ4äaÐAJŸLß0ÀN^NuNVHç*n>. Jng0GÑÈ>µˆN¹` ` 5pH€À|ÿJŸLß €N^NuNVHç*n>. <.-Jng>†N¹? M2GÓÉÑÉ1_`B@0À|ÿ"M4GÓÊ@JŸLß ÀN^NuNVHç>. *yB†<.-H€á¦-H€. HÀAHÀÜ€>‡/9/N¹PJŸLß ÀN^NuNVHç*nJng,-!é-"H€è@‚-"Ì<ã-#gŒ<`-Î<?- R¼< mBR¾<@mp`¬H€-HÂ|?°Af,H€- H³@"y)HFAÀAÀ|f F B@`n.N¹°|ÿep`Z-- GF BW/ /<N¹P°|ÿe0J. g ED p` >¼/ /<N¹P°|ÿep`B@JŸLß ðN^NuNVHç *n~Ií J$fSGJGfö y hÿcâOp"y)HAàoB@0"y)HFA- H‚ÂBÂ|€AJŸLß0€N^NuNVHç*n.aˆ>- H€¾@f-H€À|ÿ``- H€¾@c0<€``B@JŸLß €N^NuNVÿüHç? *n. y6(Æ|ÿJf - g y h>¨/ N¹XJng2>¼H€?/ aýä\=@ÿþg B@0.ÿþ`j-#H€À|@ `& -€ fBWH€?/ aý¬\J@gp`8B- mÿü.aÿ- HÂ|ÿ°AbJgp`-- H€R@@ÿü.aü::>ƒ?/ aüv\<JFgJgB@`p8`¢Jgp`Ê>ƒJEg?SW`Bg/ aü@\>€N¹<¼|ÿÿfp`ž>†??/ aüXPx nfR(y#ù:<€SE0EÑùBJEfðBE`>„0H€??aüjXxRE y(H€º@oÜ#Ì>„- H€??aü>X=@ÿþJnÿþfnÿüJnfR- B@0.ÿþJŸLß0øN^Nu_chainp¨_gblsˆ_rdwrtˆ_swapˆ_close_fˆ_getalocˆ_dirscanˆ_openfilˆ_createˆ_ro_dsk¨_ro_errˆ_blkindx¢~~blkind‚~fcbpÐ ~dparmpÐ ~iÐ~blkshfÐL1‚>_blknum¢H~~blknum‚H~fcbpÐ ~indexÐ~wrdfcbÀL3‚pL2‚zL4‚z_setblk¢„~~setblk‚„~fcbpÐ ~indexÐ~blockÐ~wrdfcbÀL6‚¼L7‚ÎL5‚Î_do_io¢Ø~~do_io‚Ø~parmÐ~blockÀ~rcrdÀ ~lsecÐ~dparmpÐ L8‚_new_ext¢&~~new_ex‚&~fcbpÐ ~readingÀ ~ranÀ~modÐ~extÐ~t_modÐ~t_extÐL10‚dL11‚bL12‚rL13‚|L14‚ˆL9‚2L15‚ÆL16‚ÆL17‚ØL18‚0L19‚L20‚0_calcext¢<~~calcex‚<~fcbpÐ ~iÐ~pÐ L24‚NL22‚XL23‚TL25‚hL21‚š_get_rc¢¤~~get_rc‚¤~fcbpÐ ~extÐL27‚ÎL26‚âL28‚âL29‚àL30‚â_bdosrw¢ì~~bdosrw‚ì~fcbpÐ ~readingÐ~randomÀ~blockÐ~indexÐ~old_dmaÐ ~parmÐ~bigfileÐ~rtnÀÿÿÿþ~rcÀÿÿÿüL32‚.L33‚fL34‚VL31‚¾L35‚ŒL36‚ŒL37‚ˆL38‚ÂL39‚°L40‚ìL10000‚äL10002‚æL41‚ŒL42‚öL10003‚L10005‚L43‚"L44‚ŒL47‚NL46‚ZL45‚^L50‚vL51‚bL49‚tL48‚†L52‚¸L53‚¸    $<4D4     T<itialization. Must be done before any regular BIOS */ /* calls are performed. */ /* */ /************************************************************************/ biosinit() { initprts(); initdsks(); } initprts() { portinit(PORT1); portinit(PORT2); } initdsks() { REG WORD i; REG WORD imsave; #if ! LOADER for ( i = 0; i < NUMTB; ++i ) { tbuf[i].valid = 0; tbuf[i].dirty = 0; if ( (i+1) < NUMTB ) tbuf[i].nextbuf = &tbuf[i+1]; else  tbuf[i].nextbuf = 0; } firstbuf = &tbuf[0]; lastbuf = &tbuf[NUMTB-1]; #else bufvalid = 0; #endif for ( i = 0; i <= MAXDSK; i += 1) { dskstate[i].state = IDLE; dskstate[i].ready = 1; dskstate[i].change = 0; } imsave = setimask(7); /* turn off interrupts */ intcount = 0; ipcstate = IDLE; setimask(imsave); /* turn on interrupts */ } /************************************************************************/ /* */ /* BIOS MAIN ENTRY -- Branch out to the various functions. */ /* */ /************************************************************************/ LONG cbios(d0, d1, d2) REG WORD d0; REG LONG d1, d2; { switch(d0) { case 0: biosinit(); /* INIT */ break; #if ! LOADER case 1: flush(); /* WBOOT */ initdsks(); wboot(); /* break; */ #endif case 2: return(portstat(PORT1)); /* CONST */ /* break; */ case 3: return(portin(PORT1)); /* CONIN */ /* break; */ case 4: portout(PORT1, (char)d1); /* CONOUT */ break; case 5: ; /* LIST */ case 6: portout(PORT2, (char)d1); /* PUNCH */ break; case 7: return(portin(PORT2)); /* READER */ /* break; */ case 8: settrk = 0; /* HOME */ break; case 9: #if LOADER d1 = 3; /* Always HD */ #endif return(slctdsk((char)d1, (char)d2)); /* SELDSK */ /* break; */ case 10: settrk = (int)d1; /* SETTRK */ break; case 11: setsec = ((int)d1-1); /* SETSEC */  break; case 12: setdma = d1; /* SETDMA */ break; case 13: return(read()); /* READ */ /* break; */ #if ! LOADER case 14: return(write((char)d1)); /* WRITE */ /* break; */ case 15: if ( *(BYTE *)(PORT2 + PORTSTAT) & PORTTDRE ) return ( 0x0ff ); else return ( 0x000 ); /* break; */ #endif case 16: return(sectran((int)d1, d2)); /* SECTRAN */ /* break; */ #if ! LOADER case 18: return(&memtab); /* GMRTA */ /* break; */ case 19: return(iobyte); /* GETIOB */ /* break; */ case 20: iobyte = (int)d1; /* SETIOB */ break; case 21: if (flush()) return(0L); /* FLUSH */ else return(0xffffL); /* break; */ #endif case 22: return(setxvect((int)d1,d2)); /* SETXVECT */ /* break; */ #if ! LOADER /**********************************************************/ /* This function is not part of a standard BIOS. */ /* It is included only for convenience, and will */ /* not be supported in any way, nor will it */ /* necessarily be included in future versions of */ /* CP/M-68K */ /**********************************************************/ case 63: return( ! format((int)d1) ); /* Disk Formatter */ /* break; */ #endif default: return(0L); break; } /* end switch */ } /* END OF BIOS */ /* End of C Bios */  */ OS */ /* End of C Bios */  */ éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé=,      bdosmain.o¶Ô`Š¢NVÿúHç>.<. *n B.ÿû-MÿüBE0`ðBWN¹N¹`B@0À|ÿ>€N¹`Þ>¼N¹`ÞB@0À|ÿ>€?<N¹T`¶B@0À|ÿ>€?<N¹T`œ>†N¹`ž>¼N¹`>†?<N¹T`p.N¹`d.N¹`XN¹`\0< "`TByByByüÿB9`"B@0À|ÿ>€N¹B@0À|ÿÀ`.Ž]—aB- B-BW/ /<N¹P:`Ø.Ž]—aè.N¹:`Â#Í.Ž]—Bg/ N¹\:`¦*y-Mÿü.Ž]—?</ N¹\:`„.Ž]—a”>¼/ /<N¹P:`b.Ž]—arBW?</ N¹\:`D.Ž]—aTBWBg/ N¹\:`(.Ž]—a8B- B- B-B->¼/ /<N¹P:`ö.Ž]—a>¼/ /<N¹P:`ÔB@09`Ö9H€À|ÿ`Æ#Í`®p9Hã`y`˜B@09`š.Ž]—aœ>¼/ /<N¹P:`j9H€°9g9H€>€N¹>¼/ /9N¹P`2B@0À|ÿ°|bB@0À|ÿÀ9H€À|ÿ`.Ž]—a>¼?</ N¹\:`æ.Ž]—aö>¼Bg/ N¹\:`È.Ž]—aØ.N¹`´.Ž]—aÄ.N¹` B@0F@<ÍyÍyÍy`‚.Ž]—a’>¼Bg/ N¹\:`d>†N¹`Z#ùBWN¹N¹`N.¹/ N¹X`<.N¹`2.N¹`pÿ`$`°|?bôå@0@Ñü PNÐJ.ÿûg®ÿúB@0JŸLß àN^NuNVHç *n(mH€€Jg H€>€SW` 9H€>€N¹¹|JŸLß0€N^Nu$,6JXrŒ˜¦¸ÄÐÚâ(Pf‚¤Æä2T`p zœ¾ö"B`tˆ  ¦     ÂÌÞ          æ ø _chainp¨_log_dsk¨_ro_dsk¨_crit_ds¨_tpa_lp¨_tpa_lt¨_tpa_hp¨_tpa_ht¨_gbls¨î_moveˆ_close_fˆ_bios1ˆ_bios2ˆ_readlinˆ_dirscanˆ_free_spˆ_openfilˆ_set_tpaˆ_rawconiˆ_deleteˆ_createˆ_set_attˆ_searchˆ_warmbooˆ_prt_linˆ_renameˆ_constatˆ_getsizeˆ_flushitˆ_seldskˆ_setexcˆ_setranˆ_taboutˆ_bdosrwˆ_pgmldˆ_coninˆ__bdos¢~~_bdos‚~funcÐ~infoÐ~infopÐ ~rtnvalÐ~tempÀÿÿÿúL3‚L4‚$L5‚,L1‚4L6‚6L2‚&L7‚JL8‚XL9‚rL10‚ŒL11‚˜L12‚¦L13‚¸L14‚ÄL15‚ÐL16‚ÚL17‚âL18‚L19‚(_tmp_sel¢>L20‚PL21‚fL22‚‚L23‚¤L24‚ÆL25‚äL26‚L27‚2L28‚TL29‚`L30‚pL31‚zL32‚L33‚œL34‚¾L35‚ÞL36‚öL37‚L38‚"L39‚BL40‚`L41‚tL42‚ˆL43‚¦L44‚ÂL45‚ÌL46‚ÞL47‚æL48‚øL49‚L50‚ L51„L52‚0~~tmp_se‚>~temptrÐ ~fcbpÐ ~tmp_dskÐL10000‚dL10002‚nL53‚€¼\dd”\dÄlÔ DDìD„tTD´D´œt  ¤tÌt DDD¬tDDDìDLDD  Ü== 1 ){if ( flush1(tbp) ) return(0); else return(1);} else return(0); } #else /************************************************************************/ /* Read and Write functions for the Loader BIOS */ /************************************************************************/ read() { REG BYTE *p; REG BYTE *q; REG WORD i; if ( ( (! bufvalid) || (buftrk != settrk) ) && ( ! dskxfer(setdsk, settrk, buf1trk, DSKREAD) ) ) {return(1);} bufvalid = 1; buftrk = settrk; p = buf1trk + (setsec << 7); q = setdma; i = 128; do { *q++ = *p++; i-=1; } while(i); return(0); } #endif /************************************************************************/ /* BIOS Sector Translate Function */ /************************************************************************/ WORD sectran(s, xp) REG WORD s; REG BYTE *xp; { if (xp) return (WORD)xp[s]; else return (s+1); } /************************************************************************/ /* BIOS Set Exception Vector Function */ /************************************************************************/ LONG setxvect(vnum, vval) WORD vnum; LONG vval; { REG LONG oldval; REG BYTE *vloc; vloc = ( (long)vnum ) << 2; oldval = vloc->lword; vloc->lword = vval; return(oldval); } /************************************************************************/ /* BIOS Select Disk Function */ /************************************************************************/ LONG slctdsk(dsk, logged) REG BYTE dsk; BYTE logged; { REG struct dph *dphp; REG BYTE st1, st2; BYTE stpkt[STPKTSZ]; setdsk = dsk; /* Record the selected disk number */ #if ! LOADER /* Special Code to disable drive C. On the EXORmacs, drive C */ /* is the non-removable hard disk. Including this code lets */ /* you save your non-removable disk for non-CP/M use. */ if ( (dsk > MAXDSK) || ( dsk == 2 ) ) { printstr("\n\rBIOS ERROR -- DISK "); portout(PORT1, 'A'+dsk); printstr(" NOT SUPPORTED\n\r"); return(0L); } #endif dphp = &dphtab[dsk]; #if MEMDSK if (setdsk == MEMDSK) return(dphp); #endif if ( ! (logged & 0x1) ) { hmpack.dskno = cnvdsk[setdsk]; hmpack.com1 = 0x30; hmpack.com2 = 0x02; actvdsk = dsk; dskstate[dsk].change = 0; sendpkt(&hmpack, 7); if ( ! dskwait(dsk, 0x72, 0x0) ) { sendack(); ipcstate = IDLE; return ( 0L ); } getstpkt(stpkt); /* determine disk type and size */ sendack(); ipcstate = IDLE; st1 = stpkt[PKTSTPRM]; st2 = stpkt[PKTSTPRM+1]; if ( st1 & 0x80 ) /* not ready / ready */ { dskstate[dsk].ready = 0; return(0L); } else dskstate[dsk].ready = 1; switch ( st1 & 7 ) { case 1 : /* floppy disk */ dphp->dpbp = &dpb0; break; #if ! CTLTYPE case 2 : /* hard disk */ dphp->dpbp = &dpb2; break; #endif default : bioserr("Invalid Disk Status"); dphp = 0L; break; } } return(dphp); } #if ! LOADER /****************************************************************/ /* */ /* This function is included as an undocumented, */ /* unsupported method for EXORmacs users to format */ /* disks. It is not a part of CP/M-68K proper, and */ /* is only included here for convenience, since the */ /* Motorola disk controller is somewhat complex to */ /* program, and the BIOS contains supporting routines. */ /* */ /****************************************************************/  format(dsk) REG WORD dsk; { REG WORD retval; if ( ! slctdsk( (BYTE)dsk, (BYTE) 1 ) ) return; #if MEMDSK if (setdsk == MEMDSK) return; #endif fmtpack.dskno = cnvdsk[setdsk]; actvdsk = setdsk; dskstate[setdsk].change = 0; sendpkt(&fmtpack, 7); if ( ! dskwait(setdsk, 0x70, 0x0) ) retval = 0; else retval = 1; sendack(); ipcstate = IDLE; return(retval); } #endif /************************************************************************/ /* */ /* Bios in>ü  |D¼äDôŒDìDiosys.o¶ì`2lNVÿþHç*nBGH€`ôí-H€>€9H€??< N¹X+@`â-H€°9gBW-H€À??< N¹X(m&l.ŽU—?/-N¹\>€B@0+ÑW?< N¹T.”?.ÿþ?<N¹X>€?< N¹T.­ ?< N¹T f>¼ N¹>`-H€>€?<N¹T>`*>¼N¹>`J@gÿ °|gÿ0°|gÿ(°|gÖB@0JŸLß8€N^Nu_chainp¨_udivˆ_bios1ˆ_bios2ˆ_bios3ˆ_bios4ˆ_bios5ˆ_do_phio¢~~do_phi‚~iopÐ ~last_dsÀL2~hdrpÐ ~dparmpÐ ~rtnÐ~iosectÀÿÿÿþL4‚L5‚L3‚$L6‚DL7‚DL8‚nL9‚âL10‚øL11‚úL1‚(,, 4$pgmld.o¶t`®DúHçþ o<d y`gQG3ÇB3ü@$y$$9Bƒ69B¶‚m&a`H”ƒaŠ&<€´ƒm" aý„aýpJAfV”ƒÕü€`äJ‚g"90aýdaýPJAf63ÃB&aÿH$y($9Sy@f’$y,$9 gBS‚fúNupNu>GãONûp``"` ````` pNu‚JZNuÂJZNu‚f<ÜE4ÆNuJb,Ü…$ÆNu"90aüÎ.98Žü€<HG69B–GlC€RF&y0Öü€–ÃâK` aüŒJAfÿrQÎÿô*9$$Eš¹(93ü@B‚âŒ`SCjaüXJAfÿ>&y06<?aÿ4S„J„fÞ$y((9Sy@fÄNu!y0 .94Þ¹‡!G"y0"è"è"ù$"ù"ù("ù"ù,"¹ .(,)ÿüÜ™,|$zB¹,¼–b¾–c.JžQÍÿòž†"Ç$hfpNBR@ÀB€Nu_pgmld¢secsizeÀ€gethdr‚`lddone‚:setaddr‚rdtxt‚rtstartcseg$noreloc‚2reloc‚€setrtn‚ setdma‚Vreadseq‚FFCBPtrÀLoAdrÀbadhdr‚€hdrgeth1‚xconflict‚„csizeconf1‚¨confbd‚¶confgd‚¸trymemtp‚ºHiAdrÀchksegs‚Ächk1‚äfndseg‚ðtemp******************************************/ flush() { REG struct tbstr *tbp; REG WORD ok; ok = 1; tbp = firstbuf; while (tbp) { if ( ! flush1(tbp) ) ok = 0; tbp = tbp->nextbuf; } return(ok); } /*************************************************************************/ /* Fill the indicated disk buffer with the current track and sector */ /*************************************************************************/ fill(tbp) REG struct tbstr *tbp; { REG WORD ok;  if ( tbp->valid && tbp->dirty ) ok = flush1(tbp); else ok = 1; if (ok) ok = dskxfer(setdsk, settrk, tbp->buf, DSKREAD); tbp->valid = ok; tbp->dirty = 0; tbp->trk = settrk; tbp->dsk = setdsk; return(ok); } /************************************************************************/ /* Return the address of a track buffer structure containing the */ /* currently set track of the currently set disk. */ /************************************************************************/ struct tbstr *gettrk() { REG struct tbstr *tbp; REG struct tbstr *ltbp; REG struct tbstr *mtbp; REG WORD imsave; /* Check for disk on-line -- if not, return error */ imsave = setimask(7); if ( ! dskstate[setdsk].ready ) { setimask(imsave); tbp = 0L; return (tbp); } /* Search through buffers to see if the required stuff */ /* is already in a buffer */ tbp = firstbuf; ltbp = 0; mtbp = 0; while (tbp) { if ( (tbp->valid) && (tbp->dsk == setdsk) && (tbp->trk == settrk) ) { if (ltbp) /* found it -- rearrange LRU links */ { ltbp->nextbuf = tbp->nextbuf; tbp->nextbuf = firstbuf; firstbuf = tbp; } setimask(imsave); return ( tbp ); } else { mtbp = ltbp; /* move along to next buffer */ ltbp = tbp; tbp = tbp->nextbuf; } } /* The stuff we need is not in a buffer, we must make a buffer */ /* available, and fill it with the desired track */ if (mtbp) mtbp->nextbuf = 0; /* detach lru buffer */ ltbp->nextbuf = firstbuf; firstbuf = ltbp; setimask(imsave); if (flush1(ltbp) && fill(ltbp)) mtbp = ltbp; /* success */ else mtbp = 0L ; /* failure */ return (mtbp); } /************************************************************************/ /* Bios READ Function -- read one sector */ /************************************************************************/ read() { REG BYTE *p; REG BYTE *q; REG WORD i; REG struct tbstr *tbp; #if MEMDSK if(setdsk != MEMDSK) { #endif tbp = gettrk(); /* locate track buffer with sector */ if ( ! tbp ) return(1); /* failure */ /* locate sector in buffer and copy contents to user area */ p = (tbp->buf) + (setsec << 7); /* multiply by shifting */ #if MEMDSK } else p = memdsk + (((LONG)(settrk) << 12L) + ((LONG)setsec << 7L)); #endif q = setdma; i = 128; do {*q++ = *p++; i -= 1;} while (i); /* this generates good code */ return(0); } /************************************************************************/ /* BIOS WRITE Function -- write one sector */ /************************************************************************/ write(mode) BYTE mode; { REG BYTE *p; REG BYTE *q; REG WORD i; REG struct tbstr *tbp; /* locate track buffer containing sector to be written */ #if MEMDSK if(setdsk != MEMDSK) { #endif tbp = gettrk(); if ( ! tbp ) return (1); /* failure */ /* locate desired sector and do copy the data from the user area */  p = (tbp->buf) + (setsec << 7); /* multiply by shifting */ #if MEMDSK } else { p = memdsk + (((LONG)(settrk) << 12L) + ((LONG)setsec << 7L)); q = setdma; i = 128; do {*p++ = *q++; i -= 1;} while (i); /* this generates good code */ return(0); } #endif q = setdma; i = 128; do {*p++ = *q++; i -= 1;} while (i); /* this generates good code */ tbp->dirty = 1; /* the buffer is now "dirty" */ /* The track must be written if this is a directory write */ if ( mode =?except.o¶d`d."pr$<|HçàNCLßRAX‚ Afr A"gì A#gæ A0mÖpNC @JX"$Ô&9(9p o#Ȳb´c¶b ¸cBJ˜QÈÿâNua–a’aŽaŠa†a‚a~azavaranajafaba^aZaVaRaNaJaFaBa>a:a6a2a.a*a&a"aaaaaa aNqNqBgH瀀 / ¼€ @$o @Xm( @tn @0 yÐÀJf` @(m@0Þüä@ @lLßJ_T@ @oP@?Aùa–0a´Aùa† aAù"avB€NBNs @m,/ f’/P Nh!/1/N`Lß/o\OWÿNs/ fÿh/P Nh!/1/!/!/N`Lß/oÞüWÿNs/BgNsBgpNB`òNu?H@a0?àHa0?èHa0@ @ m02pNBNu Exception $ at user address $. Aborted._tpa_hp¨_tpa_lp¨_initexc¢gouser¢bgetsegÀbsetexcÀbuserrÀspuriousÀtrap0À trap2À"trap3À#endvecÀ0exchndlÂ@|init1‚ init2‚init3‚"evec_adrinit4‚Zdo_init‚rdontinit‚texcept‚excrtn0‚€chkredir‚@dfltexc‚Zusrexc‚¬supexc‚Nnobusexc‚llowexc‚zexcmsg1„print‚prtbyte‚>excmsg2„prtlong‚*excmsg3„"addrexc‚Þprtdone‚(prtword‚4prtnib‚Hlt10‚X filetyps.o¶´`R(Ò#ü#ü #ü#ü #ü#ü#ü#ü"Nu68K SUB_load68k¨_load_tb¡init_tbl¢typ1„typ1ptyp2„typ2p typ3„typ3pnull„ typ4ppgld1pgld2pgld3pgld4"stack.o¶,`Bstack¡@éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé? /************************************************************************/ /* Wait for an ACK from the IPC */ /************************************************************************/ waitack() { REG WORD imsave; REG BYTE work; while (1) { while ( ! intcount ) ; /* wait */ imsave = setimask(7); intcount -= 1; work = (DSKIPC + ACKFMIPC)->byte; if ( (work == ACK) || (work == NAK) ) { (DSKIPC + ACKFMIPC)->byte = 0; setimask(imsave); return(work == ACK); } setimask(imsave); } } /************************************************************************/ /* Acknowledge a message from the IPC */ /************************************************************************/ sendack() { (DSKIPC + MSGFMIPC)->byte = 0; /* clear message flag */ (DSKIPC + ACKTOIPC)->byte = ACK; /* send ACK */ (DSKIPC + INTTOIPC)->byte = 0; /* interrupt IPC */ } /************************************************************************/ /* Send a packet to the IPC */ /************************************************************************/ sendpkt(pktadr, pktsize) REG BYTE *pktadr; REG WORD pktsize; { REG BYTE *iopackp; REG WORD imsave; while ( (DSKIPC+MSGTOIPC)->byte ); /* wait til ready */ (DSKIPC+ACKFMIPC)->byte = 0; (DSKIPC+MSGFMIPC)->byte = 0; iopackp = (DSKIPC+PKTTOIPC); do {*iopackp = *pktadr++; iopackp += 2; pktsize -= 1;} while(pktsize); (DSKIPC+MSGTOIPC)->byte = 0x80; imsave = setimask(7); dskstate[actvdsk].state = ACTIVE; ipcstate = ACTIVE; intcount = 0L; (DSKIPC+INTTOIPC)->byte = 0; setimask(imsave); waitack(); } /************************************************************************/ /* Wait for a Disk Operation to Finish */ /************************************************************************/ WORD dskwait(dsk, stcom, stval) REG WORD dsk; BYTE stcom; WORD stval; { REG WORD imsave; BYTE stpkt[STPKTSZ]; imsave = setimask(7); while ( (! intcount) && dskstate[dsk].ready && (! dskstate[dsk].change) ) { setimask(imsave); imsave = setimask(7); } if ( intcount ) { intcount -= 1; if ( ( (DSKIPC + MSGFMIPC)->byte & 0x80 ) == 0x80 ) { getstpkt(stpkt); setimask(imsave); if ( (stpkt[PKTSTCOM] == stcom) && ( (stpkt+PKTSTVAL)->word == stval ) ) return (1); else return (0); } } setimask(imsave); return(0); } /************************************************************************/ /* Do a Disk Read or Write */ /************************************************************************/ dskxfer(dsk, trk, bufp, cmd) REG WORD dsk, trk, cmd; REG BYTE *bufp; { /* build packet */ REG WORD sectcnt; REG WORD result; #if CTLTYPE LONG bytecnt; /* only needed for FDC */ WORD cheksum; #endif rwpack.dskno = cnvdsk[dsk]; rwpack.iobf = bufp; sectcnt = (dphtab[dsk].dpbp)->spt; rwpack.lsect = trk * (sectcnt >> 1); rwpack.chcmd = cmd; rwpack.numblks = (sectcnt >> 1); #if CTLTYPE cheksum = 0; /* FDC needs checksum */ bytecnt = ((LONG)sectcnt) << 7; while ( bytecnt-- ) cheksum += (~(*bufp++)) & 0xff; rwpack.cksum = cheksum; #endif actvdsk = dsk; dskstate[dsk].change = 0; sendpkt(&rwpack, 21); result = dskwait(dsk, 0x70, 0x0); sendack(); dskstate[dsk].state = IDLE; ipcstate = IDLE; return(result); } #if ! LOADER /************************************************************************/ /* Write one disk buffer */ /************************************************************************/ flush1(tbp) struct tbstr *tbp; { REG WORD ok; if ( tbp->valid && tbp->dirty ) ok = dskxfer(tbp->dsk, tbp->trk, tbp->buf, DSKWRITE); else ok = 1; tbp->dirty = 0; /* even if error, mark not dirty */ tbp->valid &= ok; /* otherwise system has trouble */ /* continuing. */ return(ok); } /************************************************************************/ /* Write all disk buffers */ /******************************@***************************************************************** * * * CP/M-68K Loader BIOS * * Basic Input/Output Subsystem * * For ERG 68000 with Tarbell floppy disk controller * * * ***************************************************************** .globl _bios * declare external entry point _bios: cmpi #nfuncs,d0 bge nogood lsl #2,d0 * multiply bios function by 4 movea.l 6(pc,d0),a0 * get handler address jsr (a0) * call handler nogood: rts biosbase: .dc.l nogood .dc.l nogood .dc.l constat .dc.l conin .dc.l conout .dc.l nogood .dc.l nogood .dc.l nogood .dc.l home .dc.l seldsk .dc.l settrk .dc.l setsec .dc.l setdma .dc.l read .dc.l nogood .dc.l nogood .dc.l sectran .dc.l setdma .dc.l getseg .dc.l nogood .dc.l nogood .dc.l nogood .dc.l setexc nfuncs=(*-biosbase)/4 constat: move.b $ffff01,d0 * get status byte andi.w #2,d0 * data available bit on? beq noton * branch if not moveq.l #$1,d0 * set result to true rts noton: clr.l d0 * set result to false rts conin: bsr constat * see if key pressed tst d0 beq conin * wait until key pressed move.b $ffff00,d0 * get key and.l #$7f,d0 * clear all but low 7 bits rts conout: move.b $ffff01,d0 * get status and.b #$1,d0 * check for transmitter buffer empty beq conout * wait until our port has aged... move.b d1,$ffff00 * and output it rts * and exit * * Disk Handlers for Tarbell 1793 floppy disk controller * maxdsk = 2 * this BIOS supports 2 floppy drives dphlen = 26 * length of disk parameter header iobase = $00fffff8 * Tarbell floppy disk port base address dcmd = iobase * output port for command dstat = iobase * input status port dtrk = iobase+1 * disk track port dsect = iobase+2 * disk sector port ddata = iobase+3 * disk data port dwait = iobase+4 * input port to wait for op finished dcntrl = iobase+4 * output control port for drive selection home: clr.b track rts seldsk: * select disk A clr.b seldrv * select drive A clr.b selcode * select code is 00 for drv 0, $10 for drv 1 move.l #dph0,d0 selrtn: rts settrk: move.b d1,track rts setsec: move.b d1,sector rts sectran: * translate sector in d1 with translate table pointed to by d2 * result in d0 movea.l d2,a0 ext.l d1 move.b #0(a0,d1),d0 ext.l d0 rts setdma: move.l d1,dma rts read: * Read one sector from requested disk, track, sector to dma address * Retry if necessary, return in d0 00 if ok, else non-zero move.b #10,errcnt * set up retry counter rretry: bsr setup ori #$88,d3 * OR read command with head load bit move.b d3,dcmd * output it to FDC rloop: btst #7,dwait beq rdone * if end of read, exit move.b ddata,(a0)+ * else, move next byte of data bra rloop rdone: bsr rstatus * get FDC status bne rerror clr.l d0 rts rerror: bsr errchk * go to error handler subq.b #1,errcnt bne rretry move.l #$ffffffff,d0 rts setup: * common read and write setup code * select disk, set track, set sector were all deferred until now move.b #$d0,dcmd * clear controller, get status move.b curdrv,d3 cmp.b seldrv,d3 bne newdrive * if drive not selected, do it move.b track,d3 cmp.b oldtrk,d3 bne newtrk * if not on right track, do it clr.l d3 * if head already loaded, no head load delay btst #5,dstat * if head unloaded, treat as new disk bne sexit newdrive: move.b selcode,dcntrl * select the drive move.b seldrv,curdrv newtrk: bsr chkseek * seek to correct track if required moveq #4,d3 * force head load delay sexit: move.b sector,dsect * set up sector number move.b track,dtrk * set up track number move.l dma,a0 * dma address to a0 rts errchk: btst.b #4,d7 bne chkseek * if record not found error, reseek rts chkseek: * check for correct track, seek if necessary bsr readid * find out what track we're on beq chks1 * if read id ok, skip restore code restore: * home the drive and reseek to correct track@/************************************************************************/ /* Generic serial port status input status */ /************************************************************************/ portstat(port) REG BYTE *port; { if ( *(port + PORTSTAT) & PORTRDRF) return(0xff); /* input ready */ else return(0x00); /* not ready */ } /************************************************************************/ /* Generic serial port input */ /************************************************************************/ BYTE portin(port) REG BYTE *port; { while ( ! portstat(port)) ; /* wait for input */ return ( *(port + PORTRDR)); /* got some, return it */ } /************************************************************************/ /* Generic serial port output */ /************************************************************************/ portout(port, ch) REG BYTE *port; REG BYTE ch; { while ( ! (*(port + PORTSTAT) & PORTTDRE) ) ; /* wait for ok to send */ *(port + PORTTDR) = ch; /* then send character */ } /************************************************************************/ /* Error procedure for BIOS */ /************************************************************************/ #if ! LOADER bioserr(errmsg) REG BYTE *errmsg; { printstr("\n\rBIOS ERROR -- "); printstr(errmsg); printstr(".\n\r"); } printstr(s) /* used by bioserr */ REG BYTE *s; { while (*s) {portout(PORT1,*s); s += 1; }; } #else bioserr() /* minimal error procedure for loader BIOS */ { l : goto l; } #endif /************************************************************************/ /* Disk I/O Procedures */ /************************************************************************/ EXTERN dskia(); /* external interrupt handler -- calls dskic */ EXTERN setimask(); /* use to set interrupt mask -- returns old mask */ dskic() {  /* Disk Interrupt Handler -- C Language Portion */ REG BYTE workbyte; BYTE stpkt[STPKTSZ]; workbyte = (DSKIPC + ACKFMIPC)->byte; if ( (workbyte == ACK) || (workbyte == NAK) ) { if ( ipcstate == ACTIVE ) intcount += 1; else (DSKIPC + ACKFMIPC)->byte = 0; /* ??? */ } workbyte = (DSKIPC + MSGFMIPC)->byte; if ( workbyte & 0x80 ) { getstpkt(stpkt); if ( stpkt[PKTID] == 0xFF ) { /* unsolicited */ unsolst(stpkt); sendack(); } else { /* solicited */ if ( ipcstate == ACTIVE ) intcount += 1; else sendack(); } } } /* end of dskic */ /************************************************************************/ /* Read status packet from IPC */ /************************************************************************/ getstpkt(stpktp) REG BYTE *stpktp; { REG BYTE *p, *q; REG WORD i; p = stpktp; q = (DSKIPC + PKTFMIPC); for ( i = STPKTSZ; i; i -= 1 ) { *p = *q; p += 1; q += 2; } } /************************************************************************/ /* Handle Unsolicited Status from IPC */ /************************************************************************/ unsolst(stpktp) REG BYTE *stpktp; { REG WORD dev; REG WORD ready; REG struct dskst *dsp; dev = rcnvdsk[ (stpktp+PKTDEV)->byte ]; ready = ((stpktp+PKTSTPRM)->byte & 0x80) == 0x0; dsp = & dskstate[dev]; if ( ( ready && !(dsp->ready) ) || (!ready) && (dsp->ready) ) dsp->change = 1; dsp->ready = ready; #if ! LOADER if ( ! ready ) setinvld(dev); /* Disk is not ready, mark buffers */ #endif } #if ! LOADER /************************************************************************/ /* Mark all buffers for a disk as not valid */ /************************************************************************/ setinvld(dsk) REG WORD dsk; { REG struct tbstr *tbp; tbp = firstbuf; while ( tbp ) { if ( tbp->dsk == dsk ) tbp->valid = 0; tbp = tbp->nextbuf; } } #endif A move.b #$0B,dcmd * restore command to command port rstwait: btst #7,dwait bne rstwait * loop until restore completed btst #2,dstat beq restore * if not at track 0, try again clr.l d3 * track number returned in d3 from readid chks1: move.b d3,dtrk * update track register in FDC move.b track,oldtrk * update oldtrk cmp.b track,d3 * are we at right track? beq chkdone * if yes, exit move.b track,ddata * else, put desired track in data reg of FDC move.b #$18,dcmd * and issue a seek command chks2: btst #7,dwait bne chks2 * loop until seek complete move.b dstat,d3 * read status to clear FDC chkdone: rts readid: * read track id, return track number in d3 move.b #$c4,dcmd * issue read id command move.b dwait,d7 * wait for intrq move.b ddata,d3 * track byte to d3 rid2: btst #7,dwait beq rstatus * wait for intrq move.b ddata,d7 * read another byte bra rid2 * and loop rstatus: move.b dstat,d7 andi.b #$9d,d7 * set condition codes rts getseg: move.l #memrgn,d0 * return address of mem region table rts setexc: andi.l #$ff,d1 * do only for exceptions 0 - 255 lsl #2,d1 * multiply exception number by 4 movea.l d1,a0 move.l (a0),d0 * return old vector value move.l d2,(a0) * insert new vector rts .data seldrv: .dc.b $ff * drive requested by seldsk curdrv: .dc.b $ff * currently selected drive track: .dc.b 0 * track requested by settrk oldtrk: .dc.b 0 * track we were on sector: .dc.w 0 dma: .dc.l 0 selcode: .dc.b 0 * drive select code errcnt: .dc.b 10 * retry counter memrgn: .dc.w 1 * 1 memory region .dc.l $18000 * load the system at 18000 hex .dc.l $8000 * disk parameter headers dph0: .dc.l xlt .dc.w 0 * dummy .dc.w 0 .dc.w 0 .dc.l dirbuf * ptr to directory buffer .dc.l dpb * ptr to disk parameter block .dc.l 0 * ptr to check vector .dc.l 0 * ptr to allocation vector * disk parameter block dpb: .dc.w 26 * sectors per track .dc.b 3 * block shift .dc.b 7 * block mask .dc.b 0 * extent mask .dc.b 0 * dummy fill .dc.w 242 * disk size .dc.w 63 * 64 directory entries .dc.w $c000 * directory mask .dc.w 16 * directory check size .dc.w 2 * track offset * sector translate table xlt: .dc.b 1, 7,13,19 .dc.b 25, 5,11,17 .dc.b 23, 3, 9,15 .dc.b 21, 2, 8,14 .dc.b 20,26, 6,12 .dc.b 18,24, 4,10 .dc.b 16,22 .bss dirbuf: .ds.b 128 * directory buffer .end , 2, 8,14 .dc.b 20,26, 6,12 .dc.b 18,24, 4,10 .dc.b 16,22 .bss dirbuf: .ds.b éééAa address */ /************************************************************************/ /* Track Buffering Definitions and Variables */ /************************************************************************/ #if ! LOADER #define NUMTB 3 /* Number of track buffers -- must be at least 3 */ /* for the algorithms in this BIOS to work properly */ /* Define the track buffer structure */ struct tbstr { struct tbstr *nextbuf; /* form linked list for LRU */ BYTE buf[32*128]; /* big enough for 1/4 hd trk */ WORD dsk; /* disk for this buffer */ WORD trk; /* track for this buffer */ BYTE valid; /* buffer valid flag */ BYTE dirty; /* true if a BIOS write has */ /* put data in this buffer, */ /* but the buffer hasn't been */ /* flushed yet. */ }; struct tbstr *firstbuf; /* head of linked list of track buffers */ struct tbstr *lastbuf; /* tail of ditto */ struct tbstr tbuf[NUMTB]; /* array of track buffers */ #else /* the loader bios uses only 1 track buffer */ BYTE buf1trk[32*128]; /* big enough for 1/4 hd trk */ BYTE bufvalid; WORD buftrk; #endif /************************************************************************/ /* Disk I/O Packets for the UDC and other Disk I/O Variables */ /************************************************************************/ /* Home disk packet */ struct hmpkst { BYTE a1; BYTE a2; BYTE a3; BYTE dskno; BYTE com1; BYTE com2; BYTE a6; BYTE a7; } hmpack = { 2,0, 7,0, 0,0, 3,0 }; /*sw Init by bytes now... */ /* hmpack = { 512, 1792, 0, 768 };*/ /* kludge init by words */ /* Read/write disk packet */ struct rwpkst { BYTE stxchr; BYTE pktid; BYTE pktsize; BYTE dskno; BYTE chcmd; BYTE devcmd; WORD numblks; WORD blksize; LONG iobf; WORD cksum; LONG lsect; BYTE etxchr; BYTE rwpad; }; struct rwpkst rwpack = { 2,0, 21,0, 16,1, 13, 256, 0L, 0, 0L, 3,0 }; /*struct rwpkst rwpack = { 512, 5376, 4097, 13, 256, 0, 0, 0, 0, 0, 768 };*/ #if ! LOADER /* format disk packet */ struct fmtpkst { BYTE fmtstx; BYTE fmtid; BYTE fmtsize; BYTE fmtdskno; BYTE fmtchcmd; BYTE fmtdvcmd; BYTE fmtetx; BYTE fmtpad; }; /*struct fmtpkst fmtpack = { 512, 1792, 0x4002, 0x0300 };*/ struct fmtpkst fmtpack = { 2,0, 7,0, 64,2, 3,0 }; #endif /************************************************************************/ /* Define the number of disks supported and other disk stuff */ /************************************************************************/ #if ! CTLTYPE #define NUMDSKS 4 /* number of disks defined */ #else #define NUMDSKS 2 #endif #if MEMDSK #define NUMDSKS 5 #endif #define MAXDSK (NUMDSKS-1) /* maximum disk number */ #if ! CTLTYPE BYTE cnvdsk[NUMDSKS] = { 4, 5, 0, 1 }; /* convert CP/M dsk# to EXORmacs */ BYTE rcnvdsk[6] = { 2, 3, 0, 0, 0, 1 }; /* and vice versa */ #else BYTE cnvdsk[NUMDSKS] = { 0, 1 }; BYTE rcnvdsk[2] = { 0, 1 }; #endif /* defines for IPC and disk states */ #define IDLE 0 #define ACTIVE 1 WORD ipcstate; /* current IPC state */ WORD actvdsk; /* disk number of currently active disk, if any */ LONG intcount; /* count of interrupts needing to be processed */ struct dskst { WORD state; /* from defines above */ BYTE ready; /* 0 => not ready */ BYTE change; /* 0 => no change */ } dskstate[NUMDSKS]; /************************************************************************/ /* Generic Serial Port I/O Procedures */ /************************************************************************/ /************************************************************************/ /* Port initialization */ /************************************************************************/ portinit(port) REG BYTE *port; { *(port + PORTCTRL) = PORTRSET; /* reset the port */ *(port + PORTCTRL) = PORTINIT; } B***************************************************************** * * * CP/M-68K BIOS * * Basic Input/Output Subsystem * * For ERG 68000 with Tarbell floppy disk controller * * * ***************************************************************** .globl _init * bios initialization entry point .globl _ccp * ccp entry point _init: move.l #traphndl,$8c * set up trap #3 handler clr.l d0 * log on disk A, user 0 rts traphndl: cmpi #nfuncs,d0 bcc trapng lsl #2,d0  * multiply bios function by 4 movea.l 6(pc,d0),a0 * get handler address jsr (a0) * call handler trapng: rte biosbase: .dc.l _init .dc.l wboot .dc.l constat .dc.l conin .dc.l conout .dc.l lstout .dc.l pun .dc.l rdr .dc.l home .dc.l seldsk .dc.l settrk .dc.l setsec .dc.l setdma .dc.l read .dc.l write .dc.l listst .dc.l sectran .dc.l setdma .dc.l getseg .dc.l getiob .dc.l setiob .dc.l flush .dc.l setexc nfuncs=(*-biosbase)/4  wboot: jmp _ccp constat: move.b $ffff01,d0 * get status byte andi.w #2,d0 * data available bit on? beq noton * branch if not moveq.l #$1,d0 * set result to true rts noton: clr.l d0 * set result to false rts conin: bsr constat * see if key pressed tst d0 beq conin * wait until key pressed move.b $ffff00,d0 * get key and.l #$7f,d0 * clear all but low 7 bits cmpi.b #1,d0 beq break rts break: trap $f .dc.w 0 * return to MACSBUG rts conout: move.b $ffff01,d0 * get status and.b #$1,d0 * check for transmitter buffer empty beq conout * wait until our port has aged... move.b d1,$ffff00 * and output it rts * and exit lstout: rts pun: rts rdr: rts listst: move.b #$ff,d0 rts * * Disk Handlers for Tarbell 1793 floppy disk controller * maxdsk = 2 * this BIOS supports 2 floppy drives dphlen = 26 * length of disk parameter header iobase = $00fffff8 * Tarbell floppy disk port base address dcmd = iobase * output port for command dstat = iobase * input status port dtrk = iobase+1 * disk track port dsect = iobase+2 * disk sector port ddata = iobase+3 * disk data port dwait = iobase+4 * input port to wait for op finished dcntrl = iobase+4 * output control port for drive selection home: clr.b track rts seldsk: * select disk given by register d1.b moveq #0,d0 cmp.b #maxdsk,d1 * valid drive number? bpl selrtn * if no, return 0 in d0 move.b d1,seldrv * else, save drive number lsl.b #4,d1 move.b d1,selcode * select code is 00 for drv 0, $10 for drv 1 move.b seldrv,d0 mulu #dphlen,d0 add.l #dph0,d0 * point d0 at correct dph selrtn: rts settrk: move.b d1,track rts setsec: move.b d1,sector rts sectran: * translate sector in d1 with translate table pointed to by d2 * result in d0 movea.l d2,a0 ext.l d1 move.b #0(a0,d1),d0 ext.l d0 rts setdma: move.l d1,dma rts read: * Read one sector from requested disk, track, sector to dma address * Retry if necessary, return in d0 00 if ok, else non-zero move.b #10,errcnt * set up retry counter rretry: bsr setup ori #$88,d3 * OR read command with head load bit move.b d3,dcmd * output it to FDC rloop: btst #7,dwait beq rdone * if end of read, exit move.b ddata,(a0)+ * else, move next byte of data bra rloop rdone: bsr rstatus * get FDC status bne rerror clr.l d0 rts rerror: bsr errchk * go to error handler subq.b #1,errcnt bne rretry move.l #$ffffffff,d0 rts write: * Write one sector to requested disk, track, sector from dma address * Retry if necessary, return in d0 00 if ok, else non-zero move.b #10,errcnt * set up retry counter wretry: bsr setup ori #$a8,d3 * OR write command with head load bit move.b d3,dcmd * output it to FDC wloop: btst #7,dwait beq wdone * if end of read, exit move.b (a0)+,ddata * else, move next byte of data bra wloop wdone: bsr rstatus * get FDC status bne werror clr.l d0 rts werror: bsr errchk * go to error handler subq.b #1,errcnt bne wretry mB*******/ BYTE csv0[16]; BYTE csv1[16]; #if ! CTLTYPE BYTE csv2[256]; BYTE csv3[256]; #endif #if MEMDSK BYTE csv4[16]; #endif /************************************************************************/ /* ALV's */ /************************************************************************/ BYTE alv0[32]; /* (dsm0 / 8) + 1 */ BYTE alv1[32]; /* (dsm1 / 8) + 1 */ #if ! CTLTYPE BYTE alv2[412]; /* (dsm2 / 8) + 1 */ BYTE alv3[412]; /* (dsm2 / 8) + 1 */ #endif #if MEMDSK BYTE alv4[48]; /* (dsm4 / 8) + 1 */ #endif #endif /************************************************************************/ /* Disk Parameter Blocks */ /************************************************************************/ /* The following dpb definitions express the intent of the writer, */ /* unfortunately, due to a compiler bug, these lines cannot be used. */ /* Therefore, the obscure code following them has been inserted. */ /*sw With release 1.2, the structure init bug disappeared, so... */ /************* spt, bsh, blm, exm, jnk, dsm, drm, al0, al1, cks, off */ struct dpb dpb0 = { 26, 3, 7, 0, 0, 242, 63, 0, 0, 16, 2}; #if ! CTLTYPE struct dpb dpb2 = { 32, 5, 31, 1, 0, 3288, 1023, 0, 0, 256, 4}; #endif #if MEMDSK struct dpb dpb3 = { 32, 4, 15, 0, 0, 191, 63, 0, 0, 0, 0}; #endif /************************************************************************/ /* Sector Translate Table for Floppy Disks */ /************************************************************************/ BYTE xlt[26] = { 1, 7, 13, 19, 25, 5, 11, 17, 23, 3, 9, 15, 21, 2, 8, 14, 20, 26, 6, 12, 18, 24, 4, 10, 16, 22 }; /************************************************************************/ /* Disk Parameter Headers */ /* */ /* Four disks are defined : dsk a: diskno=0, (Motorola's #fd04) */ /* if CTLTYPE = 0 : dsk b: diskno=1, (Motorola's #fd05) */ /* : dsk c: diskno=2, (Motorola's #hd00) */ /* : dsk d: diskno=3, (Motorola's #hd01) */ /* */ /* Two disks are defined : dsk a: diskno=0, (Motorola's #fd00) */ /* if CTLTYPE = 1 : dsk b: diskno=1, (Motorola's #fd01) */ /* */ /************************************************************************/ #if ! LOADER /* Disk Parameter Headers */ struct dph dphtab[] = { {&xlt, 0, 0, 0, &dirbuf, &dpb0, &csv0, &alv0}, /*dsk a*/ {&xlt, 0, 0, 0, &dirbuf, &dpb0, &csv1, &alv1}, /*dsk b*/ #if ! CTLTYPE { 0L, 0, 0, 0, &dirbuf, &dpb2, &csv2, &alv2}, /*dsk c*/ { 0L, 0, 0, 0, &dirbuf, &dpb2, &csv3, &alv3}, /*dsk d*/ #endif #if MEMDSK { 0L, 0, 0, 0, &dirbuf, &dpb3, &csv4, &alv4} /*dsk e*/ }; #endif #else #if ! CTLTYPE struct dph dphtab[4] = #else struct dph dphtab[2] = #endif { {&xlt, 0, 0, 0, &dirbuf, &dpb0, 0L, 0L}, /*dsk a*/ {&xlt, 0, 0, 0, &dirbuf, &dpb0, 0L, 0L}, /*dsk b*/ #if ! CTLTYPE { 0L, 0, 0, 0, &dirbuf, &dpb2, 0L, 0L}, /*dsk c*/ { 0L, 0, 0, 0, &dirbuf, &dpb2, 0L, 0L}, /*dsk d*/ #endif }; #endif /************************************************************************/ /* Memory Region Table */ /************************************************************************/ struct mrt { WORD count; LONG tpalow; LONG tpalen; } memtab; /* Initialized in BIOSA.S */ #if MEMDSK BYTE *memdsk; /* Initialized in BIOSA.S */ #endif #if ! LOADER /************************************************************************/ /* IOBYTE */ /************************************************************************/ WORD iobyte; /* The I/O Byte is defined, but not used */ #endif /************************************************************************/ /* Currently Selected Disk Stuff */ /************************************************************************/ WORD settrk, setsec, setdsk; /* Currently set track, sector, disk */ BYTE *setdma; /* Currently set dmCove.l #$ffffffff,d0 rts setup: * common read and write setup code * select disk, set track, set sector were all deferred until now move.b #$d0,dcmd * clear controller, get status move.b curdrv,d3 cmp.b seldrv,d3 bne newdrive * if drive not selected, do it move.b track,d3 cmp.b oldtrk,d3 bne newtrk * if not on right track, do it clr.l d3 * if head already loaded, no head load delay btst #5,dstat * if head unloaded, treat as new disk bne sexit newdrive: move.b selcode,dcntrl * select the drive move.b seldrv,curdrv newtrk: bsr chkseek * seek to correct track if required moveq #4,d3 * force head load delay sexit: move.b sector,dsect * set up sector number move.b track,dtrk * set up track number move.l dma,a0 * dma address to a0 rts errchk: btst.b #4,d7 bne chkseek * if record not found error, reseek rts chkseek: * check for correct track, seek if necessary bsr readid * find out what track we're on beq chks1 * if read id ok, skip restore code restore: * home the drive and reseek to correct track move.b #$0B,dcmd * restore command to command port rstwait: btst #7,dwait bne rstwait * loop until restore completed btst #2,dstat beq restore * if not at track 0, try again clr.l d3 * track number returned in d3 from readid chks1: move.b d3,dtrk * update track register in FDC move.b track,oldtrk * update oldtrk cmp.b track,d3 * are we at right track? beq chkdone * if yes, exit move.b track,ddata * else, put desired track in data reg of FDC move.b #$18,dcmd * and issue a seek command chks2: btst #7,dwait bne chks2 * loop until seek complete move.b dstat,d3 * read status to clear FDC chkdone: rts readid: * read track id, return track number in d3 move.b #$c4,dcmd * issue read id command move.b dwait,d7 * wait for intrq move.b ddata,d3 * track byte to d3 rid2: btst #7,dwait beq rstatus * wait for intrq move.b ddata,d7 * read another byte bra rid2 * and loop rstatus: move.b dstat,d7 andi.b #$9d,d7 * set condition codes rts flush: clr.l d0 * return successful rts getseg: move.l #memrgn,d0 * return address of mem region table rts getiob: rts setiob: rts setexc: andi.l #$ff,d1 * do only for exceptions 0 - 255 cmpi #47,d1 beq noset * this BIOS doesn't set Trap 15 cmpi #9,d1 * or Trace beq noset lsl #2,d1 * multiply exception nmbr by 4 movea.l d1,a0 move.l (a0),d0 * return old vector value move.l d2,(a0) * insert new vector noset: rts  .data seldrv: .dc.b $ff * drive requested by seldsk curdrv: .dc.b $ff * currently selected drive track: .dc.b 0 * track requested by settrk oldtrk: .dc.b 0 * track we were on sector: .dc.w 0 dma: .dc.l 0 selcode: .dc.b 0 * drive select code errcnt: .dc.b 10 * retry counter memrgn: .dc.w 1 * 1 memory region .dc.l $800 * starts at 800 hex .dc.l $17800 * goes until 18000 hex * disk parameter headers dph0: .dc.l xlt .dc.w 0 * dummy .dc.w 0 .dc.w 0 .dc.l dirbuf * ptr to directory buffer .dc.l dpb * ptr to disk parameter block .dc.l ckv0 * ptr to check vector .dc.l alv0 * ptr to allocation vector dph1: .dc.l xlt .dc.w 0 * dummy .dc.w 0 .dc.w 0 .dc.l dirbuf * ptr to directory buffer .dc.l dpb * ptr to disk parameter block .dc.l ckv1 * ptr to check vector .dc.l alv1 * ptr to allocation vector * disk parameter block dpb: .dc.w 26 * sectors per track .dc.b 3 * block shift .dc.b 7 * block mask .dc.b 0 * extent mask .dc.b 0 * dummy fill .dc.w 242 * disk size .dc.w 63 * 64 directory entries .dc.w $c000 * directory mask .dc.w 16 * directory check size .dc.w 2 * track offset * sector translate table xlt: .dc.b 1, 7,13,19 .dc.b 25, 5,11,17 .dc.b 23, 3, 9,15 .dc.b 21, 2, 8,14 .dc.b 20,26, 6,12 .dc.b 18,24, 4,10 .dc.b 16,22 .bss dirbuf: .ds.b 128 * directory buffer ckv0: .ds.b 16 * check vector ckv1: .ds.b 16 alv0: .ds.b 32 * allocation vector alv1: .ds.b 32 .end ectory buffer ckv0: .ds.b 16 * checkC/*=======================================================================*/ /*/---------------------------------------------------------------------\*/ /*| |*/ /*| CP/M-68K(tm) BIOS for the EXORMACS |*/ /*| |*/ /*| Copyright 1983, Digital Research. |*/ /*| |*/ /*| Modified 9/ 7/82 wbt |*/ /*| 10/ 5/82 wbt |*/ /*| 12/15/82 wbt |*/ /*| 12/22/82 wbt |*/ /*| 1/28/83 wbt |*/ /*| 2/05/84 sw V1.2 |*/ /*| |*/ /*\---------------------------------------------------------------------/*/ /*=======================================================================*/ #include "biostype.h" /* defines LOADER : 0-> normal bios, 1->loader bios */ /* also defines CTLTYPE 0 -> Universal Disk Cntrlr */ /* 1 -> Floppy Disk Controller */ /* MEMDSK: 0 -> no memory disk */ /* 4 -> 384K memory disk */ #include "biostyps.h" /* defines portable variable types */ char copyright[] = "Copyright 1983, Digital Research"; struct memb { BYTE byte; }; /* use for peeking and poking memory */ struct memw { WORD word; }; struct meml { LONG lword;}; /************************************************************************/ /* I/O Device Definitions */ /************************************************************************/ /************************************************************************/ /* Define the two serial ports on the DEBUG board */ /************************************************************************/ /* Port Addresses */ #define PORT1 0xFFEE011 /* console port */ #define PORT2 0xFFEE015 /* debug port */ /* Port Offsets */ #define PORTCTRL 0 /* Control Register */ #define PORTSTAT 0 /* Status Register */ #define PORTRDR 2 /* Read Data Register */ #define PORTTDR 2 /* Write Data Register */ /* Port Control Functions */ #define PORTRSET 3 /* Port Reset */ #define PORTINIT 0x11 /* Port Initialize */ /* Port Status Values */  #define PORTRDRF 1 /* Read Data Register Full */ #define PORTTDRE 2 /* Write Data Register Empty */ /************************************************************************/ /* Define Disk I/O Addresses and Related Constants */ /************************************************************************/ #define DSKIPC 0xFF0000 /* IPC Base Address */ #define DSKINTV 0x3FC /* Address of Disk Interrupt Vector */ #define INTTOIPC 0xD /* offsets in mem mapped io area */ #define RSTTOIPC 0xF #define MSGTOIPC 0x101 #define ACKTOIPC 0x103 #define PKTTOIPC 0x105 #define MSGFMIPC 0x181 #define ACKFMIPC 0x183 #define PKTFMIPC 0x185 #define DSKREAD 0x10 /* disk commands */ #define DSKWRITE 0x20 /* Some characters used in disk controller packets */ #define STX 0x02 #define ETX 0x03 #define ACK 0x06 #define NAK 0x15 #define PKTSTX 0x0 /* offsets within a disk packet */ #define PKTID 0x1 #define PKTSZ 0x2 #define PKTDEV 0x3 #define PKTCHCOM 0x4 #define PKTSTCOM 0x5 #define PKTSTVAL 0x6 #define PKTSTPRM 0x8 #define STPKTSZ 0xf /************************************************************************/ /* BIOS Table Definitions */ /************************************************************************/ /* Disk Parameter Block Structure */ struct dpb { WORD spt; BYTE bsh; BYTE blm; BYTE exm; BYTE dpbjunk; WORD dsm; WORD drm; BYTE al0; BYTE al1; WORD cks; WORD off; }; /* Disk Parameter Header Structure */ struct dph { BYTE *xltp; WORD dphscr[3]; BYTE *dirbufp; struct dpb *dpbp; BYTE *csvp; BYTE *alvp; }; /************************************************************************/ /* Directory Buffer for use by the BDOS */ /************************************************************************/ BYTE dirbuf[128]; #if ! LOADER /************************************************************************/ /* CSV's */ /*****************************************************************Dlo68 -r -o cpm.rel -ucpm cpmlib biosa.o bios.o 0:clib ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé lo68 -r -o cpm.rel -ucpm -um68010 cpmlib biosa.o vt52.o bios.o 0:clib éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééDmpi.w #$601a,(a0) bne wrt1 add.l #28,a0 wrt1: move.l a0,bufp * wloop: tst.w count beq exit move.w sect,d1 check for end-of-track cmp.w spt,d1 ble sok move.w #1,sect advance to new track move.w trk,d0 add.w #1,d0 move.w d0,trk cmp.w off,d0 bge oflex sok: move.w #settrk,d0 set the track move.w trk,d1 trap #3 move.w sect,d1 set sector move.w #setsec,d0 trap #3 move.w #isetdma,d0 set up dma address for write move.l bufp,d1 trap #3 move.w #write,d0 and write clr.w d1 trap #3 tst.w d0 check for write error bne wrterx add #1,sect increment sector number sub #1,count add.l #128,bufp bra wloop * exit: move.w #flush,d0 exit location - flush bios buffers trap #3 unlk a6 rts and exit to CCP * erxit: move.l #erstr,d1 miscellaneous errors erx: move.w #prntstr,d0 print error message and exit trap #2 bra exit * selerx: move.l #selstr,d1 disk select error bra erx wrterx: move.l #wrtstr,d1 disk write error bra erx bufoflx: move.l #bufofl,d1 buffer overflow bra erx oflex: move.l #trkofl,d1 bra erx * * .bss * .even * buf: .ds.b bufsize+128 * fcb: .ds.l 1 fcb address spt: .ds.w 1 sectors per track sect: .ds.w 1 current sector trk: .ds.w 1 current track dsk: .ds.w 1 selected disk off: .ds.w 1 1st track of non-boot area count: .ds.w 1 bufp: .ds.l 1 hflag: .ds.b 1 * .data * erstr: .dc.b 'Invalid Command Line',13,10,'$' selstr: .dc.b 'Select Error',13,10,'$' wrtstr: .dc.b 'Write Error',13,10,'$' opnfl: .dc.b 'Cannot Open Source File',13,10,'$' bufofl: .dc.b 'Buffer Overflow',13,10,'$' trkofl: .dc.b 'Too Much Data for System Tracks',13,10,'$' * * .end ,13,10,'$' bufofl: .dc.b 'Buffer Overflow',13,10,'$' trkofl: .dc.b 'Too Much Data for System Tracks',éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé#define LOADER 0 #define CTLTYPE 0 #define MEMDSK 4 éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééE* @(#)ldbiosa.s 1.3 * .text .globl _bios .globl _biosinit .globl _cbios .globl _setimask .globl _cons_out * * * * _bios: link a6,#0 move.l d2,-(a7) move.l d1,-(a7) move.w d0,-(a7) jsr _cbios unlk a6 rts * _setimask: move sr,d0 lsr #8,d0 and.l #7,d0 move sr,d1 ror.w #8,d1 and.w #$fff8,d1 add.w 4(a7),d1 ror.w #8,d1 move d1,sr rts * _cons_out: move.l a6,-(sp) move.l a5,-(sp) lea.l 13(sp),a5 lea.l 1(a5),a6 trap #15 .dc.w 6 move.l (sp)+,a5 move.l (sp)+,a6 rts * .globl _rddat .globl _wrdat * * wihtout considering wait states movep.l makes * the faster loop. however, accounting for wait * states makes the 68010 loop mode faster. * _rddat: move.l 4(a7),a0 move.w #127,d0 move.l #$f1c0d9,a1 rdlp: move.b (a1),(a0)+ dbf d0,rdlp rts * * _wrdat move.l 4(a7),a0 move.w #127,d0 move.l #$f1c0d9,a1 wrlp: move.b (a0)+,(a1) dbf d0,wrlp rts * .globl _no_device * _no_device: move.l 4(sp),a0 move.l 8,-(sp) move.l #ndberr,8 move.b (a0),d0 moveq.l #0,d0 move.l (sp)+,8 rts ndberr: moveq.l #1,d0 add.l #58,sp move.l (sp)+,8 rts .end  move.b (a0),d0 moveq.l #0,d0 move.l (sp)+,8 rts ndberr: moveq.l #1,d0 add.l #58,sp move.l (sp)+,8 rts .éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééÿeldrif.o¶`2~OùB€N¹pr$<,N¹| Où`W Ns_bios¨_bios1¨_dirscan¨_seqread¨_ldcpm¨_startld¢ldr¢stackprivexc‚,&cpmldr.o¶¸`À¾ NVHç*n`H€>€?<N¹TJfêJŸLß N^NuNVHç>.0`".¼"aºN¹.¼0a¬`.¼Ia¢`J@gÚ°|gâ°|gæ.¼_aˆN¹JŸLßÀN^NuNVHç*n.¼Bg?<N¹X.Bg?<N¹X°|ÿm>¼aÿjB- .Bg?<N¹XJ@g>¼aÿJ&| S`fJkf>¼aÿ0(k.+Þ«>¼d/ /<N¹PÙüdž¼d`8.ŒBg?<N¹X.Bg?<N¹XJ@g>¼aþÖÙü€ž¼€J‡nÄ +JŸLß8€N^NuNVÿøBW?<N¹TJ@gBWaþœ.¼aþì-@ÿü.¼gaþV.¼ŽaþL nÿüNN^NuCPM SYS Boot error. Open or Read error on Bad file format on CPM.SYS CP/M-68K(tm) Version 1.2 03/20/84 Copyright (c) 1984 Digital Research, Inc. _buffer¨€_moveˆ_startldˆ__bdosˆ_cpmfcb¤_pstring¢~~pstrin‚~pÐ L4‚ L3‚L2‚$L1‚$_badload¢.~~badloa‚.~errtypeÐ~iÐL7‚`L8‚>L9„"L10‚LL11„0L6‚pL12‚VL13„IL14„_L5‚~_load¢ˆ~~load‚ˆ~fcbpÐ ~pÐ ~hpÐ ~lengthÐL16‚ÆL17‚æL10000‚øL18‚L21‚fL20‚.L22‚ZL19‚jL15‚n_ldcpm¢x~~ldcpm‚x~gocpmÀÿÿÿüL24‚”L25„gL26„ŽL23‚¼ E .text .globl _bios .globl _biosinit .globl _cbios .globl _dskia .globl _dskic .globl _setimask * * * * _bios: link a6,#0 move.l d2,-(a7) move.l d1,-(a7) move.w d0,-(a7) move #$2000,sr lea _dskia,a0 move.l a0,$3fc jsr _cbios unlk a6 rts * _dskia: link a6,#0 movem.l d0-d7/a0-a5,-(a7) jsr _dskic movem.l (a7)+,d0-d7/a0-a5 unlk a6 rte * _setimask: move sr,d0 lsr #8,d0 and.l #7,d0 move sr,d1 ror.w #8,d1 and.w #$fff8,d1 add.w 4(a7),d1 ror.w #8,d1 move d1,sr rts * .end #8,d0 and.l #7,d0 move sr,d1 ror.w #8,d1 and.w #$fff8,d1 add.w 4(a7),d1 ror.w #8,d1 moéééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé********************************************************* * * * Program to Write Boot Tracks for CP/M-68K (tm) * * * * Copyright Digital Research 1982 * * * ********************************************************* * * * prntstr = 9 BDOS Functions dseldsk = 14 open = 15 readseq = 20 dsetdma = 26 * seldsk = 9 BIOS Functions settrk = 10 setsec = 11 isetdma = 12 write = 14 sectran = 16 flush = 21 * bufcnt = $80 bufsize = $80*bufcnt * .text * start: link a6,#0  move.l 8(a6),a0 base page address lea $5c(a0),a1 move.l a1,fcb clr.b hflag add #$81,a0 first character of command tail scan: cmpi.b #$20,(a0)+ skip over blanks beq scan sub.l #1,a0 scan1: tst.b (a0) beq erxit cmpi.b #$2d,(a0)+ check for -H flag bne nohyph cmpi.b #$48,(a0)+ bne erxit tst.b hflag bne erxit move.b #$ff,hflag sub.l #$24,fcb change to 2nd default fcb bra scan nohyph: cmpi.b #$20,(a0) bne scan1 scan2: cmpi.b #$20,(a0)+ beq scan2 cmpi.b #$61,-(a0) get disk letter blt upper upshift sub #$20,(a0) upper: cmpi.b #$41,(a0) compare with range A - P blt erxit cmpi.b #$50,(a0) bgt erxit move.b (a0),d0 ext.w d0 put disk letter into range 0 - 15 sub.w #$41,d0 move.w d0,dsk * * open file to copy * move.w #open,d0 move.l fcb,d1 trap #2 cmpi.w #$00ff,d0 bne openok move.l #opnfl,d1 jmp erx openok: move.l fcb,a0 clr.b 32(a0) * * read * move.l #buf,d2 clr.w count rloop: move.w #dsetdma,d0 move.l d2,d1 trap #2 move.w #readseq,d0 move.l fcb,d1 trap #2 tst.w d0 bne wrtout add.l #128,d2 add.w #1,count cmpi.w #bufcnt,count bgt bufoflx bra rloop * * write * wrtout: move.w #seldsk,d0 select the disk move.w dsk,d1 clr.b d2 trap #3 tst.l d0 check for select error beq selerx move.l d0,a0 move.l 14(a0),a0 get DPB address move.w (a0),spt get sectors per track move.w 14(a0),off get offset clr.w trk start at trk 0 move.w #1,sect start at sector 1 lea buf,a0 tst.b hflag bne wrt1 cFbdosif.o¶(`Np$/` 4/`"/`2/0/HçN¹LßxøNu/áH/Nu/ o /€ï 0ÀH@0€ _Nu_bios¨_bios1¢_bios2¢_bios3¢ _bios4¢_bios5¢_swap¢*_udiv¢6dskutil.o¶4`ÎzNVÿêpH€@ÿîB@H€@ÿï-nÿò-n ÿø-yÿü.Ž—ÿÿÿîN¹N^NuNVÿü.¹0n/a´XN^NuNVHç *n (yBG`RB@0À|f<äN>†aÀJ@gpÿ`B?B@0À|ëHH@B@H@й// nNßü J@g B@0À|` RG¾lc¨0<ÿJŸLß0ÀN^Nu_gblsˆ_do_phioˆ_rdsec¢~~rdsec‚~secnumÀ~dmaÀ ~rwpktÀÿÿÿîL1‚6_dir_rd¢:~~dir_rd‚:~secnumÀL2‚N_dirscan¢R~~dirsca‚R~fcbpÐ ~funcpÀ~iÐ~dparmpÐ ~dirsecÐL6‚ºL7‚hL8‚‚L9‚‚L3‚ÄL10‚¸L5‚¸L4‚À fileio.o¶L`dhNVÿîHç. H€À|ÿ°|opÿ`FB.ÿîGÿñB.ÿï.Ž—ÿÿÿîN¹#îÿüfpÿ` y#è  y#èB@JŸLß ÀN^NuNVHç *n(n >.`Ý0SGJ@föJŸLß0€N^NuNVHç *n(n ~  ?H€H³@À|gJgB@`LSGJGfÜJ.g> ?g H€H³@"y)HFAÀAgB@`TTŒH€H³@À|?gB@`pJŸLß0ÀN^NuNVHç*n>¼/. / aÿbPg- >¼ / /. aÿ PG H€JŸLß ÀN^Nu_gblsˆ_do_phioˆ_seldisk¢~~seldis‚~dsknumÐ~selpktÀÿÿÿî~pÐ ~iÐL2‚L1‚dL3‚F_move¢n~~move‚n~p1Ð ~p2Ð ~iÐL7‚†L6‚„L5‚ŽL4‚Ž_match¢˜~~match‚˜~p1Ð ~p2Ð ~chk_extÀ~iÐ~tempÐL11‚ªL12‚ÈL8‚L10‚ÊL9‚ÎL13‚L14‚úL15‚_openfil¢~~openfi‚~fcbpÐ ~dirpÀ ~dirindxÀ~fcb_extÐ~rtnÐL17‚VL16‚Z bdosread.o¶ (`¢ÆNVHç *n(y,H†- H‡,H€Î@pFág0- HÂ|ÿ4äaÐAJŸLß0ÀN^NuNVHç*n>. Jng0GÑÈ>µˆN¹` ` 5pH€À|ÿJŸLß €N^NuNVÿüHç*yB€0.-HHÁã -H. H‚ÂBHÁÐ-@ÿü.¹ /.ÿüN¹XJŸLß N^NuNVHç*n-Î<?- R¼< mBR¾<@mp``H€-HÂ|?°Af*H€- H³@"y)HFAÀAÀ|fF B@`$GF ./<N¹X°|ÿep`B@JŸLß ÀN^NuNVHç *n~Ií J$fSGJGfö y hÿcâOp"y)HAàoB@0"y)HFA- H‚ÂBÂ|€AJŸLß0€N^NuNVHç*n.aˆ>- H€¾@f-H€À|ÿ``- H€¾@c0<€``B@JŸLß €N^NuNVHç*n y8(È|ÿ -€ f.aþ’J@gp`LB- .a€- HÂ|ÿ°Abp`2.aý–<>„?/ aýÒ\>JGfp`- H€>€?aýôTR- JŸLß ðN^Nu_gblsˆ_swapˆ_dirscanˆ_openfilˆ_rdsecˆ_blkindx¢~~blkind‚~fcbpÐ ~dparmpÐ ~iÐ~blkshfÐL1‚>_blknum¢H~~blknum‚H~fcbpÐ ~indexÐ~wrdfcbÀL3‚pL2‚zL4‚z_do_io¢„~~do_io‚„~blockÀ~rcrdÀ ~lsecÀÿÿÿü~dparmpÐ L5‚Ê_new_ext¢Ô~~new_ex‚Ô~fcbpÐ ~modÐ~extÐL7‚øL8‚L6‚bL9‚>L10‚>L11‚`_calcext¢l~~calcex‚l~fcbpFant to format disk ' msgdskx:.dc.b 'x ? $' * .even buf: .dc.b 126,0 .ds.b 126 * xlt: .ds.l 1 spt: .ds.w 1 drm: .ds.w 1 sect: .ds.w 1 trk: .ds.w 1 dsk: .ds.w 1 count: .ds.w 1 * fmtstr: .dc.b 'Formatting Error',13,10,'$' erstr: .dc.b 'Error',13,10,'$' selstr: .dc.b 'Select Error',13,10,'$' wrtstr: .dc.b 'Write Error',13,10,'$' * copyrt: .dc.b 'CP/M-68K(tm), Version 1.2, Copyright 1984, Digital Research ' serial: .dc.b 'XXXX-0000-654321' * .end ééé#define LOADER 1 #define CTLTYPE 0 #define MEMDSK 0 éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééGÐ ~iÐ~pÐ L15‚~L13‚ˆL14‚„L16‚˜L12‚Ê_get_rc¢Ô~~get_rc‚Ô~fcbpÐ ~extÐL18‚þL17‚L19‚L20‚L21‚_seqread¢~~seqrea‚~fcbpÐ ~blockÐ~indexÐ~parmÐ~bigfileÐL23‚PL24‚LL22‚˜L25‚fL26‚„ $bdosmain.o¶À`’ŠlNVHç>.<. *n 0`XB@0À|ÿ>€?<N¹T`V>†N¹`NBB- B-./<N¹X`2B.N¹`&#Í `pÿ``HÀ |r°˜WÉÿü hNÐB@JŸLß ÀN^Nu8x0:VbjCP/M-68K(tm), Version 1.1, Copyright (c) 1983, Digital ResearchXXXX-0000-654321_gbls¨_bios2ˆ_dirscanˆ_seqreadˆ_openfilˆ_seldiskˆ_copyrt¤L1„8_serial¤L2„x__bdos¢~~_bdos‚~funcÐ~infoÐ~infopÐ L5‚pL6‚L4‚†L7‚0L3‚ˆL8‚:L9‚VL10‚bL11‚jL12„L13‚z ,$iosys.o¶Œ`ÀîNVÿüHç*nH€`–-H€>€-H€??< N¹X+@`~(m&l.ŽY—?/-N¹\>®ÿüB@0+ÑW?< N¹T.”?.ÿþ?<N¹X>€?< N¹T.­ ?< N¹T>¼ N¹`` J@gÿh°|g„B@JŸLß8N^Nu_udivˆ_bios1ˆ_bios2ˆ_bios3ˆ_bios4ˆ_bios5ˆ_do_phio¢~~do_phi‚~iopÐ ~hdrpÐ ~dparmpÐ ~iopdivÀÿÿÿüL3‚¨L4‚L2‚´L5‚8L1‚¶$, ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééG`~<NV nÐü  gú amP Am6 Pn.À H€|A3À20< "<~NB0< "<¦NB9¨ Yg yfäB€B0< 292BNCJ€gì @#Ð& h3Ð*3è,3è0By.By40<?292NCJ@f¤Aù¦ <åååå2< ÀQÉÿü0< "<¦NC094°y,nZ29.²y*m By.Ry00< 290NC0<29.$9&NC20< NC0<BANCJ@f6Ry.Ry4`˜0<NCN^Nu"<I0< NB`è"<6`ð"<Q`è"<``àDo you really want to format disk x ? $~Formatting Error $Error $Select Error $Write Error $CP/M-68K(tm), Version 1.2, Copyright 1984, Digital Research XXXX-0000-654321é********************************************************* * * * Disk Formatting Program for CP/M-68K (tm) * * * * Copyright Digital Research 1982 * * * ********************************************************* * * * prntstr = 9 readbuf = 10 * seldsk = 9 settrk = 10 setsec = 11 setdma = 12 write = 14 sectran = 16 flush = 21 format = 63 * .text * start: link a6,#0 move.l 8(a6),a0 add #$81,a0 scan: cmpi.b #$20,(a0)+ beq scan cmpi.b #$61,-(a0) blt upper sub #$20,(a0) upper: cmpi.b #$41,(a0) blt erxit cmpi.b #$50,(a0) bgt erxit query: move.b (a0),d0 move.b d0,msgdskx ext.w d0 sub.w #$41,d0 move.w d0,dsk move.w #prntstr,d0 move.l #msgdsk,d1 trap #2 move.w #readbuf,d0 move.l #buf,d1 trap #2 move.b buf+2,d0 cmpi.b #$59,d0 beq doit cmpi.b #$79,d0 bne exit * doit: clr.l d0 clr.l d1 * * Select the disk to format * move.w #seldsk,d0 move.w dsk,d1 clr.b d2 trap #3 tst.l d0 beq selerx move.l d0,a0 move.l (a0),xlt move.l 14(a0),a0 move.w (a0),spt move.w 8(a0),drm move.w 14(a0),trk clr.w sect clr.w count * * Call the format function * move.w #format,d0 move.w dsk,d1 trap #3 tst.w d0 bne fmterx lea buf,a0 move.l #$e5e5e5e5,d0 move.w #31,d1 bloop: move.l d0,(a0)+ dbf d1,bloop move.w #setdma,d0 move.l #buf,d1 trap #3 * dloop: move.w count,d0 cmp.w drm,d0 bgt exit move.w sect,d1 cmp.w spt,d1 blt sok clr.w sect add.w #1,trk sok: move.w #settrk,d0 move.w trk,d1 trap #3 move.w #sectran,d0 move.w sect,d1 move.l xlt,d2 trap #3 move.w d0,d1 move.w #setsec,d0 trap #3 move.w #write,d0 clr.w d1 trap #3 tst.w d0 bne wrterx add #1,sect add #1,count bra dloop * exit: move.w #flush,d0 trap #3 unlk a6 rts * erxit: move.l #erstr,d1 erx: move.w #prntstr,d0 trap #2 bra exit * fmterx: move.l #fmtstr,d1 bra erx selerx: move.l #selstr,d1 bra erx wrterx: move.l #wrtstr,d1 bra erx * .data msgdsk: .dc.b 'Do you really wH/* @(#)loadbios.h 1.3 */ #define LOADER 1 #define CTLTYPE 0 #define MEMDSK 0 #define DISKB 0 #define DISKC 5 #define DISKD 0 #define NO_ASM_SUPPORT 0 LOADER 1 #define CTLTYPE 0 #define MEMDSK 0 #define DISKB 0 #define DISKC 5 #define DISééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééépip biostype.h=loadbios.h cp68 bios.c $1bios.i c068 $1bios.i $1bios.1 $1bios.2 $1bios.3 era $1bios.i c168 $1bios.1 $1bios.2 bios.s era $1bios.1 era $1bios.2 as68 -u -l -s 0: bios.s era bios.s pip ldbios.o=bios.o as68 -u -l -s 0: booter.s as68 -u -l -s 0: ldbiosa.s éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééHééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé` BAù‚#ÈŒAù0ü ü üÿÿôø/9AùÑü#È#üHJX`üßü:#ß‘ü‘ü r â¨3ÀFü N¹B€NuB€Nù//?N¹Þü Ns@ÀàHÀ¼@ÁàYÂ|ÿøÒoàYFÁNu o0<"|ñÀÙÑQÈÿüNu o0<"|ñÀÙ˜QÈÿüNu o/9#üüp#ßNupßü:#ßNu_flush¨_ccp¨_end¨cpm¨_dpb3¨_biosini¨_memtab¨_memdsk¨_cbios¨_init¢_wboot¢z_setimas¢”trap3ÀŒbuserrÀentry‚‚quit‚Hloop‚D_rddat¢°_wrdat¢Ærdlp‚¾wrlp‚Ô_no_devi¢Ündber‚ü4<$, DééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééIlo68 -s -tB00 -uldr -o cpmldr.sys booter.o ldrlib ldbiosa.o ldbios.o 0:clib ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé/* @(#)normbios.h 1.5 */ #define LOADER 0 #define CTLTYPE 0 #define MEMDSK 4 #define DISKB 0 #define DISKC 5 #define DISKD 0 #define NO_ASM_SUPPORT 0 /* * the preprocessor variable MVME410 controls assignment * of the lst: device in bios.c. if the variable is defined * == 1 code is included to support an mvme-410 parallel * port card, if == 0 the lst: device is assumed to be * the second port of the mvme-400 serial card. * * the initialization sequence of the mvme-410 will not prevent * booting if the code is included and the card is not installed. * factory default settings are assumed. */ #define MVME410 1 ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééIÿÿÿú~pscntÀÿÿÿø~scntÀÿÿÿö~bpÀÿÿÿò~errorÀÿÿÿðL40‚,L42‚ÜL43‚2L41‚îL44‚LL47‚ŽL46‚hL48‚ŽL45‚œL49‚®L39‚òL10001‚L38‚L50‚ L37‚L51‚_slctdsk¢~~slctds‚~dskÐ~loggedÀ ~dphpÐ ~psnÐL53‚>L55‚"L56‚PL57‚PL58‚ŠL59‚´L61‚ L62‚âL60‚L63‚ìL64‚L54‚>L65‚L66‚L67‚L52‚@_homedsk¢J~~homeds‚JL71‚pL70‚pL69‚~L68‚~_initvds¢‚~~initvd‚‚~iÐL72‚L75‚ÀL76‚žL74‚¾L73‚ÆL79‚ÚL78‚ÚL77‚èL82‚þL81‚þL80‚ _read¢~~read‚~pÐ ~qÐ ~iÐL10002‚.&. <.:.8.0`&0GÑÈÑÈÑü ƒ`,0GÑÈÑÈÑü ¼``S@°| bå@0@ÑüÔ PNо|l¸|g¸| fJƒfz|ÄñÀÑ |Ì0pH€ë@HÀ"tä¡€ÀñÀÑ à€ÀñÀÑÃñÀÑÆñÀÑ02GÓÉÓü2€AÀñÀÑJŸLßøN^NuNVÿþHç>.<. :. 8.BnÿþüÀñÀÑ |Ì0pH€ë@ÀñÀÑ0ë@2àA€AÀñÀÑÅñÀÑÄñÀÑ0.ÿþÀñÀÑ0GÑÈÑÈÑü ¼JŸLßðN^NuNVÿü9ñÀÓH€À|€fòùñÀÑùñÀÑ9H€ê@À|HÀмР@Ð9ñÀÑH€3À09á@9ñÀÑHÐA3ÀùñÀÑ9H€À|À9H€ê@ÀùñÀÑùñÀÑ ùñÀÑ ùñÀÑ ùñÀÑ N^NuNVHç>.<. 0Áüм` @*h¾|m02HÁ4GÕÊÕü(ƒÒÁÁ`NzP»ü0f:< 0HÀü¼@l02HÁ4GÕÊÕü(ƒÒÁÁã@HÀ`0Fã@S@2HÁ4GÕÊÕü(ƒÒÁÁJŸLß àN^NuNVÿøHç>.*. <.*n>¼?<4?/?aý,ßü `Ú`9ñÀÓH€À|g.N¹Ûü€9ñÀÓH€À|€fÖaþ< 9g9H€`˜`9 H€á@9 HÐAHÀ-@ÿü мÿÿÿ-@ÿø9 H€"nÿøÓîÿü±9 H€"nÿøÓîÿüR‰±J9g6>¼?<49H€? 2HÁÐ9HHÁ/?aüVßü `B@``ÿ&JŸLß àN^NuNVÿðHç>.<. *n :.>†?aþ2T-@ÿú0Áü @"|` p˜=Pÿö0.ÿöHÀ2GÓÉÓü(Ñ=@ÿø-Mÿò=| ÿþ0`¬.?.ÿø/.ÿú?aþvP=@ÿð`¤>…?<4?.ÿø/.ÿú?aû¬ßü `&9ñÀÓH€À|gJnÿög.N¹Ûü€Snÿö9ñÀÓH€À|€fÌaü¶9H€=@ÿð`@>…?<4?.ÿø/.ÿú?aûJßü aüŠ9H€=@ÿð``°|gÿP°| gÿb`À*nÿòJnÿðgSnÿþfÿ.JnÿðgB@``pJŸLß àN^NuNVHç. H€3ÀH€Áü*@Ûü`. føH€`ÔH€0@ÑÈÑüJPf(H€0@ÑÈÑÈÑü 〠€H€0@ÑÈÑü0¼€/<H€0@ÑÈÑÈ"|/0˜N¹P,J†f|é†>¼ ?<4?</H€?aú>ßü aû~9H€`*+|0`,+|@H€0@ÑÈÑüBP`›Í`` J@gÒ°|gÖ`î`$`"B€` `J@gÿ*°|gÿ"°|gä°|gÞ`Þ JŸLß ÀN^NuNVÿüBy>¼?<4BgB§?9aù¢ßü 9ñÀÓH€À|€fòN^NuNVHçJyÈf‚B9ñÀÓBG`"0GÑÈÑü0¼€0GÑÈÑÈÑü ¼RG¾|mØ>¼(?<O?<Bgaú\9ñÀÓH€À|€fò>¼ÿ?<1?<?<aùà\9ñÀÓH€À|€fò3üÈJŸL߀N^NuNVHç J9g09°yg$>¼/<?9?9aü|PJ@fp`8ü3ù09ï@HÀ*@Ûü(y><€ÝSGJGføB@JŸLß0€N^NuNVHç>.*n g 5pH€``0R@JŸLß €N^NuNVHç0.å@HÀ*@Ûùü. n/g nNg*® JŸLß €N^NuNVÿüaN^NuNVHçB9aþ`JŸL߀N^NuNVHç>.,. *.0`”a¾`¢ H€>€N¹`’aýê`Š0yÊ"|Ð0˜H€HÀ, H€>€ H€?aüŽT`^3Æ`V S@3À`J#Æ`BaþpHÀ`:.… ?aþæTHÀ`*.… ?aÿT`B€```°|bòå@0@Ñü PNÐJŸLßàN^NuCopyright 1984, Motorola Inc.BIOS 2.15 9À  ™À  ¿ÿÿ00P:ffff*f***HÒÒÒNÒÒÒ^f˜¤¬ÒÒ´ÒÒÒÒÒÄ_memtab¨ _dirbuf¨€_settrk¨_setsec¨_setdsk¨_setdma¨_tkflg¨_lstpsn¨_buf1trk¨_bufvali¨_buftrk¨_sns¨_wrdatˆldivˆ_cons_ouˆ_rddatˆ_copyrig¤_biosrev¤_bioserr¢~~bioser‚L4‚L3‚_lperp¤(_dpb96¤0_dpb48¤@_dpbwdc¤P_dphtab¤`_config¤È_bootdsk¤Ê_cnvdsk¤Ì_rcnvdsk¤Ð_sndcmd¢ ~~sndcmd‚ ~dskÐ~nÐ~ctlÐ~cmdÐ~psnÐL7‚PL8‚*L9‚*L10‚*L11‚*L6‚fL12‚:L13„ÔL14‚€L10000‚xL15‚€L5‚Ð_sndcnf¢Ú~~sndcnf‚Ú~dskÐ~mxhdÐ~mxclÐ~prcmpÐ~zeroÀÿÿÿþL16‚J_gtsns¢T~~gtsns‚TL20‚XL19‚XL18‚fL17‚_tk2psn¢ ~~tk2psn‚ ~dskÐ~trkÐ~ppÐ ~ttrksÐL22‚^L21‚¬L23‚lL24‚’_rddsk¢¶~~rddsk‚¶~dskÐ~pscntÐ~psnÐ~bufpÐ ~erofstÀÿÿÿü~bpÀÿÿÿøL28‚ÂL27‚êL31‚L30‚ìL32‚L29‚L33‚4L25‚ÆL34‚ÂL35‚¾L36‚ÂL26‚Æ_dskxfer¢Ð~~dskxfe‚Ð~dskÐ~trkÐ~cmdÐ~bufpÐ ~rcntÀÿÿÿþ~psnÀKct start at sector 1 lea buf,a0 tst.b hflag bne wrt1 cmpi.w #$601a,(a0) bne wrt1 add.l #28,a0 wrt1: move.l a0,bufp move.w #512,$11e(a0) assume fd sector size in config tab cmp.w #2,dsk check for floppy disk slt fdflag blt wloop move.w #256,$11e(a0) set hd sector size in config tab * wloop: tst.w count beq exit move.w sect,d1 check for end-of-track * tst.b fdflag special check for trk 0 of fd beq wl1 wl3: tst.w trk bne wl1 cmp.w #16,d1 ble sok bra wl2 * wl1: cmp.w spt,d1 ble sok wl2: move.w #1,sect advance to new track move.w trk,d0 add.w #1,d0 tst.b fdflag special check for fd beq wl4 neg.w d0 add.w #160,d0 cmp.w #80,d0 bge wl4 addq.w #1,d0 wl4: move.w d0,trk cmp.w #80,d0 assume 2nd side fd writes are ok bge sok cmp.w off,d0 bge oflex sok: move.w #settrk,d0 set the track move.w trk,d1 trap #3 move.w sect,d1 set sector move.w #setsec,d0 trap #3 move.w #isetdma,d0 set up dma address for write move.l bufp,d1 trap #3 move.w #write,d0 and write clr.w d1 trap #3 tst.w d0 check for write error bne wrterx add #1,sect increment sector number sub #1,count add.l #128,bufp bra wloop * exit: move.w #flush,d0 exit location - flush bios buffers trap #3 unlk a6 rts and exit to CCP * erxit: move.l #erstr,d1 miscellaneous errors erx: move.w #prntstr,d0 print error message and exit trap #2 bra exit * selerx: move.l #selstr,d1 disk select error bra erx wrterx: move.l #wrtstr,d1 disk write error bra erx bufoflx: move.l #bufofl,d1 buffer overflow bra erx oflex: move.l #trkofl,d1 bra erx * * .bss * .even * buf: .ds.b bufsize+128 * fcb: .ds.l 1 fcb address spt: .ds.w 1 sectors per track sect: .ds.w 1 current sector trk: .ds.w 1 current track dsk: .ds.w 1 selected disk off: .ds.w 1 1st track of non-boot area count: .ds.w 1 bufp: .ds.l 1 hflag: .ds.b 1 fdflag: .ds.b 1 * .data * erstr: .dc.b 'Invalid Command Line',13,10,'$' selstr: .dc.b 'Select Error',13,10,'$' wrtstr: .dc.b 'Write Error',13,10,'$' opnfl: .dc.b 'Cannot Open Source File',13,10,'$' bufofl: .dc.b 'Buffer Overflow',13,10,'$' trkofl: .dc.b 'Too Much Data for System Tracks',13,10,'$' * * .end ,13,10,'$' bufofl: .dc.b 'Buffer Overflow',13,1éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééKééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé`¢šNV//?N¹N^Nu@ÀàHÀ¼@ÁàYÂ|ÿøÒoàYFÁNu// Kï MíNO*_,_Nu o0<"|ñÀÙÑQÈÿüNu o0<"|ñÀÙ˜QÈÿüNu o/9#ü’p#ßNupßü:#ßNu_biosini¨_cbios¨_bios¢_setimas¢_cons_ou¢0_rddat¢F_wrdat¢\rdlp‚Twrlp‚j_no_devi¢rndberr‚’ éééL`N‚@–NV nCè\#ÉCPB9CdÐü  gúSˆJgø -f& HfêJ9CdfàüÿCd¹$CP`Æ  fÈ  gú amP Am® Pn¦H€|A3ÀCZ0<"9CPNB @ÿf "<‚Nù& yCPB( $<ÐByC^0<"NB0<"9CPNBJ@fÔ¼€RyC^ y€C^nR`Î0< 29CZBNCJ€g, @ h3ÐCT3èC\ByCX3üCVAùÐJ9Cdf P`fÑü#ÈC`1| yCZ]ùCem1|JyC^g¬29CVJ9CegJyCXf²|oD`²yCTo:3üCV09CXR@J9CegD@Ð| °|PlR@3ÀCX°|Pl°yC\lz0< 29CXNC29CV0< NC0< "9C`NC0<BANCJ@f:RyCVSyC^¹€C``ÿN0<NCN^Nu"<N0< NB`è"<e`ð"<t`è"<œ`à"<®`ØInvalid Command Line $Select Error $Write Error $Cannot Open Source File $Buffer Overflow $Too Much Data for System Tracks $éreloc -b$1 cpm.rel cpm.sys eloc -b$1 cpm.rel cpm.sys éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééL`0*CP/M 9/30CP/M-68K of 9/30/82 0020¤„-€N¹JfðJŸLß N^NuNVHç?>.&. <.:.8.0`&0GÑÈÑÈÑü ƒ`,0GÑÈÑÈÑü ¼``S@°| bå@0@Ñü PNо|l¸|g¸| fJƒfz|ÄñÀÑ |¶0pH€ë@HÀ"tä¡€ÀñÀÑ à€ÀñÀÑÃñÀÑÆñÀÑ02GÓÉÓü2€AÀñÀÑJŸLßøN^NuNVÿþHç>.<. :. 8.BnÿþüÀñÀÑ |¶0pH€ë@ÀñÀÑ0ë@2àA€AÀñÀÑÅñÀÑÄñÀÑ0.ÿþÀñÀÑ0GÑÈÑÈÑü ¼JŸLßðN^NuNVÿü9ñÀÓH€À|€fòùñÀÑùñÀÑ9H€ê@À|HÀм¼ @Ð9ñÀÑH€3À09á@9ñÀÑHÐA3ÀùñÀÑ9H€À|À9H€ê@ÀùñÀÑùñÀÑ ùñÀÑ ùñÀÑ ùñÀÑ N^NuNVHç>.<. 0Áüм2 @*h¾|m02HÁ4GÕÊÕüèƒÒÁÁ`NzP»üf:< 0HÀü¼@l02HÁ4GÕÊÕüèƒÒÁÁã@HÀ`0Fã@S@2HÁ4GÕÊÕüèƒÒÁÁJŸLß àN^NuNVÿøHç>.*. <.*n>¼?<4?/?aý,ßü `Ú`9ñÀÓH€À|g.N¹Ûü€9ñÀÓH€À|€fÖaþ< 9g9H€`˜`9 H€á@9 HÐAHÀ-@ÿü мÿÿÿ-@ÿø9 H€"nÿøÓîÿü±9 H€"nÿøÓîÿüR‰±J9g6>¼?<49H€? 2HÁÐ9HHÁ/?aüVßü `B@``ÿ&JŸLß àN^NuNVÿðHç>.<. *n :.>†?aþ2T-@ÿú0Áü @"|2 p˜=Pÿö0.ÿöHÀ2GÓÉÓüèÑ=@ÿø-Mÿò=| ÿþ0`¬.?.ÿø/.ÿú?aþvP=@ÿð`¤>…?<4?.ÿø/.ÿú?aû¬ßü `&9ñÀÓH€À|gJnÿög.N¹Ûü€Snÿö9ñÀÓH€À|€fÌaü¶9H€=@ÿð`@>…?<4?.ÿø/.ÿú?aûJßü aüŠ9H€=@ÿð``°|gÿP°| gÿb`À*nÿòJnÿðgSnÿþfÿ.JnÿðgB@``pJŸLß àN^NuNVHç>.*y` ¾mfB-*U fðJŸLß €N^NuNVHç. H€3À¾<n ¾<g¾<f*.¼aúlH€>€WAN¹.¼-aúRB€`RH€Áü*@Ûü2 yf `2. f&H€`H€>€aÿFH€0@ÑÈÑüJPf(H€0@ÑÈÑÈÑü 〠€H€0@ÑÈÑü0¼€/<H€0@ÑÈÑÈ"|/0˜N¹P,J†f|é†>¼ ?<4?</H€?aùºßü aúú9H€`*+|`,+|H€0@ÑÈÑüBP`›Í`` J@gÒ°|gÖ`î`H`F.¼>aù:H€>€WAN¹.¼Taù B€` `J@gþü°|gþô°|gÀ°|gº`º JŸLß ÀN^NuNVÿüBy>¼?<4BgB§?9aøúßü 9ñÀÓH€À|€fòN^NuNVHçJy´f‚B9ñÀÓBG`"0GÑÈÑü0¼€0GÑÈÑÈÑü ¼RG¾|mØ>¼(?<O?<Bgaù\\9ñÀÓH€À|€fò>¼ÿ?<1?<?<aù8\9ñÀÓH€À|€fò3ü´JŸL߀N^NuNVHç nJ(g. nJ( g$>¼ /.X— n?( n?(aûÒP>`~ nB( ? n(À_@0JŸL߀N^NuNVHç~*y` .a„J@fBG*U fð0JŸLß €N^NuNVHç*nJ-gJ- g .aÿP>`~JGg>¼/ X—?9?9aû8P>GB- ;y;y0JŸLß €N^NuNVHç*y™Ì—Ë`<€ÝSGJGføB@JŸLß8€N^NuNVHç yg"aþð&@ fp`‚*K09ï@HÀÛÀX`609HÀr ã *@09HÀï€ÛÀÛù(y><€ÜSGJGføB@`8(y><€ÜSGJGfø| . f.‹aýzJ@gB@` `p``B@JŸLß8€N^NuNVHç>.*n g 5pH€``0R@JŸLß €N^NuNVHç0.å@HÀ*@Ûùê. n/g nNg*® JŸLß €N^NuNVHç>.pH€>€0H€?aú\TJ€fB@`p yfp``0GÑÈÑü0¼€>¼?<4BgB§?aôæßü aö&J9gB@`*>¼?<BgB§?aô¾ßü aõþJ9gB@`pJŸL߀N^NuNVÿüaðªa¤a*aN^NuNVHçBG`d0Áü м @B(0Áü м @B( 0R@°|l 0R@Áü м2Ãü Ò¼"A"€`0Áü м @ ¼RG¾|m–#üM`bâNNVÿþHç. 09`~. H€`î3ü`ø0y"|0˜H€3ÀBWan`ÖByBWa^`Æ09°y f>¼OBgaøT`RyBWa2`šJyf JygSy3ù ``t`SyBWaú`b . mB>9^. H€Ž@09ÐyÁü 29ÒyãAHÁÐмñp @0‡>¼a®`HÀ |rr°˜WÉÿü hNÐ`ˆBy. H€`Ø09°ygSyBWah`Ð>¼a\`Ä3ù3ùBWa>`¦09°ygSy`>¼O?<aÎTBWa`x=yÿþ>¹?.ÿþadTRnÿþ`>¹?.ÿþaNTRnÿþ09 °nÿþlà`6>¹?9a*T`"3ü``HÀ |¢r°˜WÉÿü hNÐ`ˆ. H€Ð|ÿà3À yo3ü3ü`Z3ù. H€Ð|ÿà@ .O o|O . H€3ÀBWa.By``J@gý€°|gþˆ°|g€°|g¦JŸL߀N^NuNVHçJng09°y gRy>9ÞyÏüPÞyÞyüñ !0H€Àñ #üñ !0à@H€Àñ #JŸL߀N^NuNVHç>9^Ž| <9 RFœn 0.Áü *@0. ã@HÀÛÀÛüñp:ÇSFfúJŸLß ÀN^NuNVHç JnfV:9>9 <9 RF0Áü *@09ã@HÀÛÀÛüñpRE0Áü (@09ã@HÀÙÀÙüñp:ÜSFfúSGf¸`T:9 >9 <9 RF0Áü *@09ã@HÀÛÀÛüñpSE0Áü (@09ã@HÀÙÀÙüñp:ÜSFfúSGf¸89^ˆ| 0Áü *@09ã@HÀÛÀÛüñp<9 RF:ÄSFfúJŸLß0ðN^NuO ((((((((0000000088888888@@@@@@@@HHHHHHHHOOOOOOOODscreen driver 3.6 Œ.`P"ÂACHIJKY8Vb€®î$L1L2„L3L4„^_scrver¤`_cons_ou¢~~cons_o‚~chrÀ L8‚”L9‚L11‚L12‚"L10‚$L13‚._pos_cur¢¸L14‚PL15‚`L16‚|_scroll¢nL17‚‚L18‚ŒL19‚´L20‚®L21‚²L22‚ºL23‚ÂL24‚ L25„rL26‚L7‚®L27‚(L29‚L30‚8L31‚LL28‚$L32‚VL33‚bL34‚€L35‚–L36‚¤L37‚®_clr_lin¢&L40‚àL39‚ÌL38‚ìL41‚îL42‚L43„¢L44‚L45‚(L46‚JL47‚TL48‚zL6‚®~~pos_cu‚¸~incrÀ~curposÐL50‚ÚL51‚ÚL49‚~~clr_li‚&~lineÀ~colÀ ~chr_attÐ~jÐ~pÐ L55‚^L54‚`L53‚dL52‚d~~scroll‚n~directiÀ~num_chrÀ ~iÐ~jÐ~lineÐ~chr_attÐ~p1Ð ~p2Ð L57‚ÒL60‚ˆL63‚ÆL62‚ÈL61‚ÌL59‚ÌL58‚ÐL64‚&L67‚ÞL70‚L69‚L68‚"L66‚"L65‚&L73‚RL72‚TL71‚XL56‚XN#ü aûJŸL߀N^NuNVHç9ÿßñŸ#üîþ.¼ñÁÁN¹J@fê&|ñÁÁKë IëB+¼|B+|ÿ|B yþ(H€é@"yþ) H€A@¼¼¼¼¼ yþ¨¼ yþ¨ ¼ yþ¨¼ yþ¨¼ yþ¨¼) yþ¼ yþ¨ ¼ yþ¨ ¼ yþ¨ ¼) yþ¨JŸLß8N^NuNVÿüHç>.0GÐÈÑüñÁÍgð |ñÁÉ2GÒÉ0H€JŸL߀N^NuNVHç>.. 0GÐÈÑüñÁÍgð0GÐÈÑüñÁɆJŸLßÀN^NuNVHç*|ñÁà.¼ñÁáN¹J@f"|8|ÿ|<|8B-|<JŸLß N^NuNVHç*|ñÁà-H‡Î|¾|gB@`0<ÿJŸLß €N^NuNVHç. aÂJ@gú*|ñÁàG-|4|<-gøJŸLß €N^NuNVHç>.,. *.0`€N¹` H€>€aÿf` H€>€Bgaþ¦T`öBWaþdHÀ`êaø`â H€>€ H€?aöPT`Ì3Æ` S@3À`´#Æ`ªaú,HÀ`  H€>€aúŒHÀ`aþ¶HÀ`†.… ?aûTHÀ`t <`j09HÀ`^3Æ`Vaø¸J@gB€`J` <ÿÿ`@.… ?aûT`2 >€aû4J@gB@`pHÀ`B€```°|?bòå@0@Ñü PNÐJŸLßàN^NuCopyright 1984, Motorola Inc.BIOS 2.15öööööööøúúøø øöø÷öÿ üQüWüEüAüSüDüZüXùöûûûüRüTüYüFüGüCüVüBùöûûûüUüIüHüJüKüNüM÷öûû   üOüPüLö÷ öû û û û  ýö÷÷û ûûûþ ööö    ö, À  Û `134567890-= []\;' ,./ ~!#$%^&*()_+ {}|:" <>? ÐÖÕÔÑ×0123456789ABCDEF,.08€8PhP2NfœÀÚ. ¿? 9À  ™À  ¿ÿÿ"òFFFF F   áDê`áDê`îZbpz„”¢´ÀÈÞèö $Œ6@JRhŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒŒv BIOS ERROR -- . BIOS ERROR -- DISK NOT SUPPORTED BIOS ERROR -- DISK NOT SUPORTED _memtab¨ _memdsk¨_iobyte¨_dirbuf¨€_csv0¨ _csv2¨_csv4¨_alv0¨(_alv2¨˜_alv4¨0_settrk¨_setsec¨_setdsk¨_setdma¨_tkflg¨ _lstpsn¨_firstbu¨_lastbuf¨_tbuf¨0_sns¨_wrdatˆ_wbootˆldivˆ_no_deviˆ_cons_ouˆ_rddatˆ_copyrig¤_biosrev¤_in_char¤(_char_av¤*_c_init¢~~c_init‚_keybd_i¢L3‚L4L5L6„,L7„,L8„0L9„8L10„PL11„hL12„€L13„’L14„¤L15„°~~keybd_‚~delayvaÐ~epci_baÐ ~cr2_basÐ ~cr2_staÐ~crÐ~regÀÿÿÿþL19‚8L18‚8L17‚L41‚JL42‚NL43‚ZL44‚bL45‚fL46‚xL47‚L48‚ŽL49‚L50‚œL51‚®L52‚´L53‚À_mode_ch¢®L54‚ÚL55‚L56‚L57‚L58‚.L59„ÀL27‚¤L60‚˜L61‚ŒL62‚˜~~mode_c‚®~iÀÿÿÿþL64‚îL65‚øL63‚ø_cons_st¢ü~~cons_s‚ü~retÐ~statusÀÿÿÿþ~epci_baÐ L67‚L66‚pL68‚$L69‚:L70‚pL71‚HL72‚pL73‚VL74‚pL75‚p_cons_in¢z~~cons_i‚zL79‚~L78‚~L77‚†L76‚”_bioserr¢˜~~bioser‚˜~errmsgÐ L81„_printst¢ÂL82„L80‚NTdTd„dT„„„„d\T\ ld\T\ lldtœœ””””””„”Œ¼¼¬ÄT\l$<,D4LééO¸~~prints‚Â~sÐ L86‚ÜL85‚ÐL84‚àL83‚à_lperp¤è_dpb3¤ò_dpb96¤_dpb48¤_dpbwdc¤"_dphtab¤2_config¤´_cnvdsk¤¶_rcnvdsk¤¼_sndcmd¢ê~~sndcmd‚ê~dskÐ~nÐ~ctlÐ~cmdÐ~psnÐL89‚0L90‚ L91‚ L92‚ L93‚ L88‚FL94‚L95„ÂL96‚`L10000‚XL97‚`L87‚°_sndcnf¢º~~sndcnf‚º~dskÐ~mxhdÐ~mxclÐ~prcmpÐ~zeroÀÿÿÿþL98‚*_gtsns¢4~~gtsns‚4L102‚8L101‚8L100‚FL99‚ü_tk2psn¢~~tk2psn‚~dskÐ~trkÐ~ppÐ ~ttrksÐL104‚>L103‚ŒL105‚LL106‚r_rddsk¢–~~rddsk‚–~dskÐ~pscntÐ~psnÐ~bufpÐ ~erofstÀÿÿÿü~bpÀÿÿÿøL110‚¢L109‚ÊL113‚èL112‚ÌL114‚èL111‚öL115‚L107‚¦L116‚¢L117‚žL118‚¢L108‚¦_dskxfer¢°~~dskxfe‚°~dskÐ~trkÐ~cmdÐ~bufpÐ ~rcntÀÿÿÿþ~psnÀÿÿÿú~pscntÀÿÿÿø~scntÀÿÿÿö~bpÀÿÿÿò~errorÀÿÿÿðL122‚ L124‚¼L125‚L123‚ÎL126‚,L129‚nL128‚HL130‚nL127‚|L131‚ŽL121‚ÒL10001‚àL120‚àL132‚ìL119‚îL133‚î_setinvl¢ø~~setinv‚ø~dskÐ~tbpÐ L137‚ L136‚ L138‚ L135‚ L134‚ _slctdsk¢ &~~slctds‚ &~dskÐ~loggedÀ ~dphpÐ ~psnÐL10002‚ NL140‚ xL141„L142„-L139‚ ÈL143‚ ˜L144‚ ÆL146‚ ªL147‚ ªL148‚ ªL149‚ îL150‚ L152‚ pL153‚ FL151‚ |L154‚ PL155‚ jL145‚ ÆL156‚ ~L157‚ ~L158‚ €L159„>L160„T_homedsk¢ Ò~~homeds‚ ÒL164‚ øL163‚ øL162‚ L161‚ _initvds¢ ~~initvd‚ ~iÐL165‚ œL168‚ HL169‚ &L167‚ FL166‚ NL172‚ bL171‚ bL170‚ pL175‚ †L174‚ †L173‚ ”_flush1¢ ¦~~flush1‚ ¦~tbpÀ~okÐL177‚ æL178‚ èL176‚ _flush¢ ~~flush‚ ~tbpÐ ~okÐL182‚ *L181‚ L183‚ (L180‚ .L179‚ 0_fill¢ :~~fill‚ :~tbpÐ ~okÐL185‚ \L186‚ ^L187‚ ~L184‚ ˜_gettrk¢ ¢~~gettrk‚ ¢~tbpÐ ~ltbpÐ ~mtbpÐ L191‚ òL190‚ ¶L192‚ ìL193‚ æL188‚ $L194‚ òL189‚ öL195‚ üL196‚ L197‚ "_read¢ .~~read‚ .~pÐ ~qÐ ~iÐ~tbpÐ L199‚ `L200‚ NL198‚ ”L201‚ €L204‚ ŠL203‚ ŽL202‚ ’_write¢ ž~~write‚ ž~modeÀ ~pÐ ~qÐ ~iÐ~tbpÐ L206‚ ÒL207‚ ÀL205‚@L208‚L211‚ üL210‚L209‚L214‚L213‚L212‚L215‚>L216‚8L217‚