IMD 1.18: 20/07/2019 17:20:46   _COLEXVME PPȎ؎мE ͙S@K[AM]I_>"uw]s@]s6%t@]sk- C3C@]sFCؾ3.[.@.]s"3.A.@.]s..Y`Ȏ3ɱ؋:t T.]aCOLEX-2000 Copyright 1984, COLEX Elec. Co., Ltd. Non-System Disk Boot Failure  ËT.". ËL2As @`  @`! #@%`'+/1 35`9;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @ @ ` @ ` @ ` @ o ǀ ɠ @ ` ׀ ٠  @` @`!Aa  !Aa!!#o')+-/13579;?ACAoGIKMOQ!SAUaBOOTLINKBAT J1 EQUATES H z9 MAPIT BAT iv* BOOT MAP v* AUTO BAT On+ BOOT_LNKH D9  DOALLASMBAT t0 $BOOT_DSKASM 9 %1BOOT_DATASM N9 2DATA H {1 4BOOT_RTCASM c9 6BOOT_POLASM *9 =BOOT_ERRASM r4 B BOOT_INTOBJ EDBOOT_TTYASM IC L-BOOT_POLOBJ Xe@`  @`! #@%`'+/1 35`9;=?A C@E`GIKMOQ S@U`WY[]_a c@e`gikmoq s@u`wy{} @ @ ` @ ` @ ` @ o ǀ ɠ @ ` ׀ ٠  @` @`!Aa  !Aa!!#o')+-/13579;?ACAoGIKMOQ!SAUaWY[]_a!cAeagkmo/sAuaw{}!Aa!Aa!ABOOT_DSKOBJ Y0(`!BOOT_RTCOBJ i4BOOT_TTYOBJ [qkBOOT_SYSOBJ |yBOOT_UTLOBJ X\1 BOOT_ERROBJ dBOOT_DATOBJ }yceBOOT_MALOBJ K5 UBOOT_STKOBJ &+.RBOOT_INTBAK  BOOT_INTASM U  WY[]_a!cAeagkmo/sAuaw{}!Aa!Aa!AMAILBOXSH ,p ,BOOT_UTLASM U9 .COMMAND COM M x<BOOT_MALASM ɨ9 )OPTIONS H  -GIFDIC MAC r#.o80186 MAC 9v 4MASM EXE S7;LINK EXE |SZWS COM \4 SWSOVLY1 OVR !WSMSGS OVR !qBOOT EXE C 3DOONEASMBAT .2* BOOT_SYSASM q BOOT_STKASM q                 ;********************************************************** ; ; MAILBOX DATA STRUCTURES ; ;********************************************************** BMAIL equ 0400h ; start EMAIL equ 2000h ; end MDATA equ 1200h ; start of data area SMAIL equ EMAIL - BMAIL ; size if new_68k ACCESS equ 0h else ACCESS equ 0040h endif ; ; macro for multiple mailboxes ; MAKE MACRO funct,numbr M&funct&numbr &funct <> ENDM ;************************************************  ******** ; ; MAILBOX CURRENT STATUS FLAGS ; ;******************************************************** PEND struc PEND1 dw ? PEND2 dw ? PEND3 dw ? PEND4 dw ? PEND ends ;********************************************************** ; ; SYSTEM CONFIGURATION BLOCK ; ;********************************************************** SCB struc ; master block SFLAG dw 0180h,05a0h,45a2h,55aah ; id flag VERSN dw 02 REVIS dw 0001 ; version and revision db 20 dup (0) GMADDM ock ; ;********************************************************** LAB struc OTDAT db 0 ; data out OTFLG db 0 ; flag in bit 0 INDAT db 0 ; data in INFLG db 0 ; flag in bit 0 db 6 dup (0) CRATE dw 300 ; ticks per second CLDIV dw 6 ; divisor CTICK dw 0 ; ticking spot LAB ends ;********************************************************** ; ; CHANNEL STATUS BLOCKS ; ;********************************************************** csb struc ; main part of csb CSBNO db equest count BLKSZ dw ? ; physical sector size BLKCTM dw ? ; msb of last sector BLKCTL dw ? ; last sector number SECTK dw ? ; sectors per track HEADS dw ? ; number of heads BLKOF dw ? ; offset to first BLKS1 dw ? ; size of first BLKS2 dw ? BLKS3 dw ? BLKS4 dw ? BLKS5 dw ? BLKS6 dw ? dw ? csb_disk ends page ;********************************************************** ; ; CHANNEL STATUS BLOCK ; REAL TIME CLOCK ; ;*********************************************************dw ACCESS ; global address GMADDL dw 400h ; global access GMAMC dw 0003 ; address modifier for access MBSIZ dw ? LMADDM dw 00 LMADDL dw 0400h ; local address db 20 dup (0) dw ? STLAB dw ? ; start of LAB dw ? STCSB dw ? ; start of CSB dw ? STCRB dw ? ; start of CRB dw ? STFLG dw ? ; start of FLAGS dw ? STDAT dw ? ; start of DATA db 12 dup (0) dw 0 LABSZ dw 16 ; size of LAB dw 0 CSBTL dw 32 ; maximum number of devices d? ; device number DEVCL db ? ; major device type ( 0 = tty, 1 = disk, 2 = rtc ) DEVIC dw ? ; device description RQMAX db ? ; max simultanious requests RQCNT db ? ; current request count dw 12 dup (?) ERROR dw ? ; error status csb ends page ;********************************************************** ; ; CHANNEL STATUS BLOCK ; SYSTEM DEVICE ; ;********************************************************** csb_sys struc db ? ; csb number ( device number ) db ? ; device* csb_rtc struc db ? ; csb number ( device number ) db ? ; device type dw ? ; device description db ? ; request max db ? ; current request count TIMESM dw ? ; time msb TIMESL dw ? ; time lsb SECND db ? ; seconds MINUT db ? ; minutes HOURS db ? ; hours DAYOM db ? ; doy of month MONTH db ? ; month YEARS db ? ; year ad - 1900 db 16 dup (0) csb_rtc ends ;********************************************************** ; ; CHANNEL STATUS BLOCK ; CHARACTER DEVICw 0 CRBTL dw 64 ; number of CRBs dw 0 FLGSZ dw 8 ; bytes per flag dw 0 DATSZ dw ? ; size of data space db 12 dup(0) SYSCT db MAXSYS ; number of system devices DSKCT db MAXDSK ; number of disk devices TTYCT db MAXTTY ; number of terminals RTCCT db MAXRTC ; number of clocks db 12 dup (0) SCB ends ;********************************************************** ; ; Low Level Access Bl type dw ? ; device description db ? ; request max db ? ; current request count RAMSZ dw ? ; upper ram size RAMAC dw ? ; lower ram size dw 11 dup (?) csb_sys ends ;********************************************************** ; ; CHANNEL STATUS BLOCK ; DISK DEVICES ; ;********************************************************** csb_disk struc db ? ; csb number ( device number ) db ? ; device type dw ? ; device description db ? ; request max db ? ; current rES ; CONSOLE, SERIAL PORTS, LINE PRINTER ; ;********************************************************** csb_tty struc db ? ; csb number ( device number ) db ? ; device type dw ? ; device description db ? ; request max db ? ; current request count CHSTS dw ? ; tty status bit flags ; bit 0 = DCD ; bit 1 = Parity error ; bit 2 = Framing error ; bit 3 = Overrun error ; bit 4 = Paper out db 24 dup (0) csb_tty ends page ;*********************************  ************************* ; ; CHANNEL REQUEST BLOCKS ; ;********************************************************** crb struc DEVNO db ? ; request on device number DEVTP db ? ; request on major device type COMND dw ? ; operation code COUNT dw ? ; request count dw 12 dup (?) CEROR dw ? ; error status crb ends ;************************************************************* ;* ;* DEVICE TYPES AND COMMANDS ;* ;*************************************************************  h/m/s etc ;********************************************************** ; ; CHANNEL REQUEST BLOCK ; SYSTEM DEVICE ; ;********************************************************** crb_sys struc db ? ; device number db ? ; device type dw ? ; command code dw ? ; request count SINIT dw ? dw 13 dup (?) crb_sys ends SYGBL equ SINIT SYLOC equ SINIT page ;********************************************************** ; ; CHANNEL REQUEST BLOCK ; DISK DEVICE ; ;**********BLOCK ; REAL TIME CLOCK ; ;********************************************************** crb_rtc struc db ? ; device number db ? ; device type dw ? ; command code dw ? ; request count STIMEM dw ? ; time upper word STIMEL dw ? ; time lower word TSECS db ? ; time: seconds TMINS db ? ; minutes THOUR db ? ; hours TDAYM db ? ; day TMOTH db ? ; month TYEAR db ? ; year dw 8 dup (?) crb_rtc ends page ;********************************************************** ; CSYST equ 00h ; class: system CDISK equ 01h ; disk CTTYS equ 02h ; character CRTCS equ 03h ; real time clock SYSMS equ 00h ; description: MSDOS system HDISK equ 0001h ; hard disk FDISK equ 0002h ; floppy disk TDISK equ 0003h ; tape drive SYCON equ 0001h ; SYSCON video/keyboard RSTTY equ 0002h ; RS serial terminal CENTP equ 0003h ; Centronics printer SYRTC equ 0000h ; SYSCON rtc REBOT equ 0001h ; command: Reboot MSDOS equ 0002h ; MSDOS FLUSH equ 0080h ; Fl************************************************ crb_disk struc db ? ; device number db ? ; device type dw ? ; command code dw ? ; request count DSECTM dw ? ; upper sector number DSECTL dw ? ; down sector number SECNT dw ? ; sector count DMADDM dw ? ; dma upper address DMADDL dw ? ; dma lower address DVMEA dw ? ; vme access code SECLAM dw ? ; look ahead sector number upper SECLAL dw ? ; look ahead sector number lower SIZLA dw ? ; look ahead size dw 4 dup (?) crb_d; CHANNEL REQUEST BLOCK ; CHARACTER DEVICES ; ;********************************************************** crb_tty struc db ? ; device number db ? ; device type dw ? ; command code dw ? ; request count INPTR dw ? ; FIFO input pointer OTPTR dw ? ; FIFO output pointer CHCNT dw ? ; FIFO size, output count CHADDM dw ? ; data address CHADDL dw ? CHVME dw ? dw 7 dup (?) crb_tty ends CCONF equ INPTR ; bit 0=1 : enable DTR ; bit 1,2 : no stop ; : 1 ush with command DREAD equ 0101h ; Read disk DRITE equ 0102h ; Write disk DSTAT equ 0103h ; Disk status DFORM equ 0104h ; Disk format TINBY equ 0201h ; Input byte TOTBL equ 0202h ; Output block TINFF equ 0203h ; Input via fifo TSTUP equ 0204h ; Set up TSTAT equ 0205h ; Status TOTFF equ 0206h ; Output via fifo READS equ 0301h ; Read clock in seconds RITES equ 0302h ; Write clock in seconds READT equ 0303h ; Read clock in h/m/s etc RITET equ 0304h ; Write clock inisk ends DSECL equ DSECTM ; sector size ( format ) DDENS equ DSECTL ; density ( format ) FSECN equ SECNT ; first sector no. ( format ) LSECN equ DMADDM ; last sector no. ( format ) FHEAD equ DMADDL ; first head no. ( format ) LHEAD equ DVMEA ; last head no. ( format ) FCYLN equ SECLAM ; first cylinder no. ( format ) LCYLN equ SECLAL ; last cylinder no. ( format ) ILEAV equ SIZLA ; interleave ( format ) ;********************************************************** ; ; CHANNEL REQUEST stop ; : 1.5 stop ; : 2 stop ; bit 3=1 : output halt xoff ; bit 4=1 : output halt xany ; bit 5=1 : input halt xoff ; bit 6=1 : send break ; bit 7,8 : 5 bit data ; : 6 bit data ; : 7 bit data ; : 8 bit data ; bit 9=1 : strip bit 8 ; bit a=1 : enable parity (i/o) ; bit b=1 : odd parity (i/o) BAUDR equ OTPTR ; value 0 : not valid ; value 1 : 50 baud ; value 2 : 75 baud ; value 3 : 110 baud ; value 4 : 134.5   baud ; value 5 : 150 baud ; value 6 : 200 baud ; value 7 : 300 baud ; value 8 : 600 baud ; value 9 : 1200 baud ; value a : 1800 baud ; value b : 2400 baud ; value c : 4800 baud ; value d : 9600 baud ; value e : 19200 baud ; value f : external clock ;************************************************************** ;* ;* flags structure ;* ;************************************************************** FLAGS struc START1 dw 0 START2 dw 0  page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.5 SUBTTL GENERAL PURPOSE UTILITIES VERSION 1.5 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_utl equ 1 include boot_lnk.h .list .xall ;****************************************************** ; ; UTILITIES ; ;****************************************************** assume ds:mailbox get_csb: ; make ds:di point to the relevent csb ,ram_68k ; start address offset on vme and ax,00f8h ; upper 5 bits mov bx,[si+4] ; vme access code swap bx and bx,0007h ; valid bits or ax,bx ; data for rf in al mov bx,[si] ; upper address swap bx mov dx,[si+2] ; lower address swap dx mov cx,4 shr dx,cl ; reduce to segment size shl bx,cl ; bits up in bl or dh,bl and dx,7fffh ; clear msb add dx,4000h ; last move mov es,dx ; got it in seg reg mov di,[si+2] ; lower address swap di and di,0fh ; offset  START3 dw 0 START4 dw 0 BUSY1 dw 0ffffh BUSY2 dw 0ffffh BUSY3 dw 0ffffh BUSY4 dw 0ffffh DONE1 dw 0 DONE2 dw 0 DONE3 dw 0 DONE4 dw 0 READY1 dw 0 READY2 dw 0 READY3 dw 0 READY4 dw 0 STATS1 dw 0 STATS2 dw 0 STATS3 dw 0 STATS4 dw 0 STACK1 dw 0ffffh STACK2 dw 0ffffh STACK3 dw 0ffffh STACK4 dw 0ffffh ABORT1 dw 0 ABORT2 dw 0 ABORT3 dw 0 ABORT4 dw 0 ABACK1 dw 0ffffh ABACK2 dw 0ffffh ABACK3 dw 0ffffh ABACK4 dw 0ffffh ACTON1 dw 0 ACTON2 dw 0 ACTON3 dw 0 ACTON4 dw 0 mov al,[si].DEVNO ; get the device (csb) number dec al xor ah,ah ; clear ah sali ax,5 ; multiply by 32 mov di,offset mailbox:MCSB1 ; start add di,ax ; pointer ret get_flag: mov dx,si sub dx,offset mailbox:MCRB1 sari dx,5 ; / 32 push dx sari dx,4 ; / 16 add dx,dx ; * 2 add di,dx ; flag address pop cx and cx,0fh mov dx,8000h sar dx,cl ; set bit ret tst_flag: pusha call get_flag test [di],dx popa ret set_flag: pusha call get_flag or  ret test_boot: mov byte ptr cs:doboot,0 ; flag cold boot call do_boot cld repe cmpsb ; test it jnz clr_boot push es pop ds mov ax,MLAB.CTICK ; unix tick mov cx,80h ticking: cmp ax,MLAB.CTICK loope ticking je clr_boot ; mov byte ptr cs:doboot,0ffh ; flag it clr_boot: call do_boot mov byte ptr es:[di],01 ; active ret set_boot: call do_boot mov byte ptr es:[di],0feh ; passive mov ax,cs:pending.PEND1 mov es:SUSPEND.PEND1,ax mov ax,cs:pending.PEND2  FLAGS ends page mailbox segment at 4000h mailrf equ 003h+ram_68k ; register file access org BMAIL MSCB SCB <> ; initial information SUSPEND PEND <> ; marking flags held here rcount = 1 REPT csbmax MAKE ,%rcount rcount = (rcount + 1) ENDM rcount = 1 REPT crbmax MAKE ,%rcount rcount = (rcount + 1) ENDM MLAB LAB <> MFLAGS FLAGS <> DSIZE equ EMAIL - MDATA mailbox ends [di],dx popa ret clr_flag: pusha call get_flag not dx and [di],dx popa ret xor_flag: pusha call get_flag xor [di],dx popa ret to_hex: ; convert hex - ascii and al,0fh add al,30h cmp al,3ah jc is_hex add al,7h is_hex: ret set_addr: ; point to vme address call get_addr ; calculate mov dx,rfport ; rf port address out dx,al ; set up rf ret ; done get_addr: ; calculate vme address mov ax,[si] ; upper address swap ax add ax mov es:SUSPEND.PEND2,ax mov ax,cs:pending.PEND3 mov es:SUSPEND.PEND3,ax mov ax,cs:pending.PEND4 mov es:SUSPEND.PEND4,ax ret do_boot: call set_mail ; set mailboxes push cs push ds pop es pop ds mov si,offset cs:stboot mov di,offset mailbox:MSCB.SFLAG mov cx,8 ; lenboot ; byte count ret clear_ram: cld mov cs:ram_size,0ffffh mov bx,0ffffh clear_loop: call get_next_page call peep_seg jnz end_of_ram mov ax,0ffffh call fill_seg jmp clear_loop end_o  f_ram: mov cs:ram_size,bx mov bx,0ffffh cloop1: call get_next_page cmp cs:ram_size,bx jz eor1 mov ax,0ffffh call check_seg jnz eor1 mov ax,0a55ah call fill_seg jmp cloop1 eor1: mov cs:ram_size,bx mov bx,0ffffh cloop2: call get_next_page cmp cs:ram_size,bx jz eor2 mov ax,0a55ah call check_seg jnz eor2 mov ax,05aa5h call fill_seg jmp cloop2 eor2: mov cs:ram_size,bx mov bx,0ffffh cloop3: call get_next_page cmp cs:ram_size,bx jz eor3 mov ax,05aa5h cess mailboxes mov dx,rfport ; register file port mov al,mailrf ; mailbox access out dx,al ; set it up mov ax,seg mailbox ; access address mov ds,ax ret get_boot: mov ax,cs sub ax,10h ; right ds mov ds,ax ; segment for file mov di,68h xor al,al mov cx,20h push ds pop es ; sort oursegments rep stosb ; clear fcb mov dx,05ch mov ah,0fh ; open file int sys_call cmp al,0 jz fileopen mov di,05ch ; fcb push ds pop es push cs pop ds ; swapset pgroup:oslabel mov cx,3 ; # chars in oslabel call fnd_nme cmp al,0ffh jz fferror mov cx,9000h ; start address for unix cmp al,50h ; first char of name P jne getnam ; no mov cx,4200h ; start address for PDOS getnam: mov cs:osstart,cx ; save it mov si,offset pgroup:nmlabel mov cx,5 ; # chars in nmlabel call fnd_nme cmp al,0ffh ; error in finding os label? jz fferror call get_val ; get file name of os cmp al,0ffh ; error in finding name? jz fferror cmp all check_seg jnz eor3 mov ax,00000h call fill_seg jmp cloop3 eor3: mov cs:ram_size,bx mov bx,0ffffh cloop4: call get_next_page cmp cs:ram_size,bx jz eor4 mov ax,00000h call check_seg jz cloop4 eor4: mov cs:ram_size,bx ret get_next_page: mov ax,es ; get the segment add ax,1000h ; get next segment mov es,ax ; save it mov ds,ax ; for later xor si,si xor di,di ; pointers to start inc bx ; up the counter test bx,07h ; rf ok ? jnz got_next ; t segments around mov si,offset cs:bootname mov cx,37 ; no of bytes rep movsb ; copy it push es pop ds ; restore ds mov dx,05ch mov ah,0fh ; open file int sys_call cmp al,0 jz fileopen mov dx,offset pgroup:errmes add dx,100h mov ah,9 ; print string int sys_call mov ah,4ch ; terminate int sys_call ; quit fileopen: push ds push cs pop ds mov dx,offset pgroup:dbuffer mov ah,1ah int sys_call pop ds mov dx,5ch mov ah,14h int sys_call mov ah,10hcx,0 ; error in finding name? jz fferror mov si,di pop es ; put ds into es mov di,6dh ; location for filename in fcb cld rep movsb ; move filename into fcb push es ; put ds back on stack ddskl: push cs pop es ; put cs into es mov si,offset pgroup:dklabel mov cx,5 ; # of chars in disk label call fnd_nme ; find disk label cmp al,0ffh ; error in finding label? jz fferror mov ah,NUM_DISK ; load number of disks allowed mov bx,0 ; initialize offset ldklpe: hen skip mov dx,rfport ; register file port mov al,bl ; get count and al,0f8h ; mask in good bits add al,mmcrf ; add the amods out dx,al mov ax,4000h ; first segment mov es,ax mov ds,ax ; into seg regs got_next: ret fill_seg: mov cx,8000h rep stosw ret check_seg: mov cx,8000h repz cmpsw ret peep_seg: mov byte ptr es:[0],0a5h cmp byte ptr es:[0],0a5h jnz bad_read mov byte ptr es:[0],05ah cmp byte ptr es:[0],05ah bad_read: ret set_mail: ; acc ; close file int sys_call push es push ds ; save es,ds pop es ; put ds into es for stosb xor al,al mov cx,37 ; clear 37 bytes mov di,6ch ; address of fcb rep stosb ; clear fcb mov al,20h mov cx,11 ; 11 char for filename mov di,6dh rep stosb ; fill filename area with blanks push ds ; put ds back on stack push cs pop es ; put cs into es push cs pop ds ; put cs into ds test byte ptr cs:doboot,0ffh ; cold boot? jnz ddskl ; no warm boot mov si,offcall get_val ; get next value in list cmp al,0ffh ; error in next value? jz fferror mov si,di mov di,offset pgroup:wdtab add di,bx ; add offest into wdtab rep movsb ; move disk name into wdtab cmp al,0feh ; end of disk list? jz caryon ; yes dec ah ; decrement disk counter cmp ah,0 ; used up all of our disks? jz caryon ; yep add bx,4 ; increment wdtab pointer mov di,dx ; point to next value in list jmp ldklpe fferror: jmp cferror caryon: mov si,offs  et pgroup:chlabel mov cx,5 ; # of chars in char label call fnd_nme ; find char label cmp al,0ffh ; error in finding label? jz fferror mov ah,4 ; # of character devices supported mov si,offset pgroup:chtab ; get address to char table lchlpe: call get_val ; get next value in list cmp al,0ffh ; error? jz fferror mov bl,es:[di] ; get first character cmp bl,4bh ; is it a 'K' jz iskvd cmp bl,50h ; is it a 'P' jz isprt cmp bl,44h ; is it a 'D' jne fferror ; no al,30h ; turn ascii into binary mov cs:num_flop,al ; store number of floppys on system pop ds ; restore ds pop es ; restore es test byte ptr cs:doboot,0ffh ; cold boot? jz cdboot ; yes ret cdboot: mov dx,6ch ; loc. of fcb mov ah,0fh ; open system file int sys_call cmp al,0 ; any errors? jne cferror ; yes mov dx,rfport mov al,mmcrf ; 50000h on 68k is destination out dx,al mov dx,rfdma out dx,al ; set both rfs for transfer mov ax,cs:osstart mov bx,01ah ; eof? jz ernme mov si,cs:mapbase xor cx,cx mov cl,cs:cntno jmp fnd_lpe got_lne: inc di ; point to next char after label mov al,es:[di] cmp al,20h ; compare to space jg got_var ; next char ok cmp al,0ah ; compare it to lf jz ernme ; no value bad config jmp got_lne ; go check next char ernme: mov al,0ffh got_var: ret get_val: push bx mov cx,0 ; init. char counter get_val1: mov bx,cx mov al,es:[di+bx] ; load next char cmp al,2ch ; compare to - an error in config file mov bl,es:[di+1] ; get next character in value cmp bl,43h ; is it a 'C' jz isdce cmp bl,54h ; is it a 'T' jz isdte jmp fferror ; error in config iskvd: mov bx,kvddev ; enter kvd code into chtab mov di,offset cs:con_fifo ; load offset for fifo jmp echlpe isprt: mov bx,prtdev ; enter prt code into chtab mov di,offset cs:prn_fifo ; get fifo jmp echlpe isdce: mov bx,dcedev ; enter dce code into chtab mov di,offset cs:dce_fifo ; get fifo jmp ff80h ; 0-80h push ax push bx push ds ; saveit getblock: pop ax ; really ds pop dx pop ds ; destination ds:dx add dx,80h ; one block push ds push dx ; save for next time push ax ; save it again mov ah,1ah int sys_call ; set dma pop ds push ds ; get and save ds mov dx,6ch ; point to fcb mov ah,14h ; read int sys_call cmp al,00 jz getblock ; repeat till done mov ah,10h ; close file int sys_call pop ax pop ax pop ax ret cferror:  comma jz enval ; is comma jl enline ; less than comma inc cx ; increment counter jmp get_val1 enval: mov dx,di ; put di into dx add dx,cx ; add length of string inc dx ; point to next char after comma jmp end_val enline: cmp al,0dh ; is is a 'cr' jz eok cmp al,0ah ; is it a 'lf' jz eok mov al,0ffh ; load error code jmp end_val eok: mov al,0feh ; last value in line end_val: pop bx ret prog ends end echlpe isdte: mov bx,dtedev ; enter dte code into chtab mov di,offset cs:dte_fifo ; get fifo echlpe: mov ds:[si],bx mov ds:[si+2],di ; put fifo address into table cmp al,0feh ; end of list? jz karyon dec ah ; decrement char counter cmp ah,0 ; all finisked? jz karyon add si,4 ; increment chtab pointer mov di,dx ; point to next value jmp lchlpe karyon: mov si,offset pgroup:fplabel mov cx,5 ; # chars in flop label call fnd_nme cmp al,0ffh jz cferror sub push cs pop ds ; put cs into ds mov dx,offset pgroup:cfmess mov ah,9 int sys_call ; print error message mov ah,4ch int sys_call ; quit program fnd_nme: mov cs:cntno,cl mov cs:mapbase,si mov di,offset pgroup:dbuffer fnd_lpe: repe cmpsb ; find matching string je got_lne ; found a match mov al,0ah ; load lf push cx mov cx,80 ; max # of chars to search for lf cld repne scasb ; scan for lf pop cx ; restore cx jne ernme ; no lf mov al,es:[di] cmp al,  m =t=t=t = tɎѼ!rδM!.eȎش !,t3pp >ltl>du˺>kt>lu>ku %.L!l I!#P!e>du3d...!X@Q!.#P!.l.d.>dt=H!. ;sKH!r.d. .`.+.\Ȏм}3n=t.!>lu"Z@;Ignore?0File3table bad0Invalid1.COM091.COM disk indrive Adefault driv0and strike any key when ready0Terminate8 job (Y/N)?EXEC failureE5in EXE4Program too big to fit in m70Bad or missing Command Interprete0No free4handle0M73e06load1, system halte06start1, exiting2or4name,{uFI=!r ش>!Y^-< !>k>u>kt'Pێ! ثثZ.%!%h  ! 26>t W_s 6  u J!>u H!  3;b>lu( !>u_H!rF,3>u !A =!rش>!,I!,\ > /t!C:t>!.>!CSPQ!ۡ.)X[$SPQ!)ۣX[ú4&^u6>^u>K !E2=!s=uغp3ɸB!r-\?!P>!Xr;t\(3ҭú"%!#%!$%!j3 !$_'_:/%PIPE1.$$$_:/%PIPE2.$$$  \lU-/LPATH=COMSPEC=/COMMAND.COMND.COM:\AUTOEXEC.BATCOMSPEC= Command v. 2.02 $Specified COMMAND search directory bad $!.J+n=t.!.H+3>lu9Ȏм.6J+6)63* t 6) >jt *;!>q t >p udjȎ+L+ 狽t  !>+tzqo !d ltl>'t>'up>ltlċϺ  뺦PSRVP$<0r<9w,0؋д!Xt^Z[X#,8<KO[ks~,Write protecBad uniNot readBad commandDatBad call formaSeeNon-DOS disSector not founNo papeWrite faulRead faulDisreadwrit e5writin drive A device $ COMMAN allocation filerrorCannotemor batcInserAbort, Retry,      `.+£\, t £ 7! /u\>u&\\:^@<@t">u&<E2C< t< t: u4I) !42D![[Q3۴>!CڴE!E!E!>!Y]X £ D ^Y>I< t < tVQ&Etg+J+gtTr !6Z+gt=r~ p t pt H G ,t>lt6l5*3ɬA< uI4*3) !)2)3*VW+0 < t <%u&E=+ _s+ t< t <=t%^< tw <%t< u,0r< wW,3ɋI&5_tf< ta'$6T+t#,I!,pp $-% !{r5* <:u < u ,u <%uZ< u6*&4* 1gt 5*[!t35*+)!<ta+ _+c+< t F+ c++f+ tuOJ+>lt"3= :N+uF/ < tF 8u  VBAPWk%(+ 2񞬢X+uЀ>X+t [+ \+,COu> ,MuY+>,EXu> ,EuY+Ɓ>,BAu> ,TuY+Y+t,EX ,EY+t,BA ,T+! t*;!J+j*֎ t2۪ t <;t&E;N\OSVR2Ҁ|:u@+W ;t(tN|.t D<:tu;!sÊu2ۆ\;!r\4F6Z,\)!?] 󪾁\ )!]+ c+N,V,tm+l+n++!1s >X,t \+׹ ! 'PPX u ,tU[r&t?] 6Z,\)!U!PTXU!uon+,N,u,tL&Y, tvp+P Xб$i -$_ -PY+À< t 7?<=uþ t< ÎJ+& 3 &=uð=2luljN=tEtO+ +@:, L+I!J+&d&j\R* K.P+e$ >lt>lðJ+jn+u$Ӡm+:l+tx6n+3S%6\!=tf]%R A! A!3p gZús''oJ+q 3Rp+ Zð Rb(q ZË6#,>%,3؋ וOJp+' 3p+5 PZրt"̀0*ъª''ú,( t< t!s >X,t& s >X,t6R,l)!>m ,(t\!PlX$ukþ< u=!$r؎L+36g+?!=S@![r ;tI;t)D!€uo J+>jt *;!2Ã.0S_6v-?![r _<u(,I!,7 >lulgìtN< t<=t <,t<;t< þ>\t FF;u < tk%oU!€u >!P')2D!S3۴>!C[E!E!E!>!J+hP˾i(2!á]+ c+%u5J< tF=: u\,u;!sW$u9!sI&,( < t]+ c+%ua\,u:!s&% !2ÿ*@<@uZ+&O+:G!rù< t< t.Ī< t2p>lul->tO+!>t! u+r&>@<@t &>qt:u&E ?t< u־5*3ɬ<%u&:$uFV< tA^A< uI64*gt&E$5*&E !A 3ɴ! !g6r >lul#g6r <|uw =!rذG5*3ɀ< up<|t< t8A<|u&E I64*N6r  Q3ɸlulJ+3ɾ5*< t<"u<"ut G<"u<>u2<>u&G < u &H hWH < tDt?:N+t9<p tt &>r 5*< u4*&>p À>N+/t 8&G t0<$t &Gk( tE:t?uWW_úe( = ><| 2P,6R,\,X,6R,P,;QV/T,[+Yˋ)IduX,lulF3ɎJ+r2&q&p u&>&q<%um&&d< t$=INt=inuVR<(uNJ<)uJ+< tB<)t<*t< u&p&>lu&l&>ur|:uq)!Xs'^Y+< t( G3u&%G:t :GGu۬< twujY+V3ɬ< t_tA<=t< t<=u?< t_t| t< t0u&u2+)!!Y+t t΁(4*5* 2۬< tt ,0ÆJ+&  e2:s뢎J+,t33ɋIFF =t56J+< u<t&5ÎJ+,t3҉.0~] uA 6+<:t!< u<:t,u=a']6+QY &:u, &:uG< w< t< u.v->!,3Ҹ=!r6v-؋.0B!Ëڊ,@Ȏ 3*4* ˾< t9-/ CWp+*!Ƽ%ٹ ËʲdĒ-%%-/t6r5:t:u,r'l< t drĴȬ< u +! uú%붾< t::t,!:&3ɺ$&::?tfr33X,<u Z+A:F],a+FF~u>^,:uN_,Fu~=u&}:uFNY%c+=ttT!J+2n.!3+-u .a+u >[+tp-Vx--+ƿ,ǣ,,A>,^ ]6n+3HA%>[+u[,ﺗ$Vx--+ƿ,ǣ,,A>,^P>[+u 3e+i+f+6h-*,6,À>q-u36h-+-ǀtu\)!,:t@,@\tT2k+ t B,+2l->,,O>[+u,t ,CQ>[+u re+>[+t ,t u>!€uAFt;V:t@@Ճ~uv|:uFFN^uFô;!r&!3IOO+F:EtFN<F~tFv<t <.t|:tFN2ۆ;!r~F ?.Īı2QP,],Z+|:u,AȀ}:uGG,A:u [tDMP"Xu<.u .u XY3x-{-|-W3ɬu< t< t|- t:uπ< u:N+u<:u>x-z->x-z-4uPZ+A:X>x-z-<.u {-z-{-t?*&z-rR uu<>x-x-z-{-< t":u&.^r< t:uNrԬ< u-! t1&\I 3*!5*< tr:t:uN:ur r Ê,0r< rFWp+ŷ)ê!ê:u. 3p+_ 00<0u*ǷÒPXRPSQ.J+>p u *Y[XZÀ> t =!$r ذGH>H t6>G tH =!r 33ɋظB!H 3ɴp tp ' ]m-t'M-g+i++u@>o-ueg+L+?!rUQ>-u>p-tы>i+L+uY+A+ыi+i+;g+r >o-u돀>-t>Y+t->!À>f+ua+t6i+;g+u t3L+i+l-n-2i+r=tcvuԀ>n-tW,t-r->j-t1,! Q*! ֊YW!>!n+f+Ë,],A!n+[+PX:[+o->e+t<u>-u>[+$t[l-=>l-u<3ɺ],!$r>,i*t(< t$:N+t:t<:uD (;2N_N.xF< t#WQ8u Y__êAz- Batch file missing $ Insert disk with batch file and press any key when ready $Bad command or file name $Duplicate file name or File not found $Insufficient disk space $Out of environment space $File creation error $File cannot be copied onto itself $Content of destination lost before copy $ File(s) copied $ File(s) $ bytes free $Invalid drive specification $Strike  t J+g((W3r u!2!Ê u2!ں'' u'".r u!!Ê uT!غ'˾] ,t 6h-6,,36h-+-ǀt#u5+)!C,+>,3e+i+f+6,6h-tP3c+\+q-m-p-n+n-[+,-],,B,++Hk+,X,+3-rGǀtq-t .a+ .c+ǀu\+Vx--+ƿ],ǣZ,Y,A>\,a+^믠q-[+j-,(\+ t<vfe+ظD!,€t2a+$ u p- m-tz tD2 ,! up-j->l-uu>-u%2i+o-Ë,3ɇi+n->l-uU3L+@!$r+t,t, u >j-u?Ite+t,>!],A!e+3҇ѸB!>Y+t@!$ zP$m-X$p-j-p- À>X,u *X,62, u6Z,+)!],:t@p-,@+\,&,% t:u>q-t,24" q-[+j->m-u$p- u ti+3L+uO>i+,>[+tC,+>Z, $COLEX $ Volume in drive $ is $ has no label$Invalid directory $Unable to create directory $Invalid path, not directory, or directory not empty $Must specify ON or OFF $ Directory of $No Path $PATH=PROMPT=Invalid drive in search path $Invalid device $Label not found $Syntax error $ FOR cannot be   nested $Intermediate file error during pipe $Cannot do binary reads from a device $off $on $BREAK is $VERIFY is $ECHO is $Invalid path or file name $Invalid number of parameters $Error writing to device $ HJDTkP/NV GLB_ $dEHQNOT ERRORLEVELoEXIST1DIR RENAMEM RENM ERASE& DEL& TYPE REMCOPYPAUSEfDATETIMEXVER VOLd CDCHDIRMD MKDIR RDURMDIRUBREAKVERIFY(SETPROMPTPATH<EXITeCTTYECHOGOTOsstart,cx ; save it 029E BE 0000 E mov si,offset pgroup:nmlabel 02A1 B9 0005 mov cx,5 ; # cha rs in nmlabel 02A4 E8 03DA R call fnd_nme 02A7 3C FF cmp al,0ffh ; error in finding os label? 02A9 74 4C jz fferror 02AB E8 041D R call get_val ; get f ile name of os 02AE 3C FF cmp al,0ffh t out ; SCB mov si,offset cs:cflag mov di,offset mailbox:MSCB.SFLAG push cs pop ds ; get segment mov cx,zflag rep movsb ; set up flag & version ; push es pop ds puti MSCB.GMADDM,ACCESS ; access address puti MSCB.GMADDL,BMAIL ; lower offset puti MSCB.GMAMC,3 ; address modifier puti MSCB.MBSIZ,SMAIL ; size of mailboxes puti MSCB.LMADDL,BMAIL ; local start puti MSCB.STLAB,(MLAB-MSCB) puti MSCB.STCSB,(MCSB1-MSCB) puti MSCB.STCRB,(MCRB1-MSCB) puti MSCB.STFLG,(MFLAGS-SHIFTIFFORCLSMSCB) puti MSCB.STDAT,(MDATA-BMAIL) puti MSCB.LABSZ,(MFLAGS-MLAB) puti MSCB.CSBTL,((MCRB1-MCSB1)/csb_size) puti MSCB.CRBTL,((MLAB-MCRB1)/crb_size) puti MSCB.FLGSZ,(((((MLAB-MCRB1)/crb_size)+31)/32)*4) puti MSCB.DATSZ,(EMAIL-MDATA) mov MSCB.SYSCT,maxsys mov MSCB.DSKCT,maxdsk mov MSCB.TTYCT,maxtty mov MSCB.RTCCT,maxrtc ; LAB puti MLAB.CRATE,300h puti MLAB.CLDIV,6 ; set up clock ; CSB mov si,offset mailbox:MCSB1 puti [si].DEVIC,SYSMS ; flag MSDOS mov [si].RQMAX,1 mov  page 60,80 TITLE INITIAL I/O INTERFACE FOR UNIX SUBTTL MAILBOX INITIAL SETUP .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_mal equ 1 include boot_lnk.h .list .xall mail_start: ; clear all space to zero push ds call set_mail assume ds:mailbox xor ax,ax mov cx,SMAIL ; size of mailboxes sar cx,1 ; /2 push ds pop es ; get segment in es mov di,BMAIL rep stosw ; clear iax,cs:ram_size ; ram / 64k put [si].RAMSZ,ax ; insert mov al,1 mov cx,maxsys mov bl,CSYST call fill_loop push si ; save first disk CSB mov cx,maxdsk mov bl,CDISK call fill_loop pop di mov cx,4 push si mov si,offset pgroup:wdtab add si,2 dsk_csb1: mov dx,cs:[si] cmp dx,0 jz no_dsk1 puti [di].DEVIC,0001 ; hard disk mov [di].RQMAX,01 ; requests puti [di].BLKSZ,512 ; sector size puti [di].BLKCTM,0 put [di].BLKCTL,dx ; sector count puti [di].SECT  K,11h ; sectors per track puti [di].HEADS,6 ; heads puti [di].BLKOF,0 mov [di].BLKS1,dx puti [di].BLKS2,0 no_dsk1: add di,32 add si,4 loop dsk_csb1 pop si add di,32 ; next CSB cmp cs:num_flop,0 ; any floppies jz do_chars puti [di].DEVIC,0002 ; floppy disk mov [di].RQMAX,01 ; requests add di,32 cmp cs:num_flop,02 ; second floppy jne do_chars puti [di].DEVIC,0002 mov [di].RQMAX,01 do_chars: push si push ax mov bx,0 ; initialize pointer  fill_loop: mov [si],al inc al mov [si].DEVCL,bl add si,csb_size loop fill_loop ret do_flag: get cx,MSCB.FLGSZ loop_flag: mov byte ptr [si],0ffh inc si loop loop_flag ret ; source of mailboxes cflag db 0feh,80h,05,0a0h,45h,0a2h,55h,0aah db 00,02 ; version number db 01,04 ; revision 1.4 zflag equ $ - cflag prog ends end =t.!.H+3>lu9Ȏм.6J+6)63* t 6) >jt *;!>q t >p udjȎ+L+ ; MACRO,EQUATES GIFDIC .SALL .XLIST ; ; ;CHANNEL ASSIGNMENTS ; ; SYSDEV EQU 64*0 KVDDEV EQU 64*1 DCEDEV EQU 64*2 DCEDEVH EQU 64*3 DTEDEV EQU 64*4 DTEDEVH EQU 64*5 PRTDEV EQU 64*6 DSKDEV EQU 64*7 MOUDEV EQU 64*8 RTCDEV EQU 64*9 SPRTDEV EQU 64*10 SCONDEV EQU 64*11 DCONDEV EQU 64*12 ; ; ;OPERATION CODES ; ; RESET EQU 0 FORMAT EQU 1 GSTATRG EQU 1 GSTATUS EQU 2 SSTATUS EQU 3 READ EQU 4 WRITE EQU 5 RDFLUSH EQU 6 WRFLUSH EQU 7 LOAD EQU 8 ; ; ;ERROR CODES ; ; NOERR EQU 0 mov di,offset pgroup:chtab chdevlpe: mov cx,cs:[di+bx] ; get dev # from chtab mov ax,SYCON cmp cx,kvddev ; video? jz gotchdev mov ax,CENTP cmp cx,prtdev ; parallel printer jz gotchdev mov ax,RSTTY ; must be tty gotchdev: put [si].DEVIC,ax ; put device # into csb mov [si].RQMAX,2 cmp bx,(num_chard - 1)*chtbsze ; have we done the char dev jz dnechdev add bx,chtbsze ; add size of chtab entries add si,csb_size jmp chdevlpe ; go again dnechdev: pop ax pop si mov new_68k equ 1 ; using new board low_debug equ 1 ; not crb messages write_protect equ 0 ; no writes for tests use_boot equ 1 ; load in boot real_tty equ 1 ; do real setup  BADCALL EQU 1 DEAD EQU 2 ILLDEV EQU 3 ILLOPC EQU 4 NOTRDY EQU 5 WRFLT EQU 6 RDFLT EQU 7 OUTPAP EQU 8 NOSCTR EQU 9 NOTRK EQU 10 ILLFRMT EQU 11 WRPRT EQU 12 CRCERR EQU 13 DEVOVR EQU 14 ECCERR EQU 15 FRAMERR EQU 16 PARERR EQU 17 TIMOUT EQU 18 STRTNF EQU 19 ENDNF EQU 20 ; ; ; OPTIONS GIFDIC VIA AH ; ; NOOPT EQU 0 ;NO OPTIONS ;**** DTRIM EQU 1 ;TRIM BIT 7 ***ONLY VIA ATR TABLE*** ;***** WAITRDY EQU 2 ;WAIT WHILE NOT READY ENATRB EQU 20H ;ENABLE ATTRIBUTE BITS VIA TABLE ;  cx,maxtty mov bl,CTTYS call fill_loop puti [si].DEVIC,SYRTC ; syscon RTC mov [si].RQMAX,1 ; 1 request only mov cx,maxrtc mov bl,CRTCS call fill_loop mov cx,(csbmax-maxsys-maxdsk-maxtty-maxrtc) mov bl,0ffh call fill_loop mov si,offset MAILBOX:MCRB1 mov al,1 mov cx,crbmax call fill_loop ; FLAGS mov si,offset mailbox:MFLAGS.BUSY1 call do_flag mov si,offset mailbox:MFLAGS.STACK1 call do_flag mov si,offset mailbox:MFLAGS.ABACK1 call do_flag pop ds ret ; IF ENATRB IS 1 THEN BIT 0 BECOMES THE DISABLE BIT FOR ; TRIM OF BIT 7 FOR CHARACTERWISE INPUT ; STRING EQU 0C0H ;STRING MODE BLOCK EQU 80H ;BLOCK MODE ; ; ; MASKS FOR STATUS WORD CHARACTER ORIENTED DEVICES ; WHICH CAN BE READ VIA GETSSTATUS FUNCTION GIOST RXRDY EQU 1 ;RECEIVING HARDWARE HAS DATA RXBRDY EQU 2 ;RECEIVER INPUT BUFFER HAS DATA TXRDY EQU 4 ;TRASMITTER HARDWARE READY FOR DATA DCD EQU 8 ;DCD LINE ACTIVE TXBRDY EQU 10H ;TRASMITTER BUFFER READY FOR DATA CTS EQU 20H    ;CLEAR TO SEND ACTIVE (DCE,DTE) BREAKC EQU 80H ;BREAK CHARACTER RECEIVED (DCE,DTE) ; ; ;GIFCALL CALLS THE GIFDIC HANDLER ; ; ; ; ; GIFCALL SYNTAX ; ;IE: ; GIFCALL KVDDEV,READ,NOOPT ; ; WILL CALL THE KEYBOARD HANDLER ; AND RETURN ONE CHARACTER IN AL IF READY ; BIT 7 OF THIS CHAR WILL BE TRIMMED ; THE ROUTINE WILL RETURN A NOT READY ERROR IF NO CHAR IS ; AVAILABLE. ; ; GIFCALL MACRO CHANNEL,OPCODE,OPTIONS ifdif ,<> MOV BX,CHANNEL+OPCODE*4 else ADD BX,OPCODE*4 endif SETITSK EQU 10 ;SET ADDRESS INTERUPT TASK SETIPRC EQU 12 ;SET ADDRESS INPUT SUB HANDLER ; ; ; SCON,DCON DEVICES ; ; SCON EQU 80H ;SET CONSOLE VIA AL:00=KVD,01=DCE,10=DTE ; ; ; SYSTEM PRINT DEVICE ; ; SCHNL EQU 80H ;PAR (0) ; ; ; PRNT DEVICE ; ; SLOWDS EQU 8 ;SLOW DATA STROBE IF B0,AL=1 ELSE FAST ;ELSE SLOW ; ; SYS DEVICE ; WRHADDR EQU 0 ;WRITE HANDLER ADDRESS TABLE WRLDEVT EQU 2 ;WRITE LOGICAL DEVICE TRANSLATION TABLE LINK1 EQU 4 ;LINK INTERUPT PROC TO 1MS INTERUPTSGDMP EQU 0CH ; MESSAGE DUMP TMOC EQU 0EH ; TIME OUT CONTROL ; XEBEC ERROR ; XBNOERR EQU 80H ; NO ERROR XBECC EQU 98H ; CORRECTABLE DATA ERROR ;-------------------------------------------- SYSS STRUC VERSION DW ? ;PROM VERSION SCOUNT DW ? ;#WORDS IN THIS TABLE SPGROUP DW ? SDGROUP DW ? GHNDLR DW ? ;GIFDIC HANDLER GHADDR DW ? ;GIFDIC HANDLER ADDRESS TAB GHAADDR DW ? ;GIFDIC HANDLER ATTRIBUTE TAB MEMENDL DW ? ;MEMORY END MEML DD ? ;FIRST NON EXISTING ADDRESS MEMORY VIDPAMOV AH,OPTIONS CALL CS:GIFDIC ENDM ; ; SPECIAL FUNCTION CODES FOR GSTATUS VIA DL ; ; SYS DEVICE ; RDHADDR EQU 0 ;READ HANDLER ADDRESS TABLE RDLDEVT EQU 2 ;READ LOGICAL DEVICE TRANSLATION TABLE TSTSUB EQU 4 ;TEST SET UP BIT RDSUB EQU 6 ;READ SETUP BUFFER/NVR ; ; ; KVD,DCE,DTE,PRT,SCON,DCON,SPRT DEVICES GIOST EQU 0 ;GET IO STATUS ; ; ; ; SPECIAL FUNCTION CODES FOR SSTATUS VIA DL ; ; ; ; ; ;FUNCTION CODES VIA DL FOR SSTATUS FUNCTION ; ; COMMON FUNCTIONS DCE,DTE,KVD,PRT ; UNLINK1 EQU 6 ;UNLINK INTERUPT PROC FROM 1MS INTERUPT LINK20 EQU 8 ;LINK INTERUPT PROC TO 20MS INTERUPT UNLINK20 EQU 10 ;UNLINK INTERUPT PROC FROM 20MS INTERUPT LINKS EQU 12 ;LINK SETUP HANDLER UNLINKS EQU 14 ;UNLINKS SETUP HANDLER XCHGERR EQU 16 ;EXCHANGE CURRENT GIFDIC ERROR HANDLER ;ADDRESS WITH ES:DI ; ; FUNCTION CODES FOR GETSTRG VIA DL ; GSREG EQU 0 ;GET STATUS REGISTER INTO AX ; FUNCTON CODES FOR RDFLUSH VIA AH ; NOOPF EQU 0 ;NO OP EXCEPT FLUSH STOAL EQU 1 ;RT DW ? ;ADDRESS PARAMENTER TABLE VIDEO GHNDLRL DW ? ;LOGICAL GIFTIC HANDLER GHNDLRF DW ? SYSS ENDS uH!&,&,+3T 3IOO+&:Et,_ ߹ 5*# < t# &,&?CCt< t I23.0>luljN=tEtO+ +@:, L+I!J+&d&j\R* K.P+e$ >lt>lðJ+jn+u$Ӡm+:l+tx6n+3S%6\!=tf]%R A! A!3p gZús''oJ+q  ; WRATTB EQU 0 ;WRITE AH TO ATR BYTE IN ATR TAB DISOUTP EQU 2 ;DISABLE OUTPUT CHANNEL SETOWT EQU 4 ;SET ADDRESS DISPATCHER OUTPUT SETOTSK EQU 6 ;SET ADDRESS INTERUPT TASK ; DCE,DTE DEVICES ; ; SXON EQU 14 ;XON ENABLED IF B0,AL=1 ELSE DISABLED CMD2SCC EQU 16 ;OUTPUT CMD STRING TO SCC SBITSC EQU 18 ;8 BITS CHAR IF BIT0,AL=1 ELSE 7 SPARITY EQU 20 ;PARITY ENABLED IF BIT 0,AL=1 SBAUDR EQU 22 ;SET BAUD RATE ; DCE,DTE,KVD ; ; SETIWT EQU 8 ;SET ADDRESS DISPATCHER INPUT STORE AL IN BUFFER AFTER FLUSH STOBUFF EQU 2 ;STORE BUFFER [ES:DI] OF LENGTH CX AFTER FLUSH ; DISK SUB-HANDLER ; GET STATUS MEDCHK EQU 0 ; MEDIA CHECK CTRLOG EQU 2 ; CONTROLLER LOG GNUMDRV EQU 4 ; GET NUMBER OF DRIVE GOSMAP EQU 6 ; GET OS MAP TDCHK EQU 8 ; TRACK DENSITY CHECK ; SET STATUS MEDSET EQU 0 ; MEDIA SET DRVMAP EQU 2 ; DRIVE MAP SNUMDRV EQU 4 ; SET NUMBER OF DRIVES SOSMAP EQU 6 ; SET OS MAP XEBECS EQU 8 ; SET XEBEC INIT-CHAR XEBECI EQU 0AH ; INIT XEBEC M   ; INSTRUCTION ENHANCEMENT FOR 80186 CPU .XLIST sw macro val ; do 68k dw dw (val SHR 8)+((val AND 0ffh) SHL 8) ; byte swapped endm swap macro reg ; do a byte swap rori reg,8 endm get macro reg,source mov reg,source swap reg endm put macro dest,val swap val mov dest,val endm puti macro dest,val mov dest,(val SHR 8)+((val AND 0ffh) SHL 8) ; byte swapped endm cmsp macro dest,val cmp dest,(val SHR 8)+((val AND 0ffh) SHL 8) ; byte swapped endm pusha macro db  , regn = 00 opsiz = 0c0h endif ifidn , regn = 03h opsiz = 0c0h endif ifidn , regn = 001h opsiz = 0c0h endif ifidn ,
regn = 002h opsiz = 0c0h endif ifidn , regn = 004h opsiz = 0c0h endif ifidn , regn = 05h opsiz = 0c0h endif ifidn , regn = 06h opsiz = 0c0h endif ifidn , regn = 007h opsiz = 0c0h endif db opsiz,0c0h+regn+op,(cnt AND 1Fh) endm enter macro fsize,nestl db 0c8h dw fsize db nestl eMZ   rkpJ[7T !25 I u   .g4|2x)5$4YLkqTQe ;~-RhEm+~ g n""""^##($T$s$$$$$60h endm popa macro db 61h endm insb macro db 6ch endm insw macro db 6dh endm outsb macro db 6eh endm outsw macro db 6fh endm roli macro reg,cnt msft 0,reg,cnt endm rori macro reg,cnt msft 08h,reg,cnt endm rcli macro reg,cnt msft 10h,reg,cnt endm rcri macro reg,cnt msft 18h,reg,cnt endm shli macro reg,cnt msft 20h,reg,cnt endm shri macro reg,cnt msft 28h,reg,cnt endm sali macro reg,cnt msft 20h,reg,cnt endm sandm leave macro db 0c9h endm D HANDLER ADDRESS TABLE RDLDEVT EQU 2 ;READ LOGICAL DEVICE TRANSLATION TABLE TSTSUB EQU 4 ;TEST SET UP BIT RDSUB EQU 6 ;READ SETUP BUFFER/NVR ; ; ; KVD,DCE,DTE,PRT,SCON,DCON,SPRT DEVICES GIOST EQU 0 ;GET IO STATUS ; ; ; ; SPECIAL FUNCTION CODES FOR SSTATUS VIA DL ; ; ; ; ; ;FUNCTION CODES VIA DL FOR SSTATUS FUNCTION ; ; COMMON FUNCTIONS DCE,DTE,KVD,PRT ;%%&=&&'(3++-/O3r333445 7n7788=9t9999999:+:O:~::::P;;;;;;;;\<<<=I========= >>>6>T>d>z>>>>>i???????@@)@9@A@J@z@@@@@@ AA;AQAkAAnBEEEF6F`FF{HHHIIIIJ%JEJJJJJK5KyKKKKKUL@MTMMri macro reg,cnt msft 38h,reg,cnt endm msft macro op,reg,cnt local regn local opsiz ifidn , regn = 00 opsiz = 0c1h endif ifidn , regn = 03h opsiz = 0c1h endif ifidn , regn = 001h opsiz = 0c1h endif ifidn , regn = 002h opsiz = 0c1h endif ifidn , regn = 004h opsiz = 0c1h endif ifidn , regn = 05h opsiz = 0c1h endif ifidn , regn = 06h opsiz = 0c1h endif ifidn , regn = 007h opsiz = 0c1h endif ifidnNNN,OOgPPPPRRRSmTDUgUV'V:VQVdVVVVW@W~WWWWX#X6X YbYYZ[\\\\\y] ^-^___S`` aaNbbbbc3cccd,dfffffggg-i2iiiiii5jjjkkkDkMk|kkl&l9l>lplllQmmmmmmm(n1nGn|nnnno:odooo,pxpppppppq q"q^qqqq   qqrrrrr{rrrrrs$s6sBsssst't>tNtmtttt,u@uvvvwx|xxoyyyyyyyyyz7zPzzzzzV{e{{|-|j||||||}E}Z}u}}}}}} ~H~~~ Qo;Nbˀāہ $,Dw؂݂ L,7<z̈́ք&ZͲҲ+E2Agմ!;CNʵߵ\'lq~'۸&7<Kexkx}'''' <EUe# '2 ? U Z i 'x D^ o^ ^ Z^ < A F ` x  # N A l W          < K E     4 B2 `2 & >t1 D "."^_ZXWVU! ]e4""FF]Is7>t+2䖋FPFP' 62PFP' ]6|LuB"s FD]Ѻd6|LuB"s P_]UF>NuOF~Ar~_t F22拄|>|tX|D6NP s 6|D|,NP6 s 6||PF롋F]U>u@>uA > uA >UuA >u+)?D<v&D̉/4BX]b^o{ˋ/>Ҍ׌7׍#tɎ;܏-KRnw.IВߒp~Փړr}͔ (ޕ;FKWҖ" o2 2 2 .2 42 U2 2 2 ;2 2 2 2 )2 02 U2 Z2 d2 2 2 2 2 2 o o o To Yo ^o co &P U z     LwPwTwXw\w`wdwhwlwpwtwxw|wwwwwwww&] g  v      .e ev1{|c     MMMM MMM!M.MJM[MoMMMMMMMMM%M6MCMHMYMfMwMMMMMMMMM MA FF]U  sL66v3P ثu2 PP 2PP  66vP >Uu t>u t 2]Uu F]U萜>t@"2"]U>"vz>zw$6z$ t"2>z$zա"2zH"]U$ tOFF~ v@2F0%F%F~ v@2F0&$7F0%F%?FF0&F%0'$]U$ ߘ.(?Vu<UjޛϜMoQ^k''Ǟߞǟ*'ן(G_j M]zۡ+ĢڢQz(.l̦&?gl ~.$GTgI1Nݮ+>&+8=q@tJFF%Fv~ v@2F0$FFFHFu$5FF%FvF0$FFFHFu$]U6NR"P"]U>"w"2;vA2"F2Pf]U6nFn]U6F]U6 F ]UF2PF2P]Uv4v2F~r"Fvv22PsF@FH;Fu]Uv<uF2PJ v@FF2PJ F2PJ vHFFvv  4J F@FH;Fuv2N22ȋF22N2-2PJ ]U>u>t2PPP$]UP PP ]U>t7:Ft/~t~u6RD СN R6NYF]U~r F2PF2P]UPwv0*  ]UPN>u3PvtFF2@=r Pvt]U PFFvDFD$FF2ЋF22R4~t~uvt&WvD 2PvtBv@tFv|uF v|uFF2ЋF2ЈVFvD%@tFv|uF v|uFFFFFF]U F2䖋 FvD%@t~ u~t~uFF F~tFFt4F2 =rAvN FsF2-2PF2FF uF@2FvFvv vvPv DF~r F2PF2PvDF~r F2PF2P~tF2PxF2PmF2 ~v F3P8] UFFvD2PPP sv 2P<^ ||FvDD NLNLDDD DD>u2|&6NP s 6|D 6||PvD2PPP s vDD]U6|D DPi]UFr6 vj6|D% tFFt |FvND RD ~uD|FvD  DFDDL:NtF2PPP rkv~r@DFDDrJDvDs=~u6|u >Pi%vD;Rt|u >R;ut >Pi|FvD:FuD%@t tv|"u P vt"tP/]UP_vtvDF~t7FFvD%@tA2-2PvtlvD F]UPFFvD2PPP sv|tt|ut3P v| u3P3PB vt tvtLvD F|uLs -@Fv3P]UvtFF2@=rP.vt3P]Uv<uk uuFv|uD2F@Fv|u tDF@FF2Pr v4vt{v|ukvP<^ FvD 4v 2 vD22P vDPivD%t|utlvD%t PiVvD% tKF2PPP rvD ;Nt PivD D~t uA]U~t"vFFFPP^ FPP^ FF؋]Uv4UvtUvDF~t!vFt{2 FPP^ FFٍFPP^ ]UP<^ vvFv~EDD]U 2 >t2 ]U$2FNFN~ܾOO󥿆vܹ]UF>NtcF|>|tSFuM|Dtq =rPP22FF2P22FF2PFPv<r 2Pv2P]UF2=wANF]U6RD; tA ;NtB vN4 FFF]Umv]UPsPPv ]UPfsPPPv ]UNFP<^ FvD 4v 2 NFvD2NHFF;Fr"FNv2 6BN@NH;FuFNFPP^ ]UF~uFFvD%2F~r!Fv2 6F@FH;FuFPP^ !v|utD2Pvt3PE]JFPwP+vig>u F F]P~u3P?|P6FPFPvEvD%@tvvvvtFF2%=uFvvtvtvD2PvD2P]UN2@P<^ vv4NN2F~r&zv46z>zNz@zH;Fu]U~uC2䖋 2P<^ |6|D>u 6|D>u 6|DF26NP s 6|D|!NP6 s 6|D|F릋FFF]UFFr 6vj6|D:Fu1~u~5$vNP s v|D v|D]F2 > u Pi2 #~:u2 ~:tF2 ]袤>u@FF]腤vP^ ]rvvvv4Dv4Dv>(u@DЋ]2F~uP<^ 6vD~uP<^ Pv}F^2rvDDDuvtDivD_>|uv   Dx D/|Fv|u-|u!Pc|>|tF PPv6F-v|u >~u v=A>"t>'u v*2 >.uAv"L4"s vF2 F2Qvvv v!v"v#xv$qv%jv&cv'\FV]w'v(v)v*vŃ+v΃,v׃-v˃.v/v9vÃ:vZv[wv\v]wq~2 vD~Ftv2䖋o2~3PPvPPv]PivtDFvtDP^w[vttF]赛v|uEDvt~}}EDvDPv~EDvD+vDPUpvDFv|t|u "Pivt|u|uvtD%t +PivtD#";$t $PivtD%t-vtD%tt|t &Pi &Piovt|tvt|t 'PiLvt|t~}E;Dt (Pi'w.%#"#C#c## $-$x$Y$Y$$$v~}EDv|t ~tDE]v4D%uvtt|uvtDrv4DFv|t 0Piv4DvD F~t~ DvD%u vD DvD; uv|u Pvw. 6FD]D~}޾dv>~.u@D sM>vt>vu/PPvvdt޹>vu@ 3PPv sPPv{>Nu(>O?u!PPv\u KPis(6||u|u Bav PPvT>Nu3>O$u,PvFvNDRD DD| PiPPv]F2䑸3Ff-؉F~vtdt޹F2 'Uvt|tUvDFNNvv~D]n P<^ vvFvDz DDDDDDDDDDD] Pivt&]v|uU7vDFv|tUvDvvDv~D]蟚6~}EvtD]sFtvtD4DvDFv|u|tD%t9vDFv~EDvFDv~EDv~}EDvt|u vtx DvtD~}:EuvD~E=vD~;Ev Ev)D$v~u+vtt|t .PivttFD5~t~u)vtt|t /PivttFD܋vDv;uFt 1Pivv^_w]vDPvvvDPvvv~}EDv~}ED]ŔFP^wvt|uFP^wFF2PPP r(~)t~(uFP^w FP^wvFD~t v~ED^23PPUU~ u F#FF~u F FF F3FFvFDvD3PPUt>ur~:ti>Ar@2С2+FF2;Fw Pi;Fw;FrF;FrF2&FPi~~:tjP3P^w]~}޾dF2 '2 F2 '2 >0r>Fw>9v>Asښ2 2 '2 >Hu PU>Ot>Qu PUp2 2 '2 >Bu PUvP>Du PUe?F2 2 >.u Pi2С2С2+2PU)2 ]~F2 ~}޾dFF:svdt޹F~v(FFFF2 F@֋vD+EDvtD4Dv|u vtDvt~ED]bvtDsv~+E@Dv|ttDsv~+E@D]vD%t|t *Pi]vD%u -Pi]Әv|u #Piv|rx D v D]虘v|tt|uvt|u Pi^2vDPUCFu vDPU2Ft vDPUb vDPUUvtD~};Et PivDFv|uv|t|uvD%u|u ,PiXvDP^_wGvt~}3PPUvDs Pi~vFv拄F~u F3vF FfFvFDaPPUR3PU& P3PU~"uv|t ~DE3PUPU P3PU[PUyv|t!FFvD#& (DDDFF3PPU~$uvFfD~u PivF3vDv~E:DtAL}FFvD *DDbFFvD ,DDGFFvDD%uDvD .0#D|u |u|uvD%uDPPU7FF~u vDD vDdDF  FvDFFPFP^wvFDFFPPUv|tS|tMDF~u!~}uEDv~E2D v|u ~D E v~ED!tFZFFv|u@2|tB2ЋD%NtA2ЋF%tA2ЉVFPFP^w vFDvDrvtDrv~ u FP3PU5a3PPU~u PivF3vT7FFPPUxvFDNDRDPPUTvD 2DFFP3PU3vD%t|tvD%t APiD2HFUv|t7vD~:EvFtF:FuFt vDs vt<uFv|uv~}EDvDrmFt?vDFv<u vDv~=EDv~E2DPk(6~EvDv|t vED]F~tYF2拄DFvttDF~uDF~t)~t#F;FuFv|u D;FuFFtvtFD֋vttFDFFF](vDFvD%tev|u|tVv|tMv|tDu=vtFPUrFvUFF@F<uv|uvDD4"Ё~ځs@" шT v΋D~vA"ȁ~vB4" ʈL ~tID% u D 42@F҃~u ~uv΀|u~t |uFv΃|tFBv΃|u |uFv΋D DD%u|tFu |uD5`#F;bt)~u#FFFv΁|u uFv΀|u&|uDv΋D%u~u FFF2PPdP r v΃|ucv΃|tV|} uG}u6E F֋F2狅DD|u|tDz DDF 1PiUU~t v΋D  D~u>~u+v<t#v΃|u|uv΋~2JvFD~E%t D%uDvD4#~M#6 8# :DoP3PUPU^2r~u@2F{vD42FlvD4~tA"2FQvD~uA 2F8vD2F+~t@2Fv.,*,;,J,e,~,,,vFDv~u@DFFP3PUvD <>#D~}}u D @Dv~EDcwh.+-))))8)()^*H+))'o+>',,,,,+,>'+''>'*******-(-(,((-(a(a(-(F2PPBP rUFFvDD~tvD~u v]褉2FFFFFFFFFUF΋v΀|uN FF2Dv΀|uFPv΀|u~tv΀|!u ~uF~F~u vD v΋~EDv΋\2vFv΀|uFF~uFt=v|t4v&3PPUp6FFF2D0F*v΋F2D!wr. 3222222Fv΀|&t|'u-~uF!v|uD2PPP 4FF:Fvv΋D2PPP sFt^v΋FFFt$|&uD)vD(v΋F2DF FFv΋DDv΋D  DF2PPfP s4v΀|t+D%@t D22Dv΋D% t D22Dv΋D%@tFv΋D% tFv΋D#h;jtDDD D Fv΋D#l;nu |t"~tvD|v@D D 4D v΋FֈDF҈DN؈LN܉L Nԁt=t 1PiFFF]荂v|t *Pi]pPFvFFvDs|t +D@DvDFFPP^ F]"PrFFFt*vD%t PivD%u -PiFFF]ρ 2 >Nt!r Pi6|HDDD|tDDvJDDvtFDvtDF~u~#tvD~M#L Dv|u ~EDv|u ~EDv|u ~EDv|u ~EDvD~M#N DFPXvtFDvDvtDF#uvtDvttDWv|u?| t|u vtD%vt~ED})t}(u vtDvt~ED>tPvtt~}Evt~}ED<uvtDs vtD] FFF~t%vD2PPP vЋD4"ЈVFt vD2PPP sFUFu FF v Pi~u FPUUcvD#PFFFFv΋vDD D FF#tYF~t~tF~t~u@2FFvܸPRP s v<t ;FuCFvD|wDs 7Piv΋D%F܋|}t@2@DaT#F;VtPX#F;Zt vDDFF%@tv΀|tFFF~u v΀|tFFv΋DFڀ|t~u v΋D \Dv΋D%u~t ~uD2PP^P r1v΃|u(~ڀs@D FD~;]蒁 2 >Nurt Pi6||u |uVoA|>|u Pi{|F\2PvD%@t IPi vD pDHv|u D rD Pi(Piwr.:=:=:::b:=:~;]賀t 6t 2 ]蕀`ڋvDrP6vvj|FvtDD~uD vRD tvD6|_š|FvD%t Pi_vD:FuD;tu|u~tD ;Rt Pi+vD xD>tuFD~uvD]    2 >Nu|Fcـ>~:t Pi] 2  r PiD>trPU6||uD$>tutPUPU~;]U82 N#tV#tQN#tV^>~,tً]Ut PiFt6z3Pj6|D|FvDDD DD D"D$D&D]Ut6|D% u Pi6|u|D|Fv|t;Dt Pi(vD>u|6|D |]U 2 >Nu Pi rCrP6||t|uutu tvvuN]UFNF2P]UFFv|s)D:Ft!|t3Q2P&P"Ƅ:"v|u DPi]U>"v \""F"2䖋F"]UFFvDFDs F2-؈FvF2DD|u@"Fu Ftvʋv|t(FtvK6LuNvy"2;tA2"6]U vDFvu uvDs|t +D@DvD"2;tA2"6|uF2>LuA2ȈNF2P]Un%F>u2~s FF~sFFFvD2P}#FvD2PFFPt 6]UvD82 > t>;u vDvDvDvDPFv|u 1PivD%t[~D%EwDs 2Piv|u|u |t|t *PivDP]U FUl2F>Nu>OuU3PU3PU|Fu PiF t+ =rAPN F"sPU Pi Pi >t>vt Pip 2 >Nu PiYr PiE6|D2PP|P s!6|D |>|u +Pi Pi]UsM|Fv|t Pi$vD%tvD%t PivD ~D(t Pi6Pj6|Dt66|D D6||t6||u63Sy=S]U6|D% ut Pi6t |D]U 2 >~:tG s2>vu z6zDŽDz@z=|u"s"薾F@FH;FuvD%u t蜿蟾v|tDv|tD%tv|u"6.6'v|u 6v|t6v|u6FFuEtv|tP3PFƃNv|uNv|u NFHHNvFD]UFFv|s |uDv|tq|u| uev|t|uv|uDv)@v|u Dva*v|u D 2@DvD svv5]Utv|u Pi]Uv4|u8PiFu PinU3PU3PU >t 4PiI>NtUu t TPi>u 4Pi?FUl2PPP s6>lu/v|u 3PUPUv|t 9Pi>lu4v|t|u PU3PUv|t 9Pibl2PPP sD3PU>luv|t|t 9Piv| t|t 9Pi3PUFv|v 4Pi>lu$v|u>Lu PUPU3PUFt Pi]>t 4PiKU3PU3PUQ>,t PiU>uFu Pi Pi=r Pi(|Fv| t Pi v|t Pi| 2 >Nu Pi r8r P4#|Fv|t|u Pi>vu6t DŽD>vup 2 r PiU|FvD% u Pi9vD2PPP svD%@uD |F Pi Pi]Ut)vDr #PivD%t ,Pi;Ftv|v 9Pi]UvFvDsD v4:D t Piv~=E D ]Uv4D]UvЋF2;v$~w 7Pi 2PiF2v]UFFv|u| t <Pi]UvD%tt|u =Pi]UP@]U u>l u F>t96|s/~E:Dt$|uF6|tTPi F2FF2PrË rB "sPËF2拄 2P P WP P%Pl]U6vDP]Un22FFF2FnF~uF2>LuA2ȈN~u+>lu$t 4Pi~t ?PifU>Lux>u3PUu3PU_FUGv| uPUQPU:6v|u PU/3PU&v|t 4Pi3PUe>uPU3PU|MFUv| uPUPUW(6xv|u PU3PU3PU-{UFtPU3PU>t}~u 3PUp/n%z>zvz%2n+AnPU?FF>,t PiU>t 4Pi~tFF3PUAFPUv|u PU3PUv|t 9Pi3PUFU>u>Su   PU3PU=FUr67v|u PUu3PUlv|t 4Pi3PU)w/.)NQILlKMIIIKIIIII>tP ]UvDFv|u| t5v|uDD  Dv|r,PivDv|uD;Ft|t @PivD%t |uDv|t|uD%uvD Dv v|u4D% tGPiv vDD v nvDrv|t|uZvDPvDPP>v|uD2P3PD ЋF2R\vD2P3PD ЋF2R> 9PitFDFFF]UFF2PP2 P sF>u7~u@>uA>uB :tB2+ȉNFFF]U~t~t CPi]UFFvtD r&D#F;Fu>tvtD#F;Fu]UvtDs#vtDsvt~}E D vt~}E D vtD r/vtD s"D22F~t~t 2PivtDrvtDr #PivtDs~}DEvt~}E D vt|u |uD]U FFvD С22Rwy.Y[YYgYY[YkvDsvv|t|t 9Pi>Pu@2p2P~vD2P>Pu@2Pt v FFvD 22PTu6T|uˋv|u|t 6HPvD vy# FFvDr #Piv|uD sD С22R4vD 22P{vD2P>Hu@2Pt vFFFPP]v|u|t 6+@P!vD2Pl>upvbFFv|u"vDP] UF22PFuvDFv~EDvFDvDPvD PPvtD2P~}u t vDPvt| uFt ;Pivt|u#tD2PPP s Pi]U~u@FFuvDFv~EDvFDvtD ~}:E tEs PiF:FtA2vtЋD 2ЋF22RvDPwFuvtD2P~}u t vDP]UPvv(]UFvt|ut|u 3Pv.FFu Pvv]2䖀 u~d3PUFFPۉF2PPP rv|s|v|t 9Pi2PPP rv|r 9Pi2PPP r vv2PPP sFP2PPP rv2PPP sv2䖀 t>t>t >t>,t PiPUFFPډF>t>t vv2PPP sFP[>tv> tv|s|v|t 9Piv|r 9Pi2? 6>t>u PU FF| uvD 2С2Ѓ2R7v܋FPPvD 2С22RvD2PnvFFv|u"| uvD 2С2Ѓ2Rf7v܋FPPlvD 2С22R9vD2P-v|t Pi&vtD2PPP s Piv|u 1Pi>tv|t|t 9Pi6vD2P~u t FFv|uDvPPPPUvD%tANUv|tA" FsAFPP^ dv F FFPP PUFuvDFv~EDvFDvttD2PPP s PivD PPvtD 2P}]UFuvDFv~EDvFDvt|u~}E :D t Pivt| u%D svt|uFu PvcvtD s|u| uFt 3Pv9vtD 22PvtD2P~}u t vDP]UFvDFv|u|u FDF_vD;RuSD%tK|tEDNAA;r+NHHF~sF"vN+D@@F~s F+FFFt vvD%u -PivD;Rt 3PivD#;t 4PivD%tU4"s 5PiUr 5Piv|uDD Dv|sDFF6Jv|u Dv1v.>u)v|u D%ut |uU v|u |uD rvD 22P)vD 22Pvߋv|t 4Piv FFvD2P2Pt v FFv|tP5vt\2:PiF PP]>Xuv| u ;PivD >XuA2ȃ2Q>F PP(PUFFFv|sv|tD DuDv|tv|urtD2PPP s 8PivD 2D 2PmUtvFFv| tv|u|u D%u3U?vD 22P#vD2P3Pt Qv7v1Uv|unt\2KPUXv| uv| u|u PUmPU},PUs"Piwr.'_^^_|v|ujt\2G3PUUv| uv| u|u 3PU3PU +3PU"Piwr._K_B_u_ 4PibFFv|tv   |tD DuDFv|tfv|uD| u>U>uvD 22P2vЋD 22RFvDrvDr #PiUh>uvD 22PEk2PPP svD 22P;vD s*D 2vЋD 2Ё€2RvD 4D PvD2P3PD С2RvvD svD r 2PivUIFFvD%u t Ftv|uMFPFP>u@@2vЋD 22R,vD2P~u t Wv=Qv|t 4Pi=FPFvFD6 u> t<t 39"vDFvDF(~t&]OU~t@@t2>t+6BD;Fu 3PUv>BEDvUvU]Tv|u FPP^ 8v|u|t PP^ FPP^ vt {2 FPP^ ]Tv3SjfSF]T~tqFFv|u#Ftv&F6v|uD2zvtDz|tzvt] T>t@2С"2+¢"P<^ Fv~E DvDvD2F~r!Fv2 6ًFFFF%svB2PUvB2PUF@FH;FuË]]O82 >-u@FF2 >+t>-uF2 '2 >Ar@2С2+FF;Fr PivD2fFF22FvFDFvtv2fFFF22FvFF@F= uă~t PiF2 ~:tEFFt^Fvtv2+FFvF22Fp2拄;Fw~t PiF@F= u]NF2 2F>t PiF2 2 >uvvD%sFFvFPߋvD 2С22RߋvD2P~u t vv|u1| u!D sv|uD s PUPU v|u 3PU ?PiFFFP?PkvD2P:ߋvD2P~E%Pt avGr6ߡ"Ƅ/"i r BPiFF6~uFFv|w v|v 4PivDrvDr #PivD v:D t Pi>t>uvPދF;Ft D2PUvD2PUF;FtPPދvD 2С22R ދF;FuFkvD2PPP s@FH;FuFPP^ ]S> t:7"v<s"@@2С42¢"2P v4萛蓚"2Ƅ[6]/S"2Ƅ]6]S>t">"v 6"v|ut]v>t6]Rv|uV*v]R6J|uFD$6JDFv|tDFvFD6JD]cRF~}dF 2 s96||u|u~}dvdtvdtF82 F2 >+t>-uF2 >t >.tv>.tD~}2FsvD]xM82 v>-u@2DF>-t>+uF2 U7F2 vD2%t Pi]MFvBF@F= uvD~2 F2 vdt>tm~'2 >Bu PUVJ>Ot>Qu PU>2>Ht>Ru PU&>Du PU PiF2 %vDsU>p.t PUUv Pv<^ vDvDFvDp2狅DH2 v2D D2F~rFvrV2 F@FH;Fuv| t9D2@F~ w*FFvztvD s 9Pi65w.c_/]F]7YZWWbZ[cZSba\]Xcba[~t FPP^ ~t FPP^ ]6W~uvDF|uDFFv<u|t@t>u)v^O#tW#tQ^O#tW_~t/vv<tv<u|t@t>ucvvS]V NF~t)v^O#tW#tQ^O#tW_6BtDFRF~uv|ut|uv|tvFFvDFD~u<tv,"*"vv~u+<t$v'~t v&u@DFF2 '2 >EuF>.tFtvD>tЀ>tɀ>+t>-uFu>.t~d>u82 >;u@>,uA >)uA > uA >>uA FdvFuvdt2 FF2 F]PvD~}vD]PvtD~}FvD]dPZF82 F2 UF2 >t>.t>Et>euUxF2 UoF2 >tFPFPFHPp2 2 2P2 s Pi~vF>p,uF >p.uF FFzt PiF@F= u܋]K0Fv|uvtFD vtFDvFDvtD>u82 ~].KvDPȋvDP/ՋvtDr|uvtDHPi P<^ FFFvD~}EvDPP^ vDDDF>uF2 >(t PiUoSmˀ>)t 82 F2 >)t PiF2 FFF]NJ"82 FFF>p+t>'t >"t>t~F2 ~dzzKsdvzzF=u2 zF P<^ FH2 FF  vDFD2D >zu Pi0FF~r$FF2 22PV2 F@FH;FuF2 F2 >p+t>p/t UsUFtF>tqB|@t FP*T&zF2 P<^ FFFvD>BEDH2 v2D z2PV2 z2PV2 FPFFFvD2PPP s>u@t Piv|u| tv|t 4Piv|t 4Pit 2 FFt UFFFFt >t>p+uFPPOҀ>p/t9>p,t2vD2PPP s *PivDD 3PPҚ|FFFv|t Piv|t PivD DP誹FtvD#DFFvD% tvD#Dv|t |u| u v|u 4Piv~ED DML MLMLM;t#uvD%uvDvDDs-vt ъ="ʉFPP^ ]qBF63PP蓙)|Fv|uD:FtFFv|DvtD =F]BPvr Pidvtt{2 H2 vt4Dvdt82 F2 >;t> t2s6|D#D Pi16|| t Pi|Ft{2 vDD]K=κF~r~wF 2Pi2PVY] =v t~:tFv:~uANFFn< uF@nF]<>u82 > u Pi~n@Pr FB]z<6n tPP n 2 ]G<>;t&> tP色6D%u -PiH] <>^u PiN];>Tt@FFtBB];NzF2 6zBD>t MPi>p+u>p/uv|t|u P<^ FFFvDp2狅DH2 v2D vD2PV2 vD2PV2 vD2Fރ~rz3PV2 z@zH;FuFPP^ v|t|u| t 4Pi>p,uv|t|uvD P<^ FvDvFDvp2狅D|u|t|t |u|tvDv|v#|t *Piv|u Piv|v@D Fu%FF@t>uvDDFFF]EF<v3ShSr<v|u v~D2PV2 F2 3PV2 ]AV~d 2 >Nu >O$uN sN>Nu>;t > t s+PUr PivDvDf3PUr PiPrt PivD-v|u|DvD;|t 6|轗 vFdvFPζFFFFv|t |u1| u+> tuvD%u|u |u|uFPP^ U'FPP^ dvÙ<]?FFFvD;uF^FFvDv;DtFz>t>;t> t>z uѡzHHFpF P<^ p6pFD 6pFP r nPiP6B)(MZ6p 6pD FpPP^ Fp];r P&|Fv|t|u3P Pi|F|Fv|t0|u >Rt;Ru 3PivD%u3u,>u|>t 6|D|vDvD D>Rt)6RND N;Ps 6RPD 6RNDvRD|RD NDP傀>;uo> ue82 F2 >'t 2 >~'t Pi82 v|"t-r v|tV@t >tu$vDrtvr JPivDsv'@t>t@6R|@vo_v|u tD vD2vDrtv|utv膔vDsvvN>u 82 F2 ~]D>4"@Ft Ft P P螛 PP葛8|FFUuStZvp2狅DFt9v| u0>Vt >Vu 6BFDvD vDFVvFD]Cv3SSc]CF;FuANv|u PiF vDFv|u |uFuFu SPiv|u|t 4PiFtFFFF]?n;ft#6|D4hP 2 dHfn]>>Ru EPi#6R|u FPiN%=uɋ]> 2 >Nu Pi>|t Pi|P]q>PFFFv|u PiWv|t5|u| tv|t 4PivD;Rt 3PivwvDs 2PivD;NsP;NsNPvDN谆FPP^ ]= 2 6ȗr(PivD";|t Pi4>Nu PiF2 r63Pj6|Dv|D"2  r6zPP s1v|uxDvD:xt:D$u"t PiT6zPP s(v|$uxD$vD$:xt Piv:vD&vDD$PiF2 ]8t Pi8>u Pi&t @;u ]/8>u Pi6;u;uA>t 6]7F2 >tFF;FuANnF2 >>t PiF2 F]f7P<^ F82 FF>>uFFF> t ~tӀ>,ũ~u PiFvFFF> u2 F]6UTFUMFvv< FFPP^ FPP^ F]6p24FF tAN uAN 2 rF6|D% tAN>puF4FN,FF$4F<5F>puF4F%wu.##mmc[u> u 12F2 vU]1XF82 FFF2 >%u F@>'t >"t~22PV2 F2 ~:u-2 ~:u22PV2 F2 F2 ~~:t> u~:u22PV2 ~uF2 ~u@FF>>u,~v@FF4F~uF2 ~vFO>!uF2 A>t>,u~u@FF4F> t >;u~uFFFt 22PV2 Fu3PV2 >u82 >;t > t,~]/Ct482 ><u@>'t>"uF~22PV2 ~:t> u> u2 92 ~:t 6V2 > t<2 r+~2 >~&u>&u ~22PF2 2 %> tFu PV2 ]* vt|tvtDFD2vD@D>ravtDС2Ё@V?Ps?Psvr42F~rFv$sF@FH;Fu2FvtDF~t'|t!FHFFvFF@FH;FuvFP萃vt|u)FFFv2 F@FH;Fu6sv2 >t6s>uFPP^ ])t >t>w 6tFt]`5 2 >~:u 2 FF~ sF>u 2 y FFt/>ru@2>ruA2+`>`uFF]4n>uLLtNK 2 >~:u 2 ~ s1>ru$>ru>u Pin]i4XtXH2 FB]>4s$3PV2 ^7P6B!)F,n6n22PV2 n> u]3v<uLzFv2 >u#v2 vFFtF2 FX>~,t Pi>p!uBFu Pi82 ~<>uF2 3SىS1>~>t PiTFF2 FtB>>u@2><uA2+F~t> uF 22PV2 (>t>;t> uF 22PV2 XFu~X>>u FtF2 H2 FB].~v PV2 vV2 ]_.vDvDv~}EPNP~v< vDvDv~Dv|t vDsvDvDFF]-2 >&u FF2 FnF 2 \FFvF~tUnv<uLFv2 >u#v2 vv<u@LF?v2 >rUX> uv2 6nn> uƚ2 NtF,Fu LumLt-v|u FPP^ FP!2 Dv^](Pm 2 >Nu> t>;t PiSXP<^ F6\|uFD!6\DFv<tFvFvF@@P}]=(6Mr$P PȂ|Fv| u DD6|| t PiJ>t2 |:X3SS蹨H2 X2PV2 <XFBv<u@LF)nv2 6nn> u2 NtFzFuLtLtFP!2 D^]03 P<^ \\FvD>p!uD>p"u vDvDvD]2P<^ FvH2 v4D6\|uFD!6\DFv<tFvF]2 2 >Nu> t>;t PiPXP<^ F6\<uF 6\Fv<tFvFvF@@P謇]22䑋F3#tPv2䑋F3V~ v@2F0FF2PV2 ]FsFF2PV2 vDF~t FuUsFF2PV2 FtFFt &PV2 nHH;Fr9FFnHHFF;Fr#Fz6z22Pz@zH;Fu],F2 >&t> t 22PX2 ],F_sX3PV2 6\|u)6:t{2 6:4D6:8D6\諅^P6B[FnnF2 >;t2 >;us>nu F #92 > t> u2;4u>6uݡ2;4u>6u  n> t 6V2 F2 > u2 %2 F2 22P9> uF2 T]'F<t& 2 ~ s>puF3SS]* Fu<tX2PV2 <Fu ny]@'P2lX|:3SىS6\bD6:D4>4uP<^ Fv 2 v2 2Fv2 2bFPP^ X;Fs++F؉F~rF3PV2 F@FH;FuC 6:D4^P6B]Z]g&FFv|uL; uP2 v2 FvFPv]&&6|D FD]&v4|s'~ЋD2;r32Pi]% 2 >Nu/r6 Pj  6xj6|| t Pi|Fv|uvtFD vtFDvFD~EDvDvD>~:t Pi踢F2 82 >=u 2 蜢FFvFDvDF=v2PiFFPFPvFD~u vDv~狅HDFvD>u82 ~]$ FF6~r PP 64i6||t PiFF6|D|FUS FFvFD=uD v~狅HD v~v@2@DFDLNF~rFzFFvD2)FFD ]v|uLPiF2 [2 >,t>>uFPvYF2 pFvtDpԉFFpv|u OPU]vt|u t|t PPU=v|t~}}E:Dt<t QPU^v~}}E2DvDvЋD2;v*FVF;FrFz PV2 z@zH;Fuv~EDvD~}}:Eu<uu t}EDv~}ED>Rt 6PFDFRFP>u82 ~] R|B82 >@UɛS諞>@~t PPUtsp2:3PiY4>RuA s 3Pi|;Rt 3Pir|Fv|t 3PiYP;Ns vND vPDvND DRDa>Rt6RD NDP NPO֛rr s">ttr6tPo Pi'6rr PiZr6|tPoH7C>9W4U/*+v. 񢋢աe6=rsQq~ >p+rA">p/wA"s n 2 6||ukT nzq;9=wv wvdDdDDFz@zH;Fu]#v|u LPiy82 >,t>>uvtDFF2 )ѠFFPvDP"vtt 拄fFFvDv~}ED>u82 ~]"|F82 >>t PiFFF]z">@|B|up+p/>]F" P<^ vvFvDDDD] "6|rPP|6|D6 g6||t Piq6|D D|BBFv6PDPvDFڀ>>t PiF2 6BDv]h>@|Bp06BD>@]UPbPU 6P&PU PPU >uP PU S3S6 >tPPU S3S6 , 6,fP ,-PP PVPU , >.tP PU 6.P , , ]U"FHb" F r<uu u$>t4>^t->t>u>=t> u>Bt u5tEt>>ti`FP w9vڃ:wrt>rt u~p23S?SfI`ZxTNH3Pi=713S;S贗$; ;>;t> ut Hj>+uF2 F2 tAM>,uF2 ?듣z>z v>zsz 2Pi=u >,u&襓z>zw>zu-zzy szp2PPP FF] 3P6Bis9F@6B|ED6BND6BDiLNnHz>Ntb6sP>JuJP/6BtJDJP6JDJ6BDFvDۋ6JpD NPi>;t> t NPi]  P<^ vvFvDDDD]F2PivDPʋvDP^wFP' (S3S6 P-PU >^t +>ptCz!z6z uu6zP >z tz-P P >wPP , t\a]UzFFu;F2 >;t> uF zFDzz;FrANFt zH,zH. ]U, P PU ]H"su~2_2 >Nu PiXv>Nu Pit PPq2 sG~ 4"rslsy rP=P3Pt4t PifP=PPt>;t> u 3S:S {tow.eRyqJ!)३ǥw}ϥk_eQQQQQx> "" sXb "sP"s,6||u|uDD蓮 Pi>Ntt PiZtZ9t/> t(>;t!2 82 >;t> t Pifd]nvPP  F2@n  6nƄ > t> unFt4n>@uD UPi&P/P  H]LP7sMF]-H]DHF>F2PPVP s%XFP<^ Fv 2 \FLFtFBF` F@FBHtDDuU^286rE6pTt >BuB> t[NuTDuGB2#83.)i$vU]U;wK]U, ]U|FvD bD]UPePU ]U~t vgP mFFvt2F~r'z6z~u>zz@zH;Fu߸ PPU q]UvT6||uDs PPU $2P%PU ]UuIPf PU , PPU Pf PU ]Uv| uuD%umu>zmPPU , =UPPU , %=3Pv}vtv|uF vt~tPfPU ]UvtDFvv\25v|uP)PU P1PU 169U&6=UPAPU v|u |uPGPU 6OUv|u;|t tDFFPSPU ~tv2PFPU wv|uP[PU _PcPU vD4P<^ Fv 2 v2 >tPPU v2 ܍FPP^ %w.aFlllQ\\\\\v|u|u$v| tt vt2PFPU ov| tt tv.˩nDuD>]nF 2 >u1)k 2 y s p:Fuks |;FuFF]U5P6Tr nRTFv|u5N+D FD;Ftt PivFDDTDYFf]sjvPg|FvD|u'|u ;TtTDuvD|T]U j| 2 >Nu>~;t>~ u P~. r Pi>ts Pi6tN>|uP@FB]~tVFFv4vF|vLu'P^Y>zv z(]UvD%t?uJPPU , PPU , PPU , 3PvFFv|utNvD2P?vt4vt(_v|ub6|D|>|tO|FQPvt \vD2PMvtAvtvD|96|D|>|t(|FQPvt vD|ы]U|FvPvt^PvD2PU v|u|$ut&)Uv|$uP PU =Pv|$rA2|$2PFPU F%@t PiPU F%t PsPU ]UvD%tVGRtevD%uXuR|tLP3PvUFFv|utv|t|t|u vtp]|b^. HF>@9:>Pz6zDŽDz@z=uNRTp2- أ3PP]>Rt_u P@ P  P{PU , 2JRF~t"t3PvO#tW#tQ^O#tW_vtv]sFvU}F@F=u]UFFvD2PPXQV s#vD~u DvZFFvD#Z;\t DFFv| uD^#DvD`#D]UFFv|u<|uDv|$uD$v~D~DvEZvD D]Uv|uVZ]UvD%@tV[]FF#tQvtvF|vLu'P^O#tW#tQ^O#tW_vtv] uB2+‹ЋD$2PU :v|"tnPPU v|"}2D|vDvDF~r*zPvt"DzPU z@zH;FuܸPPU ]UFFvD2PPQ slvD%uaPSv|u|u3PUB3PvuPPU , vD|>|tPUJ6|D |]UPPU vP$2P%PU ]UPFPU v]UFz6z拄~}};Euz@Fz@z=uՋvtDF~u;v| uF+v|uFs'vDF؃>Tt_uPN P  PPU , TF~t"t3Pv vDF؃>tYtu P^ P S3S6  P^ PU S3S6 , ;]>|u]>ft>z6zez@z= u n 2 n>NtÃ>|uNOA|P X 6|M|PP^ ]J  P P P^ MC#6r t^PP' PP' PP' t6,fP PP'  u  3S#S*>t66D3S S3S:S}]t?H.63STS63S߯Sv3ShS3SS6Vu[ P P  P P  S3S6 PP S3S6  ;rcP PU P PU S3S6 PPU S3S6 tPP' 6t >vt 6v >xt 6x ]^. FFU+r;.wVn UFtFP( P S3Sv  PPESDSOCKODSODSBODSWOOPOOPEOOPNEOOPNZOOPZOVOVSOVSBOVSWULEGOPOTRUTOPOPFUSHUSHFCLCREPEPEEPNEEPNZEPZETOLORAHFALARBBCASCASBCASWHLHRTCTDTITOSTOSBTOSWUBESTAITCHGLATLATBOR      7? 8'/H6@wsrvrt}|~vrswsu~|}q{yupzz{xt𬬭ᢤXP(02ABCDEFILMCNKPwR-TD tPRV+^DE|ZXJut@=sË>ǣ,;s!KK63;6t$E> Ë63 t;u|B t ]\à uB3Hw3 t;wt t +;rˋދtߋًw t3t$ +;r @wD UTËLO @ËDK^ Osusvss isO ׃P6| t>}t}E݋6<t;Gt@@Eۋt uX t;uMOË_g uqsCtOr ~ UwPf : P  DP( PU S3Sv  PPU ~ UwPf : PU , ]U]ADCKDSE^I}LNOPRST.%%DSE*G6L<MBPHRMSTSSUMEOMMENTBDQTWLSENDNDIFNDMVENXITMXTRNFF1F2FBFDEFFDIFFEFIDNFNBFNDEFNCLUDERPRPCOCALAMERGAGEUBLICURGEEPTUBTTLITLECREFLALLLFCONDLISTRADIXSALLSFCONDTFCONDXALLXCREFXLISTOUTNDPNDSQUROUPABELACROROCECORDEGMENTTRUCAzB~DFNQTWBSYTSTWXYXM1BSDDDDPLDSTPHSLEXOMOMPOMPPECSTPISIIVIVPIVRIVRPNIREEADDCOMCOMPDIVDIVRLDMULNCSTPNITSTSTPSUBSUBRDD1DCWDENVDL2EDL2TDLG2DLN2DPIDZULULPCLEXDISIENIINITOPSAVESTCWSTENVSTSWATANREMTANNDINTSTORAVECALEQRTTTCWTENVTPTSWUBUBPUBRUBRPSTAITAMCHTRACTL2XL2XP1       @M#t+t*rˋ6u>ˋDE|ˋ|=^  t ;t_Ë6;t FFf]lf]af]Vf]K ~~:uANFt:~2V~r*F~~~~:tF VBVJ;VuۋFf] ~~:sAN~2VFt ~2VVV~r?F~~~~:t~~~~:sAN VBVJ;VuƋFf]`~2RGW  f]8RR' f] RR' f]f][2.Cr˷%tހ!t"u0tSَɎ6N"tR:N"tFt6:P6:Ouw<t$ƿPtQNuFtF3[&} u 2[#LD=st6CCU+r;.wSn vR,RE f]*>vt6vR,RE f] >vuVV~sFF~~UV~ u*3*+***;r F~ u>( u6vR.RE 6vRVRE Ft~ uB2*@*F(VBVJ;VtYf]>tt6tvvE f]VV>xt6xRVRE f] F3FF3V~t vv~EV0~Mvtf]g FUvVVN#tV#tQV2  RVRN#tV^f]( *f]f][2.C u!܋_ݍF G _U]F; r U؎v ~Ns]U؎v ~NNO]U؎~ NFs]UF؋v F ~Ns] UF FnFr@]UF fnFr@]UF FnFp~t@]UF nnFp~t@]U^@%]U^];>r;>s E;vA؎X> u[X& . Gu5>r*< t< t< tF< uI!r +3RB_VwG=rRQWYZwr @G<t ^0t S?![!R'Q!YZ=tw uË\G0t33ҸB!3G!G#TD0u%5 !Ew۹fP8X2û2?!t2860t!0622wtˉ4˸$K^ 82벃>6 v2 622DG6܋_t600?t7܋_w4t wGSp [t| vVV2 ^\2\G>|wVW_^ˀu5=ˀu9=7==UWΉ3ɉỳ u.`3.x6'x+P&ȋ. uŋr XȃrXP @3ؿ]t 7='342^ >26 D 6262Dˋ܋_OuwD=t G GHG n;ft˸hP2 ufCf@ndPPˋn;ft ;dtnˡfnhP2 >tˡn;ftn˸dP[ˠtˋn;ft@;dt:n@t $~_]23 7-7.,7>=Tx7.:;:=û,0rf< wb2 wxc,0rB< ~,:}6[<.t,0r(< w$t ɀ2À u N23 <-t <+tN2 !ߝGuS^ [0u ?t?^ r3뾴0!,0ˋM t2]uGu)W؎r W03ҋBW0tֻ@!;F!QO#t0tWS@![r;tYËW!(!;OtYTeˋLT#ueiËLT]uFM2<t"<t<u<_t<%ttaOGF2 '2 uF2 t uk uԡnH>u$82 <.tJ t 2 F2 2 ~Nˋ܋Ww Oo RUZRUZRUt"RUt 3 Uu Uu Uu ZW7."_PQVt:$2,ty 2"7, u::뾁lj^YXUQVNNo v9^Y]}9=RsZu7.>:5=e]ˀu87.>:7>=&&f &"Ԁ?k t s.GGn.&ˋF$F\뾋F$F-L뮸*RP<^ Z(  ̛<Ë6 uÍ|,  ÛًF؀؀t$8 v .YЎيF~Fw t uF%8=tURWЎ؎<3 t# O y W^,_Z]Ú t:Ú Ú Ú g F PXPX˿ m +uGGkeP t(+،  PQRWJtr4% QPW!_XY_ZYXt P> ..XUP X]SWPQR<Pv3=r<ZYX_ tރ @<\6< 6<[S<w t6<O46@ 6>[UVvNNv,2^]UVvNNv,2\^]UVvNNv,=^]UFŎ]6&UVWPSQRӋ6_6GMr4Ŋ݁6‹<3Ћ‹G$3Ћ‹GG5GG ƋՋ~݁t6@ S[[Վݎŋ6> ;><u}=>h]~ t t t @t ˋف6` ف6h 6> ;6<uh6>Ëف6p ف6x u}utt uu6 6 6 u%uЎ؋6> ;6<u6>À@ú3һ3҇ 3һ3һE D 2u 2T MD'>h;u1Ê+u þj2>hu Àv¥ t2xƋ߹w뗋듋ځu3ۓtt 3Ëځu'+|=C~/UR>hX]tuNJ݊Ί򗕊Ԋ2ufNtS ͊ tD rrwr't"XPr rXPr sF3Ջʊr^s Š t rrwr,t'XPr rXPr3sF32H tA rrwr,t'XPr rXPr3sFhM]EX]䀈e @}~uE Ë6j e Àrr"ve r  Āu辎e À Ātí$ȆČՎ݋6>;6@u 6>ʀ2 ;><u}=6ht>htt60 6> ;6<uW6> 60 |ЎZY[X_^]Ϡ   to 6&(U _6&* U 36&,U6&.U6&0U6&2U6&4U 6&6U# ^6&8jUT h@6&: LU6 Jr"6&<$.U ,O6&>,U ,6&@4U 6&B<U u2y݋M]} xyURQ2֜譋Эȭح3 tr| tыˋ3wtTr)|3 tĊ╊֊͊ߊ2wt)Fu?t ΋?tXx&L\|ss@+L\|s3XPځu'wU2R@P"3ۋˋ t  tU tU t ڃD t t ڃX P3ɋ tU t D tU t D t t X P3ۋ t eʃD tU t ʃD |Èd @u u݈d u uɀ,@H yu3u\Dd d ŌߋތҎڋ6>D NjL uL D=}=~dt\H T 2\ Tt7 r.r4rwtЃ2y tër x xӀ(rr- ërĀu ëĀt=}7 T ƋT\ tsd 䀊NJފ2'3R،Ҏڋ6>;6@u 6>؇譋ЭȭӎۇӀˀ\LT 6&DU 6&FU y6&HU_ [6&J gUA e=6&L$IU# Gj6&N,+U )G6&P4 U :6&R<U %6&TUL 6&VU 6&XU 6&ZU6d6&\vUf6&^dUT6&`RUB6&b, ;6<u6>Ў]ˌЎˌЎ6> ;><u}=>hèt ttU t ʃD t ʃՁ?X P3RD t eڃD tU t ڃDU t ڃQ3ɋD t eDU t DeY]ыˋX t^uځu'2URVW_^譋ȭحЭ3r EU>JW@W<W8r";Tu ;Du;\u; s 2Y[_^<63;sb u;wARS3 tP t꡶ t[+[]蕒sOsO+‹ɰ ut ًʋ3jl ʊ怈t 24=t=t-Dt ø@u uu uր-,TL\@H y,TL\2u 3?u=T\DLڒë«| 瀸 \ .럌Ō؎Ў؋6>L uL t DDD=}=~ŠT t3ۉtN r6r,t5 t0\DLy"srrЋ\DLڒë«D=} L ᫎÃ(\ 《rr   r u쾩 tU؋ȃt 怊T\lDūë«]뇭ӎ t43݋Ӹ6>;6@u 6>2ɈL π倀y߈l 6>;6@u 6>3DDDDd d VЎ؋6>D uOD uELA\|D t(2ۋ3ۋ u&d yt3x_«Ë\3߭譋ӎ tB3ۋӸ6>;6@u+ 6>2ɈL π倀yl t3-VЎ؋6>D ubD uRLT\|D t52ۋ3ۋ u9d y3x_«ëË\3ҋ t3ԋ62t t6> ;6<u6>Ë6>D $4עË6>D $3ۋӊ\ P..>PXPX.t,SQVRWU\ .t 2]_Z^Y[qtX..X3>PXPX uURVWSPQ..&3یȎ26%Ɏ! %#!YX[_^Z]RP. t%.!XZ<^ The Microsoft MACRO Assembler , Version 1.25 BWASM.MSF @>L?})\|D t2ۋ3ۋY3 t? Ë\DDDDD 3rD\l|3?I|It@}Cs t& u)u1 "s 3ð23ߋuD uD uϋ،Ҏڋ6>;6@uh 6>،Ŏ‡ڎŇ怈t 2=t=t%-?Dt ø@|ul l ,uދl l l ,uʀ3,lllu 櫋6> ;6<u6>3 櫋6> ;6<u6>u36> ;6<u6>ÌŌ؎Ў؋6  @ @ 8/25/82 Ver>D?t t DD | u ;6<uz6>Ë6>d Ë6>t Ë>>Ō؎6>;6@u 6>Ë>>Ō؎6>;6@u 6>׋ ;><u}= ;6<u6>íáŌێËáŌێËË6> ;><u}=E$*ȋEM yDp=@} =~Dy @D D 3ҊD e 3ۊ\ ] 6 2xz yߋD;E|NS2ut:r2w7@iuEEDD92A+t$xtxt    @@ Segments and groups:Symbols: Size align combine class Type Value Attr Open segmentsOpen proceduresOpen conditionals: xpected Division by 0 or overflow Shift count is negative Operand types must match Illegal use of external Must be record field name Must be record or fieldname Operand must have size Must be var, label or constantMust be structure field name Left operand must have segmentOne operand must be const Operands must be same or 1 absNormal type operand expected Constant was expected Operand must have segment Must be associated with data Must be associat illegal Field cannot be overridden Override is of wrong type Register can't be forward ref Circular chain of EQU aliases 8087 opcode can't be emulated End of file, no END directive    AT BYTE WORD PARA PAGE MEMORYPUBLICSTACK COMMONBYTE WORD DWORD QWORD TBYTE NEAR FAR WB MIS1.MSF WB DOSIO.MSF , Open failed , Create failed , Write error  Text area read past end (   Warning SevereErrors Errors  $ WDEBWPS1:ASMERR.MSF E r r o r --- Block nesting error Extra characters on line ?Register already defined Unknown symbol type Redefinition of symbol Symbol is multi-defined Phase error between passes Already had ELSE clause Not in conditional block Symbol not defined Syntax error Type illegaled with code Already have base register Already have index register Must be index or base registerIllegal use of register Value is out of range Operand not in IP segment Improper operand type Relative jump out of range Index displ. must be constant Illegal register value No immediate mode Illegal size for item Byte register is illegal CS register illegal usage Must be AX or AL Improper use of segment reg. No or unreachable ?(=Rg|7Us:Xv ".CXm=[y"@^|)@@?<g F g  F @BBN         ^ t t t t t t t t in context Should have been group name Must be declared in pass 1 Symbol type usage illegal Symbol already different kind Symbol is reserved word Forward reference is illegal Must be register Wrong type of register Must be segment or group Symbol has no segment Must be symbol type Already defined locally Segment parameters are changedNot proper align/combine type Reference to mult defined Operand was expected Operator was eCS Operand combination illegal Near JMP/CALL to different CS Label can't have seg. overrideMust have opcode after prefix Can't override ES segment Can't reach with segment reg Must be in segment block Can't use EVEN on BYTE seg. Forward needs override or far Illegal value for DUP count Symbol is already external DUP is too large for linker Usage of ?(indeterminate) bad More values than defined with Only initialize list legal Directive illegal in STRUC Override with DUP is _  <8087>= @ 0 !!  %%0@ @  @2 ```D1 $1 E??---- E R U(8 `dlT`@ @`(J % &@% Page SymbolsU -U  U  &?End of file encountered on input file8@  . . . . . . . . . . . . . . . .-   N a m e Macros: N a m e LengthStructures and records: N a m e Width # fields Shift Width Mask InitialNONE''GROUPLength =N PROCF PROCL V REG NumberE Alias OpcodeText External GlobalOpen segment(s):Open procedures: U    U  U  :U :ASMSTB *Out Of Memory**Internal Error*M86IO 1#NAN1#INF1#IND?@@@@ @P@$@@ @4@p+ŝi@v~ ,vXvƄ ]q v v:uANFtgFv 2;FrVFtPvF~ar~zw F2Fvv:FuAЋF2 :ЉNuA NNF랋FFF] vv Px FF F~rqFv2v;r*~2PQvF r ~}.vvvvvFvF@FH;FuvFHF]6v2F~r1Fvv< t~} @F@FH;Fuԋ]v~E@DvD~ЋE~E]'v DRFv v~CDRF@F=uv |FuQFvPFPPvPvs#v | u|tv~ Ftv | u|uv 󥤋v~=;u@~Ћ2;rA ђ2v)vv Pv U@PF PUPF FPUqPF PPUbPF RPUSF]~,~,PvPFPvQvQNQFv FFF](,,dž$Ğ&2@ džĞ&@H; udžƆFFוC)@զIx@ڇzA=A2#sAGA~QCǑFͨ?I uuvHMn,P䧓9;5SJ ?W]=];Z R`%u.7@@v:k :@@ ? d'@Bʚ; TvHrN @zZƤ~o#]xEcd "m  mmmmmm m}xsmmm>mK$1;+g:PsmmUrdmeWkrWkvtt~}}Ћ2;v FvD[v~}}׋~}}DvttvD2PQvF ~|A FF] XFFvtƄ ,PUGsU ~/u&vt^wvt s\W~\uUF2FC~.u/vt~}=\t=.tvt~.uUgF@FF2FF;Fr*FFvt F+F~CDFF@FH;Fu܋vt F2+FDFFF~r$Fvt v~CDF@FH;Fuvt FD~:u vtvt |Ft@|tP,PvFP6,6,Ur7,PUP,Pv TP6-6-U,PUP-Pv P6)-6'-U,PUP+-PvP6?-6=-U{U;PUkUPFPPPUr PDPPPUhr PPPPUDr DPUs PUs 2;s~SPA-P 2+@vP PQ-P  džG] ]^. FFU+r;.wVn BWPS1:SCAN.MSF WWWW^^WyeW^mmmmmmm~smmw،$&+؁v&+. ....p2 t7  >t p2+H t!Gp2$G^ ˉ v~Ћ2;йwAv:FuB"ʈNFtvF]] v~F~ar F2FF])  Pvos/Pv_rv2v;rrv2PPvDP sRvvvh2vvA FF]Tvsvs%v~t 󥤋v~t~,Fv~Ћ2;wvv ~tF2PFP ~tF2PFP P`-P PFP P,P vP~Pv  HvvDŽ,v Pv DPD v2v;vX~=:uHPvP,Pvs.v ~DD:~v~tv ,UF:Pvms"~ R,,v Pvd.Pv=s/PF RP,Pvv~tv__@ NUL]: . :  CONUSERSource filename [ASMObject filename [OBJSource listing [LSTCross reference [CRFLine invalid: '', start again..4xvtb cd 4060DŽ0@0=u0&00N060ƄN 0@0= u닶ODPs Pi6 1 Pj6|ED 6|ED0@0=ty6P&P  (P#1P   PVPr  FPhPPP0PPP0Q PP0Q PP0Q 4PP0Q PP0Q PP0P 4PP0Q PP0Q QQ0R PP0P s' P<^ x6xhP r lPiPP0P s' P<^ v6vP r lPiPP0P s' P<^ t6tP r lPi P<^ r6rFP r nPi]]^. FFU+r;.wVn BWPS1:INIT865^bfjnrv`'/'G'M'S'f'l'''' 'B'Z'i''''''&'JJ5JAJJJ[.[>[F[^[l[[[[[[[[[[[[[[6[X[n[|[[[[[[[[[U[[[[[2[?[D[w[[[[[[[[#[3[N[t[[[[[[[[[![*[3[8[A[N[S[][b[[[[[[[[ [[5[C[H[x[[[[[[[[[:K====D=t====R=== = @ BIsy z $/SEn      .     aa aaaaaa3apaaa$a.MSF  CSDSESSSAXCXDXALBLCLDLAHBHCHDHBXBPSIDISPST-( Copyright (C) Microsoft Corp 1981,82,83U F30~ F30~U~L2Uf]UF~sVVFf]U*R3R)L2- 2RP2R  2RS2R ”RV2R vv Rx P2RvvMP? f]Uf]WB M86DAT.MSF M86DAT FF~u vDD vDdDF;Wu s="m"""2":"C"P"B>y>>>P>>>>>'>@>h>>>>>>>o>>>>>T>nA9O5Bcw  (7?qCx$7@IV3?D @PPPyPPPGPnPPPP z_zzzzzzzzzzzzz#zkzyzzzzzLicensed Material - Program Property of Microsoft Inc.3U> s> r PP[F'F~u'FF'F'FP HPFP HPFP HPFFF~t <t<t<t<t ƇY ;F$<t;^UPP~F^vD ;UtCP4P*ۊ^UPP~F^G ;n tP7P*~u P[^GFF$<uG+F8F$<tW^vDJF~u@%3~uF%^~u F%^FJF^GF YMZZS; `4 /4BJRct.? $OYsEw7@EMfn-Gh+nlnnnn"n-njnsn}nnnnnnBnnnn}nnnnJn\nsnnnnnBnNnZncnnnnnnnnn'n,n^nlnnnnnnnnnn n*nLnUnanfnzSzzzzzzzz z7z@Zo#Z_mu}<Tm,=X,E^hqv{.\!GS^D6DmDDDDsDDWDkDtDDDDDDDDDDDD D-DDDD6e3_5~-======N==~uÊcFS 6,]UP HPF^UPP~F^GF C r PP[ HP']U> wF'PPr'PPPPPuZ PPPu 6~ Pn G LJB Ƈ_ ㋶DBG _ @ =r &PP[]U~uT^FC^PS P6t   FFÀ?t6 6t 7DF+ FFt FI~vC^F^NFu  ~vvvjFNFFN뷡 Z@9FvF]UQQ> u% 6 ZP P6t   t #FZ vPF Z;r ^]UP HPFP HPFF; r^YFÊcN: t`> t8'PP5'P^LP*F^tP7^GPr'8'8'F  > vu> r  8''F'F^㋇JFv$' PY'^SP':PY'vP'dP5' 넉]U  F' 'sv~^FFv^FF;FwVvNj^ FNv^0vkrv^FFvv^0ksF+FN+N;sFƋNJ֋FBFFFƋNJ֋FBFFFF< r pP[]U P5'Ɔ H;vu s P5'<t5P5'P,OP*GPr'8'Ɔ: vÊW:t㋇SPX 艆Ɔ H;v\ˊc:tDPLP*FFtP7P*䊞8t-*ȴƋ^pǍ򤊆*1*Ƌ^pǍ򤊆*^8t)*ȴƍpǍ^*0^*ƍpǍ^*~}򤊆^]Udž^ ;s]΍PRv+P"u^ +^ p򤋆@P^딉]U ]U ]U ]U ]U ]U` ]U GP:PP"F~tx ȴ9Fti F F > u> ps> v> u5D"> t> ue > ut> uf> uZ> uL> u @> t> uJ+> u s> uD! HP'> u F'F]UFF;FrQƋ^0P*F^tP7FFÊOwP^wP*F^tP7^GÊcvTV<t`΋SN: wNPLP*F^ 8Gu/Ê c㋇SFV+бVFF PY'vP':P㋆J PY'P'P'P5'^udž ^GHPP'P'P5'^wP'P5'GFPr'^?vƆ ^*v PY'P^w P*GPr'8'ttOt> u> tP5'PP s <PP> tmP5' P6 nP6 n P5'PP P6 nP6 n]U^ _F;FsQƋ @,0FF<r< v'> w> t@P~w@Y"sP5' ]ˡ N U~t PP[]U^PPP"]U6d ^PS'P P']U6d vP']U6d ^GPP P']UF<v3j tF]U~vP6b vFPFPY'vP't : vh!Wtn stzPr'P5'Pr'8WtA8t;: w5QW,OP*FP5'^GPr')PY'8'F5]UDFFHFFF+Fr~u ~tF@FF;FwLHFv^Fv^0vksv^@N؋vF^@F묀~uFȈFƋJ։NBFbFFFƋ^FFFFF0vksv~^FFvv^0ksGv~^FFv0Pk tD PY'^ _ cSP'EP5'^GPr'8'] UƆ^?v :uƆ^:s ƀx\tx/u Ջ^^:sƀx.uƆ^?v :uƆ^:s ƀx\tx/u Ջ^^:sƀx.uƆtvt򤊆vt򤊆8t-*ȴƋ^pǍ򤊆*1*Ƌ^pǍ򤊆*.j >j tvvNFYFF) )F몉]U~v16b vFPFP.j >j tF) )Fɉ]UQFPPr'F]UP6 F'F HF=v PP[ZPvr'^YF <t ѴÊc: w@"s   ^FJt ^c F s[> uT Z > v1d Fd 1Pt[6t D~tFd Fۋ> Z]Ud ]UQ\ s 6f F> t8' s 6d F ]UQ   s 6d Fv5']UQ > t 8' v5']U[ sZLP5'#[6b FPjFYP5'vP'vP'`P5' PP'8' s 6d Fv]UP6n P*F^G F^tP7P*FFFÍGPr'~t-(PY'PvP*F^GPr')PY']Uvv]UQQ~toP{P^Pw F8'[ v]U츖PEP5'vP'8'vu]U [ h FFun QPFd Fу> th~t. P5'> uP5'6 $'P5'> tsPY'P5' s 6d F []U~ }6t+JVu P5'v PPF sL^t4^utG;FuG;FtjP^7P*F6~ PF^G FGFG^ F| ^ >h uh PvP*F^ ^G]UQ a ]U a ]U ]U ]U^?tP"^:u?u GDAƆ:ƆPP P^~t FF멋FxFr\]U^GP6P"tB^+Iƍp^+HPuP6 ]U F^GP:PP"F~u ^F^FFF^ヿLt%Lvs~tHFFFρ~u \P5'-F^  ^ć\FF^> t'sP5'vr'yP5'}PP[]UQ^?t6^^:w&^vtt+JVt]U~ =FNu+J]U ~t^F P*F^GFGFu@FGFG F^tp QPP*FFz FX ;Fu FrX ;FtFs 6b Fz GPGP>PPPb >b tz :uG,AFd Fd P5'z GPr'8'F:] t@P~u@Y"P~u@Y",PQ8Ft@Y"Y Pv6Y s 8'P5'P>PPHaF>> uښ8'Fd Ft+^<F*VV6b FPWF^FX Fs6b Ftv[~tZ s 6b P [ s>DtDƆZPPPuE> r P`P[PPP ~  4 ]UQ^^:u8^F~t.FȈFƋ^H^:Ht s @2< tа]UQQ^FF~v#FȈFFȊN΋^H 2ԊF]UQQ H%F F;FvF FF =r )PP[PvP*F]UPvP*F,F^Pu| FF^8FwFƋ^FuފF^GvD| DvF F _Pv >PPP^㉇^㋇Fu~t ^P0P[FPPP+?tP1P[G W‹v扄$GGFF~vFF1FF^<] UQQEHIGG; r@"ErEsgFEJPPFrEGX h F h G㋇b Z P*[Z Fh 뒊GFIGYH]UJsEPv P*F^OwIrnPGF[ ]U^ t7Fs8'^GPr'P5' PY'^ Gn #[] U d P5'zFF=w ñcJLÈ^Fs؃>d tG s P5'> u P5'> t'P5'6 $';P5'8'X P*[> ;n F~?w^LJNLJ,OFsX P*[ PPHaF8'Fd = P Pd F s5d yP5'^PP8'~t F]UQF ~ QPP*z z G|  sNP6| P*F^G:Fu-^| uˊFs 6~ v]UQQv MF^㋇ ~  >~ upFrb ^ PY~ z ^㋏ ÉG~ Gv ^~ ~t PvHCP6~ P*z v z GPs6~ vv~ z ~ F]UF~v^㋇ F~tPvP*FF^FGFsNPvP*F^FGF8Ft~uvvvvFP^ P*G4$sG4$DDPDPSP>ud d P5'GPr'8'P5'ƆƆPPPHaud JPsCPG P*F^GPvGP Fs^ F] U ^ ㋇Fv F P%F~tF^F^  ]U ^㋇F^FNȉNFFFF~vT^ F^ NFV3‰FF^3ÉFF3ÉFF3‰FNFN릋F1vVF%1VF1vVF1V~uF~uFFP^F$PP+FF~%sa^v8u %tPb^vFPvs^F@FË.FFFF%rn%뙋FFF;FrF)F_]UFPv vaF~uu~tl~tfFFËNOWF GWWW W WsRƍPQHa^G^GGv&G &D]U^sQGFGO NO NSFPPa^Fv^wSva;Ft]U ^G;Gt Fr^G;GtSjtr^GG G G OsAFG FSFPPa^FFPwS^wHa^G^G^u Fs5^GFGF^GH9Fw^vFs^G]UGPV]UQGvV]UQGvV]UFFw"ÊMs LPFFs։]6_UQFFs"F^Gv5'^GPr'8'FFF;FsJƋ^8 u>t1v^8 u vv~^FF뮋F^GF~uF,8t@P> t@Z"P> t@P8t@Z"Z "Fs F~;u~u ~;u]U > w Ƈ  s l v      [ \ HPPS P PP~ x G PPP G  ]U,,FdF>,sp,Ƈ,^u~ =NF] U~t~u$^Grvt va]U~ t+~ t%v PFPFP.F~t~t^&^&]U^&~t~uXvPuD^G+G^&;FvF&^GGPv &Z&T^&^G] UQQ~tf~uPFPPaFIvP+u9^GFwÊNF^w;wvw^G;GvG^]U~ t~ uPFPvaF^ GFF~v|v Puj^ G+GF;F,&G&FFw@vNP&x t@Y"sv֋F&F&9Fr@vP&x t@Y"sF&8u &G]UQs 6F]UF&9r&&G 6&@F< s< u&&:GrYv5'&&t&OPGP}PHa&G8'&G&G&@ &PFPF~uR>,uF,,ƇH/LJFsF,@,,FF=w>,ZuF눃>,s PVP[>>>*,,,,,]UQ PPS > ]U졾&^&Z&WF&;Gr]Uv"^?t>1򤍆P^P PPP >u~ ]UH`[]U >PP +  a ` d ƆsSƆƆP6PovFF^v0~ }^9N^ FGG;GvG^ G;GvGFF)F~]UQ~ t~ uZv uJFFFFfF^ G FG SFPPa^F^ PP]U ~ tz~ tt^ G FO N9Frc9Ft@P9Nr@Y"rKF^ GFFF9Fw19Ft@NP;Ns@Y"O rF^ +G G^ GSuoF%^ GfFG FG SFPPa^F^ GFSPS^wHa^ Gv |L+ϋ^9]U~ t~ t^ G &&HN& s tvv]U$vF݀~@ts PP[P~FFF<,u@NP+u@Z"P;u@Z"P~ r@Z"P w@Z"P:u@Z"sFܴƈJ޸PfFF똀~ t FݢFܴBNQPP6P>u(P5'FP5'P5'PP[vF݊F݉]U Fs ^GvFF^,9Fr@NP u@Z"P,u@Z"P;u@Z"s' u~tvF^FvMF띃~vvF^8 uN頶t4ƀ+u ƆPP:P+P >u NP P[P6P*ƆPGP PmP :u A;sHΊAI΀:uN/t\u몋 r򤊎 򤊆 Ǎ|ƆsPPoP"sPP PP P PP HG:uA Ɔr>,u*z Ɔ  QÍGP PP 򤊎 򤊆 ǍƆPPoP"t-s%z QÍGP PP PP D+smƆ sZƆƆPPot;r4ƀ+u ƆP&P+P 랚PPPkaaPP PPPd >d u P!P[P:PP">d t>d u] t,A]  ]UPP[]UQF'FJF Y 6,]UP HPF^UPP~F s ^G ^GF> vhF'F~tF'FF'FF'FѸP6 FP^YLP*F^uFG둃> v :PP[]U P ȴPP6 8u'YS㋇JX> w F'PPr''PPPPPt PPP sS _㋆BGȉOF^cF^cNˋS+SNv FFPFFFFr@s FFPFFr@s FFP> uCF Fl P5' SP'P5'6l P'8']UQQF$FFs8Nw.PPFPPFF$FF$FFsF^ F F^ F ]U s I  ȈNF: v:FvX> uv+6t F ?^ WF㋇SFFF^NPFPP6   ]UQP5'#[FF%tVRF'YFF;Fr;FvF]UF'PPr'P6n P*PPP~ G ]U> vm> r PP[F'PPr'PPP ~ UPPs~ v  댉]U> s> r PP[F'F~u'FF'F'FP HPFP HPFP HPF~ux !^㋇U;x t ^㋇UFv PP~F s4> @r PP[ ^G^G6, @ =r LPP[2d d tPt[Pr'P5'#[8'tËd džĉ]U> v\F'PPr'PPPPPuPPP띉]UF'FF'F HPQPr'Y~uN> t+Ju K P&> t+Ju ~u s P&]UQ F' ' > v> pvy> u_m> t> uX> ueJ> u9>> u2> uP5' F+JPP'8']UQd Fd Pt[vD~t Fd F܉]UF'FFFFt ȉNZFFPFPFPFP1^cF~t^cFF> t.~u+~u~vFHFÀ?u ~tp~tH^FS+SNȱFFF~s;FsvFFFFFss~t  F  FS+SNFF~sF;Fsv~uFFN+ȃ FFN+INFF^FF^.'^FFF=rt=r UÉ,O ^GFFF~t <t<t<t<t ƇY F$<tx^UPP~F s9^vD ;Uu@P|u@Y"sP4P*FNj^t/ ^U ^UPF s< ^GƋ| L^㋇U^G FG n G FG  ^GFF$<u F FF$<u^GFG9FsF~u ^G@%.~u^G%~u^G%^GF^G 8FvG $V ˆG ~t#FF^;Gs PP[FFF^G^$> u> t> t! HP'> u F'FW]U~ uF; r^Y!~ u1F; r^ ^ËJ^5~ u"F; r^_v㋇Bы^^]UF'FF$<t ^S㋇ F[ F F$F<wPPFF$<t^S㋇ F[ PPFF$F~t~u FFFFvv^ P^Pvv^P^PF$<u '^^]UF'FF$@<uFPFPFPFP~uFFsfv^F^T^㋇S^6 vvD3F^^^㋇S^6 FPˤ]UQQ> vpF'FFFF$FF$F^.F$PF$PPvFPPvFPs}]UFs(6 F @ =r P@P[] U6 F  @ =r PAP[] UPF PP+NFPF PP+NF> u^_cF^_cNÊW:Wv^W^:WsF:Fu^  G^;GwɊ^㋇SF^㋏SN FFFF^GFF%FF^GFF%F9Fu|F;FwF;FulF;Fa^GFvDFD8Gw^GF~v,^ F^ N:wF:FrFFN΋^G^:G]UQ^ GF<t^㋇J^ G6,] UVF8 u(d Fd .Pt[~tBFd FP LP*F> u ^G ^G sVJPPPF^G $ ˆG s!G ,v G 6 | L G ^GFF HN F-^㉇S^LJJ F HN;wˊc዇QJFuؠ  Ƞ;s ƇWW PP]U XF^㋇OP%QFZSVrFf~u F@%7~u F%&~uF%FFf%FFFFFFF%F㋏S;Nr;Nt@QP;Nr@Y"sFSFQFsXFFOFr@sFFHFr@sFF FFPvS ]U~t(GP&PawPQPRP[F FMZ  ㋇SFl F:uFb㋇S+HQ+Or@s%F衔 Fꊞ㋇NF cˋSV QVFN҉NVԉVF%+ȉN܋F FԱF؉FFF⊆F6f FP P P PFPPC=P6 PPヿNt PiP[~t~v6f PP3N㊞㋇QS:vÊW:t㋆;Q;vˀctPLP*F^ tg ^cvD FÈ^F; s=QLP*F^G ;Fu t ^cFFtX F HN;wˀcu cFuՠ s F F^c: w%ùSQOXuҰ~@F + F HN;vˊcPLP*F^ uvDS^GF<t;À t c:v F^ F: u :FvF^G PFX$<uFFFXPPP[]UQFsN ^& FF F~v^& FNF s ^& ]UFF FFFf~ w<FF =vF FF FFH1FvQv vPNvF^F+ƉFF~ t>FsvFPvC=6f FPv PFF)F FFYFFFFFN;w^Ί:FuMF^FsPFPPC=6f FPP PJ^㋇NHNt+FFF;FreƊvFF] U>^tB^ Gu@P;Su@Y s*6f PP@v묊POQP ㋇OPY#;v!3 FF6f FPWP!6f  PP P 6f P\ ] . Ќ+؎72!7!PU&]UQQFNȈF<uFNFFF~rn^-F-F,HN;w,ˊ,F<t:XvXW<tƀzuF:FvBF^LJJ^G WvDOFt s^cFÊNꈏX FF:Fw ÀWuvPFؠ r F HN;w ΊFBFu^㋇OFLJO: w3ÀWt"WrPqWƈZuĊ^FOF: v@PWu@Y"s֠: wPF HN;wrPFuFF: w ÀWuvPFנ sH^㋇OQSFF FFƆ: wÊW:t uËQSƆ <r˴ÊW:u"u> t^$<tŠËS+IQ+%Or@s%Fԋ%F։FtFFԀt ~u^:t Ɔ:ƆƆ^OwǍ򤊆^GtǍ6s򤀆PPPkaPaFPP>PPPf >f ut PP;FF^-Fulj]U^ƇH/]UFFF;,s,À,u,^㋇;Fw FF,FɊ,,toF,F^F;,s,À,uF^㋇;Fw FFFFɊ^H/s^H/sSPs,:Ft~FF,F,~Z,,^,,FƉ,H/^H/,Ƈ,ƇH/,]U,FFF~w@VNPr@Y"rFȈFÊ,Nt'΋*惼u   ÊH/s~t vvHFFF FFF~uvv"FFFW~t vv]U,r,~v F,,,F, FPPPkaPaPPPa>u PP[P6sEd Fd P5'AFPFPPaFP5'Fd ^,F*ƋËFue,FF,,,FFFFFF~v6^,F*ƋËNFFNċF FFFFF,F6FYF FN랊^ F;v P[^^㋇Fu v ߸FNF 뱋F FFFFNF~w@^^NAP9t@Y"s!v vPuFNFF6FPPa^F6v SFPHaPFY;t P[FF ]Uv v v*F %+ȉ;NvF]U~ v0vvv P )F Fv >F ]U^F,*F,~s=v PP[]UQ,s26aFPPaF~t u2^ Gr~tvv v^ P>F]!sH0UV^ !]UVF=]U^VN F B]UFLU^>=t3]UV3ɴ<]U^^V N @!sH0]UVAZ=t3]U^^V N ?Ǵ!2Too many segments Too many groups Too many external symbols in one module Line numbers for H  Abs Ovl Res ( Start Stop Length Name Class Resident Overlay H H H Origin Group PPa^F6FPFPaPFY;t[ PP[~v^ƇH/FN]U,,:F u㋇;Fu Fsv vPF~u^-F;,sË,`,F,FF,vFYv vP+F,^-ÊN ,F^H/,H/^Ƈ,ƇH/F碶,*,v vPF,^-ÊN ,FsI;r 6PP[^ ㋇*Fu P[^^㋇FFF^ ㋇P[,]UvvvPF]UQFFwÊMsL Fs۸]UQQ~ }vNFƋ^ @]UQQ~ u^ PPP"F ~ r<6~ t+Ju6~ t+Ju0FukvF Pv Ir^FFw@vN^HP:u@Z"P/u@Z"P\u@Y"sv뾋^vx6t+Jul^vx6t+JtF^vx6t+Jt^vx6t+Ju Address Publics by Name Address Publics by Value :0 | G)3= DSALLOCATEHIGH LINENUMBERSMAPNODEFAULTLIBRARYSEARCHPAUSESTACKBad numeric parameter. Stack size exceeds 65535 bytes. Out of space on list file  Data record too big. LIDATA record too complex Input File: pos: Record Type: Cannot open file Invalid format file An internal failure has occured. Code is Cannot find file change diskette F~u,߸nF FFFvFPPa^Fv,SPHa=tF;u jPPP[,@,tFF,HN;wˀ,t㋇;FsFFuׁ~sFF,HN;wDˀ,t6㋇;FsLJ^F)^㋇;,r@,Fu,㡲,Fs ,ƇH/,㋇]UF%Pv F Pv+Y]U^ ㋇*Fu P[~wev vPF~tB^-,FFv vFoFsv^GPvv^GP,^u^GGFr~u ^G^G^G G ؉] UQQF PvPva]UQ~u^PPP"FnF=u'vFPv^GPt]UQQF PvPva]UQ~t/~t)^Gr^GP`t]UQQ~ uC~ unF^&S^&Gvvv ^ PFF]UQQ~ t.~ u FPvCvvv ^ PFF]U~ t~  in file(s): DS Allocation Loading High Stack Allocation = bytesAbout to generate .EXE file Change disks Unresolved Externals: There was ere error detected. Too many libraries specified. VM.TMPVM.TMP is an illegal file name and has been ignored .LIB Symbol table capacity exceededAmbiguous switch: Unrecognized switch: "" Invalid switch. >Cannot find library Enter new drive letter: Cannot nest response files. "" Cannot   open response file. DGROUPNot enough memory for linker. .OBJObject Modules [.OBJ]: No object modules specified. .EXERun File []: .EXENUL.MAP.MAPList File []: .MAPLibraries [.LIB]: Cannot open list file. Too many segments or classes CODEToo many segments Too many overlays. Segment size exceeds 64K Too many groups Too many public symbols in one module Symbol defined more than once: in file MS PASCAL FORTRAN 77 Program entry point at : in near Fixup offset exceeds field widthToo many PUBLIC symbolsToo many PUBLIC symbolsWarning: No STACK segment OVERLAY_AREAOut of space on run file .OVLCannot open overlayCannot open run fileBad internal reloc tableVM.TMPCannot open temporary file VM.TMP has been created. Do not change diskette in drive : Out of space on VM.TMP Attempt to access data outside of segment bounds Unexpected end-of-file on VM.TMP Unexpected end-of-file on Libray Program size exceeds capacity of Link CON:NUL:CON.NUL.CONNUL /dInvalid object module @ Microsoft Object Linker V2.01 (Large) (C) Copyright 1982, 1983 by Microsoft Inc. PASCAL.LIB    F@@P}]=(6Mr$P PȂ|Fv| u DD6|| t PiJ>t2 |:X3SS蹨H2 X2PV2 <XFB(B@ J..Y[]{}AEIOU.:+-JP @~XvփBDDF1n*<u   B K 0 1 2 3 4 5 6 7 8 9     2 n?<         ,6       "$6& (*,.08:H4       ;^ H****<_G****=`L***>aR***?bS****@cB****Ad B****Be K****CfR****DgC****G**H*****I*****K*****M*****OX****P99(9 Copyright (c) 1983 MicroPro International Corporation  8086/8088 WordStar Serial # WS9999XX release 3.30  COLEX-2050  backspacing standard  No communications protocol  Primary list device "P )BPY KMLpqÐ Ð *****Q*****R*****S*****(Vp6w6n?0$   -_ÐúuÊд!úÐ$4t$4tÐÐÐÐú t=!jtŊд! tÊ!$ uô56   YZRCDTTVV2CCTTBT2STTTTTTTTTTCBTTTTVUUUVUUVVSSVUfVVTVTUVVg  VVUTVTVUTTTTTTSTTRRTRfTTTTSSSTTfTTTTVTVU <NIQYdXfjly"+8AIW^o~YN @@@@ now now INTERNAL ERRORFATAL NAME OF  TO FILEMailMerge PRINT a file Ԡ  *** FATAL ERR F25: NOT ENOUGH MEMORY $ File  not found. Menus &  messages will display as @@@@ only.  WAIT  Print\paused MailMerge-printing\ \not\editing\ ڽ KJ@JJJJf뵍KMK,s2= J"rQRbJ1*ZY2rKpKS^VC<"t$< u1"t< t C^ˇVu[ð P!rtXĞONOF|!JAt1!uyS[n!s}txßAJ!ru< ußJAQRSP4%XPĞ$4 ?D uXPĞXĞ;sðJÍJ tFr@DJ"t?D tÍJJsÍK}pK_Ko KhJJ t;rðJðRSJРJt9 K[@tzKPčJ tXĞJ:u|BCuy P^XĞ@ aJSRPD @DJ  u#XPĞXĞZ[àJ tËJJPsEXĞytðEPQ uyuuYXĞßP tXĞà=D uu5S=D u$YjtKQJJtIJ>QJWJVJVJڊ t ڠJ2؇ڊ$_"JJt+Ӡ7JugJuUJ tIJڇڠJ JtFJ2J u yJڇ$,JuJ2J$4 uJޞևà tR$u< tF<u <u< r6S2ؠMJ u Ȑ$Jt<s$[ð  $_u2 t xD uJ uàJ Jt.7 ~J t< u<u<usJJJRJJJJÍJ$t$_tûJJJÍJuJJ tà2J uJJJ*JJJJËJ uàJ uËJұ.QJ ݊ y &yrrJ yJ áJHtۊ yJRJ)J[J t~xnx<s"zuq+s_#s JJàJ tQyUJJËJۇڋJڋڀ>QJ rڠ tڇڋJJJ%JJy JJJJSRڋJ+ڊ xJ[JCK[2Z[ù  ;uً3؎ދ;u++3؎KJCB؎2õxxß۞ßڞÇڟ+ڞË+22+Ëñ2$tBCu;:xÊXĞÊtßC< uu![ZY^VQRR2BuZRB!<.uCZF< t ZYZY'tBuußPİ BuXĞÊ uCK <.u<GZuSG2GlGRG?ZG2urRlG;tnGEZG [ÍkGNsÍHCsuvϊ$Pޞևڠ2Gȍ,I:t5:t+Ƣ2GXĞHPRGr(가rZHXĞRI;Zt2ZXĞR ;tS>DtFKGGG G G;"y+t)&g{Vt8[ßP~XĞS8tPCuXEVED[E uuT uËVE t RSEEE;[Zu2eFàE tSDs[ Stt& t!'[ ËVEÍX E uÍZ E uÍ\ 2 1 S1FS1FڋLGSZ[ ufEB<tr<sßCPTCLXĞ7<u<t<t#<t ^ uÍ` 2ßޞ֟JÇKZZßPQȠD"$<t<u2<u~s<< u /D$u < s< t< tPİ^XĞ@YXĞ< r PD uXP< urFSu$[XSPID$< t4< t'>GGSXP>DuCڋOX[IGKH:r"IPċIG2؉IGXĞGG=GXĞSQRڋISڋCG+ـ>Du:u<*uuQRS= QRS >t QRS> u !<t $ u uðà u>ubQRS[QRSR $ tˈ $ $C $ô un s tH $CԊ:t t>uQRS> t  0!'QRS>u!$CCC2$[ZYSPčuGXĞ[Pt0XĞßPQSXETEVEPH[YXĞ<Y ZY[PQȠ u>u(RSPXĞD>tpHB>uYXĞßPQំP2XĞSD2y 2[y,2[ßPĠD u!SQ ًGG$KG ň24FY[XĞGGPĠD u tQRSD[ZYXĞS4F t؋GG44$KG[XĞË>Du/K&>Dut% - &  t áDPXR&t&$> u ؀>DuutëZ>Dut%-t PjPtXĞQQRSJ"S<ي"t [ [ZY2[QS!ڋ [PćXĞY^V^VRSڟP XĞ[ZtRZrRZ RnZ uCG tâGR u< uQD I:YA< rA< tßPăAXĞQC< sEr KYtAzPQRS6LGIH*S [uɊSRZD tG:u CBu[*RQYKJ:uuZ[XBu[ZYXĞ ܀>DuxD:IsßPS:D*PS&ID:s D+u÷PSDH:s` DPİXĞ<u}RtZP4XĞÇZu Q Y u-ֵ+=>u PXßPS u [XĞ>u PXßPS[XĞßPSS[XĞP  SDlPS\QR>u.HIʊ>gZY[XĞËH˷PSRSDtIG[ZD trQRZY[XĞàd tN>tkڋ^ڊנ] uSJSZX` uEڍ)>twS=GIGzGG+ڞ[׊PS[XÊطQ׋=GIuڟޞY< tSQPXY [< u H>IK:tùנuS6+[V^VPĊÍ+:tXĞ[QRSfFD{F[S< u< u<uo.S<t<t<u{F3F uVEKF uàF tt( S SV( F u, ßPq3F uXĞÊطہ1ޞ֋CÊط& ßPSFЍE u.4FPًDS ~v [uXĞ u[XĞ؟PQRSuF ÍE ut 2ELGyFSPE t<x F u)E tE tz | D-~ 2tOFIOZ)KF AFtj>Fc@Fd)NF>FPQRSLGyFSZ뻀>IPrRSPċLGyF+XĞ:s[ZßPİ XĞÊ u< sPİ^XĞ@RSS9:tC u$AB y<9[Jt̟BRS2]FVG[FTGSڃS;[r^F uRSK [ZY[ZSYF ޞֻ9R[ZɊ tGRS2BC$uu [Z[yPXĞ.CCÈC GG[YFZBAINuHEvREwCOxOVy$$zREZYFtð^FS.[ËVGY[[juS Y[Y[SQ$؋:u@؊:sSI,D*[sÇڊC u< u^I uJËfF[KCZYD<sàH<svpFoFnFlFPİ P2(XĞ^V<^Vj^V,^VD*7FPXĞDkF:lFylFàD:9FynFpF2lFkFeFiFijFZ QuD<\u < t2"GNGyF;rCyF[ZßPSE u)$t DCF"uz[XĞI^VRZ^VQC ubQS& +"FusFMsFZ rF/*t0tF u&& t+sF:9Fr 2sFrFТtF[YtFxð3 DuSC:s[tàF uQRSAFsF 0\+QS+/"ŰeF[Yt2UF'2SF9Fu,TFàVF VF uȢVFWF]FSF$ >+jFu؟CÍmFt[:xÊà+ utQRS UFxmF9F*tt_C>u!\XGZG\G\G^G`GbGdGfGhG7GjGßӻ::ޞFF2FËC2KFТPFuFnFpFjF%;SF?F@FlF_fFt>FRSF u< ub$? uO:t ޞC t=F"Wuh'2fFGt?FfߊȊ2$t tC:t[ZËWZE t II$uI yY$:u$ߢ1u$RЊ61 tC:t:uW  ZHhu< t< t ûsBuA,0r8< s4Rӟޞ֊жޞZ!r t ,0r< rAJ ßAJu uIB$ u< u< u<urHHHHHGGGGGGGGHHGGGGHHHHHHHHH H HHHHHHHNHHRHTHVHXHZH\H^HHbHdHHHHhHjHlHHH R [;~ S[RS2P qFoFX[PĞXĞ t[ 0 < 2pFqFoFC:u2lF$ōSF:ytWF uC6SFTF*<y,РWFVF*:xXF tƲu_FЊVF:stۈWF:r2WFUFՍ]F"tàF"tVF:s ƊƢTF͊u TF:s뉢UFLGyFVFXF  tn 1yF;yF% tdt ISFfFx QRS2XF_FVG[F]F u2^FE^F]F tQRSIȵ LGS Cu[C ڀ :r[ZYXFQRSڋ[Ft'[F<^F u^uXFrA_F.BZ tÍlGޞևڍ30fSD}uZrRuZYoF tD 2B uuGG2^QF4SF t!/ tDu8PĈ+F>-FXĞ^6/F"^VPĊC+FC-F/FXĞ^VSPQR+F<$r+tHٟۍ&Bڋ-Fڃ ޞZYXĞ^VË+Fۍ)BڊXEXE???????????ySrXYou are trying to run an uninstalled WORDSTAR.Please run INSTALL first. ^VP XĞ^FV$u<ut C@PWCޞ։C:l; ]< t\+ "Π, < t&PĠADDt HuøO>S,]*<sطޞ֟ޞ֟ޞ֟ޞְ:s؇[B0P7FH,9FȢu6PD@ذ>00uDDX u tD4DXĞtDQR诲ZYzۀ>u9[XĞ܍E QY EʍE.F/&FÛ>gP6H3۹´ <tGG1HpEpLpPp p p 2IpNpDpEpNpTp 3SpEpTp pLpMp 4SpEpTp pRpMp 5UpNpDpLpIpNp 6BpLpDpFpCpEp 7BpEpGpBpLpKp 8EpNpDpBpLpKp 9BpEpGpFpIpLp 10EpNpD  pFpIpLp This software has been provided pursuant to a License  Agreement containing restrictions on its use. The software  contains valuable trade secrets and proprietary information  of MicroPro International Corporation and is protected by  federal copyright law. It may not be copied or distributed  in any form or medium, disclosed to third parties, or used  in any manner not provided for in said License Agreement  except with prior written authorization from MicroPro. >D2mF財D Gt袑xGFS [諑jFlF螡XG7DJe ur,@ПC<:uCE t 뾰g_FpD|D$ upDSBC u[^VCPՐ誠XĞ^VQS+^VSD}F;ډ1Fڋ}FG;[S贞@ u<FtFs t[S$uuLH륊<ut똊<t#SF8[t%xHztvHm<u4qt_襍t'zHܟD蹢莋S :tC[t3 PuXĞ[^VPĊÍ+:t^XĞ[Y訏HH[SgJHQSR+RuB $% ? (Y/N): EDIT?  SAVING  BAKEDM+ ; + 赱*2uϊ tQRSFjG?͋hGstE u5菠GA|tpE tàE u uPSQRWVȎر "tLuD&SSB S,tSB St #S9^_ZY[Xt ÎSB S S À>Su"6P".$.$P.&'#.#PX.#.&'#XÐ Operating System has been patched by WordStar NFF~sF;Fsv~uFFN+ȃ FFN+INFF^FF^.'^FFF=rt=r E>F t+ 0)F"E t$K=D JKt2Z[YYZRQ:tßCB 4tXĞ0H QRR2BuZRB&<.uCZBJ< t ZYZY+tBuußPİ BuXĞÊ ußCS <.t7<:t3<*t/u <+t EE"Í:HtE ts芠D t|GujFlFu蹟+ DD ,uâ; ׯ2^V`&^VQS+^VS蚯D}Fډ1Fڋ}F螚蒟[S KC菟 u.hsR t#sFՊ t:Ŋ[S^u <+t HE ts)@H۪zt蕏 E u.龪.0ZDEAO9BD tàbDDDI,:rDBDÍi蜌Í4 RӌZt  ƌu E+DDt臥E t2sBHED$E Ía D u HESRQ$K+ sYZ[uÛ00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000G2!;u^rPXĞBy هډE EGXsu QyYrRZR6suDDډEShtsuS^VbsuSPċG+&NJ؉G2DIXĞ[^VS+G[y^Vs u& uK[GH*NJ[^VQRIZY[.ډEڠG؊H*:PrXDXĞsu[QYڊŊQu]EsËABtßPĐ$< u$< u ABXĞXĞQ $YSB u[ßPuXĞtP™XĞà4E 2Eun5E PuUXĞts4E tà2EfG*2EfG zƋLGڟBEpڟJrˠ4E Et |uËdGڊQSD;E u4(B,KB2KCڊ2E[YñR t<u B CBۋ[KCà;E uà4E u9rFō uF;蒢9% @uÊжPSP ؟PčC賊XĞr$ڟޞ֟ޞ֟ޞ֟ޞևڊ" ƈ[XĞPS2DKt  t$uʊ¢C[XĞ鹤rZKōޖڋDڋDޞևڋޞ֊ xJ tSޖ/[ )uږrK:.*Ss[s$ut ö sSs[w"T;裟D<>r蓏>u+fH @~ jFlFƞ苟6胟=8ߞM-E uË>U2s:̀>u  >} Ɏ>u1>wlu7tu>t Bu u蕎uS`[>U RZR2Z[>UGW_C u睠}+P2pF諪XĞ{N EECEE:ȋ  6 󤹡C*BÌێ.DFKFAFàgF tËڠ<u?3rÍږtr3▍Ζ蠋gF2 uru urS[t藌rV tirut<Prukuˉ:tR/ ƊZtu_PQȎ &YXS菉[u Ju/贝ɎDDD뛠D<rߋnjFlF'o6Eޛ蘋B:ڒ6BZjBp a9s{IQ0 ENTER space OR NEW LINE SPACING (1-9): LEFT MARGIN COLUMN NUMBERumn)? (ESCAPE for cursor col RIGHT For decimal tab stop enter "#" and decimal point column  SETJUMNF TAB AT COL CLEAR./; A for all)? B艒@,1s< râ)ÍCF uhAEDQuâDDD:sÈÍGEF+u<sDȍD:rÈD:rÈZ*B߁ 38G+裠W!2_WG6>uZR[rHZu뀀>u++3&2&G__ww+ 膙n螆 uS_ [sh:uÈuu6t F F^FV>ud!LË*B&CMDCOMEXE`  \  i\9 +"  ec؎Ѝ&F> ueR+º tc3&N&P9ti> u\Ic" t "%#b%9RB&u ȎءRt-5PtH&R+RT& =u&\\ 󤹀> uŽں%R%3&&3&a&>u3_&> t& > uRP" t>u"Ћ&Rc./.> u;=tP3Xø5Í&F> u g&zRZeZcC\^C9\Z+Z\^!7eZ\\_ ڎ.._+ߋaÍ S[cbEXE@@@<h3GGHL Hit any key to return to WordStar: XĞt艐GhБESRQ+ $K hYZ[uQSq舐Vs2 :tC:Kt tuP" t.R\\ > t+3N&P&ZȣZ\^9iutjuQ> u6 "_~%Ȏػ#_l%Ȏ؍iRGzYtsX&:tk&] Xu." t\\ uPXPX+?O OGVX> u ںz 3XŽX҄..V> u PcXiV. Replace diskette with file , hit any key: *** file  still not found *** *** file  bad (too big ??!@&*) *** *** file  bad (too short) *** ***  found is bad or incompatible version *** *** Program is too big to be loaded in available memory ****** BAD .EXE FILE *** ^C Cannot return to WordStar. Replace system disk (if removed), Hit any key to return to Operating System: WS.CMD uXĞÊ ußC- <.t7<:t3<*t/u <+t u.d!LZ[QYu3R&ںӋccG'uXÄXËR&9G~'ZG+Љӌ;чڻw9ڃ>t+ȋً3Ҵ!9'!)t uzڍS[áZG!>t#'9! u>Ŏ&-uݡ.2ɄÀ+&&G!33.O F tàE tÍE˳^E uTE t E u .JbF u ,GDg G.JEtТ/J饇EF tsÍB.J虌=DK$KDE uGu GuàF t4sSK<DHuEtƑ[DD u CBuD<tޞ։M"GjFlFclFᛍG=DuQJKDUGtРD<u3DGJsDGJsDGE tJsG>D uSGCIC=D PЍGu0  j"&,48PAGE\ LINE\FC= FL= COL\MAR\RELINSERT\ONdecimalLINE\SPACING\Z=>68P t!r&QRSfGfG+R˲l  ZG[ZYXĞ QRSdG+1fGQKĉdGډfG[ ɟPQRSfGfG+ڲG& A y**ËANjA‹yjAt1j t[_PQRSdG+ˉdG AF F t x F x At+띋2GGßPQRSPsXĞdGCdGK8ٲb. 뇟PQRS柆PQR  SdGSQ‡ډdGY[ PQRS2ڊ ul砗 bG+J' u;u" u6$< u*< u#JACߋbGK+ʻ uIBut uIB$< uS< t < u܊ uIB$< uY*C' t Rڋ;Zs V뀰Ou t~hRZCRޞ֋ޞZÇ:uÊ' uâlNjڟK2S Ë [à' u=YuYjs+uyLH8ZPLRZMTXZMB^ZCPZPAZ[r< u2 iCAtuJ‹hGKV uSW uu)[L ËbGCϋFdG+ӋbG;sS;F[s Fźޞ։bGËhGFuF2+St ޞS^VSFfGZ;Ӈ^VsSF;[s + T&SF;[Fr2 F [hGQRIR豂KJCBuBuuQRS uusFjGQRSguʍjGhGr7rFhGuxōFB trÍ* B t褿õ<t Cu谿*S* F[QRS uN]bG.bGĺFOFŢNFPS?FKF u>F׍ʖQ [#D<s9tàjFP P2XĞjFFtWˠjFlF2jF2eFàD uG$< tWQs:us$<u:u<%t< s踦rÍ% tPF u s,يG K KuًCBB$ t>$?Ŋ9F$<r:s2Pİ~XĞr9R$u 3$uSVXsvPcshΖz"tҖh t֖X xB諦t2r< tްN ^rr< tRӋC;Zs!+ڋF;rFF;rFXĞRFڋL +ںޞZٟޞ֊׶sQRSڍZGC;ӟKr:+hG;r@DQSXGXs[YRiG;ZQRS<0^V訽[SQRSS^V製[fGRS[Z4rQRSss uFtuCQRSus8s uF/F2u ȠFxuI:uI:Y2*ÊذNJŠß6~VË\T ÊƋ]URZËdG;suËfG;rðRS[ZßPQRt!dGrfG*YYXĞ»R}ZQR‡ x0tϊ t?hG+fGC;ӟKrsڋfG )tϋbG+dG;ssڋdGڊ ZYHV:r,9FȢ tB< t]2+؊ xga:uRSPCX[ZKZQSNGLGRGPG-Z yXPG2 xC0;r;:sȵ t$< r <tBuY^VSKR*ZtSh [uàE tuA uà* uQRSEs(P; tX2PX< uâj^ޠ\ \CVu [F uP ؠ^Vr< t; k2,u]=; u(X[PĞ$XSPĞ-/C-XĞ[CYð@!OGt뙠i xSR0;hZ[sXĞ[YXĞ[2YÉ02ޠ`a u,<x%<sSh-[PXĞQSYTQ[Y^VRS5[Z^VTQtt^VYàF tàB uQSYPkXĞQ[RS<KQRS2`FȢEȢ_]$uꖋ$Du蘊+[Z餱PSRdD tOt tO:y Z[XĞ+ ujFmF tRF t2eFZ跴 'Z[XĞ<Z[XĞt@67FRZZÍ&PQRSэ+ʋӃ9/ƟPQRSٍ&PQ&PQRSэ+ʋڃޡ뾟PQtXĞYßPQRS2PQRS rh7ƟPQRSrT*6V t $uets uÃË$uà tà s $~$~m[XĞ,p uûԖljҖruCΖsR"Z uàD u3S"[rrKؖtCS",[rK RwZ" ul"ar wҟB"B" u JB2% txDuԊ|觯 ȯK{pKCrKCQJJRJSJ K2JJJJÍJf见BPğCI,:rK* ȋBXĞQRSڍZGCQKrX?hG=rzKKKKQSXGڟޞևs[YRCCCCiGZQRSgKKʼn^VC7K^V/[SCCC7xQRSSKK*[S茉^VC脘֟n'3ΟuF(:运CYSv4E y#Ί ußICBDP2D螞XĞD_ƙÍfG%sQtF5P2 FXĞRd ???Action(F/B/I/D/S)?Spelling Check Completed Add to Dictionary:  Add to Supplement: (Y/N)? s24E=ES苜ؑG跡&E ʟ[r[ s،e uúԎRCJ IJx& uÊ< uàGußPDXĞ u 7JyÊ8J u7J JJx uàHußPXĞ u 8JyQ9J uCȠKJȠLJY t< u Ju x y9J:tQRS\ S< ts <t<t dJÊō_JPĠ7J yXĞQRS\ SPĠyxuCޞ֍ J΋ڍIJRSQ2JТ7J2{JIUJ|KFuD<t?<t;<t7<t3<t/<t+<t'뵉JIJiJN͍J"2J3J uYNYZ[(͋â2Jâ3J ȹȟI u.J xܠ/J uh谹2EȰ27J2JJ7J u9YJڋ`J)͇ڋJޞSyJޞZ5s 2JPuXĞtHt<ÍIJc1$< u< u< u<u<u$<u<u<u<u< u<ßKu KKKÍNJޞ֋`XĞ校J tPSYJޞ։YJ`Jޞ։`J[ûڋYJ(ȇSbJޞ։bJ[àRJжWeJfJp3fP#XĞ<uC< u<t <t< shJQRS\ SZJ yxahJ tPıXĞ2ڋbJuÉbJfJ:|t O뾋ڋ`JuÉ`JeJr :uQY&TSchJ ugJ2 yoPčgJ2/ōyXĞR<t <tZ4ZÍeJ:uÈȊ uhƇsڟJrƊXĞQY:Kà urZ u镴u鲴u̴Ҵ Ȋu釴u頴u鰴ƴô yyu醴u镴鵴SKC[àdJ uȢdJ Eyt&rJ$<u<uJ x(Jz:rðJ  xiJs$<tÊ xàytQRSJsz:r"̠J tQRSe ̠J tEJ uFJڍ;JޞʟKCŠ< râFJ:rHJ:r:J:sÍdJËFJڍ;Jޞ֠EJŸKt:sCEJډFJÊ tƍJޞ:tCB:ËyJ iJ^J`t!/Cvu wȟCŠŠ Û00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 L  '2Kr-XĞCKZ[ÍK;$χڊ t JCɍ.J yjɍKCs)ڍJKu GEK̺ޞ։KMKKKÛ Jt ußPğBXĞ00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 'Uày t tJIJ{J λ?LS27J|KtC|KCLS]:S< uú`S< uúS< uúiS<uúN<uúP< uúM< tM<t <túcSC , :$ÊuɊ t$6JJuÊXĞ7J yJJ uàHußPXĞ< uàKJ t LJ uQRS\ S< uPĠ7J y6XĞQRS\ SPĠyxXĞQY:K$Š urW uu u:@ Ȋuuu4 yuu&SKC[àyt&rJ$<u<uJ x(Jz:rðJ  x}Js$<tÊ xàytQRSJsz:r͋QJK tSJPJußPğB BB READ? WRITE MARKED TEXT ON? 舱ꖍ"XĞ^VQS+^VS謰D}Fډ1Fڋ}F谛褠[S詠 u^s t{[S荍upuz<u3xt[t'賐zH蒠oDS :tC[  t P+XĞ[^VPĊÍ+:tXĞ[Y^HH[S蛐JH@LH8QSRE>F t+ 0)F"E t$K=D JKt2Z[YYZRQ:tßCB tXĞޏH QRR2BuZRB&<.uCZBJ< t越 ZYZY+tBuußPİ BuXĞÊ ußC <.t7<:t3<*t/u <+t r>q)>>q>>>?*?6?U?W?y???6q??q?q1@qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq For maximum help (full menu display),  select Help Level 3 by typing ^JH3.  This message will clear when a key is pressed.  TO HYPHENATE, PRESS -. Before pressing -, you may  move cursor: ^S=cursor left, ^D=cursor right.  If hyphenation not desired, type ^B.  < < < M A I N M E N U > > > CURSOR: ^A=left word ^S=left char ^D=right char  ^F=right word ^E=up line ^X=down line SCROLL: ^Z=down line ^Wjʖ* uð V00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000qq < < < O P E N I N G M E N U > > >  D Open Document File | Y DELETE a file | H Set HELP LEVEL  N Open Non-document File | E RENAME a file | L Change Drive  X EXIT to System | O COPY a file | R Run a program  F Directory + | P   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  M Run MailMerge S Run SpellStar < < < O P E N I N G M E N U > > >  =up line ^C=up screen ^R=down DELETE: DEL=char left ^G=right ^T=word ^Y=line OTHER: ^V=insert off/on ^I=tab RETURN=end para ^U=stop  ^N=insert a RETURN ^B=reform ^L=find/replace again PREFIX KEYS ^Q ^J ^K ^O ^P display additional menus < < < M A I N M E N U > > >  | | |  ^S char left ^D char right |^G char | ^I Tab ^B Reform | (from Main on󭭭 | 堠 |  L Change logged disk drive | | R Run a program  F File directory + | P  | X EXIT to system  H Set help level | |  孭 | E RENAME a file |  D Open a document file | O COPY a file | M Run MailMerge  N Open a non-document file | Y DELETE a file | S Run SpellStar ly)  ^A word left ^F word right |DEL chr lf| ^V INSERT ON/OFF |^J Help ^K Block  ^E line up ^X line down |^T word rt|^L Find/Replce again|^Q Quick ^P Print  筭 |^Y line |RETURN End paragraph|^O Onscreen  ^Z line down ^W line up | | ^N Insert a RETURN |  ^C screen up ^R screen down| | ^U Stop a command | IMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM;: < < <    M A I N M E N U > > > :: | | | ::^S char left ^D char right |^G char | ^I Tab ^B Reform | (from Main only)::^A word left ^F word right |DEL chr lf| ^V INSERT ON/OFF |^J Help ^K Block::^E line up ^X line down |^T word rt|^L Find/Replce again|^Q Quick ^P Print:: 筭 |^Y line |RETURN End paragraph|^O Onscreen ::^Z line down ^W line up |  Find Misspelling |^Q Quick ^P Print  B top block K end block |Q Repeat command or |^O Onscreen  0-9 marker Z down W up | key until space |Space Bar returns  P previous V last Find or Block | bar or other key |you to Main Menu.  ^K PREFIX (to cancel prefix, press SPACE bar)  END EDIT/SAVE: D=Done X=done,eXit S=Save,reedit Q=abandon  MARK BLOCK: B=Block start K=blocK end H=Hide/display  BLOCK OPERATIONS: V=moVe block C=Copy blockstrike  A=alternate pitch N=standard pitch X=strikeout begin/end  O=non-break space F=phantom space G=phantom rubout  C=pause H=overprint char RETURN=overprint line  Q,W,E,R=user printer controls SPACE=cancel prefix < < < P R I N T M E N U > > >  젠󠭭 | 砠 |  (begin and end) | (one time each) | A Alternate pitch | (from Main only)  B Bold D Double | H Overpri | ^N Insert a RETURN | ::^C screen up ^R screen down| | ^U Stop a command | :HMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM< ^Q PREFIX (to cancel prefix, press SPACE bar)  CURSOR: S=left Side E=top X=bottom D=right enD line  R=beginning file C=end file 0-9,B,K,V,P=to marker  SCROLL: Z=continuous down W=continuous up  DELETE TO END LINE: DEL = left  Y=delete block  ADDITIONAL FILES R=Read file W=Write block J=delete file  & PRINTING: O=cOpy file E=rEname P=  DISK & DIRECTORY: L=Log disk F=File directory + MISC: 0-9 = set/hide place markers N=columN move * < < < B L O C K M E N U > > >  砠 | | 堠 |  S Save & resume | B Begin K End | R Read P Print | (from Main only)  D Save--done | H Hide nt char | N Standard pitch |^J Help ^K Block  S Underscore | O Non-break space | C Printing pause |^Q Quick ^P Print  X Strikeout | F Phantom space | Y Other ribbon color|^O Onscreen  V Subscript | G Phantom rubout | 󭭠 |Space Bar returns  T Superscript | RET Overprint line | Q(1) W(2) E(3) R(4) |you to Main Menu. ^O PREFIX: on-screen formatting commands  S=line Spacing C=Center cursor line F=margins/tabs from line  L=Left margin X=mar Y = right  FIND, REPLACE: F=Find a string A=find And substitute  REPEAT NEXT COMMAND: Q=repeat until key pressed < < < Q U I C K M E N U > > >  | | |  S left side D right side |Y line rt|F Find text in file | (from Main only)  E top scrn X bottom scrn |DEL lin lf|A Find & Replace |^J Help ^K Block  R top file C end file |L/ Display | O Copy E Rename | ^J Help ^K Block  X Save & exit | C Copy Y Delete| J Delete | ^Q Quick ^P Print  Q Abandon file | V Move W Write | 렠 | ^O Onscreen  | N Column *|L Change logged disk| Space Bar returns  0-9 set/hide 0-9| |F Directory+| you to Main Menu. ^P PREFIX: Put Control Character in File  V=subscript T=superscript Y=ribbon color change  S=underScore B=Boldface D=Double gin release E=soft Entry #  R=Right margin W=Word wrap   D=, ctrl dspy%  I=set tab stop J=Justify ! P=Page display (  N=clear tab V=Var tabs " T=ruler display&  G=para tab H=Hyphn-Help$ SPACE=cancel prefix < < < O N S C R E E N M E N U > > >  󠦠 | 堠 | 󭭠 |  L Set left margin |C Center text |J Justify !| (from Main only)  R Set right margin|S Set line spaci  ng |V Vari-Tabs"|^J Help ^K Block  X Release margins | |H Hyph-help$|^Q Quick ^P Print  I Set N Clear tab| 󭭭 |E Soft hyph#|^O Onscreen  G Paragraph tab |W Wrd wrap |D Prnt disp%|Space Bar returns  F Ruler from line |T Rlr line&|P Pge break(|you to Main Menu. < < < H E L P M E N U > > >  | |  H Display & set help level |S Status line | (from Main only) ^S=delete character ^Y=delete entry ^F=File directory  ^D=restore character ^R=Restore entry ^U=cancel command  TYPE ^KP TO CONTINUE PRINT  TO RETURN CURSOR TO POSITION BEFORE SAVE,  TYPE ^QP BEFORE TYPING ANYTHING ELSE.  TYPE 1-9 TO VARY SPEED, SPACE TO STOP *** WARNING:  WRONG VERSION OF WSMSGS.OVR --  SOME MESSAGES MAY BE INCORRECT. *** *** WARNING  SCREENS OVER 48 LINES HIGH OR 120 COLUMNS WIDE  HAVE NOT BEEN TESTED AND DEBUGGED. PROCEED WITH  CAUTION; REDUCE WIDTH ands) also suppressed  0 command explanations (including this) also suppressed  CURRENT HELP LEVEL IS  ENTER Space OR NEW HELP LEVEL (0, 1, 2, OR 3):  The LOGGED DISK (or Current Disk or Default Disk) is the  disk drive used for files except those files for which  you enter a disk drive name as part of the file name.  WordStar displays the File Directory of the Logged Disk.  THE LOGGED DISK DRIVE IS NOW  NEW LOGGED DISK DRIVE (letter, colon, RETURN)?  Use this command to cr  B Paragraph reform (CTRL B)|R Ruler line |^J Help ^K Block  F Flags in rightmost column|M Margin & Tab |^Q Quick ^P Print  D Dot commands, print ctrls|P Place markers|^O Onscreen  I Index of commands |V Moving text |Space Bar returns  | |you to Main Menu. < < < H E L P M E N U > > >  | |  H Display & set the help level | IF BUGS ENCOUNTERED. *** WARNING: DISK FULL,  DELETING OLD .BAK FILE TO MAKE SPACE  (NORMALLY, THE PREVIOUS BACKUP FILE IS DELETED  ONLY AFTER EDIT IS SUCCESSFULLY COMPLETED).  CAN'T DISPLAY PAGE BREAKS IN A NON-DOCUMENT FILE *** WARNING: WORD TOO LONG TO FIT MARGINS  PUT AT FILE BEGINNING FOR CORRECT PAGE BREAK DISPLAY  Normally press RETURN only, or enter one or more of:  number=repeat count, B=search Backwards, W=whole Words only, U=ignore case, N=replace w/o asking, G=reate and alter program source files  and other non-documents. Word wrap defaults off;  tabbing defaults to fixed (TAB chars in file; 8-col stops);  page breaks not shown; hi bit flags not used in file.  For normal word processing uses, use the "D" command instead.  Use this command to create a new document file,  or to initiate alteration of an existing document file.  A file name is 1-8 letters/digits, a period,  and an optional 0-3 character type.  File S Status line | (from Main only)  B Paragraph reform (CONTROL-B) | R Ruler line | ^J Help ^K Block  F Flags in right-most column | M Margins & Tabs | ^Q Quick ^P Print  D Dot commands, print controls | P Place markers | ^O Onscreen  I Index of commands | V Moving text | Space Bar returns  | | you to Main Menu. eplace in entire file.to search for misspelled words, enter one of the following - RETURN=search forward, B=search backward  F - Fix word D - Add to dictionary  B - Bypass word S - Add to supplemental dictionary  I - Ignore word  HELP LEVELS  3 all menus and explanations displayed  2 main editing menu (1-control-char commands) suppressed  1 prefix menus (2-character commname may be preceded by disk drive letter A-D  and colon, otherwise current logged disk is used.  WARNING: You are editing the same file as you are printing.  WordStar will not allow you to save the edited version  until the print has completed or has been abandoned.  ALLOW PRINT TO FINISH BEFORE EDITING A FILE.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  CAN'T EDIT A FILE WHILE MERGE-PRINTING --  FINISH OR ABANDON MERGE-PRINT BE  FORE EDITING  FINISHING PRINT BEFORE EXIT  (type ^U to cancel exit command) ... FINISHING PRINT OF SAME FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  FINISHING PRINT OF .BAK FILE BEFORE SAVING  (Type ^U to cancel Save command) ...  ABANDONING UNCHANGED  ABANDON EDITED VERSION OF INVALID  NAME:    NOT FOUND  Now printing file  "Y" TO ABANDON PRINT, "N" TO RESUME, ^U TO HOLD: YED)BLOCK END MARKER BEFORE BEGINNING MARKERBLOCK TOO LONG -  MOVE OR DELETE IN TWO SMALLER BLOCKSCURSOR NOT IN RANGE FOR COLUMN MOVE/COPYCOLUMN READ / WRITE NOT ALLOWED THAT FILE EXISTS ON DESTINATION DISK.  DELETE EXISTING FILE FIRST,  OR USE A DIFFERENT DISK.DISK FULLINVALID COPY LENGTHADDRESS IN "HOLE" (TSTADR)MEMORY FULL (MAK256)MEMORY SHORTAGE (MKSP)POINTER > 64K FROM CURSOR (PPTOAD)NOT ENOUGH MEMORY DISK DIRECTORY FULL CLOSE FAILURE -  SYSTEM FAILURE, OR YOU Clable.  for spelling check, enter name of file to be checked.  (^R for last file edited)  For dictionary maintenance, enter name of file  containing words to add to or delete from dictionary  FILE  ALREADY EXISTS FILE  NOT ON SAME DRIVE  TOO LITTLE MEMORY TO COPY WHILE  EDITING OR MERGE-PRINTING  FILE  EXISTS -- OVERWRITE? (Y/N): FILE  IN USE BY WordStar   P=   Press space bar after reading screen: ***PRINT? MAILMERGE?  For default press RETURN for each question: START AT PAGE NUMBER (RETURN for beginning)?  STOP AFTER PAGE NUMBER (RETURN for end)?  NUMBER OF COPIES (RETURN for 1)?  DISK  OUTPUT (Y/N):  OUTPUT  NAME?  USE FORM FEEDS (Y/N):  SUPPRESS PAGE FORMATTING (Y/N):  PAUSE FOR PAPER CHANGE BETWEEN PAGES (Y/N):  Ready printer, press RETURN: WARNING: You are printing the same file as you are editing.  The last saved version will be printed, not reflecting unHANGED DISKS RENAME FAILURE -  SYSTEM FAILURE, OR YOU CHANGED DISKS INVALID SCREEN HEIGHT OR WIDTH  MESSAGE  Can't edit a file of type .BAK or .$$$  -- rEname or cOpy before editing BAD OVLY #BAD OVERLAY FILE, OR  WRONG VERSION OVERLAY FILE Overlay file  Not Found FILE  NOT FOUND  (The separately sold file   is required for use of chosen function ) Example (shows disk space): CHKDSK  WARNING : With all versions of MSDOS and PCDOS with version numbers  Invalid Dot Command Ignored: *** File Not Found *** But found, and will use, *** Cannot change disk in drive , request ignored Insert disk with file then press RETURN: *** No .DF before .RV: *** WARNING: Overlong data value truncated *** Invalid variable name in .RV command ignored *** WARNING: Data exhausted, null value(s) used ***** Print Directives *****  PRINT CONTROL CHARACTERS may be entered anywhere in a line  to invoke underlining, boldface,-  saved changes. Furthermore, WordStar will not allow you to  save the file being edited while the print is in progress.  END EDIT (^KD) BEFORE STARTING PRINT.  YOUR SYSTEM DOES NOT HAVE ENOUGH MEMORY TO  PERMIT SIMULTANEOUS EDITING AND PRINTING.  TOO LITTLE MEMORY FOR MERGE-PRINT  *** PRINT OUTPUT DISK IS FULL. PRINT PAUSED. *** THAT PLACE MARKER NOT SETBLOCK BEGINNING NOT MARKED  (OR MARKER IS UNDISPLAYED)BLOCK END NOT MARKED  (OR MARKER IS UNDISPLAless than 2.0 , running certain programs will result in an error message upon return  to WordStar. If this occurs, do not  worry; nothing has been lost but it  may be necessary to reboot your system.NOT FOUNDPROGRAM IS AN EMPTY FILE!?PROGRAM TOO BIG FOR  MEMORY AVAILABLE UNDER WordStar LET PRINT COMPLETE BEFORE RUNNING A PROGRAM  NOT ENOUGH MEMORY TO USE "RUN PROGRAM" COMMAND  File  Not Found --  Can't Run a program unless  is avai subscripts, pauses, etc.  They are entered by typing ^P and a letter. A directory  of most print controls is given on the ^P PREFIX MENU;  see manual for more.  DOT COMMANDS are special lines beginning with a period and  a two-letter code. They control page breaks, headings,  page numbering, page layout, etc. Dot commands are  typed in like other text.  Space bar for DOT COMMAND SUMMARY, ^U to return to editing:  ***** Dot Commands    *****  PUT EACH DOT COMMAND ON SEPARATE LINE, WITH . IN COL 1  .PA new PAge  .CP n new page if less than n lines left on this page  .OP Omit Page numbers when printing, starting this page  .PN print Page Numbers, starting this page (default)  .PN n set Page Number to n, print page numbers  .PC n Page number Column (default 33 (30 if 64-col screen))  .PO n Page Offset: extra indent when printed (default 8)  .. text comment, not printed  n inch (3)  .UJ OFF/ON "MicroJustification" off/on (default ON)  Use ensures that printed column alignment exactly  matches screen, e.g. for tabular material:  Put .UJ OFF before table, put .UJ ON after table.  Space for next frame, ^U to return to editing:  SPECIAL CHARACTERS in HEADINGS (.HE) and FOOTINGS (.FO):  # prints as current page number  \ do not interpret next character as a special character  ^K do not print following spaces if line of screen) *****  ^JS at left end of line is command now executing  A:NAME.TYP is name of file you are now editing  PAGE n is page number of cursor (disregards .PN's)  LINE n is printout line on page of cursor position  COL n is printout column on line of cursor position  INSERT ON shows if character insertion is on (^V command)  MAR REL shows if margins are released (^OX command)  decimal shows during decimal tabbing  press space bar for next frame:  .HE text HEading used until next .HE (default blank)  .FO text FOoting (replaces page number) (blank)  .PL n Paper Length: total number of lines (default 66)  .MT n Margin at Top: # lines, top paper to text (3)  .MB n Margin at Bottom: # lines, end text to end paper (8)  # lines text on page is PL - MT - MB (defaults to 55)  .HM n Heading Margin: blank lines between head and text (2)  .FM n Footing Margin: blank lines, text to footingon even-numbered page  PAGE NUMBER POSITIONING: If a footing text is specified (.FO  dot command), the default bottom center page number is not  printed. Use a # in heading or footing to position page  number where desired. ^K followed by spaces followed by #  may be used to produce alternating left/right page numbers.  Space for next frame, ^U to return to editing:  ***** Merge-Print Dot Commands *****  .DF filename specify Data File for .RV  .RV name,name,nam  LINE SPACING n shows if line spacing is not 1 (^OS command)  PRINT PAUSE shows if printer is stopped (^KP to resume)  when WAIT appears, stop typing. Press space bar:  If page break display is OFF (^OP command) or edit  was started with N command, then Status Line shows  FC=nnnn FL=nnnn in place of PAGE n LINE n .   FC=nnnn cursor position in characters (bytes) from  beginning of file  FL=nnnn cursor position in file lines from b (2)  FOR PAGE BREAKS TO DISPLAY AS THEY WILL PRINT, USE  .PL,.MT,.MB, AND .LH (next frame) AT FILE BEGINNING ONLY.  Depress space bar for next frame:  THE FOLLOWING WORK ONLY WITH INCREMENTAL PRINTERS:  .LH n Line Height in 48ths of an inch (default 8)  .CW n Character Width in 120ths of an inch, for standard or  alternate pitch, whichever is in use (see ^P menu).  (default 12 for standard, 10 for alternate)  .SR n Subscript / Superscript Roll in 48ths of ae,... Read Variable values from data file  .AV "prompt",name Ask operator for Variable value  &name& anywhere in doc't prints as variable value. variable names are letter then 0-39 letters, digits, -'s. .FI filename Insert document File  .DM message Display Message  See manual for details and additional commands. Merge-Print  is an optional feature, operational only if MAILMRGE.OVR is  on your disk. Press any key to return to editing:  ***** STATUS LINE (top eginning  of file, including dot command lines   space bar:  ***** FLAG CHARACTERS (rightmost column of screen) *****  < line ends in "hard" carriage return, entered by user  space this line break arose from word wrap or paragraph  reform, and may be moved on subsequent reform  + this line continues past the edge of the screen  - next line will overprint this line  ? unrecognized or incomplete dot command  !  M Merge-Print (optional feature) dot command  P page break  : this screen line is before beginning of document  . after end of document press space bar:  COMMANDS TO -- ARE --  move cursor on main and ^Q menus  scroll file up or down on main menu; also find (^QF)  delete text on main and ^Q menus; also ^KY  move or copy text on ^K menu  end edit / save file ^KD; see ^K menu  print (while editing) ^K type ^KV to move the text,  or ^KC to make a duplicate copy.  To undisplay markers afterwards, use ^KH.  ^KB and ^KK may be entered in either order, with or without  other intervening commands.  All above commands are on ^K menu. press space bar:  ***** PARAGRAPH REFORM (^B) *****  To realign margins of a paragraph after corrections, place  cursor at beginning of paragraph and type ^B.  To change margins of paragraph already entered, set matop before the end of the paragraph  and ask you whether you wish a word hyphenated.  Following the instructions that appear on the screen, move  the cursor if desired to adjust the hyphen position,  then press "-" to hyphenate, or ^B to not hyphenate.  To turn off "hyphen-help", type ^OH.  press space bar:  ***** MARGINS *****  To set left margin: Type ^OL. WordStar will ask for column.  Type desired column number 1-240 and press RETURN.  P  set tabs and margins on ^O menu  reformat text ^B; ^JB gives info  find a string; replace ^QF; ^QA; ^L repeats last  press space bar for "entering text":  ***** ENTERING TEXT *****  To enter text at cursor position, just type the text.  Use RETURN key for paragraph end or other fixed line break;  let word wrap form lines within paragraph.  Type ^V to turn insertion off (to overtype) or back on.  ^N may be used to creatrgins  (^OL, ^OR), place cursor at paragraph beginning, type ^B. To change between justified and ragged right, or change line  spacing, set desired justification (^OJ) & line spacing  (^OS), place cursor at paragraph beginning, and type ^B.  To obtain WordStar's help in hyphenating long words, place  cursor at beginning of paragraph and type ^B.  press space bar for more:  ^B reforms lines to end of paragraph as indicated by "hard"  carriage return (< in rightmost Or, to use column of cursor in file, just press ESCAPE.  To set right margin: type ^OR, proceed as above.  To set both margins to match text in a line already entered:  place cursor in that line, type ^OF.  To temporarily set left margin to next tab stop: type ^OG.  Margins apply to text subsequently entered. To remarginate  text already entered: set margins and use ^B.  press space bar after reading:  ***** LINE SPACING AND JUSTIFICATION ***** e blank lines ahead of cursor,  as before inserting a paragraph.  Use ^B to realign margins after corrections.  ^JM shows info on margins, tabs, table entry, outline entry. press space bar after reading:  ***** TO MOVE A BLOCK OF TEXT *****  1. Put cursor on first character, type ^KB to mark start.  2. Put cursor after last character, type ^KK to mark end  (for end line, use start next line to include RETURN).  3. Put cursor at destination, column).  Thus, it is important not to use RETURN between lines  within a paragraph when entering text.  ^B may be used to form hanging indents, change margins in  mid-paragraph, etc. The exact rule is:  "^B starts on the cursor line, at the left margin col-  umn, or at the cursor position, whichever is farther  left, and proceeds to the next 'hard' carriage return".  press space bar:  ***** Hyphen-Help *****  ^B will occasionally s  To set line spacing: type ^OS. WordStar will ask for line  spacing. Enter a digit 1 thru 9.  To turn justification off (for ragged right format),  or to turn justification back on: type ^OJ.  Line spacing and justification settings apply to text  subsequently entered; they may be applied to previously  entered text with the paragraph reform command (^B).  press space bar for "Tab Stops":  ***** TAB STOPS *****  !   To set a tab: type ^OI. WordStar will ask for column number.  Type column number and press RETURN. Or, to use cursor  column, press the ESCAPE key. To set a decimal tab stop,  type "#" before typing column number or pressing ESCAPE.  To clear a tab stop or all tab stops: type ^ON.  To tab: type ^I, or press TAB key if present. Tabbing  inserts spaces to next tab stop if insertion (^V) is on.  Tabbing advances cursor over text if insertion is off.  press  regular tab stop (set with ^OI, clear with ^ON)  # decimal tab stop (set with ^OI, clear with ^ON)  - other positions between margins   press space bar after reading:  ***** PLACE MARKERS *****   Up to 10 place markers, identified by numbers (n) 0-9,  may be set in a file while the file is being edited.  To set place marker n at the cursor position: type ^Kn.  will display to indicate the marker position.  To return the cursor to place space bar:  ENTERING A COLUMNAR TABLE -- We Suggest:   Set a tab stop for each column of table.  Clear all other tab stops.  If not at end file, turn on insertion (^V),  or use ^N to make blank lines.  Tab (^I) after entering each table item. After last column  on a line, tabbing will move to first item on next line.  space bar:  OUTLINE FORMAT TEXT ENTRY -- We Suggest:  Set tab stops at desired indentations.  Set right mamarker n: type ^Qn any  time during the same edit.  To remove the from the display: type ^Kn when the  cursor is already at the marker position.  press space bar:  ***** OTHER MARKER & RELATED COMMANDS *****   The block beginning marker, ¾, and the block end marker,  ˾, are set and moved to in a similar manner; the  text between these markers can be moved (^KV), copied  (^KC), deleted (^KY), or written to a file (^KW).  MZ X -rgin as desired.  For each item:  Type ^OG's as required for item number indentation.  Type item number.  Type ^OG.  Type text of item, without using RETURN.  At end of item, press RETURN. Left margin resets.  Press RETURN again if blank line desired.  press space bar:  ***** RULER LINE *****   L----!----!----!----!----!----!----!----!---------R   L Left margin (set with ^OL)  R Right margin (set with ^OR)  !   ^QP moves cursor to its position before preceding command.   ^QV moves cursor to start of last find/replace, or to  source of text for last block move or copy.  press space bar:  IF THIS DISPLAYS YOU ARE USING WRONG VERSION OF WSMSGS.OVR )t$p裺uDsЋDsu S ؟PC2Xr$[Êط PQR$t$tfuPC_1.b.u9'LXi1&7thú@ء....  ....3͙&E.&E.t$..r&u..r@a %X -O 5#F '  `D!DD(!D ..!.3L #1\1\!DD.  D 5u-SYSCON: Setting the DONE bit for the disk t`%ar. 3"  uà sCRB : |u.tBP |u.t.W|u.tb |u.tV  GGWQPXY_`^Ê<t<t .&D$=t=t =t=tTO..s....RP X%DEtZZthR..ZEE.E E.DE .DEEEEEEEÊ0 Disk format request. Drive .   g  ?g  ?.@.3...|.L...a.>.M. #..=t-.>q.>NÁ|t|t |ua q P.sq P.sx |uW.v -FsdPmX@.>u r@2.u ItV.t HQ.s |<.r nû<.q ^sBsB_UE3|ÃÃÃÃÃÃÃÃÃÃP Y.v E.u E.t E .s E .r E .q E 3TS .[2Dt .Mu"< t< u.E< .E.Eu.E.E@.;Eu.E.m.;-u.C`<  .asÁ|u|u L!Q2ËցRY`a` a`!a`1a$0<:rË%\ ËT @‹|.Ku;t.-&%&.&.&.&.&.u.{.9 g ?| uË\ TиrA;L upCut!t RSQL VT^Y[ZXt+\ٜ\s \C\D D %D BTuDLDusDt-V\SD PHD S+Á\. XD[\ [\^VPt Y[S.6V.6^Gu^ËT JT TRBTs TBTZVD.Dt$`^Dt../PV ^D D3ۊPºssB<.q 3.r .s X3Ҿm+sˁmDcrd.v .u .t .q .q .r .r .s .s .t .t .u .u .v .v q VT.^sq VT.^ars.v uC;r^+rUrKrAr7r-r#rrr2 P, <~X..}|t|tR|u6|t|ud|uZ.PXEtMtM.tuZ.Y.9tZxuZj.7.9tZVuH..9t4t.Ì33Cu$@ùù&&>u &Z&>Zú@Ì-ؿh2 \!<t+\c%\!<t !L!!\!!2%l m.u?O D5  {X%DEt PW_XEDDrive :  look ahead request block : , count : Vt ^L \...=u.&=a.&=.=a`.r.=a3...=u.&=a.&=.=a`.r.=a3......@.3..`.ar..>t.Gu.>. ub`.63...s tPt X&ËDLT P@;u3P;u7.PX]tt9]]tXXS.[s t+XXPVSt Y^XZ[&QR&ZTY[iPX=uM=uM =tÁM%.E.+H%L ;wWQt *Y_&..AC.;]u.FË\;\t.E.+H%uWSVt ^[&_..AC.;]u.Vd^\CD ;u\뢁t t|B.S .[Dt DuS .[D%2.S .[Dt DtTt»@%5#-|uûT. COLEX Universal System Interface. V 1.4A Loading Bootstrap.  Illegal "  CRB requested !  Bad command.  Bad disk sector.  Bad disk device.  Bad disk type.  CONFIG Bootfile file not found. $ Invalid configuration file $.!!!!!!!!EUOS:DISK:CHAR:NAME:FLOP:#  3 )  "$&*B FJN Rbf j@nrDD.DVmasm %1 %1 nul nul link boot_int+boot_pol+boot_dsk+boot_rtc+boot_tty+boot_sys+boot_utl+boot_err+boot_dat+boot_mal+boot_stk,boot,con:,nul LINK EXE |SZWS COM \4 SWSOVLY1 OVR !WSMSGS OVR !qBOOT EXE VG~ 3DOONEASMBAT.I~ _V.t0EEEEU E EEUE ^ .>tEE .>u EEVP. @t tDD t X^8DD'@È\ ËnFEU&G&G&@ &&&HN& s tvv]U$vF݀~@ts PPP~FFF<,u@NP+u@Z"P;u@Z"P~ r@Z"P w@Z"P:u@Z"sFܴƈJ޸PfFF page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.4 SUBTTL SYSTEM INTERFACE VERSION 1.4 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_sys equ 1 include boot_lnk.h .list .xall ;********************************************************** ; ; SYSTEM COMMANDS ; ;********************************************************** system: cmsp [si].comnd,REBOT ; reboot ? jnz is_msdos ; prehaps #   ;************** reset 68k board if possible call disk_quit jmp restart ; restart my side is_msdos: cmsp [si].comnd,MSDOS ; go msdos jnz not_msdos ; skip go_msdos: call disk_quit ; terminate disk handler call set_boot ; set up warm boot mov ax,exit ; exit command int sys_call ; quit to msdos not_msdos: jmp badcomand prog ends end D(!D ..!.3L #1\1\!DD.  D 5u-SYSCON: Setting the DONE bit for the disk t`%ar. 3link boot_int+boot_pol+boot_dsk+boot_rtc+boot_tty+boot_sys+boot_utl+boot_err+boot_dat+boot_mal+boot_stk,boot,con:,nul s ; trycnt equ 4 ; retrys on disk NUM_DISK EQU 4 ; number of disks allowed by gifdic maxsys equ 1 maxdsk equ 8 maxtty equ 16 maxrtc equ 1 disk1 equ 3 ; D = unix disk 1 disk2 equ 1 ; B = unix disk 2 disk3 equ 2 ; next disk for unix disk6 equ 2 ; C = unix disk 6 if new_68k ram_68k equ 0h ; was 40h : upper start address else ram_68k equ 40h ; upper start address endif  page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.4 SUBTTL STACK SPACE 1.4 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_stk equ 1 include boot_lnk.h .list .xall ; STACK FOR DISK OPERATIONS dw 200h dup (?) DSTACK: ; space for system stack dw 200h dup (?) STACKE: PROG ENDS end ; program start address masm %1 %1 nul nul link boot_int+boot_pol+boot_dsk+boot_rtc+boot_tty+boot_sys+boot_utl+boot_err+boot_dat+boot_mal+boot_stk,boot,boot,nul /map  stack_up equ 0000h stack_lo equ 1000h prog_up equ 5h prog_lo equ 0000h rfport equ 0e204h ; access to register file rfdma equ 0e206h ; access to dma r file cr equ 0dh lf equ 0ah etx equ 04h tab equ 09h sys_call equ 21h ; msdos system call exit equ 4c00h csb_size equ 32 csbmax equ 32 crb_size equ 32 ; size of one crb crbmax equ 64 chtbsze equ 4 ; size of char table records num_chard equ 4 ; numbewr of 80186 char devices dktbsze equ 4 ; size of disk table entrie$   OTLINKBAT J1 EQUATES H z9 MAPIT BAT iv* BOOT MAP6I~ ic gifdic public sys_flag public doboot public ram_size public gifl public gifh public pending public con_fifo public prn_fifo public dte_fifo public dce_fifo public drvno public dbuffer public start_move public first public stboot public lenboot public mapbase public unitno public wdtab public cntno public oslabel public dklabel public chlabel public chtab public osstart public nmlabel public fplabel public num_flop endif ifdef boot_mal PGROUP GROUP PROG PROG SEGMENT BYTE PUBLIC 'PROG' ASSUME CS:PGROUP ; public equates for each module ifdef boot_int public restart endif ifdef boot_pol public domailbox endif ifdef boot_dsk public is_disk public disk_quit public disk_init endif ifdef boot_rtc public do_rtc endif ifdef boot_tty public fifo_out public console endif ifdef boot_sys public system public go_msdos endif ifdef boot_utl  public mail_start endif ifdef boot_stk public dstack public stacke endif ifndef boot_int extrn restart:near endif ifndef boot_pol extrn domailbox:near endif ifndef boot_dsk extrn is_disk:near extrn disk_quit:near extrn disk_init:near endif ifndef boot_rtc extrn do_rtc:near endif ifndef boot_tty extrn fifo_out:near extrn console:near endif ifndef boot_sys extrn system:near extrn go_msdos:near eecho off echo echo echo Welcome to COLEX MSDOS. echo echo echo To boot COLEX VME/681MP PDOS, Please type: echo echo "A>boot pdos " echo on public get_flag public set_flag public tst_flag public clr_flag public xor_flag public set_addr public get_csb public test_boot public clear_ram public set_mail public get_boot public get_addr public set_boot endif ifdef boot_err public perr public end_com public badcomand public signon public ptext public phex public pspace public eom public badcrb public sys_prn public bootname public errmes public cfmess endif ifdef boot_dat publndif ifndef boot_utl extrn get_flag:near extrn set_flag:near extrn clr_flag:near extrn tst_flag:near extrn xor_flag:near extrn set_addr:near extrn get_csb:near extrn test_boot:near extrn clear_ram:near extrn set_mail:near extrn get_boot:near extrn get_addr:near extrn set_boot:near endif ifndef boot_err extrn perr:near extrn end_com:near extrn badcomand:near extrn signon:byte extrn ptext:near extrn phex:near extrn pspace:near extrn eom:byte extrn$   badcrb:near extrn sys_prn:near extrn bootname:byte extrn errmes:byte extrn cfmess:byte endif ifndef boot_dat extrn gifdic:dword extrn sys_flag:byte extrn doboot:byte extrn ram_size:word extrn gifl:word extrn gifh:word extrn pending:word extrn con_fifo:byte extrn prn_fifo:byte extrn dte_fifo:byte extrn dce_fifo:byte extrn drvno:byte extrn dbuffer:byte extrn start_move:word extrn first:byte extrn stboot:byte extrn lenboot:word extrn mapbase:word extrnmasm boot_int boot_int nul nul masm boot_pol boot_pol nul nul masm boot_dsk boot_dsk nul nul masm boot_rtc boot_rtc nul nul masm boot_tty boot_tty nul nul masm boot_sys boot_sys nul nul masm boot_utl boot_utl nul nul masm boot_err boot_err nul nul masm boot_dat boot_dat nul nul masm boot_mal boot_mal nul nul masm boot_stk boot_stk nul nul link boot_int+boot_pol+boot_dsk+boot_rtc+boot_tty+boot_sys+boot_utl+boot_err+boot_dat+boot_mal+boot_stk,boot,con:,nul :drvno,ah ; to use get ax,[si].COMND and al,07fh ; clear flush bit cmp ax,DREAD jz disk_rw cmp ax,DRITE ; write if write_protect jz disk_wite ; ************* temp only else jz disk_rw endif cmp ax,DSTAT ; get status jz disk_stat cmp ax,DFORM ; format jz disk_format baddisk: jmp badcomand disk_rw: jmp disk_wrap ; do real disk read/write ;********************************************* ; ; for debug purposes ; ;******************************************** unitno:byte extrn cntno:byte extrn wdtab:byte extrn chtab:word extrn oslabel:byte extrn dklabel:byte extrn chlabel:byte extrn osstart:word extrn nmlabel:byte extrn fplabel:byte extrn num_flop:byte endif ifndef boot_mal extrn mail_start:near endif ifndef boot_stk extrn dstack:byte extrn stacke:byte endif X..}|t|tR|u6|t|ud|uX.PXEtMtM.* disk_format: mov di,offset formes call ptext call pdisk mov di,offset fend call ptext clc ret disk_stat: mov al,cs:drvno ; disk mov dl,medchk gifcall dskdev,gstatus,noopt ; check it jnc stat_good disk_rec: mov al,cs:drvno ; disk gifcall dskdev,reset,noopt ; clear error mov al,cs:drvno ; disk mov dl,medchk gifcall dskdev,gstatus,noopt ; check it stat_good: push dx push ax call get_csb ; where to put it pop ax and ax,0ff00h ; clear bad status mov page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.5 SUBTTL DISK HANDLER VERSION 1.5 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_dsk equ 1 include boot_lnk.h .list .xall is_disk: mov al,[si].DEVNO ; drive number cmp al,7 mov ah,2 jz got_diskno cmp al,8 mov ah,3 jz got_diskno jg to_bg mov ah,al add ah,2 jmp got_diskno to_bg: mov ah,0ffh got_diskno: mov cs [si].CEROR,ax mov [di].ERROR,ax ; error status jz good_status pop dx clc ret good_status: pop dx ; restore media cmp dl,0 ; hard ?? jz done_status push dx mov dh,dl ; get media byte mov al,cs:drvno ; drive mov dl,medset gifcall dskdev,sstatus,noopt ; set it pop dx puti [di].BLKSZ,512 ; set up sector size mov [di].BLKCTM,0 ; no upper sector mov si,offset cs:disktab ; table of values and dl,0fh ; lower bits mov al,6 ; 3 words mul dl ; offset add si,%  ax ; point to it mov ax,cs:[si] ; first put [di].BLKCTL,ax mov [di].BLKS1,ax ; mov ax,cs:[si].2 put [di].SECTK,ax mov ax,cs:[si].4 put [di].HEADS,ax mov [di].BLKOF,0 mov [di].BLKS2,0 mov [di].BLKS3,0 mov [di].BLKS4,0 mov [di].BLKS5,0 mov [di].BLKS6,0 done_status: clc ret if write_protect disk_wite: mov di,offset dwrit call ptext call pdisk mov di,offset cs:dwend call ptext clc ret endif pdisk: mov al,[si].DEVNO ; get drive add al,30h ; to iscarry ; carry into bx nextsec: inc cx swap cx ; byte swap cmp cx,[si].SECNT ; done all sectors pushf swap cx ; byte swap popf jnz loopsec ; no, go back jmp diskex ; execute disk iscarry: inc bx ; do carry test bx,07 ; over a boundary ?? jnz nextsec ; go onward till done cmp cx,0 ; any to do ?? jz goodisk ; no, skip push [si].SECNT ; save total sector count push dx ; lower address push bx ; upper address push cx ; good sectors swap cx moit jnz skip_move ; if its a read call move_data ; copy over before write skip_move: call disk_bit ; do the physical i/o jnc good_bit ; no errors jmp disk_exit ; else report and end good_bit: test [si].COMND,0100h ; read bit jz done_move ; if its a write call move_data ; if its a read done_move: jmp disk_wrap ; done move_data: push ds push si ; save these mov bx,[si].DMADDL ; get lower address push bx ; and save lower address mov ax,[si].DMADDM ; get upper adascii call sys_prn ret if write_protect dwrit: db 'Pretend to write to disk ',etx dwend: db '.',cr,lf,etx endif formes: db cr,lf,'Disk format request. Drive ',etx fend: db '.',cr,lf,etx disktab: dw 2cfh,9,1 dw 59fh,9,2 dw 27fh,8,1 dw 4ffh,8,2 dw 167h,9,1 dw 2cfh,9,2 dw 13fh,8,1 dw 27fh,8,2 dw 167h,9,1 dw 2cfh,9,2 dw 13fh,8,1 dw 27fh,8,2 dw 0b3h,9,1 dw 167h,9,2 dw 09fh,8,1 dw 13fh,8,2 ;***************************************************** ; ; this code v [si].SECNT,cx ; do this number push si call diskex ; do so far mov bp,ax ; save error code pop si ; point to crb again pop cx pop bx pop dx pop ax swap ax ; get it our way round cmp bp,0 ; no errors ?? jz goodisk clc ; quiting, flag done ret goodisk: sub ax,cx ; sectors left get bx,[si].DSECTL ; get start sector add bx,cx ; increase the start sector pushf put [si].DSECTL,bx ; store it away popf jnc noextra get bx,[si].DSECTM ; do upper byte dress push ax ; save upper address swap ax dec ax ; down one put [si].DMADDM,ax ; reduced upper address swap bx push bx ; save second count mov ax,512 ; sector size sub ax,bx ; first size sub bx,512 ; reduce lower address put [si].DMADDL,bx ; put it away mov cs:start_move,offset pgroup:dbuffer call real_move call set_mail ; back to mailboxes pop ax ; next count mov [si].DMADDL,00 ; lower address start at 0 pop bx ; new upper address mov [si].DMADDM,bdoes disk read/write even across ; page and 1/2 mb boundaries ; ;***************************************************** disk_wrap: cmp [si].SECNT,0 ; done all ?? jnz dosome clc ret ; good return dosome: mov bx,[si].DMADDM ; upper address swap bx ; byte swap and bx,07 ; bits below 1/2 mb mov dx,[si].DMADDL ; lower address swap dx ; byte swap mov cx,0 ; sectors done mov ax,511 ; sector size - 1 loopsec: add dx,ax ; address of end of block mov ax,512 jc  inc bx put [si].DSECTM,bx ; store it back noextra: put [si].SECNT,ax ; new sector count get ax,[si].DMADDM ; upper address and ax,0fff8h ; mask lower bits to zero add ax,0008h ; next boundary put [si].DMADDM,ax ; store it back inc dx ; start of next sector put [si].DMADDL,dx ; new lower boundary swap dx cmp dx,512 ; if exact sector jnz dobitwise ; here is trouble mov [si].DMADDL,0 ; back to start jmp disk_wrap ; proceed dobitwise: test [si].COMND,0100h ; read bx ; set it up call real_move call set_mail ; boxes again pop bx mov [si].DMADDL,bx ; new lower address pop si pop ds ; restore ret real_move: push ds push si push ax ; save count lea si,[si].DMADDM ; point to address call get_addr ; get address makeup pop cx ; count pop bx ; use as pointer push bx mov si,cs:start_move push si add si,cx ; final address mov cs:start_move,si ; set up for part 2 pop si test [bx].COMND,0100h ; read ?? push cs pop %  ds mov dx,rfport ; get register file out dx,al ; do vme access jnz no_swap push es push ds xchg di,si ; swap these pop es pop ds no_swap: cld rep movsb ; move it pop si pop ds ret disk_bit: get dx,[si].SECNT ; sector count dec dx ; one less put [si].SECNT,dx ; store it back get dx,[si].DSECTL ; start number push dx ; save for us inc dx pushf ; save carry put [si].DSECTL,dx ; value for next popf ; restore flags jnc no_overflow get dx,[srt ; share port with mbox out dx,al ; set it up mov dx,bx ; get start mov al,cs:drvno ; get drive call real_write ; disk_exit: push ax push si ; save our pointer call set_mail ; point to mail boxes pop si mov ax,[si].SECLAM or ax,[si].SECLAL ; any look ahead jz no_look_ahead test [si].SIZLA,0ffffh jz no_look_ahead mov di,offset cs:look_start call ptext mov al,[si].DEVNO call phex mov di,offset cs:look_ahead call ptext mov ax,[si].SECLAM call phex get a stc ret read_try: popa real_read: pusha gifcall dskdev,read,noopt jc read_loop mov cs:error_byte,trycnt popa xor ax,ax ret write_loop: mov al,cs:drvno gifcall dskdev,reset,noopt dec cs:error_byte jnz write_try mov cs:error_byte,ah popa mov ah,cs:error_byte mov cs:error_byte,trycnt stc ret write_try: popa real_write: pusha gifcall dskdev,write,noopt jc write_loop mov cs:error_byte,trycnt popa xor ax,ax ret error_byte db trycnt disk_init: i].DSECTM ; upper sector inc dx ; increment upper put [si].DSECTM,dx ; store back no_overflow: pop dx mov cx,1 ; one sector push si push ds push cs pop es ; destination segment mov di,offset pgroup:dbuffer mov ax,[si].DSECTM ; upper sector shri ax,5 ; semiswap add al,cs:drvno ; add disk number test [si].COMND,0100h ; read bit jz bit_write call real_read jmp was_read bit_write: call real_write ; was_read: pop ds pop si ret ; done physical disk ;**x,[si].SECLAM call phex mov ax,[si].SECLAL call phex get ax,[si].SECLAL call phex mov di,offset cs:look_size call ptext mov ax,[si].SIZLA call phex get ax,[si].SIZLA call phex mov di,offset cs:fend call ptext no_look_ahead: call get_csb ; point to csb pop ax and ax,0ff00h ; al not valid mov [si].CEROR,ax mov [di].ERROR,ax ; status jz no_disk_error push ax push di call disk_rec ; re init disk pop di pop ax mov [di].ERROR,ax ; status mov [si].CEROR,ax mov cs:cntno,1 mov cs:unitno,0 mov al,8 mov dl,SNUMDRV ; set number of drives to 8 gifcall dskdev,sstatus,noopt do_mapn: mov al,1 ; GIFDIC drive number mov ch,cs:cntno ; controller number mov cl,cs:unitno ; unit number mov dh,40h ; hard disk mov dl,DRVMAP gifcall dskdev,sstatus,noopt xor ax,ax mov es,ax mov al,1 mov di,00 mov cx,10h mov dx,SOSMAP gifcall dskdev,reset,noopt mov al,1 gifcall dskdev,reset,noopt mov al,1 mov cx,01 mov dx,00 push cs **************************************** ; ; DO PHYSICAL DISK READ/WRITE ; ;****************************************** diskex: test [si].COMND,0100h ; read bit jz disk_write disk_read: call set_disk ; test & set parameters mov dx,rfdma ; own rf out dx,al ; set it up mov dx,rfport out dx,al ; ************ fudge !!!! mov dx,bx ; get start mov al,cs:drvno ; get drive call real_read jmp disk_exit disk_write: call set_disk ; test & set parameters mov dx,rfpo no_disk_error: clc ret look_start: db 'Drive : ',etx look_ahead: db ' look ahead request block : ',etx look_size: db ', count : ',etx set_disk: push si lea si,[si].DMADDM ; address data call get_addr ; get vme data pop si get cx,[si].SECNT ; sector count get bx,[si].DSECTL ; start sector number ret read_loop: mov al,cs:drvno gifcall dskdev,reset,noopt dec cs:error_byte jnz read_try mov cs:error_byte,ah popa mov ah,cs:error_byte mov cs:error_byte,trycnt  pop es mov di,offset pgroup:dbuffer pusha gifcall dskdev,read,noopt popa jc nxt_unit call realinit ; initialize gifdic from dib nxt_unit: inc cs:unitno cmp cs:unitno,1 ; check for a second disk on controller jz do_mapn ret disk_quit: ret realinit: push ds push cs pop ds add di,16 ; point to nos of maps mov bl,cs:[di] ; load number of maps inc di ; position to first map domap: cmp bl,0 ; any maps left in this dib? jnz contmap jmp dnedib contmap: mov c&  s:mapbase,di ;save for later mov si,offset pgroup:wdtab mov cs:drvno,4 dodkn: add di,12 ; point to OS name mov cx,2 ; 2 chars cld repe cmpsb jne nxtdkn ; no match pusha push es mov si,cs:mapbase ; found a match xor ax,ax mov al,cs:drvno ; disk # mov ch,cs:cntno ; controller number mov cl,cs:unitno ; unit number mov dh,40h ; hard disk mov dl,DRVMAP gifcall dskdev,sstatus,noopt xor ax,ax mov es,cs:[si].dbotl ; load boot offset mov al,cs:drvno ; disk # mov di,csfplabel db 'FLOP:' con_fifo fifo <> prn_fifo fifo <> dte_fifo fifo <> dce_fifo fifo <> prog ends end  mov al,cs:drvno ; disk mov dl,medchk gifcall dskdev,gstatus,noopt ; check it jnc stat_good disk_rec: mov al,cs:drvno ; disk gifcall dskdev,reset,noopt ; clear error mov al,cs:drvno ; disk mov dl,medchk gifcall dskdev,gstatus,noopt ; check it stat_good: push dx push ax call get_csb ; where to put it pop ax and ax,0ff00h ; clear bad status mov:[si].dstrtl ; start offset mov cx,cs:[si].dszel ; partition size mov dx,SOSMAP gifcall dskdev,sstatus,noopt mov al,cs:drvno gifcall dskdev,reset,noopt pop es popa mov di,cs:mapbase mov cx,cs:[di].dszel mov cs:[si],cx jmp nxtmap nxtdkn: inc cs:drvno mov al,cs:drvno cmp ax,8 ; have we used all table entries? jz nxtmap ; y mov bh,dktbsze ; n sub ax,2 mul bh ; offset to next drive in wdtable mov si,offset pgroup:wdtab add si,ax mov di,cs:mapbase jmp dodkn nxtmap page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.5 SUBTTL DATA AREAS VERSION 1.5 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_dat equ 1 include boot_lnk.h .list .xall ; gifdic label dword gifl dw ? gifh dw ? ; ; start_move dw ? ; pointer to buffer ram_size dw ? ; ram on 68k/64k osstart dw ? drvno db ? mapbase dw ? ; base of map in dib num_flop db 0 ; number floppies: mov di,cs:mapbase ; get base of map in dib add di,14 ; position to next map in dib dec bl ; decrement map counter jmp domap dnedib: pop ds ret ; END OF DISK HANDLER CODE prog ends end  in system unitno db ? cntno db ? wdtab db "!!" dw ? db "!!" dw ? db "!!" dw ? db "!!" dw ? stboot db 0feh,80h,05h,0a0h,045h,0a2h,055h,0aah lenboot equ $-stboot first db 0 ; fisrt fifo in sys_flag db 1 ; print sys info doboot db 0 ; assume cold boot pending PEND <> ; pending flags dbuffer db 512 dup (?) ; disk buffer for wrap chtab dw 8 dup (0) ; charcter device table oslabel db 'OS:' dklabel db 'DISK:' chlabel db 'CHAR:' nmlabel db 'NAME:'  ;************************************************** ; ; INTERNAL FIFOS FOR CHARACTER OUTPUT ; ;************************************************** fifo struc input dw 0 output dw 0 maxize dw 400h lineptr dw 0 ; for tabs buffer db 400h dup (?) fifo ends page ;************************************************** ; ; DIB buffer ; ;************************************************** map struc dbotl dw ? dboth dw ? dstrtl dw ? dstrth dw ? dszel dw ? dszeh dw ? dnme d&  b "??" map ends ;******************************************************** ; ; REAL TIME CLOCK BUFFER ; ;******************************************************** rtc struc bsecs db ? bmins db ? bhour db ? bdate db ? bmoth db ? byear db ? rtc ends ;********************************************************* ; ; WORKING DATA AREAS ; ;********************************************************* if new_68k stmmcpu segment at 04000h stmrf equ 05h+ram_68k ; register file acce page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.5 SUBTTL CALENDAR CLOCK MODULE VERSION 1.5 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_rtc equ 1 include boot_lnk.h .list .xall ;******************************************************* ; ; REAL TIME CLOCK ACCESS ; ;******************************************************* do_rtc: cmsp [si].comnd,READS ; read clock jz read_rtc x ; years again inc ax ; adjust cmp cs:rtc_buffer.bmoth,3 ; after feb ?? jc not_feb inc ax ; nother year not_feb: shri ax,2 ; /4 for leap years add si,ax ; add to days xor ch,ch ; clear it mov cl,cs:rtc_buffer.bmoth ; get month dec cx ; minus one jz dun_month ; if jan call add_month ; do months dun_month: mov al,cs:rtc_buffer.bdate ; odd days call get_hex dec ax ; days 1-31 etc add si,ax ; add them in mov ax,5180h ; hours per day -10000 mul si ; secss org 00000h stmmcpu0 dw ? stmmcpu ends else stmmcpu segment at 0b000h stmrf equ 0fbh-ram_68k ; old start tecnique org 0fffeh stmmcpu0 dw ? stmmcpu ends endif mmcpu segment at 4000h mmcrf equ 003h+ram_68k org 0 ssp0 dw ? ssp1 dw ? pc0 dw ? pc1 dw ? mmcpu ends ; check it stat_good: push dx push ax call get_csb ; where to put it pop ax and ax,0ff00h ; clear bad status mov cmsp [si].comnd,READT ; read as h/m/s etc. jz read_rtc cmsp [si].comnd,RITES ; write clock jnz rtc_badcom jmp write_rtc rtc_badcom: jmp badcomand read_rtc: push ds push cs pop es mov di,offset cs:rtc_buffer mov cx,6 ; read first six mov dx,0 gifcall rtcdev,read,noopt pop ds jnc no_read_err push ds push cs pop es mov di,offset cs:rtc_buffer mov cx,6 ; read first six mov dx,0 gifcall rtcdev,read,noopt ; try again pop ds jnc no_ronds passed add si,dx ; extra word mov di,ax ; save it mov al,cs:rtc_buffer.bhour call get_hex ; convert mov bx,60 ; minutes mul bx ; mov bx,ax ; save it mov al,cs:rtc_buffer.bmins call get_hex ; convert add ax,bx ; total minutes mov bx,60 ; to seconds mul bx ; got it mov bx,ax ; save it mov al,cs:rtc_buffer.bsecs call get_hex ; convert add ax,bx jnc no_xtra_sec inc dx ; upper bits no_xtra_sec: add ax,di ; final lower jnc no_extra_sec iead_err jmp end_com no_read_err: call get_csb ; get the csb cmsp [si].comnd,READT ; which type of read? jnz do_reads ; read as seconds jmp do_readt ; read as m/d/y etc do_reads: push di ; save csb pointer mov al,cs:rtc_buffer.byear ; get year call get_hex sub ax,70 ; years since -1 jnc add_cent add ax,100 ; correct it add_cent: push ax mov si,365 ; days per year mul si ; years * days mov si,ax ; save it pop anc dx no_extra_sec: add dx,si ; final answer pop di ; recover csb put [di].TIMESM,dx put [di].TIMESL,ax ; save result xor ax,ax jmp rtc_exit add_month: add si,31 ; jan loop jan ret jan: add si,28 ; feb loop feb ret feb: add si,31 ; march loop march ret march: add si,30 ; april loop april ret april: add si,31 ; may loop may ret may: add si,30 ; june loop june ret june: add si,31 ; july loop july ret july: add si,31 ; august loop augu'  st ret august: add si,30 ; september loop sept ret sept: add si,31 ; october loop oct ret oct: add si,30 ; november ret get_hex: ; convert 2 nibbles to hex push ax ; save it shri al,4 ; upper nibble mov cl,10 ; ten mul cl ; al * cl pop cx and cx,0fh ; lower only add ax,cx ; result in ax ret do_readt: mov al,cs:rtc_buffer.byear ; get the year call get_hex mov [di].TYEAR,al mov al,cs:rtc_buffer.bmoth call get_hex mov [di].TMOT years, dx = days add ax,2 ; normalise for leap years mov bl,al ; save years shri ax,2 ; /4 sub dx,ax ; remove leap days jnc no_leaps ; ok dec bl ; one year less add dx,365 ; restore to days no_leaps: add bl,68 ; add offset cmp bl,99 ; range check jc good_year sub bl,100 ; adjust good_year: mov cs:rtc_buffer.byear,bl ; save years call undo_month ; get month inc dl ; days 1-31 etc mov cs:rtc_buffer.bmoth,cl ; save month mov cs:rtc_buffer.bdate,dl ; c cl mov bx,28 ; non leap years test cs:rtc_buffer.byear,3 ; check it jnz is_not_leap inc bx ; 29 is_not_leap: cmp dx,bx jc got_month sub dx,bx inc cl cmp dx,31 ; march jc got_month sub dx,31 inc cl cmp dx,30 ; april jc got_month sub dx,30 inc cl cmp dx,31 ; may jc got_month sub dx,31 inc cl cmp dx,30 ; june jc got_month sub dx,30 inc cl cmp dx,31 ; july jc got_month sub dx,31 inc cl cmp dx,31 ; august jc got_month sub dx,31 inH,al mov al,cs:rtc_buffer.bdate call get_hex mov [di].TDAYM,al mov al,cs:rtc_buffer.bhour call get_hex mov [di].THOUR,al mov al,cs:rtc_buffer.bmins call get_hex mov [di].TMINS,al mov al,cs:rtc_buffer.bsecs call get_hex mov [di].TSECS,al xor ax,ax jmp rtc_exit write_rtc: get dx,[si].STIMEM get ax,[si].STIMEL mov bx,0a8c0h ; 60 * 60 * 12 div bx ; ax = days * 2, dx = secs xor bx,bx ; clear hours & mins mov ch,bh ; clear secs shr ax,1 ; /2 push ax ; save date ; convert all times to nibbles mov al,cs:rtc_buffer.bsecs call put_hex mov cs:rtc_buffer.bsecs,al mov al,cs:rtc_buffer.bmins call put_hex mov cs:rtc_buffer.bmins,al mov al,cs:rtc_buffer.bhour call put_hex mov cs:rtc_buffer.bhour,al mov al,cs:rtc_buffer.bdate call put_hex mov cs:rtc_buffer.bdate,al mov al,cs:rtc_buffer.bmoth call put_hex mov cs:rtc_buffer.bmoth,al mov al,cs:rtc_buffer.byear call put_hex mov cs:rtc_buffer.byear,al push cs pop es mc cl cmp dx,30 ; september jc got_month sub dx,30 inc cl cmp dx,31 ; october jc got_month sub dx,31 inc cl cmp dx,30 ; november jc got_month sub dx,30 inc cl got_month: ret put_hex: xor ah,ah ; clear top mov bx,10 div bl ; divide al by 10 shli al,4 ; move bits in ah add al,ah ; result ret rtc_buffer rtc <> ; real time clock buffer prog ends end  mov ax,dx ; get remaining seconds mov dx,0 ; clear upper part jnc not_12_hrs ; dont add 12 hours add ax,0a8c0h ; 12 * 60 * 60 jnc not_12_hrs ; no carry inc dx not_12_hrs: mov si,60 ; sec/min div si ; div dx.ax/60 mov cs:rtc_buffer.bsecs,dl ; remaining seconds xor dx,dx ; clear upper div si ; min/60 = hours mov cs:rtc_buffer.bmins,dl mov cs:rtc_buffer.bhour,al ; save results pop ax ; days xor dx,dx ; clear upper mov si,365 ; days per year div si ; ax =ov di,offset cs:rtc_buffer mov cx,6 ; move six bytes mov dx,0 ; start at begining push ds push si gifcall rtcdev,write,noopt ; send it pop si pop ds jnc rtc_exit ; try again push cs pop es mov di,offset cs:rtc_buffer mov cx,6 ; move six bytes mov dx,0 ; start at begining push ds push si gifcall rtcdev,write,noopt ; send it pop si pop ds rtc_exit: jmp end_com undo_month: mov cl,1 cmp dx,31 ; january jc got_month sub dx,31 ; remove days in page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.5 SUBTTL MAILBOX POLLING ROUTINE VERSION 1.5 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_pol equ 1 include boot_lnk.h .list .xall domailbox: ; check round the mailboxes call set_mail ; point to mailboxes assume ds:mailbox test MLAB.OTFLG,01h ; any output ? jz no_bytes mov al,MLAB.OTDAT ; get it and al,07fh ; GIFDIC don'  t like bit 7 push ds mov bx,cs:chtab ; get dev. # of console gifcall ,write,noopt pop ds jc no_bytes and MLAB.OTFLG,0feh ; clear flag no_bytes: test MLAB.INFLG,01h ; input jnz no_inbyte push ds mov bx,cs:chtab ; get dev. # of console gifcall ,read,noopt pop ds jc no_inbyte mov MLAB.INDAT,al or MLAB.INFLG,01 no_inbyte: mov di,offset cs:con_fifo mov bx,kvddev ; do console fifo call fifo_out mov di,offset cs:prn_fifo mov bx,prtdev ; do printer fifo callting for no start and cs:[di].PEND1,ax ; update pending if no start xor bx,cs:[di].PEND1 ; whats new mov cx,[si].STATS1 ; status not cx and bx,cx ; wait for status xor [si].BUSY1,bx ; clear busy xor [si].DONE1,bx ; set done not ax and [si].BUSY1,ax ; force busy if start mov ax,[si].BUSY1 ; get it or ax,cs:[di].PEND1 ; action required or ax,[si].STATS1 ; ignore if waiting for status swap ax xor ax,0ffffh ; invert logic jnz do_some ret bit_mess: db 'z no_print_system call print_crb no_print_system: jmp system notsys: cmp [si].DEVTP,CRTCS ; rtc jnz notrtc test byte ptr cs:sys_flag,08h jz no_print_rtc call print_crb no_print_rtc: jmp do_rtc notrtc: jmp badcrb if low_debug print_crb: push si mov di,offset cs:crbmes call ptext mov di,si mov cx,13 pcrb_loop: mov ax,[di] inc di inc di push di push cx push ax call phex pop ax swap ax call phex call pspace pop cx pop di loop pcrb_loop mov fifo_out mov di,offset cs:dte_fifo mov bx,dtedev ; do dte fifo call fifo_out mov di,offset cs:dce_fifo mov bx,dcedev ; do dce fifo call fifo_out ;*************************************************** ; ; NOW DO REAL MAILBOXES ; ;**************************************************** mov si,offset mailbox:MFLAGS.START1 mov di,offset cs:pending.PEND1 mov dx,offset mailbox:MCRB1 call mail_check mov si,offset mailbox:MFLAGS.START2 mov di,offset cs:pending.PEND2 mov dx,offSYSCON: Setting the DONE bit for the disk',CR,LF,etx do_some: mov si,dx ; crb address in si mov bx,8000h check_crb: test ax,bx ; this crb ? jz not_this pusha ; save the state call do_crb ; do the crb pushf call set_mail ; point to mailbox again popf popa ; restore all jc not_this ; not finished swap bx or cs:[di],bx ; flag it done swap bx xor ax,bx ; clear this bit jnz not_this ret ; done all bits not_this: add si,crb_size ; point to next s di,offset cs:eom call ptext pop si ret endif prog ends end  * 60 * 60 jnc not_12_hrs ; no carry inc dx not_12_hrs: mov si,60 ; sec/min div si ; div dx.ax/60 mov cs:rtc_buffer.bsecs,dl ; remaining seconds xor dx,dx ; clear upper div si ; min/60 = hours mov cs:rtc_buffer.bmins,dl mov cs:rtc_buffer.bhour,al ; save results pop ax ; days xor dx,dx ; clear upper mov si,365 ; days per year div si ; ax =set mailbox:MCRB17 call mail_check mov si,offset mailbox:MFLAGS.START3 mov di,offset cs:pending.PEND3 mov dx,offset mailbox:MCRB33 call mail_check mov si,offset mailbox:MFLAGS.START4 mov di,offset cs:pending.PEND4 mov dx,offset mailbox:MCRB49 call mail_check jmp domailbox mail_check: mov ax,[si].READY1 ; 0 if no activity and [si].DONE1,ax ; then clear any at idle mov ax,[si].STACK1 and [si].STATS1,AX mov ax,[si].START1 ; get any mov bx,cs:[di].PEND1 ; waihr bx,1 ; next bit jnc check_crb ; do all crbs ret ; done 16 crbmes: db 'CRB : ',etx do_crb: cmp [si].DEVTP,CTTYS ; tty ?? jnz notcon test byte ptr cs:sys_flag,01h jz no_print_console call print_crb no_print_console: jmp console notcon: cmp [si].DEVTP,CDISK ; disk ?? jnz notdisk test byte ptr cs:sys_flag,02h jz no_print_disk call print_crb no_print_disk: jmp is_disk notdisk: cmp [si].DEVTP,CSYST ; system ?? jnz notsys test byte ptr cs:sys_flag,04h j(   page 60,80 TITLE GENERAL PURPOSE I/O INTERFACE VERSION 1.4 SUBTTL ERROR HANDLER VERSION 1.4 .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_err equ 1 include boot_lnk.h .list .xall ;********************************************************************* ;* ;* Error handling ;* ;********************************************************************* badcrb: mov ax,0100h ; bad call mov di,ofibble pop ax pnibble: and al,0fh or al,30h ; add bits cmp al,3ah jc decimal add al,7 ; adjust decimal: call sys_prn ret pspace: mov al,20h ; space jmp sys_prn sys_prn: cmp cs:sys_flag,0 jnz do_print ret do_print: gifcall kvddev,write,waitrdy ret signon: db lf,lf,cr,'COLEX Universal System Interface. V 1.4A',cr,lf,lf db 'Loading Bootstrap.',lf,cr,etx crberr: db cr,lf,'Illegal CRB requested !',cr,lf,etx comerr: db cr,lf,'Bad command.',cr,lf,etx secerr: d INITIALf$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (T[Y BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINfset crberr jmp do_error badcomand: mov ax,0400h mov di,offset comerr jmp do_error badsect: mov ax,0900h ; sector not found mov di,offset secerr jmp do_error baddev: mov ax,0300h ; bad device mov di,offset deverr jmp do_error badtype: mov ax,0300h ; bad device mov di,offset typerr do_error: push ax call perr pop ax end_com: push ax call get_csb pop ax mov [di].ERROR,ax mov [si].CEROR,ax clc ret perr: mov al,cs:sys_flag push ax mov cs:sys_flag,1 b cr,lf,'Bad disk sector.',cr,lf,etx deverr: db cr,lf,'Bad disk device.',cr,lf,etx typerr: db cr,lf,'Bad disk type.',cr,lf,etx eom db cr,lf,etx bootname: db 0,'CONFIG ' db 22 dup (0) ; default file name errmes: db 0ah,0dh,'Bootfile file not found.',0ah,0dh,'$' cfmess: db cr,lf,'Invalid configuration file',cr,lf,'$' fifoflow: db '.',etx prog ends end GPERRPHEXPRN_FIFOPSPACEPTEXTRAM_SIZESET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG<.EU  @    call ptext pop ax mov cs:sys_flag,al ret ptext: ; print all characters from es:di to 04h ( etx ) push ds push si ; save these push cs pop es ; messages are in cs jmp ptext1 ; starting point printone: push es push di call sys_prn pop di pop es ptext1: mov al,es:[di] ; get character inc di ; next cmp al,etx jne printone ; output one pop si pop ds ; restore these ret phex: ; print a hex byte as two ascii bytes push ax sari al,4 ; msb call pn5 n5 N5 .5 5 58 ͢5X 5x 5(   m5 M5 -5  5 58 ̢5X 5x 5 l5  08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X  ,0   0  08  ˢ0X  0x  0  k0  K0  +0   0 L5 ,5  5 58 ˢ5X 5x 5 k5 K5  0x  0  n0  N0  .0  0  08  ͢0X  0x  0 08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X +5  5 58 ʢ5X 5x 0 p0 P0 00 0  m0  M0  -0   0  08  ̢0X  0x  0  l0  L0 0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;)  ,-PX Q..uúء.... ....3ty cmp al,num_chard ; compare against number of char dev. jle good_con jmp badcrb good_con: mov bl,chtbsze ; size of chtab records mul bl ; get offset into chtab mov di,offset pgroup:chtab add di,ax pop ax mov bx,cs:[di] ; get dev # mov di,cs:[di+2] ; get fifo offset cmsp [si].COMND,TINFF ; fifo mode jz allfin cmsp [si].COMND,TINBY ; input ? jz all_in cmsp [si].COMND,TOTBL ; output ?? jnz not_allout jmp allout not_allout: cmsp [si].COMND,TSTAT ; get status jz ap: push ax ; next pointer cmp ax,cx ; pointers same ?? jnz tryinput fifexit: mov dl,GIOST gifcall ,GSTATRG,NOOPT push ax call get_csb pop ax mov bx,[di].CHSTS and bh,0f6h test al,dcd jz no_dcd or bh,1 no_dcd: test al,breakc jz no_break or bh,8 no_break: cmp [di].CHSTS,bx mov [di].CHSTS,bx jz no_status mov di,offset MAILBOX:MFLAGS.STATS1 call set_flag no_status: pop ax pop ax ; clear stack stc ; not finished ret tryinput: push bx gifcall ͙&E.&E.\9= ? [#&')w,258>9AD[GJ'MP7TY\7`flr~ăĉ-Đ-ė-Ğ-7ħĭ-İĴ-ķĻ-ľ-#"RESTART= al,ah ; result ret rtc_buffer rtc <> ; real time clock buffer prog ends end all_stat cmsp [si].COMND,TOTFF ; fifo output jnz mb_setup jmp all_fout mb_setup: cmsp [si].COMND,TSTUP ; set up channel jnz bad_con_com jmp all_setup bad_con_com: jmp badcomand all_stat: mov dl,GIOST gifcall ,GSTATRG,NOOPT push ax call get_csb pop ax mov [di].CHSTS,0 ; clear old status test al,dcd jz no_dcd1 or [di].CHSTS,1 no_dcd1: test al,breakc jz no_break1 or [di].CHSTS,8 no_break1: clc ret ; null for now all_in: push ds gifcall ,read,noo,read,noopt ; bx is channel pop bx jnc good_finput cmp ah,NOTRDY jz quick_exit call all_error quick_exit: pop ax pop ax stc ret good_finput: push ax push si ; save pointer to crb push bx lea si,[si].CHADDM ; point to address call set_addr ; point to it pop cx ; channel number pop si ; recover crb pop ax ; recover data pop dx ; new pointer pop bx ; old pointer mov es:[bx.di],al ; set it up push cx ; channel number push dx ; save pointer call page 60,80 TITLE INITIAL I/O INTERFACE FOR UNIX SUBTTL TERMINAL INTERFACE .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_tty equ 1 include boot_lnk.h .list .xall ;********************************************** ; ; NOW DO CHARACTER DEVICES ; ;********************************************** assume ds:mailbox firstty equ (maxdsk+maxsys+1) console: push ax mov al,[si].DEVNO sub al,firstpt ; try it pop ds jnc good_input cmp ah,NOTRDY stc jz no_input call all_error clc ret good_input: push ax lea si,[si].CHADDM ; point to address call set_addr ; point to it pop ax mov es:[di],al ; set it up clc no_input: ret allfin: ; input to fifo get ax,[si].INPTR ; input pointer get cx,[si].OTPTR ; out pointer get dx,[si].CHCNT ; fifo size push ax ; old pointer inc ax ; next cmp ax,dx ; wrap round ? jnz nowrap xor ax,ax ; restart nowr set_mail ; restore mailboxes pop dx put [si].INPTR,dx ; new pointer mov di,offset MAILBOX:MFLAGS.ACTON1 call set_flag pop bx ; restore channel jmp allfin all_error: push ax call get_csb pop ax cmp ax,OUTPAP jnz try_frame or [di].CHSTS,10h jmp set_stat try_frame: cmp ax,FRAMERR jnz try_parerr or [di].CHSTS,4 jmp set_stat try_parerr: cmp ax,PARERR jz is_parerr ret is_parerr: or [di].CHSTS,2 set_stat: mov di,offset MAILBOX:MFLAGS.STATS1 call set_flag )   ret ;******************************************************** ; ; MOVE BLOCKS OF CHARACTERS TO THE OUTPUT FIFOS ; ;******************************************************** allout: mov ax,cs:[di].output ; get output pointer sub ax,cs:[di].input ; how much space dec ax ; adjust ( 0=mt not full ) and ax,3ffh ; normalise to fifo size get cx,[si].CHCNT ; get block size cmp ax,cx ; nuf space for whole block ? ja out_ok ; yes, skip stc ret ; sorry out_ok: push di fout: stc ret ; sorry do_fout: push di ; save fifo pointer push bx ; save user fifo pointer push si lea si,[si].CHADDM call set_addr ; point to data pop si pop bx ; pointer mov al,es:[di.bx] ; byte pointer pop di mov bx,cs:[di].input ; get fifo input pointer mov cs:[di.bx].buffer,al ; move data inc bx cmp bx,cs:[di].maxize ; in range ?? jnz no_wrap_today ; yes, skip mov bx,0 ; restart no_wrap_today: mov cs:[di].input,bx ; save new pointer push si est [si].CCONF,0002h jz do_bit_7 mov al,1 do_bit_7: mov dl,WRATTB gifcall ,SSTATUS,noopt call get_csb or [di].CHSTS,100h ; set dcd for dana clc ret bit_table: db 2 ; default 8,1 db 2 db 2 db 2 db 2 db 2 db 2 db 2 db 2 db 0 ; 7,1 db 1 db 1 db 2 db 2 db 3 db 3 baud_table: db 6 ; default 9600 db 6 db 6 db 0 ; 110 db 6 db 6 db 6 db 1 ; 300 db 2 ; 600 db 3 ; 1200 db 6 db 4 ; 2400 db 5 ; 4800 db 6 ; 9600 db 7 ; 19; save fifo pointer push cx ; save length lea si,[si].CHADDM call set_addr ; point to data mov si,di ; source pointer pop cx ; recover count pop di ; target pointer move_block: mov al,es:[si] ; byte pointer mov bx,cs:[di].input ; get fifo input pointer mov cs:[di.bx].buffer,al ; move data inc bx cmp bx,cs:[di].maxize ; in range ?? jnz no_wrap_out ; yes, skip mov bx,0 ; restart no_wrap_out: mov cs:[di].input,bx ; save new pointer inc si ; next source loop  call set_mail pop si get bx,[si].OTPTR inc bx get ax,[si].CHCNT cmp ax,bx jnz no_wrap_either mov bx,0 no_wrap_either: put [si].OTPTR,bx jmp all_fout all_setup: if real_tty cmp bx,dtedev jz allset cmp bx,dcedev jz allset jmp bit7set allset: ; only serial ports get di,[si].BAUDR add di,offset cs:baud_table mov al,cs:[di] push bx mov dl,SBAUDR gifcall ,SSTATUS,noopt pop bx mov al,0 ; no parity test [si].CCONF,0004h jz do_parity inc al200 else ; for now we just print a message mov di,offset cs:setup1 call ptext mov al,[si].DEVNO ; get device number mov di,offset cs:devtab xor ah,ah sub ax,firstty shl ax,1 ; *2 add di,ax ; calculate address mov di,cs:[di] ; get message call ptext mov di,offset cs:setup2 ; next message call ptext mov di,offset cs:baud1 call ptext get ax,[si].BAUDR ; baud rate number test ax,0fff0h ; 0-15 only jz good_baud xor ax,ax good_baud: mov di,offset cs:move_block ; repeat till done clc ret ;******************************************************** ; ; MOVE CHARACTERS FROM FIFOS TO THE OUTPUT FIFOS ; ;******************************************************** all_fout: mov bx,[si].OTPTR ; get output pointer cmp bx,[si].INPTR ; compare jz no_fout swap bx mov ax,cs:[di].output ; get output pointer sub ax,cs:[di].input ; how much space dec ax ; adjust ( 0=mt not full ) and ax,3ffh ; normalise to fifo size jnz do_fout no_ test [si].CCONF,0008h jnz do_parity inc al do_parity: push bx mov dl,SPARITY gifcall ,SSTATUS,noopt pop bx get ax,[si].CCONF sar ax,1 rori al,2 and ax,000fh mov di,offset cs:bit_table add di,ax mov al,cs:[di] push bx mov dl,SBITSC gifcall ,SSTATUS,noopt pop bx mov al,0 test [si].CCONF,0800h jz do_xonxoff inc al test [si].CCONF,1000h jz do_xonxoff add al,2 do_xonxoff: push bx mov dl,SXON gifcall ,SSTATUS,noopt pop bx bit7set: xor al,al tbautab add di,ax add di,ax mov di,cs:[di] call ptext mov di,offset cs:dtrmes test [si].CCONF,0100h ; bit 0 jnz set_dtr mov di,offset cs:dtnrms set_dtr: call ptext get ax,[si].CCONF ; get set word and ax,180h ; data bits shri ax,7 add al,35h ; ascii 5-8 push ds call sys_prn mov di,offset cs:bitmes call ptext get ax,[si].CCONF ; get word and al,6 ; get bits push ax jpe paritye ; 0 or two mov al,31h ; 1 call sys_prn pop ax cmp al,2 ; one bit jz*   dunstop mov al,2eh call sys_prn mov al,35h call sys_prn jmp dunstop paritye: pop ax mov al,30h ; 0 bits jz gotbits add ax,2 gotbits: call sys_prn dunstop: pop ds mov di,offset cs:stopms call ptext mov di,offset cs:xnonms ; no xoff input test [si].CCONF,800h jz noxon mov di,offset cs:xonmes call ptext mov di,offset cs:xnanms test [si].CCONF,1000h jz noxon mov di,offset cs:xanyms noxon: call ptext mov di,offset cs:xnofms test [si].CCONF,2000h jz xnofdb 'BAD ',etx b50: db '50 ',etx b75: db '75 ',etx b110: db '110 ',etx b134: db '134.5 ',etx b150: db '150 ',etx b200: db '200 ',etx b300: db '300 ',etx b600: db '600 ',etx b1200: db '1200 ',etx b1800: db '1800 ',etx b2400: db '2400 ',etx b4800: db '4800 ',etx b9600: db '9600 ',etx b19200: db '19200 ',etx bext: db 'EXTERNAL ',etx dtrmes: db ', DTR, ',etx dtnrms: db ', no DTR, ',etx bitmes: db ' data bits,',cr,lf,etx stopms: db ' stop bits, ',etx xnonms: db 'ignore XOFF, ',etx xonmes:].output,ax fifo_out: mov bp,cs:[di].output ; get fifo output pointer cmp bp,cs:[di].input ; anything ?? jnz got_chars ; if so skip ret ; else quit got_chars: mov al,cs:[di.bp].buffer ; get data pusha ; save registers cmp al,tab jmp nottab ; jnz nottab mov al,20h ; space nottab: gifcall ,write,noopt ; try to write popa jnc fifo_next ; try another ret prog ends end : push bx mov dl,SPARITY gifcall ,SSTATUS,noopt pop bx get ax,[si].CCONF sar f mov di,offset cs:xoffms xnoff: call ptext test [si].CCONF,4000h jz nobreak mov di,offset cs:brkmes call ptext nobreak: mov di,offset cs:no_parity test [si].CCONF,0004h ; parity ? jz do_parity mov di,offset cs:even_parity test [si].CCONF,0008h jz do_parity mov di,offset cs:odd_parity do_parity: call ptext mov di,offset cs:nbrkms call ptext call get_csb ; point to csb mov [di].CHSTS,0100h ; show dcd clc ret ; null for now ; messages for dummy setup d db 'stop on XOFF, ',etx xnanms: db 'start on XON, ',etx xanyms: db 'start on XANY, ',etx xnofms: db 'dont use XOFF',etx xoffms: db 'use XOFF control',etx brkmes: db ', send BREAK' no_parity: db ', no',etx even_parity: db ', even',etx odd_parity: db ', odd',etx nbrkms: db ' parity.',cr,lf,etx endif ;***************************************************** ; ; ATTEMPT TO OUTPUT FROM CHARACTER FIFOS ; ;***************************************************** fifo_next: test al,0e0h ; cevtab: dw dtemes dw prnmes dw dcemes dw conmes dw nulmes dw nulmes dw nulmes dw nulmes setup1: db cr,lf,'Set up ',etx setup2: db ' device : ',etx conmes: db 'CONSOLE',etx prnmes: db 'PRINTER',etx dtemes: db 'DTE SERIAL',etx dcemes: db 'DCE SERIAL',etx nulmes: db 'NULL',etx baud1: db 'Baud rate : ',etx bautab: dw badmes dw b50 dw b75 dw b110 dw b134 dw b150 dw b200 dw b300 dw b600 dw b1200 dw b1800 dw b2400 dw b4800 dw b9600 dw b19200 dw bext badmes: ontrol ?? jnz not_control ; no cmp al,lf jz new_line cmp al,cr ; return ?? jnz not_return new_line: mov cs:[di].lineptr,0 ; position 0 not_return: cmp al,tab jmp next_char ; jnz next_char inc cs:[di].lineptr test cs:[di].lineptr,07h jnz fifo_out jmp next_char not_control: inc cs:[di].lineptr ; next position next_char: mov ax,cs:[di].output ; get it inc ax ; next cmp ax,cs:[di].maxize ; too much ?? jnz fifo_wrap mov ax,0 ; wrap pointer fifo_wrap: mov cs:[di GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (u[W BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOTDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERRPH*  EXPRN_FIFOPSPACEPTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   L5 ,5  5 58 ˢ5X 5x 5 k5 K5  0x  0  n0  N0  .0  0  08  ͢0X  0x  0 5 n5 N5 .5 5 58 ͢5X 5x 5 +5  5 58 ʢ5X 5x 0 p0 P0 00 0  m0  M0  -0   0  08  ̢0X  0x  0  l0  L0  m5 M5 -5  5 58 ̢5X 5x 5 l5  08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X ,0   0  08  ˢ0X  0x  0  k0  K0  +0   0 +  08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X D.  D 5u-SYSCON: Setting the DONE bit for the disk t`ar. 3uà sCRB : |u.t|u.t|u.t|u.tV GGWQPXY_^ŜY7  $)2< BFJ PS/Y\be knq,twz},Ā Ćĉ,Č Ēĕ,Ę97B=HK V=\_$ GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (9[C BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFODKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERRPHEXPRN_FIFOPSPACE0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;j=ps<~=Ŏ21..0ű1 DOMAILBOXtmov al,[si].DEVNO ; get device number mov di,offset cs:devtab xor ah,ah sub ax,firstty shl ax,1 ; *2 add di,ax ; calculate address mov di,cs:[di] ; get message call ptext mov di,offset cs:setup2 ; next message call ptext mov di,offset cs:baud1 call ptext get ax,[si].BAUDR ; baud rate number test ax,0fff0h ; 0-15 only jz good_baud xor ax,ax good_baud: mov di,offset cs:PTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   ,-PX Qt$..r&u..r@D!DD(!D ..!.3L #1\1\!D5 n5 N5 .5 5 58 ͢5X 5x 5 m5+   M5 -5  5 58 ̢5X 5x 5 l5 L508  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X     0  08  ˢ0X  0x  0  k0  K0  +0   0 0 ,5  5 58 ˢ5X 5x 5 k5 K5 +50x  0  n0  N0  .0  0  08  ͢0X  0x  0  m8 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X 0x  5 58 ʢ5X 5x 0 p0 P0 00 0  0  M0  -0   0  08  ̢0X  0x  0  l0  L0  ,0 0 i0 I0 )0  0 08 Ȣ0X 0x ;,,  -PX Q<t<t .&D$=t=t =t=t..s....RPX%DEtZZthR..ZEE.E E.DE +Q1>LOQU_bg5z}/,Dž/,,,,ǩ/,,Ǿ,/d!t block : , count : Vt ^L \...u.&a.&.a`.r.a3...u.&a.&.a`.r.a3......@.3..`.ar..>t.Gu.>. ub GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (7[Z BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERR.DEEEEEEEÊ0 Disk format request. Drive .   g  ?g  ? g ?| uË\ TиrA;L uCut!t RSQL V^Y[ZXt+\ٜ\s \C\D D %D BTuDDusDtV\SD PHD S+Á\.XD[\ [\^VPt Y[S.6V.6^Gu`.63....@.3...|.L...a.>.M. #..=t-.>.>-7<CIN^eoy~ąċĐĠħij Ĺ? ? %2*?/?FK%N@Sf%lq v?ńōŢŦŰŷ%@%R%<Ր DISK_INIT DISK_QUIT1OIS_DISK0tF,2000h jz xnofPHEXPRN_FIFOPSPACEPTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   ^ËT JT TRBTs TBTZVD.Dt^Dt..PV^D DtQDtJDDDDDDX%DEt PW_XEDDrive :  look ahead requeshu<?BE/HK,N/T`fptĀġĭĻ0 <66BLcOTd^caƍ8Ə 55ƽ88 !5 n5 N5 .5 5 58 ͢5X 5x 5,   m5 M5 -5  5 58 ̢5X 5x 5 l5  08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X  ,0   0  08  ˢ0X  0x  0  k0  K0  +0   0L5 ,5  5 58 ˢ5X 5x 5 k5 K5  0x  0  n0  N0  .0  0  08  ͢0X  0x  0  08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X +5  5 58 ʢ5X 5x 0 p0 P0 00 0  m0  M0  -0   0  08  ̢0X  0x  0  l0  L0 0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;-  ,-PX Q|t|t |uP.sP.s|uW.-FsdPmX@.>r@2.It.HQ.<.û<.5 DO_RTC}tg5z}/,Dž/,,,,ǩ/,,Ǿ,/d!t block : , count : Vt ^L \...u.&a.&.a`.r.a3...u.&a.&.a`.r.a3......@.3..`.ar..>t.Gu.>. ub5 n5 N5 .5 5 58 ͢5X 5x 5 sBsB_UE3ÃÃÃÃÃÃÃÃÃÃP Y.E.E.E .E .E .E 3TD3ۊPºssB<.3..X3Ҿm+sˁmDcrd...............VT.^sVT.^rs.uC;r^+rUrKrAr7r-r# INITIALf$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (8[O BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERRPHEXPRN_m5 M5 -5  5 58 ̢5X 5x 5 l5 rrr2 8y/ 8H NQ[8`c(zĊĔ(ħ(ĵ((d:=(DG(NQ(X[(be(lo(wdŦůųg  #'*.3E N` ey(FIFOPSPACEPTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   L5 ,5  5 58 ˢ5X 5x 5 k5 K5 +5-    5 58 ʢ5X 5x 0 p0 P0 00 0  m0  M0  -0   0  08  ̢0X  0x  0  l0  L0  0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;,08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X  ,0   0  08  ˢ0X  0x  0  k0  K0  +0   0 -PX Q<P, <~X..}|t|tR|u|t|u|u.PXEtMtM.s tPt X&ËDLT P@;u3P;u7.P0x  0  n0  N0  .0  0  08  ͢0X  0x  0  08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X X]tt9]]tXXS.[s tXXPVSt Y^XZ[&QRZT[PX=uM=uM =tÁM.E.+H%L ;wWQt Y_&..AC.;]u.FË\;\t.E.+H%uWSVt ^[&_..AC.;]u.V^\CD ;u\뢁t t|.S .[Dt DuS .[D%.S .[Dt DtS .[2Dt .M.  u!< t< u.E< u.E.Eu.E.E@.;Eu.E.m.;-u.C`< u .as˜ 3kDNQ]aĆ:35 :3'61458<eh5336/QcuƗƯ2CONSOLECFIFO_OUTt  #'*.3E N` ey(HEXPRN_FIFOPSPACEPTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKE START_MOVESTBOOTSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   L5 ,5  5 58 ˢ5X 5x 5 k5 K5 +55 n5 N5 .5 5 58 ͢5X 5x 5   5 58 ʢ5X 5x 0 p0 P0 00 0   GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (" [P BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERRPm5 M5 -5  5 58 ̢5X 5x 5 l5 08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X  .  0x  0  n0  N0  .0  0  08  ͢0X  0x  0  08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X m0  M0  -0   0  08  ̢0X  0x  0  l0  L0  0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;, GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (H[ BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTABCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERRPHEXPRN_FIFOPSPACEPTEXTRAM_SIZERESTARTS,0   0  08  ˢ0X  0x  0  k0  K0  +0   0 -PX Q&|u|u L! 35 \GO_MSDOSŐ SYSTEMsttMtM.s tPt X&ËDLT P@;u3P;u7.PIGNONSTACKE START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRNUNITNOWDTAB.EU  @   5 n5 /  N5 .5 5 58 ͢5X 5x 5 m5 M5  ʢ5X 5x 0 p0 P0 00 0  08  Ϣ0X  -0   0  08  ̢0X  0x  0  l0  L0  ,0   0  -5  5 58 ̢5X 5x 5 l5 L5 ,5 0x  0  o0  O0  /0  0  08  ΢0X  0x  0  08  ˢ0X  0x  0  k0  K0  +0   0 08 ʢ0X 0 5 58 ˢ5X 5x 5 k5 K5 +5  5 58n0  N0  .0  0  08  ͢0X  0x  0  m0  M0  x 0 j0 J0 *0  0 08 ɢ0X 0x 0 i0/   I0 )0  0 08 Ȣ0X 0x ;,-|E-KP-X`g-mr-zʼn-Ŕ-ţ-PX Q2ËցRY`a` a`!a`1a$0<:rË%\ ËT @‹|.u;t.&&.&.&.&.&.u..9tuZ%:L }ƃ%Ɯ&Ɵ#7  9 B*K Tnt~$DžǢ&" 8Pt.63.G&< < tS&<,t| AB< t < t[ " i CLEAR_RAMCLR_FLAG;GET_ADDR`GET_BOOTGET_CSB?GET_FLAGSET_ADDRXSET_BOOT SET_FLAG3SET_MAIL TEST_BOOTߐTST_FLAG+XOR_FLAGE GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ ([CHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODSTACKDTE_FIFOFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPRN_FIFORAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLA..9tZuZ..9tZu..9tt.Ì33Cu$@ùù&&>u &Z&>ZúÌ-ؿh2 \!<t+\%\!<t !L!!\!!2%l m.u?.M. #..=t-.>.>-7<CIN^eoy~ąċĐĠħij Ĺ? ? %2*?/?FK%N@Sf%lq v?ńōŢŦŰŷ%@%R%<Ր DISK_INIT DISK_QUIT1OIS_DISK0tF,2000h jz xnofGSET_MAILSTACKE START_MOVESTBOOTSYSTEMSYS_FLAG TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   5 n50   N5 .5 5 58 ͢5X 5x 5 m5 M5 58 ʢ5X 5x 0 p0 P0 00 0  08  Ϣ0X  -0   0  08  ̢0X  0x  0  l0  L0  ,0   0  -5  5 58 ̢5X 5x 5 l5 L5 ,5 0x  0  o0  O0  /0  0  08  ΢0X  0x  0  08  ˢ0X  0x  0  k0  K0  +0   0 08 ʢ0X  5 58 ˢ5X 5x 5 k5 K5 +5  5 n0  N0  .0  0  08  ͢0X  0x  0  m0  M0  0x 0 j0 J0 *0  0 08 ɢ0X 0x 00   i0 I0 )0  0 08 Ȣ0X 0x ;,- GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (z[g BADCOMANDBADCRBBOOTNAMECFMESS CLEAR_RAMCLR_FLAGCONSOLE DISK_INIT DISK_QUIT DOMAILBOXDO_RTCDSTACKEND_COMEOMERRMESFIFO_OUTGET_ADDRGET_BOOTGET_CSBGET_FLAGGO_MSDOSIS_DISK MAIL_STARTPERRPHEXPSPACEPTEXTRESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNONSTACKESYSTEMSYS_PRN TEST_BOOTTST_FLAGXOR_FLAG.EU58 ̢5X 5x 5 l5 L5 ,5  5 58 ˢ5XPX QX" PXPXED.P.X.VW_&G<u^PX$ 0<:rð .>uûT. COLEX Universal System Interface. V 1.4A Loading Bootstrap.  Illegal CRB requested !  Bad command.  Bad disk sector.  Bad d  @   5 n5 N5 .5  5x 5 k5 K5 +5  5 58 ʢ5X 5xisk device.  Bad disk type.  CONFIG ze (2,<1>2D2HPM2Znq|ć2ĕTޠBj Bootfile file not found. $ Invalid configuration file $. BADCOMAND А BADCRBBOOTNAMEH CFMESSEND_COM/ EOME8 ERRMESj PERR< PHEXi PSPACE PTEXTPu SIGNONSYS_PRNtMAPBASE SNMLABELP NUM_FLOP ȐOSLABELCOSSTARTPENDING+'PRN_FIFObzRAM_SIZEՐ START_MOVE) STBOOT ^SYS_FLAG) UNITNOn WDTABيtPERR< PHEXi PSPACE PTEXTPu SIGNONSYS_PRNttEE .>u EEVP. @t tDD t X^DD@È\ ËFEU)7$ *"0$6&<*BBHFNJTNZR`bffljrnxr~ăĈčĒĘĝĪ2B)+)?wœ GENERALr$MAILBOXMMCPUPGROUPPROGSTMMCPU] @* @ @ (&[R BADCOMANDBADCRBBOOTNAMECFMESSCHLABELCHTAB CLEAR_RAMCLR_FLAGCNTNOCONSOLECON_FIFODBUFFERDCE_FIFO DISK_INIT DISK_QUITDKLABELDOBOOT DOMAILBOXDO_RTCDRVNODTE_FIFOEND_COMEOMERRMESFIFO_OUTFIRSTFPLABELGET_ADDRGET_BOOTGET_CSBGET_FLAGGIFDICGIFHGIFLGO_MSDOSIS_DISKLENBOOT MAIL_STARTMAPBASENMLABELNUM_FLOPOSLABELOSSTARTPENDINGPERR0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;ŞŤŪn MAIL_START@t7.PSXZ€RP!l!<t!XXX !L!..6t! QPYu#&< -5=GY`ģıĸ''''2 -#-).-6>E-KP-X`g-mr-zʼn-Ŕ-ţ-PHEXPRN_FIFOPSPACEPTEXTRAM_SIZERESTARTSET_ADDRSET_BOOTSET_FLAGSET_MAILSIGNON START_MOVESTBOOTSYSTEMSYS_FLAGSYS_PRN TEST_BOOTTST_FLAGUNITNOWDTABXOR_FLAG.EU  @   ,-PX Q3    @DD.DV_5 n5 N5 .5 5 58 ͢5X 5x 5 2  m5 M5 -5  5 58 ̢5X 5x 5 l5  08  Ϣ0X  0x  0  o0  O0  /0  0  08  ΢0X  ,0   0  08  ˢ0X  0x  0  k0  K0  +0   0 L5 ,5  5 58 ˢ5X 5x 5 k5 K5 +50x  0  n0  N0  .0  0  08  ͢0X  0x  0  08 ʢ0X 0x 0 j0 J0 *0  0 08 ɢ0X   5 58 ʢ5X 5x 0 p0 P0 00 0 m0  M0  -0   0  08  ̢0X  0x  0  l0  L0  0x 0 i0 I0 )0  0 08 Ȣ0X 0x ;3  ,-PX Q DSTACK STACKEt    @DD.DV_ ; ; ******* COLD START SYSTEM *************** ; call clear_ram ; init 68k ram ; call get_boot ; read in the boot file ; call set_start ; popinters for 68k start ; call disk_init ; sort out the disk system ; call mail_start ; initiialize the mailboxes ; call start_68k ; start the 68k ; call no_pending ; clear pending action ; jmp start_mailbox wboot: call get_boot ; read in config file ; call disk_init ; sort out the disk system ; call get_pending ; recover pendv cs:pending.PEND3,0 mov cs:pending.PEND4,0 ; ret get_pending: ; call set_mail assume ds:mailbox ; mov ax,SUSPEND.PEND1 or al,80h ; clear system bit mov cs:pending.PEND1,ax mov ax,SUSPEND.PEND2 mov cs:pending.PEND2,ax mov ax,SUSPEND.PEND3 mov cs:pending.PEND3,ax mov ax,SUSPEND.PEND4 mov cs:pending.PEND4,ax ; ret gifdic_init: ; xor cx,cx int 99h ; link up to gifdic mov ax,es:[di.ghndlr] mov cs:gifl,ax mov ax,es:[di.spgroup] mov cs:gifh,ax ; ret ping flags ; jmp start_mailbox restart: mov sp,offset pgroup:stacke ; call get_boot ; read bootstrap ; call set_start ; set up pc/sp ; call disk_init ; sort the disks ; call mail_start ; set up mailboxes ; call no_pending ; idle ; ; drop through ; start_mailbox: call set_mail ; point to mailboxes assume ds:mailbox puti MSCB.SFLAG,0180h ; flag active jmp domailbox ; set_start: ; call set_mail assume ds:mmcpu ; puti ssp0,stack_up ; upper stack pointer rog ends end begin  ʢ5X 5x 0 p0 P0 00 0  page 60,80 TITLE INITIAL I/O INTERFACE FOR UNIX SUBTTL INITIALISATION AND RESTART .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_int equ 1 include boot_lnk.h .list .xall begin: ; set up stack push cs pop ss mov sp,offset pgroup:stacke mov cs:sys_flag,0 ; set debug print off ; call gifdic_init ; call test_boot ; cold / warm start test byte ptr cs:doboot,0ffh ; cold jnz wboot puti ssp1,stack_lo ; lower stack pointer ; cmp cs:osstart,9000h ; unix or pdos ; jz stunix ; puti pc0,00h ; start for pdos ; puti pc1,2000h ; ret stunix: puti pc0,5h ; start for unix puti pc1,0000h ; start for unix ; ret start_68k: ; mov dx,rfport mov al,stmrf out dx,al ; point to it ; mov ax,seg stmmcpu mov ds,ax assume ds:stmmcpu ; get segment ; mov ax,stmmcpu0 ; start it up ; ret no_pending: ; mov cs:pending.PEND1,0 mov cs:pending.PEND2,0 mo page 60,80 TITLE INITIAL I/O INTERFACE FOR UNIX SUBTTL INITIALISATION AND RESTART .xlist include gifdic.mac include 80186.mac include options.h include equates.h include mailboxs.h include data.h boot_int equ 1 include boot_lnk.h .list .xall begin: ; set up stack push cs pop ss mov sp,offset pgroup:stacke mov cs:sys_flag,0 ; set debug print off ; call gifdic_init ; call test_boot ; cold / warm start test byte ptr cs:doboot,0ffh ; cold jnz wboot 3   ; ; ******* COLD START SYSTEM *************** ; call clear_ram ; init 68k ram ; call get_boot ; read in the boot file ; call set_start ; popinters for 68k start ; call disk_init ; sort out the disk system ; call mail_start ; initiialize the mailboxes ; call start_68k ; start the 68k ; call no_pending ; clear pending action ; jmp start_mailbox wboot: call get_boot ; read in config file ; call disk_init ; sort out the disk system ; call get_pending ; recover pend:pending.PEND3,0 mov cs:pending.PEND4,0 ; ret get_pending: ; call set_mail assume ds:mailbox ; mov ax,SUSPEND.PEND1 or al,80h ; clear system bit mov cs:pending.PEND1,ax mov ax,SUSPEND.PEND2 mov cs:pending.PEND2,ax mov ax,SUSPEND.PEND3 mov cs:pending.PEND3,ax mov ax,SUSPEND.PEND4 mov cs:pending.PEND4,ax ; ret gifdic_init: ; xor cx,cx int 99h ; link up to gifdic mov ax,es:[di.ghndlr] mov cs:gifl,ax mov ax,es:[di.spgroup] mov cs:gifh,ax ; ret prog ing flags ; jmp start_mailbox restart: mov sp,offset pgroup:stacke ; call get_boot ; read bootstrap ; call set_start ; set up pc/sp ; call disk_init ; sort the disks ; call mail_start ; set up mailboxes ; call no_pending ; idle ; ; drop through ; start_mailbox: call set_mail ; point to mailboxes assume ds:mailbox puti MSCB.SFLAG,0180h ; flag active jmp domailbox ; set_start: ; call set_mail assume ds:mmcpu ; puti ssp0,stack_up ; upper stack pointer ends end begin  ʢ5X 5x 0 p0 P0 00 0 puti ssp1,stack_lo ; lower stack pointer cmp cs:osstart,9000h ; unix or pdos jz stunix puti pc0,00h ; start for pdos puti pc1,2000h ret stunix: puti pc0,5h ; start for unix puti pc1,0000h ; start for unix ; ret start_68k: ; mov dx,rfport mov al,stmrf out dx,al ; point to it ; mov ax,seg stmmcpu mov ds,ax assume ds:stmmcpu ; get segment ; mov ax,stmmcpu0 ; start it up ; ret no_pending: ; mov cs:pending.PEND1,0 mov cs:pending.PEND2,0 mov cs4  4  5  5  6  6  7  7  8  8  9  9  :  :  ;  ;  <  <  =  =  >  >  ?  ?  @  @  A  A  B  B  C  C  D  D  E  E  F  F  G  G  H  H  I  I  J  J  K  K  L  L  M  M  N  N  O  O