FORMAT (? IBIOS ASM4ASM COM@ LOAD COMDDT COM&MOVCPM COMXz{|}~STAT COM*PIP COM: !"#$%&'ED COM4()*+,-.IBIOS2 PRNo/012345=>@ABCDSBIOS ASM46789:;<IBIOS2 HEX ?VSBIOS HEX EJCPM56 COMPKLMNOPQRSTIBIOS HEX IBIOS1 ASM3\]^_`abIBIOS2 BAK:YZcdefg;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; interrupt driven keyboard and realtime clock bios ; ; ; will also have lightpen interrupt in future ; ; ; rst6 = realtime clock ; rst1 = keyboard (left serial port only) ; rst2 = memory parity error interrupt ; rst3 = lightpen interrupt ; ; ; ; notice::: ; ; a circular buffer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will horst0 ;console status hconin jmp horin0 ;console input hconout jmp horout0 ;console output hlist jmp hlst ;high speed list vector hpunch jmp hpnch ;punch vector hreader jmp hread ;reader vector hprst jmp horprst ;printer status not implem db 0,0,0 ;reserved dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; hread lda iobyte ani 0ch ;mask out reader bits cpi 8h ;ur1:=cassette routine jz ur1v ;casette input cpi 4h ;high speed reader rddr:=ptr jz p ani 2 jz ptr in 0 push psw mvi a,30h out 6 pop psw ret ; ptrx: ;logical "inp" for pip (ptr) call ptr ani 7fh ;clobber parity bit sta 109h ;store it in pip ret ; ; horin0: push h ;get data from circlar buffer hloop: call horst0 ;get status of circular buffer jz hloop ;loop if no data lhld bot ;get data pointer mov a,m ;get data itself inx h ;bump pointer mvi h,0ffh ;make it mod 256 shld bot pop h ret ; horin1: ;right serial port in 5 ani 2 jz horin1 IBIOS2 ASM:FGHIUWX[IBIOS1 HEX rwSYSGEN COM xyCPM48 COMPCPM56X COMPhijklmnopqCPM56Y COM^stuvCPM56Z COMP ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; msize equ 56 ;mikes system ; bdos equ 5 ;system entry point ; ; bios equ 5300h+(msize-24)*1024 user equ bios+700h offset equ 2700h-user ;to overlay sysgen image iobyte equ 03h ;iobyte ; org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed hcinit jmp tinit ;init i/o ports and parity wboot jmp warm ;warm boot initializer hconst jmptr ;paper tape reader cpi 0ch jz horin1 ;ur2:=right serial port ret ;return if not either dev. hpnch lda iobyte ani 030h ;mask out punch bits cpi 10h jz up1v ;casette out cpi 20h jz horout1 ;right serial port is pun: ret ;ret if not cas or pun: ur1v ret ;will be cassette reader up1v ret ;will be cassette routine hlst lda iobyte ani 0c0h cpi 0h jz horout0 ;list to console cpi 80h jz horout2 ;list to printer ret ; ; input routines ptr: ;paper tape reader in 6 in 4 ani 7fh ret horin2: ;parallel port in 6 ;motherboard status ani 2 jz horin2 in 0 ;read keyboard push psw ;save char mvi a,30h out 6 ;reset pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz loop mvi a,20h ;reset po flag out 6 ;output char mov a,c ;load accumulator tin1: ani 7fh out 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to; ;tinit rewrites all ram to set parity correct ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard and set up serial ports nopar: xra a out 6 out 6 out 6 out 6 mvi a,0c1h outserial ports mvi a,30h out 6 ;reset parallel port pi flag mvi a,60h ;code to set po flag out 6 mvi a,0dh ;output carriage return jmp tin1 ;to parallel port ; inter: ;set up interrupt traps mvi a,0c3h ;code for 'jump' sta 30h ;store at rst 6 trap location sta 08h ;save it at rst 1 location for keyboard int. lxi h,clock shld 31h lxi h,key ;get addr of keyboard interrupt handler shld 09h ;save it at rst 1 location mvi a,50h out 6 mvi a,0c0h out 6 mvi a,0c3h ;code forlhld top key0: in 3 ani 2 jz key0 in 2 ani 7fh mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret ; ; top db 00h htop db 0ffh bot db 00h hbot db 0ffh ; ; errmsg db '******* parity error ******* type char to cont.$' count ds 2 ;counter for real-time clock ; ; ; warm ret ;warm boot initializer not used yet ; ; ; horlen equ $-user ;length 1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX indicate ; that data is in the buffer. ; horst0: push h push b lhld bot push h pop b lhld top scf: db 037h ;set carry flag ccf: db 03fh ;complement carry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented 0c0h ; ; call inter ;set interrupt traps ; ; hsbit: ;set stop bits here ;config 121h=default produces 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits mvi a,4eh ;for 1 stop bit out 3 ;to first serial port out 5 ;to second serial port mvi a,37h ;cmmd: rts er rxf dtr txen out 3 ;first port out 5 ;second port in 2 ;clear input buffers in 4 ;on both 'jump' sta 10h ;store in rst 2 location lxi h,parity shld 11h ;save at rst 2 location lxi h,00h ;initialize time counter shld count mvi a,0ach ;initialize iobyte sta 03h ei ret clock push psw ;real-time clock interrupt handler push h lhld count inx h shld count mvi a,50h out 6 pop h pop psw ei ret parity mvi c,09h lxi d,errmsg call bdos mvi c,01h call bdos ;wait until char is typed retn ; ; ; keyboard interrupt handler ; ; key: push psw push h !)ͼ !ͼ :5͡ :6:6͡ :7͡ :\ ʻ 24!dͮ 25ͮ 27ͮ 26!8 ( ʃ !Y 1  :7ʞ !z 8  !"2D2X2#! 8 !ͼ z{* ! !"!8 w#  +6# *#"~!ͼ G:6QxJQS*!w#"! 1 !"!Y~~# …¡z!ͼ wʹ* ! w#" ! 8 !" ! zz_O4:  :6y@2 0 0:x0_<2! wI2 2> 2 >2ɯ22 !~@_6^4#: w~$w: 0 q: A: A͋q: a{_2  2 - !ɯ2I:  ;*:  ͭͷ ͭ͋>9q>9: '!2 >9 7:! 6 >2>2: 2 Qͭ:Ğ! :lj<͖<j<|<: OʊQ>ÖH >2 2 û: B­>ôD> ¸!52 !"!N#~#A07O! ~*!) " {zA"*![N![ N#Fr+sq#p/>G=#w#w3#w#w!JSYMBOL TABLE OVERFLOW G*##~w*##~͎*_###s#r^#V`à 4 Wm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FP! ( 2/!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ :! G~#x=2> > ! >x6 #='G! ~ p( O*}O>4?:7w:#ĸ*"!͸* }w>ͪg( ʆ1 Y :7ʗ8 z !<ͼ CP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY G:7xʘ!#~ʄl͸Ä**!O {zʊ͸*"!!#^4!$wͯͯWƐ'@'ê>:ͪ!#^Ww*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪ:  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*?'  v:P@< !  PP27 ( *"  NZZ NCC POPEP M x_BH!œ#¶ ¦{KÈCÈ<:JCR:  !6 s!#  ɯ<:O=_Z!F!V#fjQ̓E!^#Vo&)~#FxGyѯ<àn8!~ڢͅ6~44O! s#r!~ ڿ6ͅ^4!mw!wp!~ͅ!55N! N#fio&)^#fkz'{ͅ>ɯo>g"k!m6ů{_zW5>)D*kOxGd !m?FDM!xGyOڂÃ)sn55)=â|g}o=î--#zg{ozg{ozg{oÓ:: ;,!ɯ22=2l!"]!~H5_!m~0:ą:  *":  :‰:̅ԅ!^#=ʅVq”*qͦ1& O:lµ̅>2ly:_!w~!s!m~ùy !~=w_!m~ ͅ:|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |R >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*!9"!e !" !" \!""͊: ƒde"\\\͊: ²d\͝: )d;! q* &f  ! q> ! : A O6Y: !2 6=21 á:1 : r+s#r==_HL"4 " >6 ͪS* "6 =23 :1 =21 v=O* #" Y8  ͝҉* +"8 .!2 ʞR̀* "4 4 = ͝* #" çR*6 DM+R*8 DM+R*: DM+R*< M!? q=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷͰ>2lyPLnR>UX:l̅2l͓*>E2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 Ľ y0G G t :):,.>C :|: Jü;r :R: ʼʋ!ʼR!ʼʋ>SR{ozg!~4ʧͦ !6 ! **̈́**̈́\iͩ !w#H USE FACTOR !* "z{*"* "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >N: 0O! q: O: O! p+q* |O* }O! p+q*  f! p+q* DMB! p+q)R* DMB1B* DM+;! p+q* i2 ! p+q* i2 ! p+q* i2 i2 !" p+q*! f!$ p+q*# i!& p+q*% i!( p+q*' i2 !* p+q*) f!/ s+p+q+p+q:/ =2/ X*+ *- w*+ #"+ *- #"- 1* #" ͖r*   ~!" ! ͸×* " x20 º*   DM":0 Ad*   6!" Ç!" : !"6 "8 ": }2< !"4 "= ! A 0O> :A 0:A AO>&R̀:A A H.2B !2 w:B !D s+q*C &͍:D _og_{ozg^#V) _{ozgi`N#Fogo&og_{_z#Wq=  ͝Kd*= ! ͸p!@ 6>!@ X*= }O!< *@ & w*= #"= !@ 4)!< 4\mad* }O!< :? wlR*4 DM+{R* DM+R 4 ͝*4 }¿= 4 ͝< N*4 #"4  å;*4 DM+: Y2 y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷ͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# z8O!B N#N ¾SP.* |} !9":q!"- Ͷ Aګ ҫ _!7^#V~  \p Z z ů2[\͓͢ ҫ ͐ =« f " ͓ ҫ ͐ ʻf " =ʻf "=« ý> 2͐ f "]=f =« *]}o"_  *]"a. ~ #E }"]*a 6 *]}#|#*]E ͐ « f f f {zA|« W}d ͐ f f f DMʡڏ"=ʡͲ=ʡYPͲ1**!O~4#~#F#x~#s#r#w>͐ « f f  . ᯕo>g. ë «   Ͷ ͐ =« f xY |« }ҫ gA>S Ag}S S i |« }!w s#r:[ʔ _!~ʦ ![4ç \͢¦ 2[ 7 >?  e͢!g"c> _͢a_!f~> 5*c~#"c 0 7   > >  ͢| } @ >. *_}o| , 0 ë ^#V#!Y ))))o P q s#r#!V4 !V6# ,® >2Vñ m ͅ m ͅ m ͅ « Vʫ ! XN!~  )*)þ))>+><7"9.Yͯ * M^2U :2:2ͳ:_³ͯ !6! @!!BH @@ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"QCPMOVE Vers 3.6 (C) Digital Research, 1978 (C) Lifeboat Associates, 1979 1980 1]R* ʿ?ʿ! ʌʌ0 ҟ))) O m|Ÿ}ڟ.g))͙ Invalid memory size.$!$~/w/w|g|?>@G!00"!4~:60+4͙!N#F !W*!~+~!R*͙xG}o|g"]! *]! xk {^~#o}ogM*.Ÿ# x! ~¤#ˆ* DM!  =*DM! D!00"D!E4~:ڴ60+4ô*"J͙͐͐*DM*]! =*]=!O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRET HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB ANA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= M!Eâê ö  - Ð f  "J*"!"!"2O!" "]""!1!++""M>28!"9:] !í 1 2|2\  !]w# ʫ .&  0 6 #& .K !e K w# ʫ : U 6 #K 6AW w#] !e~H#~E#~X*}|́ "!́ ͐ !ʬ =« f kʫ j \͢F w# ͋ t ʫ : W& _& & O { `i"F & & w# & ͋ « t Y t Y GтWx ͢!o ~Z #N  *. *.  NEXT PC͐ =« f  . ~ Ͷ ʻ .͓ =« f |« }w#Ä >2L͐ ! =« f }ʫ +"MD Å D  !  #! _^! ^#V~ x+ >= = !~  . !   #x f L L ͓ͅ ҆ *" !6ï +"_*~ #E گ ʫ ^#V. ï ~ CZMEIABDHSP!"M"+"!91*~!O~6=G#^#V#~x (#"!N#FW( *J>7Å*M|N+"M N:LHͅÅD Å >* *͓ b" . *"] !/~##ʁtZ*F#n!Is!^#V&&##&))::^#V#*^#V>+)x-8_$$$I$$H!!! BH" !I B  $$!BD! $!BI D@"!$I$$H"!I$I$I$UUU$$A$ D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI$H$! $I $I$$A !A@$I$"!$H$I$I "! $A$  HHAA"I @BB $A"v"!6!Ùx7? a%_0#~$7y~# =y~+ H~ !~N# 6 ~tw+ i`{_ Ù $ !"èè Syncronization error.$͙SYN͙>CwH͙>Hwk͙SLR@P.$~?w Do you have a Horizon computer (Y/N) ? $ CONFIG.COM not required on disk.$ Printer on Left, Right or Parallel port (L R or P) ? $ CONFIG.COM needed on disk for first cold boot.$!& Constructing 00K CP/M $ New CP/M in memory at 900H (sysgen image) is ready for "SYSGEN" or "SAVE 00 CPM00.COM"$CP/M$K VER$3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:SOR:---:BAT:---:SOR:PTR:CAS:RTS:SOR:CAS:RTS:---:SOR:---:LPT:---:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk SL!*p+q*)O2'!,p+q*+O2'O2'O!.p+q*-LRRLR\LR" O!/q*/& L!1p+q*0#L~*##N!ͽ͞"T!Vq*VMͳ!Xp+q!W* >Wr#MͲ!_p+q!`6>!`6*`&*^*`&Y />!`4 >*]& ~ O!]49!a6:a*]& ~2bO>z*bM >!b/~,H~:H~*H~.H~>H~<H~=H*]& 6!]4T!]4!cq*a&Y :cw!a4>!H% - *DM ͱͷDM  ͱ* N#F 9ͱ * ^#V))DM Tͱ* ~ *} *M!+s#r#4 !s+p+q!6!66:!ڄ !6!6>!r *&**&Y i !6!4+4A :} :!4- >!699 2¨ :!4: :2!6+6>! :O!9 DMi ͱ:!O!Y DMi :2͠Q" 8AO͐jͱͷDM͏ m  Z"l"!6>ʥ *}҆ *M ͱ*}x O͐} W͐ͱ !+s#r!+s#r#4D ͠:\ʹ :\=Oͳͩ !6!)6l :) :)=2) :] & !"}2\!h6?!j6?\:'C:'ƀo&")!)6!"):)/)HҘ]!)6> !)ڎ*)&*)*)&*) y!)6 Ä:) 2):)<2)M*)#")/:)ҩ*)+")`*")#"]!*)!/H!")!"]*)) *)s#r! tatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!T OË!]6:\:] Hr3 Ë:\ʀË͇ /ҋͺ *2!"q*"&L ͐ ͐ ͐!$p+q*#~*#N͐*##"#÷!&p+q͠*%DMͱ O O!(q*(&!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠":2͠!4 F :® )!6>!ګ ͠:O!9 DMi 8ͱ!6> !ڤ Å :2k ä  ͐:!O!Y DMi w !4C F :¿ >F : F :=229:Y= ;>9*&Y DM =2 I>!6:=28 :2:2 :!!29:Y T >:Y,e \>Ì !p+q*~:ʉ *N͐*#"o :͐!p+q!'"!6> **{2*́"PY! ">!+~H !6:0O͐à k͐)6> !).*)&*)*)&*) w:)<2)*)) >w#6*)) w#6*)!) w#6*)%) w#6*)) N#F*)) q#p*)%) *) ~e *) * ~o&͞ *)%) q#p!)6* >!)6!)6>!)=:)!)w=*)&*)~2):)*)& *):)2):):*)!) *)) s, >X\:)“>!d!")>!)d!")!")*++!)a*)) ^#V")]*)")*)) ^#V")]!)6> !)T*)&*)~2)*)&*)~2)O;*)) ^#V")*)) *)) N#Fq#p*)) *)s#r*)#")!)6 J:)!)J!)6 :)<2)*)")҈q:tw͠ͱ!"))ҍ*)) ^#V")]͠.*)DM\ -°!\6:\ͣ:ͱ*}DM'ͫ*)%) N#F'ͫ*)!) N#F'k͐ͫ*)) N#FͫR͐/͐ *) ~IO͐NW͐ͫ8AO͐:͐ *) ~2)t(͐:)҃)͐*)#")Ã& \!"))\Ұ*)")]͠*)M! ^#V *) >*) w *) >*) w *) >*)& !sc*&P :w:9 ұ22:_!6=!6>'!E!4!p+q*0 !99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#W(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.8$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$221@:2!o6+6+6!6#6!6#6:G*o .!N6:^*M^!K6!6!6+6' :$::=2K  :ʤ\:ҷ\x'Ͳ:!\͢  :͈'! Ͳ:$: $͈Ͳ!N6' :!Cwͯ !6:^͢c!6{:/>!/H{ͯ :<2Š ::=HҮͯ !6:Ҿ:2 !6::/H͈;!6:> !/>!p+q* !q*& *M *M !p+q*!!p+q*"!p+q*$!6  !kp+q*j> >ڪ Þ !qp+q/ *pDM9: :M2r:N!r !:r *r& N!r4 !6:͔: :ͳ.!ws+p+q+p+q:w=2wN *s*u w*s#"s*u#"u' !"*M^7 !x6:!xھ **DM͆ 2yʭ :yʗ ͯ *"*6:2x÷ *"!x4d !"/ !j}=2| !"*KM^'_ !z6:|!z1 * w *) >*) w.*)DM\ -+!\6uͱ:)O! DMͱ*)#")Ù*))))))"):m w>.Yn -:YS:Z Hҧ!6> 2)½>!)6> !)*)&*)>2) :) .͐*)M͐:)<2)99:Y=/9&ͩ c,Hͩ 9 EHͺ i`N#Fog_og_ogDM!>))덑o|gҘ =†DM!>))ҭ =¥~ ³^#V) ½^#V|g}o _{ozgi`N#Fogo&og_{_z#WABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1 :2L> ̈́M9 HHͯ :^!w:<2:0}:@E}:!S!W6: z!]6:cm!c6:_z!_6l ::,: HHҰͯ : 2ó:E:1:2v!q!*8!*6: >ͦ>ͦ!q:_  !p+q.*   !q*&!p+q*2!p+q*2!p+q*22!p+q*!p+q*!p+q*!p+q*2!p+q* "}*}DM͆ ' ͯ *"!z4 :e !"͆ !z6:|!z '? 2*H#"H!{6:{ր!Ң *{& :{4 2!{4m *":ڹ ͯ !z4I '2!"!q: !4>!S :S! :2*M! ^#V͎ * :w*#" = = = = = ͯ  *M !6q  !6q  !6q  *& !6à  !6 à  !60à  *& !6  !6  !6  *& . 1 4 7 : = F P [ f q  :2!q: " *M n :c4 *M n :2!c:Q !c:2: !:cw>!n !5 Y : { !6!q:!lwҙ  â :0O !q:O| :O| !6:]2l:o'2o:n'2n:m'2m*mMͣ *nMͣ *oMͣ :]:   *}2D" * * *&"!q:UY: Y:ҩ: ʩ:_2ʘ:€!6<:<2!ژ!6 >!]Ҥ; !6:Q::H: !6*M : !6!q:a/>z!*M:>!(:=2%> >>!F!5+N! ~2!4<2T>>!b}*bMͭz:b2!b6:<2é>!`ҥ*`MͭҞ!`6!6> :é:(!q:!wO! ~2*& :w>!:!4!6>:N<2N!> *N& N2 !p+q!6!6+6 !6: S: M!6g8:N2M*M8p!6!6!6>!ڕ*&P 6!4z!6!6#6#6!6*M8:ھ:*͇g2ê::¿::,͡A<2O>÷:S:QHI:N<22: H@"2Í202O> c!6Í202O> ڍ*&O*& !sc*&P :w:·>!ұͯ :22:_!6=!6>'!E!4!p+q*0 !r+s+p+q*~$7*>*>H&>*#"*#"> 2:R͎:!6!6=2:ʙ!6:“H9Ž>!6-e!6ͻ2=2ʺ-é:>>"ͻ2:!!5ͻ2ͬ!\2*">!b!ͯ >!`0ͯ !q:E:24J!46*}a!44EJ *KM^'́:‚ͯ !36'n::0:f9OY#9.3'ͳ.:020' 'ͳ'7 6'!j>A+!s!"@͓1!"<**"͓n "Dn"":!Q2҂:X!Wғä:ڤ*MEÓ:ұ@@:O2Mc;!6#6>!)*&P ~"::H:HDM!  ::=H-\:N2O_og_{ozg^#V))) _{ozg^#V) d^#V|g}o n_{ozgO{ozgi`N#Fogo&og H ©=¨' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈*ȟ/H:_2:!q:A/>Z!/H8: 2::=O>m:W!Q} Hmd>9>!6:2*M!E ^#V͎ڗO **~2*#"m2m͖ 2m!6m!6m!6 m2mͯ m!62m!62m!62m!62m'2:2:TҒ:2!6*ME:2::Ҳ:<22ý: 2:} >ͯ :i:2:d*M:[ *M8):[ͱ!N5!6ñ:5!6#6>!ڰ!6:<2O>/:!O!T *M͡H~K:¡!6[–ͱ!N5:2:2!4=:[¼ͱ4:!6:.2O8: :* ͇g:[ ͱ!N5!6:%:<2*6 * 6å!q!6> !d*&I :]>!4A>:<2O* :w:?†!6!q!6?!:ҠgÐ!q*&*~!6:22: :]Hں:A2O>: 2ͯ -:>>!p+q:,!6*DM9:<!6:z 2W!6D*&L :w:<2Ov*:>=20O> ڒ:0:AO>Ҥ::A }}Hͬ!wͻO`idͻV[2O>2:!X!6:!:=O!L NE!4 E E:/.*&L 6$L9k9.Xͯ *KM^020 :020:121'ͳ':²ͯ !G6!"!"7 *M^n/ :a/:H!6:ͯ !&6:H:H"!6!4:_jYO jM*"S*" 3@bl*M1͓!""7 *M^͆ \͔!":͎H*#"ͧÝ/ :>͛9ͯ .*#":_!' !'6!36' :1/!aE*#">z?C9IͲÁ.!6> !ڇ*&' ~2 ʀ: y.*M!4Q>!қ:=2á:2:Ҭ\>!ҿ:=2K:2K!:!:K\: \!p+q͈* COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mM"m +!8s~1m!f6!!6e*!M͛ /$^L:!@OL:! 2͑e:b:! L:h<2hb:! b:hO>!hw:! pX:! …!!6  LÊ!!6ûô:!ʛ͑:! ҩ OҸû:!R†!6G>!!!6 :2.t -? >!!6!6s, !6:xB!6OU2!SB!G6:҃!6:G҃*G& ~2!:G<2G_ Qқ=e  b:!-®! 6:!#¿͇;J:!:!!6Lv:!:Jv: *#"͎"&! 6R*I""ë :!M:H| ! 6>F ͛e: <2 O! Hqy d F : 2! 6*#s#r :!N ͢ *o/ Ҧ Ͷn! 6!"&R! 6o$ Î Ç :!S0 $͢- :2"+s#r!:* *& ~2!:<2 :!W> v :!X³ Z͎\ Ee ð :7/҃ E!76e ͕ :xƒ - ͷ*&"K(Kڰ *KM N͔*K"KҌ :!Z ͎  ͢ : :!  'v!gq:7 e !p+q*DM  =? ) !p+q.*DMF -L *9"`!"b!h6!j6!|6.!=\ -x !e:dʥ *eM \R :xʥ @ *dM \, :x \͕ :x - V :e _ :f w : =e !e:d*eM =e : =e =͕ !]6:x>- !"!76!6!6!66*dM  *dM !6:8!*`*;DM \u 2xʻ>!xҨ- *`*;6:82*`"`:<2w!"`9`h*`*;~2*`#"`6:0O  ú!p+q:/(*DMͩ:  : I N* *DM:aO>!Һ x!: ڦ> ʡ* +" >¡! 6: <2 =O! N͒:  O͒: ! 6:h!o$O* ͸ ! 6 !h6!: 2 3* & 6 : <2 =O! N͒*dM  :sGsu n>!6:<2=O! N͒!">!"͎/Ҵ*+">>!": *#"*""*!".+",*$"**o".!",!36:3{. *M  *!M 1m! 6!6! 6: 2Ebͽ!e:d\::eH2 H҆ͽ:e2!:d2e:!2dû :!I¬!: :H2 ҮX:h2iҐ:!ʍ:!:!H:!H,!"! 6#~ F)ͷX:! X):i!h)9 e:!:h2jO>F L>!":i!jHҼ*"+M ~ ʼͲ!f6!h6!"! 6F!f6:h2k!iҠ:i2k:j2h:k!hҶ9 æ:h2j!!6:j2he:! >"Ͳ*"M ~2!O :! *+"! 6:!B)! >w!"&*o"(R :!C:eR :!DKeX :!K\ͷX :!Lj^ :!Pš͎҇! 6F×͢җ:Ç :!T¨F :!U¾: 2 :!V͎"$DMͩ/ *oDMͩ : 2 :! (::H%^bF : ͎H :!Ay! 6*""&*o"(R͎an͢na! 6R :!F”͢ґ Ä :!J $:2$͢ :=2:<2!*& ~2!ü*""I*M*o/!:":f *g&!lq:l $ !h4:l 1 !h6*lM :hB     !h55!mq:m :hO>H2ny} !m6 !o6:n!oښ *mM !o4‚ !pq:p ڪ >:p :p H:p H!qq*qM͛  ^W :q@2q*qMW   !sp+q*r !up+q *tDM !wp+q*v !zp+q*y2x!|p+q*{2x!~p+q*}2x!p+q*!p+q*!p+q*!p+q*2x!p+q*!6   >>! q* &!p+q*:*eM !b+!s{!f!6:!b*b*^DM =ͅ N- *b"b:<2)f!"b!q9bڀ*b*^:w*b#"b!q:6ڶZͅ ʱ- !66*6& :w:6<26!J6*b}:J<2Jm=? :x- : ;*dM .=\ -=ͨ ;: *eM =ͨ .M= -C!q:Y*M !q:a/>z!/H!q*MaҎ:_:!q:ҥ*My:!p+q!'"!6>**ͪ{2**ͪ"*! ͪ":!!*22*,**"0M ~ H3*0"**+"*+">23:2/k!36,*+s#rx:3x*0"*: “**"&*"+"(á*$#"&**#"(*"#""*$#"$*"+""*$+"$*#"!4qM*"*$: *(y"$DM}|C#~ *#"*&DMyxC 1*+":4?w+"$""ͷR: —*$"("҈!"&Ô""&*""&$mڸ*o"(**$"($"O26͛*"M :6w͢:6 !7q:*7M͒:7o$+͛ͪ*$M ~28Om:8 I͇͢u$oqo͛rP! 6!"&*$"(R͎ҔM͢ҡÔ($ҵ! 6R͇vͶ2!*!Mm$"*"M :!w͢:! e2!:! : /HH/Q:! @!!6 R!!6 :!KR$*& :!w:<2dn!:s+q*$";!>6:>/;oH*;#"(";:92=*=& *(M !::=2>/H:=<2=*(#"(æÀ:>*(+"(R:>!6*FM8 *FM   Oy2F :FY5>>:!02HO> /!";u*)))*) *H& "PҘ! 6+s#ré! 6"DM!>))덑o|g =±^#V) ^#V|g}o _{ozgi`N#Fogo&og_{_z#W H = LIBX$$$$$$$LIB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; Interrupt driven bios using mode 2 Z-80 interrupts.. ; ; ; ; ; vi0 = Floppy disk sector interrupt ; ; vi1 = Vertical blanking interrupt ; ; vi2 = Clock interrupt ; buffer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; interrupt vector vectors ; F4C7 = vec0 equ 0f4c7h F4CF = vec1 equ 0f4cfh F4D7 = vec2 equ 0f4d7h F4DF = vec3 equ 0f4dfh F4E7 = f3h FEF5 = nblank equ 0fef5h ; FEF7 = r7d0 equ 0fef7h FEF8 = r7d1 equ 0fef8h FEF9 = rfd0 equ 0fef9h FEFA = rfd1 equ 0fefah ; ; ; 0038 = msize equ 56 ;mikes system ; 0005 = bdos equ 5 ;system entry point ; ; D300 = bios equ 5300h+(msize-24)*1024 DA00 = user equ bios+700h 4D00 = offset equ 270$:2*o/*!My:<2=O!s Hq**DMͷ! 6: e!"*""?k*&"?*?+M ~2A :hHҏ *&"?(?:A ½8*#" ҽ*?M ~2AO *?"?ҕ!"*"*"^: 2B! 6F:B2 o(>&H6͛9!C6>!Ca R>:C<2C?! 6!"͇͢Ґq"ڊ͛Íq!!6 !!6 !6*!Ma2D*!M͒2!:D/!+w!6e2!͢!Eq!E:!:H:H!Fq ; vi3 = A/D converter data valid interrupt ; ; vi4 = Right serial port data ready interrupt ; ; vi5 = Console keyboard interrupt ; ; vi6 = Printer interrupt ; ; vi7 = Button 0 interrupt ; ; ; ; ; ; notice::: ; ; a circular vec4 equ 0f4e7h F4EF = vec5 equ 0f4efh F4F7 = vec6 equ 0f4f7h F4FF = vec7 equ 0f4ffh ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; misc equates to be used in future ; ; FEF0 = ch0 equ 0fef0h FEF1 = ch1 equ 0fef1h FEF2 = ch equ 0fef2h FEF3 = time equ 0fe0h-user ;to overlay sysgen image 0003 = iobyte equ 03h ;iobyte ; DA00 org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed DA00 C3F7DA hcinit jmp tinit ;init i/o ports and parity DA03 C3F8DB wboot jmp warm ;warm boot initializer DA06 C3D2DA hconst jmp horst0 ;console status DA09 C367DA hconin jmp horin0 ;console input DA0C C398DA hconout jmp horout0 ;console output DA0F C347DA hlist jmp hlst ;high speed list vector DA12 C335DA hpunch jmp hpnch ;punch vector DA15 C320DA hreader jmp hread ;reader vector DA18 C3F5DA hprst jmp horprst ;printer status not implem DA1B 000000 db 0,0,0 ;reserved DA1E F901 dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; DA20 3A030z up1v ;casette out DA3F FE20 cpi 20h DA41 CAA3DA jz horout1 ;right serial port is pun: DA44 C9 ret ;ret if not cas or pun: DA45 C9 ur1v ret ;will be cassette reader DA46 C9 up1v ret ;will be cassette routine DA47 3A0300 hlst lda iobyte DA4A E6C0 ani 0c0h DA4C FE00 cpi 0h DA4E CA98DA jz horout0 ;list to console DA51 FE80 cpi 80h DA53 CAAEDA jz horout2 ;list to printer DA56 C9 ret ; o data DA6E 2AF6DB lhld bot ;get data pointer DA71 7E mov a,m ;get data itself DA72 23 inx h ;bump pointer DA73 26FF mvi h,0ffh ;make it mod 256 DA75 22F6DB shld bot DA78 E1 pop h DA79 C9 ret ; horin1: ;right serial port DA7A DB05 in 5 DA7C E602 ani 2 DA7E CA7ADA jz horin1 DA81 DB04 in 4 DA83 E67F ani 7fh DA85 C9 ret horin2: ;parallel port DA8 79 mov a,c DAA0 D302 out 2 DAA2 C9 ret horout1: ;right serial port DAA3 DB05 in 5 DAA5 E601 ani 1 DAA7 CAA3DA jz horout1 DAAA 79 mov a,c DAAB D304 out 4 DAAD C9 ret horout2: ;parallel output DAAE 79 mov a,c DAAF E67F ani 7fh DAB1 FE0A cpi 0ah DAB3 CCCFDA cz lf DAB6 DB06 loop in 6 DAB8 E601 ani ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ***** 48k cpm version ***** ; ; interrupt driven keyboard and realtime clock bios ; ; ; will also have lightpen interrupt in future ; ; ; rst6 = realtime clock ; rst1 = keyboard (left serial port only) ; rst2 = memory parity error interrupt ; rst3 = lightpen interrupt ; ; ; ; notice::: ; ; a circular buffer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory bo0 hread lda iobyte DA23 E60C ani 0ch ;mask out reader bits DA25 FE08 cpi 8h ;ur1:=cassette routine DA27 CA45DA jz ur1v ;casette input DA2A FE04 cpi 4h ;high speed reader rddr:=ptr DA2C CA57DA jz ptr ;paper tape reader DA2F FE0C cpi 0ch DA31 CA7ADA jz horin1 ;ur2:=right serial port DA34 C9 ret ;return if not either dev. DA35 3A0300 hpnch lda iobyte DA38 E630 ani 030h ;mask out punch bits DA3A FE10 cpi 10h DA3C CA46DA j ; input routines ptr: ;paper tape reader DA57 DB06 in 6 DA59 E602 ani 2 DA5B CA57DA jz ptr DA5E DB00 in 0 DA60 F5 push psw DA61 3E30 mvi a,30h DA63 D306 out 6 DA65 F1 pop psw DA66 C9 ret ; ; ; DA67 E5 horin0: push h ;get data from circlar buffer DA68 CDD2DA hloop: call horst0 ;get status of circular buffer DA6B CA68DA jz hloop ;loop if n6 DB06 in 6 ;motherboard status DA88 E602 ani 2 DA8A CA86DA jz horin2 DA8D DB00 in 0 ;read keyboard DA8F F5 push psw ;save char DA90 3E30 mvi a,30h DA92 D306 out 6 ;reset pi flag DA94 F1 pop psw DA95 E67F ani 7fh DA97 C9 ret ; ; output routines ; horout0: ;left serial port DA98 DB03 in 3 DA9A E601 ani 1 DA9C CA98DA jz horout0 DA9F1 DABA CAB6DA jz loop DABD 3E20 mvi a,20h ;reset po flag DABF D306 out 6 ;output char DAC1 79 mov a,c ;load accumulator tin1: DAC2 E67F ani 7fh DAC4 D300 out 0 DAC6 F680 ori 80h ;set strobe false DAC8 D300 out 0 ;send character DACA EE80 xri 80h ;toggle strobe DACC D300 out 0 DACE C9 ret DACF 0E07 lf mvi c,07h DAD1 C9 ret ard in the system or system will ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; msize equ 48 ;mikes system ; bdos equ 5 ;system entry point ; ; bios equ 5300h+(msize-24)*1024 user equ bios+700h offset equ 2700h-user ;to overlay sysgen image iobyte equ 03h ;iobyte ; org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed hcinit jmp tinit ;init i/o ports and parity wboot jmp warm ;warm boot initializer hconst jmp horst0 ;console status hconin jmp horin0 ;console input hconout jmp horout0 ;console output hlist jmp hlst ;high speed list vector hpunch jmp hpnch ;punch vector hreader jmp hread ;reader vector hprst jmp horprst ;printer status not implem db 0,0,0 ;reserved dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; hread lda iobyte ani 0ch ;mask out reader bits cpi 8h ;ur1:=cassette routine jz ur1v ;casette input cpi 4h ;hi: ;paper tape reader in 6 ani 2 jz ptr in 0 push psw mvi a,30h out 6 pop psw ret ; ; ; horin0: push h ;get data from circlar buffer hloop: call horst0 ;get status of circular buffer jz hloop ;loop if no data lhld bot ;get data pointer mov a,m ;get data itself inx h ;bump pointer mvi h,0ffh ;make it mod 256 shld bot pop h ret ; horin1: ;right serial port in 5 ani 2 jz horin1 in 4 ani 7fh ret horin2: ;parallel port in 6 ;motherboard status an ;output char mov a,c ;load accumulator tin1: ani 7fh out 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer. ; horst0: push h push b lhld botffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard and set up serial ports nopar: xra a out 6 out 6 out 6 out 6 mvi a,0c1h out 0c0h ; ; call inter ;set interrupt traps ; ; hsbit: ;set stop bits her to set po flag out 6 mvi a,0dh ;output carriage return jmp tin1 ;to parallel port ; inter: ;set up interrupt traps mvi a,0c3h ;code for 'jump' sta 30h ;store at rst 6 trap location sta 08h ;save it at rst 1 location for keyboard int. lxi h,clock shld 31h lxi h,key ;get addr of keyboard interrupt handler shld 09h ;save it at rst 1 location mvi a,50h out 6 mvi a,0c0h out 6 mvi a,0c3h ;code for 'jump' sta 10h ;store in rst 2 location lxi h,parity shld 11h ;save at rsgh speed reader rddr:=ptr jz ptr ;paper tape reader cpi 0ch jz horin1 ;ur2:=right serial port ret ;return if not either dev. hpnch lda iobyte ani 030h ;mask out punch bits cpi 10h jz up1v ;casette out cpi 20h jz horout1 ;right serial port is pun: ret ;ret if not cas or pun: ur1v ret ;will be cassette reader up1v ret ;will be cassette routine hlst lda iobyte ani 0c0h cpi 0h jz horout0 ;list to console cpi 80h jz horout2 ;list to printer ret ; ; input routines ptri 2 jz horin2 in 0 ;read keyboard push psw ;save char mvi a,30h out 6 ;reset pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz loop mvi a,20h ;reset po flag out 6 push h pop b lhld top scf: db 037h ;set carry flag ccf: db 03fh ;complement carry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity correct ; promloc equ 0e800h/256 and 0e ;config 121h=default produces 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits mvi a,4eh ;for 1 stop bit out 3 ;to first serial port out 5 ;to second serial port mvi a,37h ;cmmd: rts er rxf dtr txen out 3 ;first port out 5 ;second port in 2 ;clear input buffers in 4 ;on both serial ports mvi a,30h out 6 ;reset parallel port pi flag mvi a,60h ;codet 2 location lxi h,00h ;initialize time counter shld count mvi a,0ach ;initialize iobyte sta 03h ei ret clock push psw ;real-time clock interrupt handler push h lhld count inx h shld count mvi a,50h out 6 pop h pop psw ei ret parity mvi c,09h lxi d,errmsg call bdos mvi c,01h call bdos ;wait until char is typed retn ; ; ; keyboard interrupt handler ; ; key: push psw push h lhld top key0: in 2 ani 7fh ;mask off any parity bit cpi 03h ;is it a cntl-c ? jz 0h ;yes, do a warm boot cpi 11h ;is it a cntl-q ? jz 0e800h ;yes, do a cold boot mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret ; ; top db 00h htop db 0ffh bot db 00h hbot db 0ffh ; ; errmsg db '******* parity error ******* type char to cont.$' count ds 2 ;counter for real-time clock ; ; ; warm ret ;warm boot initializer not used yet ; ; ; horlen equ $-user ;length  ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer. ; DAD2 E5 horst0: push h DAD3 C5 push b DAD4 2AF6DB lhld bot DA pop h DAEC C9 ret DAED DB05 horst1: in 5 ;right serial port DAEF E602 ani 2 DAF1 C8 rz ;no key DAF2 3EFF mvi a,0ffh DAF4 C9 ret ;key horprst: horwinit: DAF5 AF xra a DAF6 C9 ret ;not implemented ; ;tinit rewrites all ram to set parity correct ; 00E8 = promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: DAF7 2100:10DA0000C3F7DAC3F8DBC3D2DAC367DAC398DAC381 :10DA100047DAC335DAC320DAC3F5DA000000F901CA :10DA20003A0300E60CFE08CA45DAFE04CA57DAFEDD :10DA30000CCA7ADAC93A0300E630FE10CA46DAFEAA :10DA400020CAA3DAC9C9C93A0300E6C0FE00CA98D1 :10DA5000DAFE80CAAEDAC9DB06E602CA57DADB00B4 :10DA6000F53E30D306F1C9E5CDD2DACA68DA2AF636 :10DA7000DB7E2326FF22F6DBE1C9DB05E602CA7A5C :10DA8000DADB04E67FC9DB06E602CA86DADB00F5EC :10DA90003E30D306F1E67FC9DB03E601CA98DA79A6 :10DAA000D302C9DB05E601CAA3DA79D304C979E652 :10DAB0007FFE0ACC DB17 C3FCDA jmp tinkl DB1A 3E41 tinu: mvi a,41h DB1C D3C0 out 0c0h ;now init motherboard and set up serial ports nopar: DB1E AF xra a DB1F D306 out 6 DB21 D306 out 6 DB23 D306 out 6 DB25 D306 out 6 DB27 3EC1 mvi a,0c1h DB29 D3C0 out 0c0h ; ; DB2B CD50DB call inter ;set interrupt traps ; ; ; now initialize D7 E5 push h DAD8 C1 pop b DAD9 2AF4DB lhld top DADC 37 scf: db 037h ;set carry flag DADD 3F ccf: db 03fh ;complement carry flag DADE ED sbc: db 0edh ;compute (hl - bc) DADF 42 db 042h DAE0 CAE8DA jz nodata ;if buffer head = buffer tail, no data DAE3 3EFF mvi a,0ffh ;data ready flag DAE5 C1 pop b DAE6 E1 pop h DAE7 C9 ret DAE8 E600 nodata: ani 0 ;no data flag DAEA C1 pop b DAEB E1 00 lxi h,0 DAFA 16E8 mvi d,promloc DAFC 7C tinkl: mov a,h DAFD BA cmp d DAFE C207DB jnz tincp DB01 C604 adi 4 ;skip 400h over prom DB03 67 mov h,a DB04 CA1ADB jz tinu DB07 7E tincp: mov a,m ;read all memory DB08 77 mov m,a ;put back with parity set DB09 2C inr l DB0A C207DB jnz tincp DB0D 24 inr h DB0E CA1ADB jz tinu DB11 7C mov a,h DB12 E603 ani 3 DB14 C207DB jnz tincp CFDADB06E601CAB6DA3E20D317 :10DAC0000679E67FD300F680D300EE80D300C90E3E :10DAD00007C9E5C52AF6DBE5C12AF4DB373FED428D :10DAE000CAE8DA3EFFC1E1C9E600C1E1C9DB05E6EB :10DAF00002C83EFFC9AFC921000016E87CBAC207C0 :10DB0000DBC60467CA1ADB7E772CC207DB24CA1A7D :10DB1000DB7CE603C207DBC3FCDA3E41D3C0AFD3F4 :10DB200006D306D306D3063EC1D3C0CD50DB3EACF0 :10DB30003203003E4ED303D3053E37D303D305DB78 :10DB400002DB043E30D3063E60D3063E0DC3C2DA8C :10DB500021B8DB22C7F421BADB22CFF421BCDB22BF :10DB6000D7F421CDDB22DFF421CFDB22Eiobyte ; DB2E 3EAC mvi a,0ach DB30 320300 sta iobyte ; ; ; ; hsbit: ;set stop bits here ;config 121h=default produces 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits DB33 3E4E mvi a,4eh ;for 1 stop bit DB35 D303 out 3 ;to first serial port DB37 D305 out 5 ;to second serial port DB39 3E37 mvi a,37h ;cmmd: rts er rxf dtr txen DB3B D303 out 3 ;first port DB3D D305 out 5 ;second port DB3F DB02 in 2 ;clear input buffers DB41 DB04 in 4 ;on both serial ports DB43 3E30 mvi a,30h DB45 D306 out 6 ;reset parallel port pi flag DB47 3E60 mvi a,60h ;code to set po flag DB49 D306 oB74 21EFDB lxi h,vi6 DB77 22F7F4 shld vec6 DB7A 21F1DB lxi h,vi7 DB7D 22FFF4 shld vec7 DB80 3EF4 mvi a,0f4h DB82 ED47 dw 047edh ; ld i,a DB84 ED5E dw 05eedh ; im 2 DB86 3E07 mvi a,7 ;chip #0 on sound board: r14 = inp; r15 = out DB88 D3F0 out 0f0h DB8A 3E80 mvi a,80h DB8C D3F1 out 0f1h DB8E 32F7FE sta r7d0 DB91 3E0F mvi a,0fh ;reset vblank and data valid flip-flo ; set time to zero DBB0 210000 lxi h,0 DBB3 22F3FE shld time ; DBB6 FB ei DBB7 C9 ret DBB8 FB vi0: ei ;disk interrupt DBB9 C9 ret DBBA FB vi1: ei ;vblank interrupt DBBB C9 ret DBBC F5 vi2: push psw ;clock interrupt DBBD E5 push h DBBE 3E50 mvi a,50h DBC0 D306 out 6 DBC2 2AF3FE lhld time DBC5 23 inx h DBC6 22F3FE shld time DBC9 E1 pop h a cntl-q ? DBE1 CA00E8 jz 0e800h ;yes, do a cold boot DBE4 77 mov m,a DBE5 23 inx h DBE6 26FF mvi h,0ffh DBE8 22F4DB shld top DBEB E1 pop h DBEC F1 pop psw DBED FB ei DBEE C9 ret DBEF FB vi6: ei ;printer interrupt DBF0 C9 ret DBF1 FB vi7: ei ;memory parity interrupt DBF2 C9 ret DBF3 00 last: nop ;end of interrupt traps code ; ; D:10BA0000C3F7BAC3F6BBC3D2BAC367BAC398BAC343 :10BA100047BAC335BAC320BAC3F5BA000000F7016C :10BA20003A0300E60CFE08CA45BAFE04CA57BAFE3D :10BA30000CCA7ABAC93A0300E630FE10CA46BAFE0A :10BA400020CAA3BAC9C9C93A0300E6C0FE00CA9811 :10BA5000BAFE80CAAEBAC9DB06E602CA57BADB0034 :10BA6000F53E30D306F1C9E5CDD2BACA68BA2ABDCF :10BA7000BB7E2326FF22BDBBE1C9DB05E602CA7AF5 :10BA8000BADB04E67FC9DB06E602CA86BADB00F54C :10BA90003E30D306F1E67FC9DB03E601CA98BA79E6 :10BAA000D302C9DB05E601CAA3BA79D304C979E692 :10BAB0007FFE0ACCut 6 DB4B 3E0D mvi a,0dh ;output carriage return DB4D C3C2DA jmp tin1 ;to parallel port ; inter: ;set up interrupt traps DB50 21B8DB lxi h,vi0 DB53 22C7F4 shld vec0 DB56 21BADB lxi h,vi1 DB59 22CFF4 shld vec1 DB5C 21BCDB lxi h,vi2 DB5F 22D7F4 shld vec2 DB62 21CDDB lxi h,vi3 DB65 22DFF4 shld vec3 DB68 21CFDB lxi h,vi4 DB6B 22E7F4 shld vec4 DB6E 21D1DB lxi h,vi5 DB71 22EFF4 shld vec5 Dps, DB93 D3F0 out 0f0h ;and disarm their respective interrupts. DB95 3E00 mvi a,0 DB97 D3F1 out 0f1h DB99 3E0D mvi a,0dh DB9B D3F1 out 0f1h DB9D 3E01 mvi a,1 DB9F D3F1 out 0f1h DBA1 3E0D mvi a,0dh DBA3 D3F1 out 0f1h DBA5 32F9FE sta rfd0 ; ; reset clock flag, arm its interrupt ; DBA8 3E50 mvi a,50h DBAA D306 out 6 DBAC 3EC0 mvi a,0c0h DBAE D306 out 6DBCA F1 pop psw DBCB FB ei DBCC C9 ret DBCD FB vi3: ei ;a/d interrupt DBCE C9 ret DBCF FB vi4: ei ;right serial port interrupt DBD0 C9 ret DBD1 F5 vi5: push psw ;console keyboard interrupt DBD2 E5 push h DBD3 2AF4DB lhld top key0: DBD6 DB02 in 2 DBD8 E67F ani 7fh DBDA FE0B cpi 0bh ;is it a cntl-k ? DBDC CA0000 jz 0h ;yes, do a warmm boot DBDF FE11 cpi 11h ;is it BF4 00 top db 00h DBF5 FF htop db 0ffh DBF6 00 bot db 00h DBF7 FF hbot db 0ffh ; ; ; ; ; DBF8 C9 warm ret ;warm boot initializer not used yet ; ; ; 01F9 = horlen equ $-user ;length 0 out 0c0h ;now init motherboard and set up serial ports nopar: BB1E AF xra aCFBADB06E601CAB6BA3E20D377 :10BAC0000679E67FD300F680D300EE80D300C90E5E :10BAD00007C9E5C52ABDBBE5C12ABBBB373FED425F :10BAE000CAE8BA3EFFC1E1C9E600C1E1C9DB05E62B :10BAF00002C83EFFC9AFC921000016E87CBAC207E0 :10BB0000BBC60467CA1ABB7E772CC207BB24CA1AFD :10BB1000BB7CE603C207BBC3FCBA3E41D3C0AFD374 :10BB200006D306D306D3063EC1D3C0CD4BBB3E4E93 :10BB3000D303D3053E37D303D305DB02DB043E300A :10BB4000D3063E60D3063E0DC3C2BA3EC3323000B8 :10BB5000320800217FBB223100219DBB2209003E1B :10BB600050D3063EC0D3063EC33210002;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; Interrupt driven bios using mode 2 Z-80 interrupts.. ; ; ; ; ; vi0 = Floppy disk sector interrupt ; ; vi1 = Vertical blanking interrupt ; ; vi2 = Clock interrupt ; ; vi3 = A/D converter data valid interrupt ; ; vi4 = Right serial port data ready interrupt ; ; vi5 = Console keyboard interrupt ; ; vi6 = Printer interrupt ; ; vi7 = Button 0 interrupt ; ; ; ; ; ; notice::: ; ; a circular buf ch0 equ 0fef0h ch1 equ 0fef1h ch equ 0fef2h time equ 0fef3h nblank equ 0fef5h ; r7d0 equ 0fef7h r7d1 equ 0fef8h rfd0 equ 0fef9h rfd1 equ 0fefah ; ; ; msize equ 56 ;mikes system ; bdos equ 5 ;system entry point ; ; bios equ 5300h+(msize-24)*1024 user equ bios+700h offset equ 2700h-user ;to overlay sysgen image iobyte equ 03h ;iobyte ; org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed hcinit jmp tinit ;init ie jz ur1v ;casette input cpi 4h ;high speed reader rddr:=ptr jz ptr ;paper tape reader cpi 0ch jz horin1 ;ur2:=right serial port ret ;return if not either dev. hpnch lda iobyte ani 030h ;mask out punch bits cpi 10h jz up1v ;casette out cpi 20h jz horout1 ;right serial port is pun: ret ;ret if not cas or pun: ur1v ret ;will be cassette reader up1v ret ;will be cassette routine hlst lda iobyte ani 0c0h cpi 0h jz horout0 ;list to console cpi 80h jz horout2 ;list to l port in 6 ;motherboard status ani 2 jz horin2 in 0 ;read keyboard push psw ;save char mvi a,30h out 6 ;reset pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz l190BB2204 :10BB7000110021000022F4BB3EAC320300FBC9F5EA :10BB8000E52AF4BB2322F4BB3E50D306E1F1FBC906 :10BB90000E0911BFBBCD05000E01CD0500F5E52A4C :10BBA000BBBBDB02E67FFE03CA0000FE11CA00E851 :10BBB000772326FF22BBBBE1F1FBC900FF00FF2A70 :10BBC0002A2A2A2A2A2A2020207061726974792060 :10BBD0006572726F722020202A2A2A2A2A2A2A2095 :10BBE0002074797065206368617220746F20636FC0 :04BBF0006E742E241D :01BBF600C985 :0000000000 fer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; interrupt vector vectors ; vec0 equ 0f4c7h vec1 equ 0f4cfh vec2 equ 0f4d7h vec3 equ 0f4dfh vec4 equ 0f4e7h vec5 equ 0f4efh vec6 equ 0f4f7h vec7 equ 0f4ffh ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; misc equates to be used in future ; ; /o ports and parity wboot jmp warm ;warm boot initializer hconst jmp horst0 ;console status hconin jmp horin0 ;console input hconout jmp horout0 ;console output hlist jmp hlst ;high speed list vector hpunch jmp hpnch ;punch vector hreader jmp hread ;reader vector hprst jmp horprst ;printer status not implem db 0,0,0 ;reserved dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; hread lda iobyte ani 0ch ;mask out reader bits cpi 8h ;ur1:=cassette routinprinter ret ; ; input routines ptr: ;paper tape reader in 6 ani 2 jz ptr in 0 push psw mvi a,30h out 6 pop psw ret ; ; ; horin0: push h ;get data from circlar buffer hloop: call horst0 ;get status of circular buffer jz hloop ;loop if no data lhld bot ;get data pointer mov a,m ;get data itself inx h ;bump pointer mvi h,0ffh ;make it mod 256 shld bot pop h ret ; horin1: ;right serial port in 5 ani 2 jz horin1 in 4 ani 7fh ret horin2: ;paralleoop mvi a,20h ;reset po flag out 6 ;output char mov a,c ;load accumulator tin1: ani 7fh out 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer.>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{_A_' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] ' on A, then type RETURN $ CP/M image in RAM at 900H is ready to write or reboot and "SAVE 40 CPMxx.COM"$ Destination drive NAME (or RETURN to reboot) $Place DESTINATION disk on , then type RETURN $Permanent ERROR - Type RETURN to ignore $Function complete$Invalid drive name (Use A B C or D) $No source file on disk$Source file incomplete$()صUׁBְP!6DW1"|2!g•$$ *%.!~.1~.!~Ϳ g•$$ D>ڼ:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~ʼ*.~¿:O!^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ý2˽ýýý߽#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ:˜1͘оA͌>>͌9ؾо2^ :ķ¥.!_~#fow]­Îå!v"!çREAD ERRORçNO FILE^:ķ ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:ķ=!ľý:ķ=!ľ:ý^T!~  6?#ˆ:`O> K{͘оA͒>:͒͢>:͒͢xK > K > ͒x =qf^!~2>`~2į2\!!B!~> >#0~O#Cx2͘վ1)ͽÂf zͧÆBAD LOADCOMf^: !Ķ Â$$$ SUB"řťūű"C{2!"E9"1ޯ22!ty)K!G_^#V*Cǐ~уEќѥѫ ,&-AGMSț!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6 Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\qfr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"ý !Ķ2:2a{_:ķʖ:ķ>Ľ˽ʖ:=2–!B!6#5ڽʖ:ķĽ!ͬ¾ʧݾÂݾ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ݾ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٿ6?ۿwȿ0߿#6 #6"  ͢¾ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tнʧ͘!6!~ڇ ¯w4!Y~ʆ͌¾†t=ʆf ^ T ¯2o&)|+!ؾڽ<ͧվÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yøpsp2mÆÆf ͧÆFILE EXISTS _: É: :ķʉ=2)ͽÉ T!@нk!ؾ}|q O͐  :ȷE B 2>: ȷb# : ȷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! Ⱦ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7Ư2 H! >w_: ! Ⱦ5ͤNkͱ¦ͱxʊ#Nx: ȷ! Ȗ2 ͤ! 5™#wO~x½p Hy<< ӷʑ :!qMD#2E>jtئIYطغ%/f3! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>ӯ*w#w*w#w'û*ӷ! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N:ҷ EG>O: \ɷSɀ*C :ҷqn& ^#V>O^"*}:*)=":O:ҡo"*C *C!ͮ~2~2ͦ:Ҧ2ͮ:ɯO:ҁw:w |g}o*ү# ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s̖-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ҷ~w~͔͔# # ɯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BȾw!>2*C~=2u:B2~2wE:A*Cȶw>"!""ү2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*6̓:O:]Ԗ܀]Լܦ]](?O?(?(Q?y!پ2y:o&))))!}2<&i"y2`i"* n& W2(`կ2(y2) `շ!>կ2$! ͂!$5W! pWW*1#=~O*!#"!2#ݯ2'ɯ2$<2'!%~6ʐ!pˆ=ʈ|O~|ٹʥ:&ݷľ2&!͂:'ݷ:=o&)))))))***:(ݷ>2&͇:(=:)կ:&ݷþ֯2%2$2&!YY",".!5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:48O=MͰ>=`:]z24###=É~#‰ٯ~$N# Ó!5>>ͿͿ)­6w#< %#H% ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:҅o$*C~i6iw**{#zr+s{ozg**͕** ʾ,w͜͸Ͳ!!N#F$**O!~#:AȾ#~$=2Ek͌ w ~>2!E5T*C!"C"C!w# F! w͌xʯ2͢*C ~<wʃG:Ҡ!Ҧʎì 4~ʶ¬:<ʶ$ʶïZͻɯx>2>2ͻ:!ҾZί2:Eȷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ҷ:ddslO s#r:Eȷ͊:==»y==»*Ww#*"͸*:G#š"͸:!Ҿw4iw:Z!E~=26):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*ҤW}_*"}o|g":ҷʑ*C6:ҷʑw:2E**E}DQ>2Àß Ù4 CP/M2 on North Star 56K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220X͡!"P1>!4Ÿ>!4Ÿ>*4Ÿ*͉>22!"!"!0~6!""Ù͛w͛:O  yO*>239-͇yO!~k׹U#~2#^#V#^#V"1͛qͲ͂ s#ryO*\~N:!مo~]Il5ݐ{IݰI>:O _4:͞怱O:G:|W*y>zW>:!"yAw!͓  Mount disk A, then $23> !~=N׆Gy@O:3̓:bo=9>{:@:34yg> gy?Oڟ 22yo:-ªڼ:2@>"!+ ~Ydd*2~}OG<=Ͱ:þpÚG5 : EW |:0F ʥ:ʚʰW>0W2 p|ʈ>0ʚyʥyy ʸ> y>>ɯ!|g ~w,$ |>A>:>N>7>0>`> >20!e"1>P>>2f!v"g!">2*#">P ******* PARITY ERROR ******* TYPE CHAR TO CONT.2ɯ !͉!"" " >22!"!"2OCONFIG ; horst0: push h push b lhld bot push h pop b lhld top scf: db 037h ;set carry flag ccf: db 03fh ;complement carry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity c7F421D172 :10DB7000DB22EFF421EFDB22F7F421F1DB22FFF4CB :10DB80003EF4ED47ED5E3E07D3F03E80D3F132F731 :10DB9000FE3E0FD3F03E00D3F13E0DD3F13E01D354 :10DBA000F13E0DD3F132F9FE3E50D3063EC0D3060E :10DBB00021000022F3FEFBC9FBC9FBC9F5E53E507D :10DBC000D3062AF3FE2322F3FEE1F1FBC9FBC9FBD6 :10DBD000C9F5E52AF4DBDB02E67FFE0BCA0000FE96 :10DBE00011CA00E8772326FF22F4DBE1F1FBC9FB31 :09DBF000C9FBC90000FF00FFC9D8 :0000000000 aps ; ; ; now initialize iobyte ; mvi a,0ach sta iobyte ; ; ; ; hsbit: ;set stop bits here ;config 121h=default produces 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits mvi a,4eh ;for 1 stop bit out 3 ;to first serial port out 5 ;to second serial port mvi a,37h ;cmmd: rts er rxf dtr txen out 3 ;first port out 5 ;second port in 2 ;clear input bard: r14 = inp; r15 = out out 0f0h mvi a,80h out 0f1h sta r7d0 mvi a,0fh ;reset vblank and data valid flip-flops, out 0f0h ;and disarm their respective interrupts. mvi a,0 out 0f1h mvi a,0dh out 0f1h mvi a,1 out 0f1h mvi a,0dh out 0f1h sta rfd0 ; ; reset clock flag, arm its interrupt ; mvi a,50h out 6 mvi a,0c0h out 6 ; set time to zero lxi h,0 shld time ; ei ret vi0: ei ;disk interrupt ret vi1: ei ;vblank interrupt ret vi2: push psw ;clock inter;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; Interrupt driven bios using mode 2 Z-80 interrupts.. ; ; ; ; ; vi0 = Floppy disk sector interrupt ; ; vi1 = Vertical blanking interrupt ; ; vi2 = Clock interrupt ; ; vi3 = A/D converter data valid interrupt ; ; vi4 = Right serial port data ready interrupt ; ; vi5 = Console keyboard interrupt ; ; vi6 = Printer interrupt ; ; vi7 = Button 0 interrupt ; ; ; ; ; ; notice::: ; ; a circular buforrect ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard and set up serial ports nopar: xra a out 6 out 6 out 6 out 6 mvi a,0c1h out 0c0h ; ; call inter ;set interrupt trrupt ; rst3 = lightpen interrupt ; ; ; ; notice::: ; ; a circular buffer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; uffers in 4 ;on both serial ports mvi a,30h out 6 ;reset parallel port pi flag mvi a,60h ;code to set po flag out 6 mvi a,0dh ;output carriage return jmp tin1 ;to parallel port ; inter: ;set up interrupt traps lxi h,vi0 shld vec0 lxi h,vi1 shld vec1 lxi h,vi2 shld vec2 lxi h,vi3 shld vec3 lxi h,vi4 shld vec4 lxi h,vi5 shld vec5 lxi h,vi6 shld vec6 lxi h,vi7 shld vec7 mvi a,0f4h dw 047edh ; ld i,a dw 05eedh ; im 2 mvi a,7 ;chip #0 on sound borupt push h mvi a,50h out 6 lhld time inx h shld time pop h pop psw ei ret vi3: ei ;a/d interrupt ret vi4: ei ;right serial port interrupt ret vi5: push psw ;console keyboard interrupt push h lhld top key0: in 2 ani 7fh cpi 0bh ;is it a cntl-k ? jz 0h ;yes, do a warmm boot cpi 11h ;is it a cntl-q ? jz 0e800h ;yes, do a cold boot mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret vi6: ei ;printer interrupt ret vi7: ei ;memory parity interrufer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; interrupt vector vectors ; vec0 equ 0f4c7h vec1 equ 0f4cfh vec2 equ 0f4d7h vec3 equ 0f4dfh vec4 equ 0f4e7h vec5 equ 0f4efh vec6 equ 0f4f7h vec7 equ 0f4ffh ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; misc equates to be used in future ; ; ch0 equ 0fef0h ch1 equ 0fef1h ch equ 0fef2h time equ 0fef3h nblank equ 0fef5h ; r7d0 equ 0fef7h r7d1 equ 0fef8h rfd0 equ 0fef9h rfd1 equ 0fefah ; ; ; msize equ 56 ;mikes system ; bdos equ 5 ;system entry point ; ; bios equ 5300h+(msize-24)*1024 user equ bios+700h offset equ 2700h-user ;to overlay sysgen image iobyte equ 03h ;iobyte ; org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed hcinit jmp tinit ;init ipt ret last: nop ;end of interrupt traps code ; ; top db 00h htop db 0ffh bot db 00h hbot db 0ffh ; ; ; ; ; warm ret ;warm boot initializer not used yet ; ; ; horlen equ $-user ;length  cpi 0bh ;is it a cntl-k ? jz 0h ;yes, do a warmm boot cpi 11h ;is it a cntl-q ? jz 0e800h ;yes, do a cold boot mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret vi6: ei ;printer interrupt ret vi7: ei ;memory parity interru;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; ; interrupt driven keyboard and realtime clock bios ; ; ; will also have lightpen interrupt in future ; ; ; rst6 = realtime clock ; rst1 = keyboard (left serial port only) ; rst2 = memory parity error interrupt ; rst3 = lightpen interrupt ; ; ; ; notice::: ; ; a circular buffer for the keyboard interrupt ; routine is located at ff00 to ffff. leave the ; high memory board in the system or system will horst0 ;console status hconin jmp horin0 ;console input hconout jmp horout0 ;console output hlist jmp hlst ;high speed list vector hpunch jmp hpnch ;punch vector hreader jmp hread ;reader vector hprst jmp horprst ;printer status not implem db 0,0,0 ;reserved dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; hread lda iobyte ani 0ch ;mask out reader bits cpi 8h ;ur1:=cassette routine jz ur1v ;casette input cpi 4h ;high speed reader rddr:=ptr jz p ani 2 jz ptr in 0 push psw mvi a,30h out 6 pop psw ret ; ; ; horin0: push h ;get data from circlar buffer hloop: call horst0 ;get status of circular buffer jz hloop ;loop if no data lhld bot ;get data pointer mov a,m ;get data itself inx h ;bump pointer mvi h,0ffh ;make it mod 256 shld bot pop h ret ; horin1: ;right serial port in 5 ani 2 jz horin1 in 4 ani 7fh ret horin2: ;parallel port in 6 ;motherboard status ani 2 jz horin2 in 0 ;read ke/o ports and parity wboot jmp warm ;warm boot initializer hconst jmp horst0 ;console status hconin jmp horin0 ;console input hconout jmp horout0 ;console output hlist jmp hlst ;high speed list vector hpunch jmp hpnch ;punch vector hreader jmp hread ;reader vector hprst jmp horprst ;printer status not implem db 0,0,0 ;reserved dw horlen ;length of this program ; ; ;vector routines (uses i/o byte) ; ; hread lda iobyte ani 0ch ;mask out reader bits cpi 8h ;ur1:=cassette routinquence of jumps may not be changed DA00 C300DB hcinit jmp tinit ;init i/o ports and parity DA03 C3FCDB wboot jmp warm ;warm boot initializer DA06 C3DBDA hconst jmp horst0 ;console status DA09 C370DA hconin jmp horin0 ;console input DA0C C3A1DA hconout jmp horout0 ;console output DA0F C347DA hlist jmp hlst ;high speed list vector DA12 C335DA hpunch jmp hpnch ;punch vector DA15 C320DA hreader jmp hread ;reader vector DA18 C3FEDA hprst jmp ; fail!!!!! ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; msize equ 56 ;mikes system ; bdos equ 5 ;system entry point ; ; bios equ 5300h+(msize-24)*1024 user equ bios+700h offset equ 2700h-user ;to overlay sysgen image iobyte equ 03h ;iobyte ; org user ;origin of this program ; ;the jump table following must be present ;the sequence of jumps may not be changed hcinit jmp tinit ;init i/o ports and parity wboot jmp warm ;warm boot initializer hconst jmptr ;paper tape reader cpi 0ch jz horin1 ;ur2:=right serial port ret ;return if not either dev. hpnch lda iobyte ani 030h ;mask out punch bits cpi 10h jz up1v ;casette out cpi 20h jz horout1 ;right serial port is pun: ret ;ret if not cas or pun: ur1v ret ;will be cassette reader up1v ret ;will be cassette routine hlst lda iobyte ani 0c0h cpi 0h jz horout0 ;list to console cpi 80h jz horout2 ;list to printer ret ; ; input routines ptr: ;paper tape reader in 6 yboard push psw ;save char mvi a,30h out 6 ;reset pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz loop mvi a,20h ;reset po flag out 6 ;output char mov a,c ;load accumulator tin1: ani 7fh out 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer. ; horst0: push h push b lhld bot push h pop b lhld top sch,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard and set up serial ports nopar: xra a out 6 out 6 out 6 out 6 mvi a,0c1h out 0c0h ; ; call inter ;set interrupt traps ; ; hsbit: ;set stop bits here ;config 121h=default produce0dh ;output carriage return jmp tin1 ;to parallel port ; inter: ;set up interrupt traps mvi a,0c3h ;code for 'jump' sta 30h ;store at rst 6 trap location sta 08h ;save it at rst 1 location for keyboard int. lxi h,clock shld 31h lxi h,key ;get addr of keyboard interrupt handler shld 09h ;save it at rst 1 location mvi a,50h out 6 mvi a,0c0h out 6 mvi a,0c3h ;code for 'jump' sta 10h ;store in rst 2 location lxi h,parity shld 11h ;save at rst 2 location lxi h,00h ;initiatl-q ? jz 0e800h ;yes, do a cold boot mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret ; ; top db 00h htop db 0ffh bot db 00h hbot db 0ffh ; ; errmsg db '******* parity error ******* type char to cont.$' count ds 2 ;counter for real-time clock ; ; ; warm ret ;warm boot initializer not used yet ; ; ; horlen equ $-user ;length psw push h lhld top key0: in 2 ani 7fh cpi 03h ;is it a cntl-c ? jz 0h ;yes, do a warmm boot cpi 11h ;is it a cne jz ur1v ;casette input cpi 4h ;high speed reader rddr:=ptr jz ptr ;paper tape reader cpi 0ch jz horin1 ;ur2:=right serial port ret ;return if not either dev. hpnch lda iobyte ani 030h ;mask out punch bits cpi 10h jz up1v ;casette out cpi 20h jz horout1 ;right serial port is pun: ret ;ret if not cas or pun: ur1v ret ;will be cassette reader up1v ret ;will be cassette routine hlst lda iobyte ani 0c0h cpi 0h jz horout0 ;list to console cpi 80h jz horout2 ;list to f: db 037h ;set carry flag ccf: db 03fh ;complement carry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity correct ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi s 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits mvi a,4eh ;for 1 stop bit out 3 ;to first serial port out 5 ;to second serial port mvi a,37h ;cmmd: rts er rxf dtr txen out 3 ;first port out 5 ;second port in 2 ;clear input buffers in 4 ;on both serial ports mvi a,30h out 6 ;reset parallel port pi flag mvi a,60h ;code to set po flag out 6 mvi a,lize time counter shld count mvi a,0ach ;initialize iobyte sta 03h ei ret clock push psw ;real-time clock interrupt handler push h lhld count inx h shld count mvi a,50h out 6 pop h pop psw ei ret parity mvi c,09h lxi d,errmsg call bdos mvi c,01h call bdos ;wait until char is typed retn ; ; ; keyboard interrupt handler ; ; key: push psw push h lhld top key0: in 2 ani 7fh cpi 03h ;is it a cntl-c ? jz 0h ;yes, do a warmm boot cpi 11h ;is it a cnprinter ret ; ; input routines ptr: ;paper tape reader in 6 ani 2 jz ptr in 0 push psw mvi a,30h out 6 pop psw ret ; ; ; horin0: push h ;get data from circlar buffer hloop: call horst0 ;get status of circular buffer jz hloop ;loop if no data lhld bot ;get data pointer mov a,m ;get data itself inx h ;bump pointer mvi h,0ffh ;make it mod 256 shld bot pop h ret ; horin1: ;right serial port in 5 ani 2 jz horin1 in 4 ani 7fh ret horin2: ;parallel port in 6 ;motherboard status ani 2 jz horin2 in 0 ;read keyboard push psw ;save char mvi a,30h out 6 ;reset pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz l ; horst0: push h push b lhld bot push h pop b lhld top scf: db 037h ;set carry flag ccf: db 03fh ;complement carry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity caps ; ; ; now initialize iobyte ; mvi a,0ach sta iobyte ; ; ; ; hsbit: ;set stop bits here ;config 121h=default produces 1 stop bit ;config 121h=2 produces 2 stop bits ; ;0ceh sets 2sbits, 16x clock, 8bits, no par ;04eh sets 1sbit, 16x clock, 8bits, no par ;mvi a,0ceh ;for 2 stop bits mvi a,4eh ;for 1 stop bit out 3 ;to first serial port out 5 ;to second serial port mvi a,37h ;cmmd: rts er rxf dtr txen out 3 ;first port out 5 ;second port in 2 ;clear input bard: r14 = inp; r15 = out out 0f0h mvi a,80h out 0f1h mvi a,0fh ;reset vblank and data valid flip-flops, out 0f0h ;and disarm their respective interrupts. mvi a,0 out 0f1h mvi a,0dh out 0f1h mvi a,1 out 0f1h mvi a,0dh out 0f1h ; ; reset clock flag, arm its interrupt ; mvi a,50h out 6 mvi a,0c0h out 6 ; set time to zero lxi h,0 shld time ; ei ret vi0: ei ;disk interrupt ret vi1: ei ;vblank interrupt ret vi2: push psw ;clock interrupt push h mvi a,5>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{__' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] 'oop mvi a,20h ;reset po flag out 6 ;output char mov a,c ;load accumulator tin1: ani 7fh out 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer.orrect ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard and set up serial ports nopar: xra a out 6 out 6 out 6 out 6 mvi a,0c1h out 0c0h ; ; call inter ;set interrupt truffers in 4 ;on both serial ports mvi a,30h out 6 ;reset parallel port pi flag mvi a,60h ;code to set po flag out 6 mvi a,0dh ;output carriage return jmp tin1 ;to parallel port ; inter: ;set up interrupt traps lxi h,vi0 shld vec0 lxi h,vi1 shld vec1 lxi h,vi2 shld vec2 lxi h,vi3 shld vec3 lxi h,vi4 shld vec4 lxi h,vi5 shld vec5 lxi h,vi6 shld vec6 lxi h,vi7 shld vec7 mvi a,0f4h dw 047edh ; ld i,a dw 05eedh ; im 2 mvi a,7 ;chip #0 on sound bo0h out 6 lhld time inx h shld time pop h pop psw ei ret vi3: ei ;a/d interrupt ret vi4: ei ;right serial port interrupt ret vi5: push psw ;console keyboard interrupt push h lhld top key0: in 2 ani 7fh cpi 0bh ;is it a cntl-k ? jz 0h ;yes, do a warmm boot cpi 11h ;is it a cntl-q ? jz 0e800h ;yes, do a cold boot mov m,a inx h mvi h,0ffh shld top pop h pop psw ei ret vi6: ei ;printer interrupt ret vi7: ei ;memory parity interrupt ret last: nop ;en Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\qڼ:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~ʼ*.~¿:O!^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ý2˽ýýý߽#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ:˜1͘оA͌>>͌9ؾо2^ :ķ¥.!_~#fow]­Îå!v"!çREAD ERRORçNO FILE^:ķ ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:ķ=!ľý:ķ=!ľ:ý^T!~  6?#ˆ:`O> K{͘оA͒>:͒͢>:͒͢xK > K > ͒x =qf^!~2>`~2į2\!!B!~> >#0~O#Cx2͘վ1)ͽÂf zͧÆBAD LOADCOMf^: !Ķ Â$$$ SUB"řťūű"C{2!"E9"1ޯ22!ty)K!G_^#V*Cǐ~уEќѥѫ ,&-AGMSț!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~62E>jtئIYطغ%/f3! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>ӯ*w#w*w#w'û*ӷ! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N:ҷ EG>O: \ɷSɀ*C :ҷqn& ^#V>O^"*}:*)=":O:ҡo"*C *C!ͮ~2~2ͦ:Ҧ2ͮ:ɯO:ҁw:w |g}o*ү# !gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"ý !Ķ2:2a{_:ķʖ:ķ>Ľ˽ʖ:=2–!B!6#5ڽʖ:ķĽ!ͬ¾ʧݾÂݾ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ݾ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٿ6?ۿwȿ0߿#6 #6"  ͢¾ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tнʧ͘!6!~ڇ ¯w4!Y~ʆ͌¾†t=ʆf ^ T ¯2o&)|+!ؾڽ<ͧվÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yøpsp2mÆÆf ͧÆFILE EXISTS _: É: :ķʉ=2)ͽÉ T!@нk!ؾ}|q O͐  :ȷE B 2>: ȷb# : ȷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! Ⱦ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7Ư2 H! >w_: ! Ⱦ5ͤNkͱ¦ͱxʊ#Nx: ȷ! Ȗ2 ͤ! 5™#wO~x½p Hy<< ӷʑ :!qMD# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:҅o$*C~i6iw**{#zr+s{ozg**͕** ʾ,w͜͸Ͳ!!N#F$**O!~#:AȾ#~$=2Ek͌::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s̖-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ҷ~w~͔͔# # ɯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BȾw!>2*C~=2u:B2~2wE:A*Cȶw>"!""ү2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*6̓:O:]Ԗ܀]Լܦ]](?O?(?(Q?y!پ2y:o&))))!}2<&i"y2`i"* n& W2(`կ2(y2) `շ!>կ2$! ͂!$5W! pWW*1#=~O*!#"!2#ݯ2'ɯ2$<2'!%~6ʐ!pˆ=ʈ|O~|ٹʥ:&ݷľ2&!͂:'ݷ:=o&)))))))***:(ݷ>2&͇:(=:)կ:&ݷþ֯2%2$2&!YY",".!5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:48O=MͰ>=`:]z24###=É~#‰ٯ~$N# Ó!5>>ͿͿ)­6w#< %#H%:10DA0000C3F7DAC3F6DBC3D2DAC367DAC398DAC383 :10DA100047DAC335DAC320DAC3F5DA000000F701CC :10DA20003A0300E60CFE08CA45DAFE04CA57DAFEDD :10DA30000CCA7ADAC93A0300E630FE10CA46DAFEAA :10DA400020CAA3DAC9C9C93A0300E6C0FE00CA98D1 :10DA5000DAFE80CAAEDAC9DB06E602CA57DADB00B4 :10DA6000F53E30D306F1C9E5CDD2DACA68DA2ABD6F :10DA7000DB7E2326FF22BDDBE1C9DB05E602CA7A95 :10DA8000DADB04E67FC9DB06E602CA86DADB00F5EC :10DA90003E30D306F1E67FC9DB03E601CA98DA79A6 :10DAA000D302C9DB05E601CAA3DA79D304C979E652 :10DAB0007FFE0ACC w ~>2!E5T*C!"C"C!w# F! w͌xʯ2͢*C ~<wʃG:Ҡ!Ҧʎì 4~ʶ¬:<ʶ$ʶïZͻɯx>2>2ͻ:!ҾZί2:Eȷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ҷ:ddslO s#r:Eȷ͊:==»y==»*Ww#*"͸*:G#š"͸:!Ҿw4iw:Z!E~=26):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*ҤW}_*"}o|g":ҷʑ*C6:ҷʑw:2E**E}DQ>2Àß Ù4 CP/M2 on North Star 56K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220X͡!"P1>!4Ÿ>!4Ÿ>*4Ÿ*͉>22!"!"!0~6!""Ù͛w͛:O  yO*>239-͇yO!~k׹U#~2#^#V#^#V"1͛qͲ͂ s#ryO*\~N:!مo~]Il5ݐ{IݰI>:O _4:͞怱O:G:|W*y>zW>:!"yAw!͓  Mount disk A, then $23> !~=N׆Gy@O:3̓:bo=9>{:@:34yg> gy?Oڟ 22yo:-ªڼ:2@>"!+ ~Ydd*2~}OG<=Ͱ:gØG5 : EW z:0F ʣ:ʘʮW>0h*~#&"zʆ>0ʘyʣyy ʶ> y**7?B>>ɯ!|g~w,$|>A>K>N>7>0>`> !"!"!"!"!"!"!"!">G^>>>> >> >P*w#&"" >22!"!"2OCONFIGCFDADB06E601CAB6DA3E20D317 :10DAC0000679E67FD300F680D300EE80D300C90E3E :10DAD00007C9E5C52ABDDBE5C12ABBDB373FED42FF :10DAE000CAE8DA3EFFC1E1C9E600C1E1C9DB05E6EB :10DAF00002C83EFFC9AFC921000016E87CBAC207C0 :10DB0000DBC60467CA1ADB7E772CC207DB24CA1A7D :10DB1000DB7CE603C207DBC3FCDA3E41D3C0AFD3F4 :10DB200006D306D306D3063EC1D3C0CD4BDB3E4E53 :10DB3000D303D3053E37D303D305DB02DB043E30EA :10DB4000D3063E60D3063E0DC3C2DA3EC332300078 :10DB5000320800217FDB223100219DDB2209003EBB :10DB600050D3063EC0D3063EC33210002>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{__' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] ' on , then type RETURN $ CP/M image in RAM at 900H is ready to write or reboot and "SAVE 40 CPMxx.COM"$ Destination drive NAME (or RETURN to reboot) $Place DESTINATION disk on , then type RETURN $Permanent ERROR - Type RETURN to ignore $Function complete$Invalid drive name (Use A B C or D) $No source file on disk$Source file incomplete$ְP!6DW1"|2!g•$$ *%.!~.1~.!~Ϳ g•$$ D>ڼ:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~ʼ*.~¿:O!^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ý2˽ýýý߽#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ:˜1͘оA͌>>͌9ؾо2^ :ķ¥.!_~#fow]­Îå!v"!çREAD ERRORçNO FILE^:ķ ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:ķ=!ľý:ķ=!ľ:ý^T!~  6?#ˆ:`O> K{͘оA͒>:͒͢>:͒͢xK > K > ͒x 190DB22C4 :10DB7000110021000022F4DB3EAC320300FBC9F5AA :10DB8000E52AF4DB2322F4DB3E50D306E1F1FBC9A6 :10DB90000E0911BFDBCD05000E01CD0500F5E52A0C :10DBA000BBDBDB02E67FFE03CA0000FE11CA00E811 :10DBB000772326FF22BBDBE1F1FBC900FF00FF2A30 :10DBC0002A2A2A2A2A2A2020207061726974792040 :10DBD0006572726F722020202A2A2A2A2A2A2A2075 :10DBE0002074797065206368617220746F20636FA0 :04DBF0006E742E24FD :01DBF600C965 :0000000000  Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\qfr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"ý !Ķ2:2a{_:ķʖ:ķ>Ľ˽ʖ:=2–!B!6#5ڽʖ:ķĽ!ͬ¾ʧݾÂݾ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ݾ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٿ6?ۿwȿ0߿#6 #6"  ͢¾ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tнʧ͘!6!~ڇ ¯w4!Y~ʆ͌¾†t=ʆf ^ T ¯2o&)|+!ؾڽ<ͧվÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yøpsp2mÆÆf ͧÆFILE EXISTS _: É: :ķʉ=2)ͽÉ T!@нk!ؾ}|q>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{__' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] ' on , then type RETURN $ CP/M image in RAM at 900H is ready to write or reboot and "SAVE CPMxx.COM"$ Destination drive NAME (or RETURN to reboot) $Place DESTINATION disk on , then type RETURN $Permanent ERROR - Type RETURN to ignore $Function complete$Invalid drive name (Use A B C or D) $No source file on disk$Source file incomplete$!6DW1"|2!g•$$ *%.!~.1~.!~Ϳ g•$$ D>:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~*.~¿:O! ^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<2#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ:˜1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^: ! ~ 3#0 Wx x   G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x =qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOADCOMf^: ! Â$$$ SUB""C {2!"E 9" 1!22!ty)K!G_^#V*C   ~E , &-AGMS  !!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$ :B A2 ! ~6 Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\qĽʖ:=2–!B!6#5ʖ:Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6"  ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧÆFILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q  O͐  : E  B 2 >: b # : y! 4 5~yy 5 6y Ґ ^H @Oy H  H : – ͬ   #H : !  H ù  H  H $O͐ : 2 *C N#  x : 2 p & x ~+é 7 2 H ! >w _ : ! 5ͤ N k ͱ ¦ ͱ xʊ #N x : ! 2 ͤ ! 5™ #wO ~x½  p H    y< < ʑ  : !qMD # 2E > jtIY%/f3! ^#V w#P :B O|^#V#"##"##"##"!O *!O *|!6ʝ 6>*w#w*w#w'û *! J * ""!N#F*^#V*~#foyx *{_zW+ * yx # *DM*s#r*s#ryOxG*0MD!!N: E G>O: \ S *C  :q n& ^#V> O^ "*}:*)= ":O:o"*C  *C !ͮ ~2~2ͦ :2ͮ : O:w:w |g}o *# : :/GyO>2!q*C " ͡  ʔ*J Ҕ^ :Oyʃ?|x | s-|N-# S:2E !~Яw > T   D ^ 6k -äPYy 5*{zBK5ڋ>*C w~#+w#w+ɯ2E 22 i  ^ *C :~w~͔͔# # 2*C !!~~#~O~G#n,-.‹! w! yG!x͢.:E <ʄ! q!pQ:E <. ʄ$.:E <ʄ i 6}2E x N! ~态O>G~G!~G} *C !r#r#r ^ ͥ_y#x#{s+p+q-*C  ͥ!!q#p#w*:B O Y G }*MD "ã:!B w!>2*C ~=2u:B 2~2wE:A *C w>" !""2B !" !r QQQâ~?ͦ ~?r Q *"C Q- Q͜QüQr Q$Q*6̓:O:]]]] (?O?(?(Q?y!2 y: o&))))!}2<&i" y2 `i"*  n& W2( `2( y2) `!>2$ !  ͂!$ 5W ! pWW*1 #=~O*! #"! 2# 2' ɯ2$ <2' !% ~6ʐ!  pˆ=ʈ|O~|ʥ:& ľ2& !  ͂:' : =o&)))))))*** :( >2& ͇:( =:) :& þ2% 2$ 2& !YY", ". !5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:4 8O=MͰ>=`:]z24 ###=É~#‰~$N# Ó!5 >>ͿͿ)­6w#< #%!#C% ) :B O! yoxg*:B O }!N#F "*#*s#r^  ~!J  ! J *:o$*C ~i 6i w**{#z r+s{ozg**͕ **  , w͜ ͸ Ͳ ! !N#F$**O !~#:A #~$=2E k͌  w ~>2!E 5T *C !"C  "C !w# F! w͌ x 2͢ *C  ~<wʃG:!ʎì 4~ʶ ¬:<ʶ$ ʶïZͻ   x >2>2ͻ :!Z2:E w ̈́ ͊ Ͳ  >2>2T *C G ͻ : w ̈́ n> 2;O ^ DM;}H> "*C  ::dd slO s#r:E ͊ :==»y==»*Ww# *" ͸ *:G#š" ͸ :!w4i w: Z!E ~=26):B  " *)*)Q;*"E :;:A  2A QÓQÜQ*C }/_|/*W}_*"}o|g":ʑ*C 6:ʑw:2E* *E }DQ>2Àß Ù4 CP/M2 on North Star 00K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220 X͡!"P1>!4Ÿ>! 4Ÿ>*4Ÿ*͉>22!"!"!0 ~6!""Ù͛w͛: O  yO*>23 9-͇yO!~kU#~2#^#V#^#V"1 ͛qͲ͂ s#ryO*\~N: !o~]I l5 {I I >: O _4: ͞怱O: G: |W*y>zW>:!"yAw!͓  Mount disk A, then $23 > !~=NGy@O:3 ̓:bo=9>{:@:3 4yg> gy?Oڟ 22yo:-ªڼ:2@>"!+  ~Ydd*2~}OG<=Ͱ:!/=K[m}:}:m:K:::_^#V>>>ʤʰʼ>0yy> y:2o:A>@!:W|*g=~w,*$=|*>A>>>>7>7>0>`> :HD~!"!" "!" ""* "* "* " >/ɯ ɯA !͉!"" " >22!"!"2OCONFIGDD$" @A $@B B HH II$@DI ABI$"$H$H@$$I! H*  $H@@A I $D!!$I"BI"I"@$BIIH$$$$BBI$@BI!"$$A DI$@ A$@$$@H! "!$$" @B$!!!DH$$"H @*@BHH  !$$A"D@ "A" "BHA " !$ D B I $ !$$ H@BD D$QCPMOVE Vers 3.6 (C) Digital Research, 1978 (C) Lifeboat Associates, 1979 1980 1]R* ʿ?ʿ! ʌʌ0 ҟ))) O m|Ÿ}ڟ.g))͙ Invalid memory size.$!$~/w/w|g|?>@G!00"!4~:60+4͙!N#F !W*!~+~!R*͙xG}o|g"]! *]! xk {^~#o}ogM*.Ÿ# x! ~¤#ˆ* DM!  =*DM! D!00"D!E4~:ڴ60+4ô*"J͙͐͐*DM*]! =*]=!/M in memory at 900H (sysgen image) is ready for "SYSGEN" or "SAVE 40 CPM48.COM"$CP/M$K VER$!6DW1"|2!g•$$ *%.!~.1~.!~Ϳ g•$$ D>ڜ:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~ʜ*.~¿:O!^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<Ý2ͤ˝ÝÝÝͤߝ#~?  xDIR ERA TYPESAVEREN USER"!yΤO#< Ty#O 321y_͸2y2ͽ:˜1͘ОA͌>>͌9؞О2^ :¥.!_~#fow]!v"!ߠçREAD ERRORçNO FILE^: !Τ ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2ͤ:=!菉ý:=!菉:ý^T!Τ~  6?#ˆ:`O> K{̡͘ОA͒>:͒ԡ͢>:͒͢xK > K > ͒x  HI DIA!$$$ $" "$D ! $"  $AB " BDD $$D!"DI$!$BH!"IB I$"D HD" " $"! @H !BI " I  $I$I$DI$ !I$@"$"$! $I$I$I$$I$ @H@DH! BD"$$$A"D" I$""IBB H$! @"H(AI D @AH   BH!B@"@B @B!$ H" " B@$I  **   AH@$I$ $ A v"!6!Ùx7? a%_0#~$7y~# =y~+ H~ !~N# 6 ~tw+ i`{_P Ù $ !"èè Syncronization error.$͙SYN͙>CwH͙>Hwk͙SLR@P.$~?w Do you have a Horizon computer (Y/N) ? $ CONFIG.COM not required on disk.$ Printer on Left, Right or Parallel port (L R or P) ? $ CONFIG.COM needed on disk for first cold boot.$!& Constructing 48K CP/M $ New CPW:8 Rm Ý !虜2:2a{_:ʖ:路>Ľ˝ʖ:=2̤–!B!6#5ڝʖ:路Ľ!ͬžʧݞÂݞ )!F#xʺ~0wëw!" !~6ͽ:ý(!Ϡ#͘*~ ""͌#>?͌͘ݞ =_.:;<> Oo$>!ͤY2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٟ6?۟wȟ0ߟ#6 #6"  ١͢١žØÆ^ BRͧ9!5‚#~Y‚#"Tͤ<ÆALL (Y/N)?^ TНʧ͘!6!~ڇ w4!Y~ʆ͌ž†t=ʆ٠f ^ Tͤ 2o&)|+!؞ͤԢͤڝ<ͧ՞ÆNO SPACE^ :Ty!ͤݤB*O=?_s#"^sG!~Ypsp2ͤmͤÆÆf ͧÆFILE EXISTS _:Τ É:Τ ģ:ʉ=2)ͽÉ֤ T!@Нk!؞ͤ}|q=qf^!~2ͤ>`~2ݤ2\!ͤ!B!~> >#0~O#Cx2͘՞1)ͽÂf zͧÆBAD LOADCOMf^:Τ ! Â$$$ SUB""C{2ֲ!"E9"122޲!ty)K!G_^#V*CȧΧԧ~Eȱױ ,&-AGMS!ʥ!եô!ô!ܥBdos Err On : $Bad Sector$Select$File R/O$ɦ:BA2ƥӦӦ!~62E>jtIY¸θ%/f3! ^#V w#P:BO|^#V#"##"##"##"в!O*!O*Ʋ|!ݲ6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*yx#*βDM*s#r*s#ryOxG*в0MD!!òN:㲷 EG>O: \S*C :ݲqn& ^#V>O^"*}:ò*)=":IJO:㲡o"*C *C!ͮ~2~2ͦ:Ų2ͮ:ղީO:㲁w:w |g}o*# :Բ:Ų/GyO>2Բ!زq*C"ٲ͡ʔ*ٲJҔ^:زOyʃ?|x | s-|N-# S:2E!Բ~Яw>T D^6kƪ-äPYyѬ 5*Ʋ{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ݲ~ۭw~͔͔# # ҩ2ղ*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:ֲ!Bw!>2޲*C~=2ֲu:B2߲~2wE:A*Cw>"!""2B!"ڪ!rQQQâ~?±ͦ~?rQ*ٲ"CQ-Q͜QüQrQ$Q*6̓:O:]]]̼](?O?(?(Q?y!2y:o&))))!}2<&i"y2`i"* n&޵ ޵W2(`2(y2) `!>2$! ͂!$5W! pWW*1#=~O*!#"!2#2'ɯ2$<2'!%~6ʐ!pˆ=ʈ|O~|ʥ:&ľ2&!͂:'¶:=o&)))))))***:(˵>2&͇:(=:)޵:&þ2%2$2&!YY",".! O͐  :E B 2>: b# : y! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #Hɦ: !  Hù H H $O͐Ӧ: 2 *CN# x: 2 p&x~+é7ɦ2 H! >w_: ! 5ͤNkͱ¦ͱxʊ#Nx: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMDӦ# ):BO!yoxg*:BO}!N#F "*Ȳ#*s#r^ ~!J! J*:鲅o$*C~i6iw**{#zr+s{ozg**̲͕** Ī,w͜͸ڪͲ!!N#F$**O!~#ҫ:A#~$=2Ek͌ͭ w ~>2Ҳ!E5T*C!"C"C!w# F! w͌x2Ҳ͢*C ~<wʃG:Ų!Ҳʎì 4~ʶ¬:Ӳ<ʶ$ʶïZͻx>2ղ>2Ӳͻ:!ᲾZ2:Eẅ́͊ѨͲҩ>2ղ>2ӲT*CGͻ:ẅ́n>2ײ;O ^DM;}H>"*C :ݲ:ײddslO s#r:E͊:ղ==»y==»*Ww#*"Ѩ͸*:IJG#š"ڪѨ͸:!Ჾүw4iw:ղҩZ!E~=26):B"ڪ*)*)Q;*"E:ֲ;:A2AQÓQÜQҰ*C}/_|/*W}_*"}o|g":޲ʑ*C6:ಷʑw:߲2ֲE**E}DQ>2ղÀß ʴÙ̴Ӵش޴4 CP/M2 on North Star 48K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220X͡!"P1>!4Ÿ>!4Ÿ>*4Ÿ*͉>22!"!"!0~6!""Ù͛w͛޵:O  yO*>239-͇yO!~kU#~2#^#V#^#V"1͛qͲ͂ s#ryO*\~N:!o~]Il5{IIĶ>:O _ն4:͞怱O:G:|W*y>zW>:!"yAw!͓  Mount disk A, then $23> !~=NGy@O:3̓:bo=9>{:@:34yg> gy?Oڟ 22yo:-ªڼ:2@>"Ǹ!+ ~Ydd*2~}OG<=Ͱ:5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:48O=MͰ>=`:]z24###=É~#‰~$N# Ó!5>>ͿͿ)­6w#< %#H%=qf^!~2>`~2į2\!!B!~> >#0~O#Cx2͘վ1)ͽÂf zͧÆBAD LOADCOMf^: !Ķ Â$$$ SUB"řťūű"C{2!"E9"1ޯ22!ty)K!G_^#V*Cǐ~уEќѥѫ ,&-AGMSț!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~62E>jtئIYطغ%/f3! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>ӯ*w#w*w#w'û*ӷ! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N:ҷ EG>O: \ɷSɀ*C :ҷqn& ^#V>O^"*}:*)=":O:ҡo"*C *C!ͮ~2~2ͦ:Ҧ2ͮ:ɯO:ҁw:w |g}o*ү# ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s̖-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ҷ~w~͔͔# # ɯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BȾw!>2*C~=2u:B2~2wE:A*Cȶw>"!""ү2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*!/=K[m}:}:m:κٺK:κٺ:κٺ:_^#V>>>ʤʰʼ>0κyٺy> y:2o:A>@!:W|*g=~w,*$=|*>A>>>>7>7>0>`> :HD~!"!" "!" ""* "* "* " >/ɯ ɯA !͉!"" " >22!"!"2OCONFIG O͐  :ȷE B 2>: ȷb# : ȷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! Ⱦ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7Ư2 H! >w_: ! Ⱦ5ͤNkͱ¦ͱxʊ#Nx: ȷ! Ȗ2 ͤ! 5™#wO~x½p Hy<< ӷʑ :!qMD# ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:҅o$*C~i6iw**{#zr+s{ozg**͕** ʾ,w͜͸Ͳ!!N#F$**O!~#:AȾ#~$=2Ek͌ w ~>2!E5T*C!"C"C!w# F! w͌xʯ2͢*C ~<wʃG:Ҡ!Ҧʎì 4~ʶ¬:<ʶ$ʶïZͻɯx>2>2ͻ:!ҾZί2:Eȷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ҷ:ddslO s#r:Eȷ͊:==»y==»*Ww#*"͸*:G#š"͸:!Ҿw4iw:Z!E~=26):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*ҤW}_*"}o|g":ҷʑ*C6:ҷʑw:2E**E}DQ>2Àß Ù4 CP/M2 on North Star 56K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220X͡!"P1>!4Ÿ>!4Ÿ>*4Ÿ*͉>22!"!"!0~6!6̓:O:]Ԗ܀]Լܦ]](?O?(?(Q?y!پ2y:o&))))!}2<&i"y2`i"* n& W2(`կ2(y2) `շ!>կ2$! ͂!$5W! pWW*1#=~O*!#"!2#ݯ2'ɯ2$<2'!%~6ʐ!pˆ=ʈ|O~|ٹʥ:&ݷľ2&!͂:'ݷ:=o&)))))))***:(ݷ>2&͇:(=:)կ:&ݷþ֯2%2$2&!YY",".!5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:48O=MͰ>=`:]z24###=É~#‰ٯ~$N# Ó!5>>ͿͿ)­6w#< %#H%et pi flag pop psw ani 7fh ret ; ; output routines ; horout0: ;left serial port in 3 ani 1 jz horout0 mov a,c out 2 ret horout1: ;right serial port in 5 ani 1 jz horout1 mov a,c out 4 ret horout2: ;parallel output mov a,c ani 7fh cpi 0ah cz lf loop in 6 ani 1 jz loop mvi a,20h ;reset po flag out 6 ;output char mov a,c ;load accumulator tin1: ani 7fh out rry flag sbc: db 0edh ;compute (hl - bc) db 042h jz nodata ;if buffer head = buffer tail, no data mvi a,0ffh ;data ready flag pop b pop h ret nodata: ani 0 ;no data flag pop b pop h ret horst1: in 5 ;right serial port ani 2 rz ;no key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity correct ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp>9Sysgen Ver 3.0 Copyright (C) 1978, Digital Research Copyright (C) 1978, Lifeboat Associates Image size= ( Trks=  SPT= ( Skew table= !"#$ %&'(  Table extension space o&)))))))!6#" !5> *~#"`{__' $ *<***!*$d*':WO,! !"[>2X!"^!X4:w8!XN4>2Y:~!Y'4:X:Y_*^+~ڨ!Y^*^F+NDy*[DML2]:] '""Ù͛w͛:O  yO*>239-͇yO!~k׹U#~2#^#V#^#V"1͛qͲ͂ s#ryO*\~N:!مo~]Il5ݐ{IݰI>:O _4:͞怱O:G:|W*y>zW>:!"yAw!͓  Mount disk A, then $23> !~=N׆Gy@O:3̓:bo=9>{:@:34yg> gy?Oڟ 22yo:-ªڼ:2@>"!+ ~Ydd*2~}OG<=Ͱ:gØG5 : EW z:0F ʣ:ʘʮW>0h*~#&"zʆ>0ʘyʣyy ʶ> y**7?B>>ɯ!|g~w,$|>A>K>N>7>0>`> !"!"!"!"!"!"!"!">G^>>>> >> >P* w#&"" >22!"!"2OCONFIG 0 ori 80h ;set strobe false out 0 ;send character xri 80h ;toggle strobe out 0 ret lf mvi c,07h ret ; ; status routines ; ; ; ; status of circular buffer at ff00 - ffff. ; if top and bottom pointers are equal, ; status is returned as no data avail (a=0). ; if not, then a=ffh is returned to indicate ; that data is in the buffer. ; horst0: push h push b lhld bot push h pop b lhld top scf: db 037h ;set carry flag ccf: db 03fh ;complement ca adi 4 ;skip 400h over prom mov h,a jz tinu tincp: mov a,m ;read all memory mov m,a ;put back with parity set inr l jnz tincp inr h jz tinu mov a,h ani 3 jnz tincp jmp tinkl tinu: mvi a,41h out 0c0h ;now init motherboard anno key mvi a,0ffh ret ;key horprst: horwinit: xra a ret ;not implemented ; ;tinit rewrites all ram to set parity correct ; promloc equ 0e800h/256 and 0ffh ;addr of prom tinit: lxi h,0 mvi d,promloc tinkl: mov a,h cmp d jnz tincp Hè<2]:Z\ Tʨ:~*["[Ñ> 2]1p":] ʜ\qڼ:2ͽ.5~h*.~y> =*.~ڛŒ:.*.wG,¤$wG,®•*.~*.~ʼ*.~¿:O!^#V~#@\XAUTO COPYRIGHT (C) 1979, DIGITAL RESEARCH _͌> ͒> Ò> Ò͘~#͌ì _2<ý2˽ýýý߽#~?  xDIR ERA TYPESAVEREN USER"!yO#< Ty#O 321y_͸2y2ͽ:˜1͘оA͌>>͌9ؾо2^ :ķ¥.!_~#fow]­Îå!v"!çREAD ERRORçNO FILE^:ķ ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:ķ=!ľý:ķ=!ľ:ý^T!~  6?#ˆ:`O> K{͘оA͒>:͒͢>:͒͢xK > K > ͒x =qf^!~2>`~2į2\!!B!~> >#0~O#Cx2͘վ1)ͽÂf zͧÆBAD LOADCOMf^: !Ķ Â$$$ SUB"řťūű"C{2!"E9"1ޯ22!ty)K!G_^#V*Cǐ~уEќѥѫ ,&-AGMSț!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6!gr+s+p+q!h6>fr*d*f!is*d́"dPY! "f>!h#~Haͫo!h6:i0O͐!mr+s+p+q*lTZs#r*lڶ*l+s#r*jN#F+q#pÌ!nq!"o"q}2uo&"s* s:n*sDM2u:uqos*s"s*o͊O !v6>!vQ*v&w 6`i+46)A*:'ʓ:'O!) ~2vʍ:vO!w 6,]!v6>!v*v&w ~һ*vM !v4˜8AO͐:͐ͱ*##N!ͽ"* N#F*͠"if no data DA6E 2AB8DB lhld bot ;get data pointer DA71 7E mov a,m ;get data itself DA72 23 inx h ;bump pointer DA73 26FF mvi h,0ffh ;make it mod 256 DA75 22B8DB shld bot DA78 E1 pop h DA79 C9 ret ; horin1: ;right serial port DA7A DB05 in 5 DA7C E602 ani 2 DA7E CA7ADA jz horin1 DA81 DB04 in 4 DA83 E67F ani 7fh DA85 C9 ret horin2: ;parallel port ý !Ķ2:2a{_:ķʖ:ķ>Ľ˽ʖ:=2–!B!6#5ڽʖ:ķĽ!ͬ¾ʧݾÂݾ )!F#xʺ~0wëw!" !~6ͽ:ý(!#͘*~ ""͌#>?͌͘ݾ =_.:;<> Oo$>!Y2*O"ʉ@G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*ٿ6?ۿwȿ0߿#6 #6"  ͢¾ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tнʧ͘!6!~ڇ ¯w4!Y~ʆ͌¾†t=ʆf ^ T ¯2o&)|+!ؾڽ<ͧվÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Yøpsp2mÆÆf ͧÆFILE EXISTS _: É: :ķʉ=2)ͽÉ T!@нk!ؾ}|q O͐  :ȷE B 2>: ȷb# : ȷy! 4 5~yy5 6yҐ^H@Oy H H: –ͬ  #H: ! Ⱦ Hù H H $O͐: 2 *CN# x: 2 p&x~+é7Ư2 H! >w_: ! Ⱦ5ͤNkͱ¦ͱxʊ#Nx: ȷ! Ȗ2 ͤ! 5™#wO~x½p Hy<< ӷʑ :!qMD#2E>jtئIYطغ%/f3! ^#V w#P:BO|^#V#"##"##"##"!O*!O*|!6ʝ6>ӯ*w#w*w#w'û*ӷ! J*""!N#F*^#V*~#foyx*{_zW+*yx#*DM*s#r*s#ryOxG*0MD!!N:ҷ EG>O: \ɷSɀ*C :ҷqn& ^#V>O^"*}:*)=":O:ҡo"*C *C!ͮ~2~2ͦ:Ҧ2ͮ:ɯO:ҁw:w |g}o*ү# ::/GyO>2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s̖-|N-# S:2E!~Яw>T D^6k-äPYy 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :ҷ~w~͔͔# # ɯ2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!BȾw!>2*C~=2u:B2~2wE:A*Cȶw>"!""ү2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*:10DA0000C300DBC3FCDBC3DBDAC370DAC3A1DAC358 :10DA100047DAC335DAC320DAC3FEDA000000FD01BD :10DA20003A0300E60CFE08CA45DAFE04CA57DAFEDD :10DA30000CCA83DAC93A0300E630FE10CA46DAFEA1 :10DA400020CAACDAC9C9C93A0300E6C0FE00CAA1BF :10DA5000DAFE80CAB7DAC9DB06E602CA57DADB00AB :10DA6000F53E30D306F1C9CD57DAE67F320901C958 :10DA7000E5CDDBDACA71DA2AC3DB7E2326FF22C3B7 :10DA8000DBE1C9DB05E602CA83DADB04E67FC9DB3A :10DA900006E602CA8FDADB00F53E30D306F1E67FF8 :10DAA000C9DB03E601CAA1DA79D302C9DB05E601C5 :10DAB000CAACDA796̓:O:]Ԗ܀]Լܦ]](?O?(?(Q?y!پ2y:o&))))!}2<&i"y2`i"* n& W2(`կ2(y2) `շ!>կ2$! ͂!$5W! pWW*1#=~O*!#"!2#ݯ2'ɯ2$<2'!%~6ʐ!pˆ=ʈ|O~|ٹʥ:&ݷľ2&!͂:'ݷ:=o&)))))))***:(ݷ>2&͇:(=:)կ:&ݷþ֯2%2$2&!YY",".! ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:҅o$*C~i6iw**{#zr+s{ozg**͕** ʾ,w͜͸Ͳ!!N#F$**O!~#:AȾ#~$=2Ek͌ w ~>2!E5T*C!"C"C!w# F! w͌xʯ2͢*C ~<wʃG:Ҡ!Ҧʎì 4~ʶ¬:<ʶ$ʶïZͻɯx>2>2ͻ:!ҾZί2:Eȷẅ́͊Ͳ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C :ҷ:ddslO s#r:Eȷ͊:==»y==»*Ww#*"͸*:G#š"͸:!Ҿw4iw:Z!E~=26):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*ҤW}_*"}o|g":ҷʑ*C6:ҷʑw:2E**E}DQ>2Àß Ù4 CP/M2 on North Star 56K Vers 2.21A DQ (C) 1980 Lifeboat Associates $1220X͡!"P1>!4Ÿ>!4Ÿ>*4Ÿ*͉>22!"!"!0~6!D304C979E67FFE0ACCD8DADBBE :10DAC00006E601CABFDA3E20D30679E67FD300F628 :10DAD00080D300EE80D300C90E07C9E5C52AC3DB99 :10DAE000E5C12AC1DB373FED42CAF1DA3EFFC1E1B1 :10DAF000C9E600C1E1C9DB05E602C83EFFC9AFC9FE :10DB000021000016E87CBAC210DBC60467CA23DB1A :10DB10007E772CC210DB24CA23DB7CE603C210DB39 :10DB2000C305DB3E41D3C0AFD306D306D306D3062D :10DB30003EC1D3C0CD54DB3E4ED303D3053E37D3D5 :10DB400003D305DB02DB043E30D3063E60D3063E42 :10DB50000DC3CBDA3EC33230003208002188DB220D :10DB6000310021A6DB2209003E50D3063""Ù͛w͛:O  yO*>239-͇yO!~k׹U#~2#^#V#^#V"1͛qͲ͂ s#ryO*\~N:!مo~]Il5ݐ{IݰI>:O _4:͞怱O:G:|W*y>zW>:!"yAw!͓  Mount disk A, then $23> !~=N׆Gy@O:3̓:bo=9>{:@:34yg> gy?Oڟ 22yo:-ªڼ:2@>"!+ ~Ydd*2~}OG<=Ͱ:5@G:*>2kwG#7wG# ,>!:G:>!Wr!0Oz/!:::::20:I~_G#~_G# 2X:48O=MͰ>=`:]z24###=É~#‰ٯ~$N# Ó!5>>ͿͿ)­6w#< %#H% DB78 221100 shld 11h ;save at rst 2 location DB7B 210000 lxi h,00h ;initialize time counter DB7E 22FADB shld count DB81 3EAC mvi a,0ach ;initialize iobyte DB83 320300 sta 03h DB86 FB ei DB87 C9 ret DB88 F5 clock push psw ;real-time clock interrupt handler DB89 E5 push h DB8A 2AFADB lhld count DB8D 23 inx h DB8E 22FADB shld count DB91 3E50 mvi a,50h DB93 D306 out 6 DB95 E1 pop h DB96 F1 DBAF CAABDB jz key0 DBB2 DB02 in 2 DBB4 E67F ani 7fh DBB6 77 mov m,a DBB7 23 inx h DBB8 26FF mvi h,0ffh DBBA 22C1DB shld top DBBD E1 pop h DBBE F1 pop psw DBBF FB ei DBC0 C9 ret ; ; DBC1 00 top db 00h DBC2 FF htop db 0ffh DBC3 00 bot db 00h DBC4 FF hbot db 0ffh ; ; DBC5 2A2A2A2A2Aerrmsg db '******* parity EC0D30679 :10DB70003EC33210002199DB22110021000022FA5D :10DB8000DB3EAC320300FBC9F5E52AFADB2322FABF :10DB9000DB3E50D306E1F1FBC90E0911C5DBCD0513 :10DBA000000E01CD0500F5E52AC1DBDB03E602CA64 :10DBB000ABDBDB02E67F772326FF22C1DBE1F1FB53 :10DBC000C900FF00FF2A2A2A2A2A2A2A2020207098 :10DBD0006172697479206572726F722020202A2A1E :10DBE0002A2A2A2A2A2020747970652063686172A3 :0ADBF00020746F20636F6E742E2402 :01DBFC00C95F :0000000000 gØG5 : EW z:0F ʣ:ʘʮW>0h*~#&"zʆ>0ʘyʣyy ʶ> y**7?B>>ɯ!|g~w,$|>A>P>2>N>7>0>`> !"!"!"!"!"!"!"!">G^>>2>>> >> 2>P>!">P*#"* w#&"G pop psw DB97 FB ei DB98 C9 ret DB99 0E09 parity mvi c,09h DB9B 11C5DB lxi d,errmsg DB9E CD0500 call bdos DBA1 0E01 mvi c,01h DBA3 CD0500 call bdos ;wait until char is typed retn ; ; ; keyboard interrupt handler ; ; DBA6 F5 key: push psw DBA7 E5 push h DBA8 2AC1DB lhld top DBAB DB03 key0: in 3 DBAD E602 ani 2error ******* type char to cont.$' DBFA count ds 2 ;counter for real-time clock ; ; ; DBFC C9 warm ret ;warm boot initializer not used yet ; ; ; 01FD = horlen equ $-user ;length