IMD DMK Tracks:35x6528 SSMD    1 vv!>K > !'zӂv> >> 0>_Ӏw(vۀ>_1 10 MSEC uu!ww!!2!!!'E 1 0TRUE !E>21p>28>x>x>b>k>e>l>Lh>i>jkkikk/j&u`tUu`t.-l%ju>2~><2>_!:2ʕ!ڠ~d>_!,:2ʭ!~h>2uu:_T0 ͆}o[Rbk {0bk0"t! "v>:rO:sG*vp>q#=˜ *t`&.utup%ˡΡ*vq#q#} `-ʫ> =ÿ*: **:""2!0">2ɯ2:!n™!=Ù*``:=``:=+}ɯ2ɯ//2ɯ*DMV! >r#= tu x( >=> 2*"!6Ù:!*w#":=2!6Ù*0!%:':(͐  1166313 14 1 0FALSE 1 0TRUE 1 0FALSE 1 3128 05 1 148 48 1 14 1 301 15 1 120 100 BYTES 1 316 06 1 1128 4 4096 1 177 8000 1 12 1 300 07 1 0FALSE͖*!"͖! :y(o&)^#V*:!! 02!ͧ "~<(:G:!*w*#> "*R(!0 "R":!!ͧ :ʦͪ:!!G>O0G*>0G}怰o~2&":!nÙ:!!?G:0G*}o%8`*~2&":!=Ù*0"Æ>_T0 ͆}o[Rbk {0bk0*!}o[RR"}0o![R},{0_!^)|?G*T])|?(!͐= *}0oÆ**:** 20000TRUE 001 2 303H 00208 2 380H 00309 2 200000 255 NULLS004 2 31 00510 2 38 00611 2 0TRUE 007 2+d  = mp͞@!~ʃ5@* ͡. ;ͣW!E# ¡")!91)ỳ*)Þʥzʖ=ʐ=|zJz?4)z z: **:""2!0">2ɯ2:!n™!=Ù*``:=``:=+}ɯ2ɯ//2ɯ*DMV! >r#= tu x( >=> 2*"!6Ù:!*w#":=2!6Ù*0!%:':(͐ Æ r#} P:*~w$o{(?2͙Q:zJ!:2>2!> _> ͇> Çͭ͘~#͇í _2ϳ<ˬϳˬˬϳ͒ˬ    !2:2a{_p:ɬ:=2γ!d!6#5Ь>$͇!ͭ͡ʆͺKͺ>>͇ !F#xʙ~wÊw!"͒!~6͘*~ ᭷͇#έ>?͇ͺK ȭ=_.:;<>  o$>!ϳ2* "D@G:K:wQx2pt#*d6?fwS{j#6 t.¤ʤ#*”6?ÖwƒʫÚ#6 ¤#6­" #~?Į ¼xDIR ERA TYPESAVEREN USERҰt!ˮyг2E>! ^#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*# # y# 21y_ͷy2ͼج2:r1ͭ͘A͇ j >1͇0͇!͵ͭ2ȭ:‹!_~#fo͢No Files:!ȭ!г ~ ޯ#0 Wxxȭ؂G º~ # ޯx~#!~ɯ2ϳü:ü:=!>!г~ @@I#~+ I 6?#BPØWլ̛а=`O> բİ{͘Êͅ>:͇ͅx ¬ª>  ð> ͇x ð Œ>.͇Ì͡аݬZ ͢All (Y/N)?!!5K#~YK#" ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw**{#zr+s{ozg**͕** Ĺ,w͜͸ڹͲ!!N#F$**O!~#Һ:A#~$=2Ek͌>PϳØȭ¬v͖͘!6!~=dw4!~ʘ͇ |͡*ʘ*=ʘ͢Read Error ȭ:=2͒ʅʘ>2ͨȭϳ걯2o&)|+!͵ϳñϳЬ<͢No SpaceͲØȭ:լ!͢File Existsk!ϳ߳* ==_n#"nG!~Wpnp2ϳϳ2!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# S:2E!~Яw>T D^6kƹ-äPYyѻ 5*{zBK5ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~ۼw~͔͔# # }| ͢Bad LoadØ= ͎ !~2ϳ>~2߳2\!ϳ!!~[ [#M~l#`x2͘ͲͼK͎ ȭ:_COM :г !ȭK$$$ SUB"C{2!"E9"1A22!ty)K!G_^#V*CȶζԶ~E ,&-AGMS!ʴ!մô!ô!ܴBdos Err On : $Bad Sector$Select$File R/O$ɵ:BA2ƴӵӵ!~6ͼ w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊ѷͲҸ>2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==»y==»*Ww#*"ѷ͸*:G#š"ڹѷ͸:!Ҿw4!iw:ҸZ!E~=26 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ӵ#Ҹ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~=2u:B2~2wE:A*Cw>"!""2B!"ڹ!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*   ):B"ڹ*)*)Q;*"E:;:A2AQÓQÜQҿ*C}/_|/*W}_*"}o|g":ʑ*C6:ʑw:2E**E}DQ>2EÕ~1 E@yÌH}~ÑÕ<)1z2A{2B>͉uuuu! >2:2<22<ʌ*"!n"_͡uuuu MEGATEL QUARK 51K CP/M V2.24 R02 preliminary !v >3¯2 21:COYE"n!"f!"h!w#"j!"l!E"nw$vۀ2ہӃ>Ӏ$ۀہӃ>Ӏ$:ӷ^**:<2*d:HӀ$ x:Ӏ*$>7:O**̷R+һ˯ogd:ӷ):ӷ˯U}ӃzӁ:Ӏ$>k>K2:Ӏ+I|*:ӁӃ:Ӏ$2*":Ӂ ?hң>7hß*)[zQ+|M>Ӏv*f"!E"f:O>2>Ӏ$>2ʜ xsڧ̯Þۂ2Ӂ2*"f!~:̾w :!Ӿwd4vv*hv!Ӷv?>Ӏͳ~2D:COE:BO@,:BO:AW!Jy͌HǷU:Dº  @ _:O$> Ϳ>2!"2!":^=‚2 >3:¥xµ!~##ʝ͝ê:xyͪ!͊ͪ͝:xyyʀʀÀ: +*p:0<xůf___yO_ yɯ 0 0m(j*r:©:uӷ ʘ :uGy@ʀmʳ>my_lll`@:uӷAA :uGAy:ʝ@*u~:Oͨ:<ʖ:ӂv>2>:>Ӏ$>2X p̈́r%!~#wO>Ӏy>2!~#w>byC*~:ӂ>2v>2>³>Ӏ$>2X ̈́rÙ>r2ix2j:2kЯ:ӷ"̈́ͭ:j!ͳ!.:jG !x!:i:ӷ::ӷ::k=Q2k!!~:͆NQͭί7:2k:NlYQ!C~ίͭ:i{>ɯ<:ӷ>O:ӷʛ:ӷʛ Üy_O:ӷʫy !f~^#V#=~³^#V#~ͭ READ WRITE SEEK WITH READ SEm!9"\1\:84>2:*\>2C!:^={h!9"\1\y*\y2i&)~#foC{†`i n&C2>22228*":ӻ:<*":ӻ2K:G~<#~ͫ6  >2:w8:<*"ͫ:<*"ͫƷO:^=:ӑy͓y! 2l^#V ~#fol++~2 ~#foY2~2~2#~2_!g~/!_^#V!:ӻ:Է6K#:Ӿ+~#:Է+6#6  EK WITH WRITE>P`nψϣϯ>PhhhhPhhhhh, Drive Not Ready, Write Protect, Write Fault, Record/Sector Not Found, Corrupt Data/ID mark/CRC, Lost Data, Data ReQuest Fault, Busy, Bad/Wrong Track, Corrupt ID mark/CRC, Write Protect/Write Fault, Corrupt ID mark Retry (Y/N) ?  Allow (Y/N) ?  WARNING : CORRUPT DATA TRANSFERED ""!9"1W2ugto|@ʝ}!q|:=!p~<'`6+~<'`6+~<'$6*l#"lw2:2:<:ѷ:ӷ#2:G *^#V+:O:ӹ8>2 :<ͨ:2*\: Է>2 2>2 ԯ2 !9"\1\!9:8ژ:Oz:ȯ2 y2 !9"\1\!9:8ړ:Oz: :2 Ol~#fo:O:1+ "y2:2 *": Է1=2 :! Ծ1*<1*:Ӿ1#:=$*#": Ol~#fo:"2ԯ2:ȯ2 >2ԯ2 :G:Ӑ_:ԷO{Vȷ PȀ2F""C"####:Ӿ*ʛ k"~ʬ#~ͤ*6#:w#*s#r#:w:8:Է*#Ͱ*"U*!^#V:G:ӐG:Է!ɠ***:>22 2 ͏n*06[#Ow#yw#6:#Ow#yw#6:#Ow#yw#6]/G~<W~_,V,~x--s^,F,{Ny<_yO q>28!q"9>202(>2QCERT223COM>>?ABQSYSG D<<<Ѱyi&) !~#fo~#fo <?ƒ ^g~OO #@z>/<e33ZO _ W{X!>:AO !>*R!>*R BIOS Error on : T-, S-!p=|~#O go*: Է#*66:w: :ͤ*|}*<***MD! s! NC! ~w{" r*MDq#p>Ú>2!ý>ò>22 9.:<*:w:>G:O:>y*:w:>G:>:Oh*K|g}o>222"`)":!Ӿʅwo& ^#fk"!:ӷ~•×?w:ӷ§> w*f"*h"*j"*l"*n"*"f*"h*"j*"l*"n!"f!"h!#~"j!"l! Please mount disk :AO in drive :0O, press when ready   ` ttPROFILEͧ >2:sQ!"<<<iYNeneration Uti Version 2.23 YPE RETURN DESTINATION DRIVE NAME (OR RETURN TO REBOOT) DEԞԧ԰uuԊkԀkԀkԀkԀz  ט'ا׶'٧ 'ڧ   ڻ(?VC HqC 0C HqC 0C HqC 0C HqC 0( # (L?# (L?# (L?# (L? !"#$  %&'( !"#$  %&'(%&'(1234=>?@ )*+,5678ABCD !"#$ !"#$  %&'( !"#$  %&'(%&'(1234=>?@ )*+,5678ABCD !"#$   >>( <02&((*$ **>> "&*2""  >> " $>> <" <"">""""""8 >>""*., "">""<""<""<" "<"""""<> < >> <  &"""">"""""$(0($" >"6**"""""2*&"""""""<""< """*$<""<($"" ">""""""""""""""**6"""""""> >>00000> >>">5CDDB02CDA !"#$  %&'(%&'(1234=>?@ )*+,5678ABCD !"#$   s=!ͧ 0>2:s_!!3MEGATEL QUARK System Generation Utility Version 2.23 R01SOURCE DRIVE NAME (OR RETURN TO SKIP) SOURCE ON , THEN TYPE RETURN DESTINATION DRIVE NAME (OR RETURN TO REBOOT) DESTINATION ON , THEN TYPE RETURN PERMANENT ERROR, TYPE RETURN TO IGNORE FUNCTION COMPLETENO SOURCE FILE ON DISKSOURCE FILE INCOMPLETE,! $$$ ,2"< &""<  8&" ,2"" "$(4$4**"",2"""""",2"< "&,2  << """&""""**""""&>> ***A9C0211800019EB2AA4022B7DB4C2EAF2 :1003D600032A9A025E23567EB3C8234E234623225F :1003E6009A02696022A402EB229C022AA202233A04 :10;255 BECOMES 00 JNZ RDOK ;OK TO READ IF NOT 255 ; ; FILE NOT PRESENT, ERROR AND REBOOT ; LXI H,NOFILE CALL CRMSG JMP REBOOT ; ;file present ; RDOK: XRA A STA FCBCR ;CURRENT RECORD = 0 ; ; PRE-READ AREA FROM TPA TO LOADP ; MVI C,(loadaddr-tpa)/cpmsectleng ; PRE-READ FILE PRERD: PUSH B ;SAVE COUNT LXI D,FCB ;INPUT FILE CONTROL COUNT CALL DREAD ;ASSUME SET TO DEFAULT BUFFER POP B ;RESTORE COUNT ORA A JNZ BADRD ;CANNOT ENCOUNTER END-OF FILE DCR C ;CONT DOWN JNZ PRERD ;*!*$*'*'*3F#~!uw<#C! ~#fo~~#fo~22!"MD!u"!t^#V~"#^#V#""*MD*N:ʮñ! ͧ 0**+}*^#V~#N#F#"i`""*#:=*#"MD!u:"2Ð1!85~2p:] ~\0 < """"UUUU 0 00 0 $B$B~$~$8DD8$$ >"">""**>"">">>>>>".&."> >><0($ >  ASM COM@ALPHTERMASM ALPHTERMASMAQBOOT ASM6 !"#$%GRPHTERMASM&MEMNAGE ASM'(MEMNAGE HEX)CPM223 DOCE!"#$%QSYSG DOC&'ERAQ COM()QDSKTWO COM*+ASM COM@,-./QINSTALLMSG$012SUB COM34DDT4 COM&567DU COM;89:;STAT COM)<=>QSYSGEN COM ?DSKRESETCOM@QINSTALLCOM*ABCDEFGHIJKQMASETUPSUBLXSUB $$$1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ   !)ͼ !ͼ :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?'  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&)^#fk:! 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*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪz'{ͅ>ɯ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~ ͅ@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! ~*!) " Ͱ>2lyPLnR>UX:l̅2l͓*>ERʵ2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2 :  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*:|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |͍ >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O{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/Ľ 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  ; ; ; ; A L P H A N U M E R I C T E R M I N A L E M U L A T I O N ; ; implemented for the Quark runing CP/M 2.23r01 ; version equ 22 ;cpm version 2.2 iversion equ 41 ;internal version 3r01 ; false equ 0 true equ 0ffffh ; valpha equ TRUE ;flag graphics/ alphanumeric video alphterm equ valpha ; grph8x8 equ false ;graphics mode 8 by 8 character font (vs 7x8) ; memnage equ false ;is memory management routine available(not for 64 k) banked equ memnage ; bellon equ true ;want to; ;graphics video display memory starts gvdm50 equ vidend-7800h ;;start addr of vdm for 50hz gvdm60 equ vidend-6000h ;;for 60hz ; ;alpha video display memory starts vdm50 equ vidend-1400h ;;top of video display memory address - 50 hz vdm60 equ vidend-1000h ;; for 60 hz ; vout equ vidparm ;front/bank end of voutsz equ 0400h ;terminal emulator size(maximum) indvout equ vidparm-voutsz ;system independent portion of vout ; ;number of lines on each of 3 screens - installable ; vdpline equ -1 ring the bell when ascii '07h' is received ; clk50 equ 50 ;;50 ticks per second - 50 hz clk60 equ 60 ;;60 ticks per second - 60 hz ; ;I/O ports ; pprport equ 05fh ;;parallel printer port viaport equ 60h ;;VIA-6522 base address-16 ports piaport equ 74h ;;PIA-6821 base address-4 addresses aciaport equ 78h ;;ACIA-6850 base address- 2 addresses ; piadra equ 74h ;;pia data reg A or pia data direction cntl reg piacra equ 75h ;;peripheral interface adapter control reg A piapb equ 76h bl + 1 ;|008| ;;number of lines on the screen minus 1 vnmline equ -1 + 27 ;|009| ;;number of lines on the screen minus 1 vstline equ -1 + 2 ;|010| ;;number of lines on the screen minus 1 refline equ vdpline+vnmline+vstline+3 ;;total number of lines cY. ; numcol equ 80 ;number of columns displayed ; blcycle equ 000100 ;number of cycles for bell to produce blhigh equ 000020 ;number of loops for high portion of cycle bllow equ 000020 ;number of loops for low portion of cycle ; ;* * port equ viaport ;;on PB0 of 6522-initialization code change if modifying this ; blbit equ 000001 ;bell mask ; ;* * * * * * * * * * ; ; absolute(fixed) origin of variables/routines in common memory ; these are the addresses we want the code to run at when system is up ; vidparm equ 0ea80h ;terminal emulator variables, and stack mvfix equ vidparm+100h ;start location of memory managment module ; ;* * * * * * * * * * ; ;linkage to memory management routines ; ;bank/move routne jump table e* * * * * * * * ; ;graphics terminal emulator equates ; if not alphterm table equ 2000h ;;address of character table endif ; ; note col$off must be 0 if 8x8 cells are used ; if (not alphterm) and (not grph8x8) col$off equ 00000 ;|013| ;;column offset for graphics screen endif if (not alphterm) and grph8x8 col$off equ 0 ;;column offset is null if using 8x8 chars endif ; if not alphterm ; ; NOTE chrhite=8 and 96 byte/line ; line3 equ vstline+1 tscrn3 equ vidend+16-(96*8*linentry points - absolute address ; Ymove equ mvfix ;entry point for move routine Yxmove equ mvfix+3h ;; xmove Ybank equ mvfix+06h ;; bank ;;for coldboot(for both the loader and bios) bankinit equ mvfix+09h ;; bank init ivdmbank equ mvfix+0ch ;; vdm init ;;for interrupt servicing svdmbank equ mvfix+0fh ;; select vdm bank from non mapped stpabank equ mvfix+12h ;; select tpa bank from non mapped ;;for terminal emulator servicing sinvdm equ mvfix+15h ;; select vdm bank from anywhere soutvdm equ 3) ;;top line of status screen ; line2 equ vnmline+1 tscrn2 equ tscrn3-(96*8*line2) ;;top line of main screen. ; line1 equ vdpline+1 tscrn1 equ tscrn2-(96*8*line1) ; totline equ line1+line2+line3 ;;make sure this is not bigger ;;than what it should be ;;ie max 30 for 60hz, and max 38 for 50hz linewid equ 80 ;;number of characters/line byteline equ 80 ;;number of bytes per line (displayed) ; ;; from beginning of used screen lineleng equ 96 ;;number of bytes per line totmvfix+18h ;; restore original bank after sinvdm ; ;abosolute address in move/bank routines ; top16k equ mvfix+1bh ;;accessing hidden memory hz equ mvfix+1ch ;;clock pulse( value 50/60 for 50/60 hz) memsize equ mvfix+1dh ;;0 - 128k, 1 - 256k bnkinrp equ mvfix+1eh ;;ei/nop, ret curbnk equ mvfix+20h ;; = @cbnk banktab equ mvfix+21h ;;address of the bank select table used by ; ;; the bank routine ;* * * * * * * * * * ; ;terminal emulator equates ; vidend equ 0000h ;end of video memory al chrhite equ 8 ;;character height in scan lines endif ; ;* * * * * * * * * * ; ;Video control character definitions ; null equ 0 ;;null character EOT EQU 4 LF EQU 0AH ;;LINE FEED VT EQU 0BH ;;VERTICAL TAB (HOME-UP AND CLEAR) CR EQU 0DH ;;CARRIAGE RETURN FF EQU 0CH ;;FORM FEED DEL EQU 7FH ;;DELETE BLANK EQU 20H ;;space chBELL EQU 07H ;;BELL CHARACTER BELL equ chbell CHLEFT EQU 08H ;;CURSOR LEFT CHARACTER CHUP EQU 0BH ;;CURSOR UP CHARACTER CHRIGHT EQU 0CH ;;CURSOR RIGHT C  HARACTER CHHOME EQU 1EH ;;CURSOR HOME CHARACTER CHCLEAR EQU 1AH ;;CURSOR HOME AND CLEAR SCREEN CHARACTER CHESC EQU 1BH ;;ESCAPE LEAD IN CHARACTER chlead equ chesc ;;leadin character CHADDR EQU 3DH ;;CURSOR ADDRESS CHARACTER (AFTER LEADIN OF CHESC) chhighf equ 19h ;;highlite off toggle chrevoff equ chhighf ;;see above chhighn equ 1fh ;;highlite on character chrevon equ chhighn ;;see above chceol equ 15h ;;clear end of line(after leadin of chesc) CINSLINE EQU 13H ;;INSERT LINE - AFTER LEADvdisp0ex ; ; which could be just return or pop ; ; ..fall thru VDISP0EX: LXI H,VDISP0 ;NEXT ROUTINE TO BE EXECUTED IS THE "0 CHARACTERS BEFORE" ROUTINE ; ; IE WHEN NEXT CHARACTER HAS INDEPENDENT MEANING ; VDISPEX: ;ENTRY FOR OTHER ROUTINES-common exit for all routines SHLD VDISPADDR ;STORE ADDRESS FOR VDISP ROUTINE call vcuron ret ; ; VDISP1EX: pop d ;get rid of extra return address LXI H,VDISP1 ;NEXT ROUTINE TO BE EXECUTED IS THE "1 CHARACTERS BEFORE" ROUTINE ;jr vdispeIN CDELLINE EQU 14H ;;DELETE LINE - AFTER LEADIN CCEOP EQU 16H ;;CLEAR TO END OF PAGE - AFTER LEADIN choff equ 12h ;;cursor off chon equ 11h ;;cursor on cstat EQU 17H ;;GO INTO status screen mode (bottom) MODE - AFTER LEADIN cnorm EQU 18H ;;GO INTO normal display mode -AFTER LEADIN cdisp equ 1dh ;;go into display (top line) mode-after leadin ; chldterm equ 01h ;;load character thru terminal 8 data bytes ; ;; followed by which character to load cmode equ 'm' ;;set write mode - NOT USED x db 018h,0ffh and vdispex-$-1 ; ; ; ;ROUTINE VDPCHL ; ; This routine branches to the routine whose address is contained in the table VADDRTAB ; with the index contained in the BC register. ; VDPCHL: LDA VNOCHECK ;CHECK FOR CONTROL CODE IGNORE - STILL NEED NOCHECK ENTRY TO TURN OFF ORA A MOV A,c ;preload index to a register ;jrz vdpchl0 ;jump if normal db 028h,0ffh and vdpchl0-$-1 ; ; THIS SECTION WILL ONLY ALLOW FUNCTION CONTROL CODE TOGGLE TO OCCUR ; - VDISP0/VDISP1 ARE REcpix equ 'p' ;;pixel on/off/xor - NOT USED if alphterm vnumspec equ 29 ;;number of terminal control code sequences endif ; the termina emulator recongnizes if not alphterm vnumspec equ 30 endif vnumtab equ 35 ;;total number of entries in 'vdtab', some ; ;; of which are not checked ; org indvout ; ;bank independent portion of terminal emulator ; ; This program is the main driver for the video CRT driver. The routine ;VDISP or routines called by VDISP are responsible for turn theSPONSIBLE FOR PLACING CHARACTERS ON SCREEN CPI VNOCHENTRY ;CF ABOVE COMMENT JNZ Vputchar ;in graphics mode?? ; ;FALL THRU TO GET TO ROUTINE VDPCHL0: ; CHECK ENTRY FOR VALID - IN TABLE CPI VNUMSPEC ;NUMBER OF ENTRIES rNC ;ENTRY IS BASED 0-error-back to vdisp0ex ; LXI D,VADDRTAB ; ; entry below was never used ;VDPCHL1: ;ENTRY FOR "NORMAL" GOTO ROUTINE MOV L,A MVI H,0 DAD H ;DOUBLE INDEX (WORD ADDRESSING) DAD D ;ADD IN THE ADDRESS MOV E,M ; LOAD ADDRESS INX H MOV D,M l cursor back on. ; NOTE: it should be possible to incorporate this routine into VDISP. ; start: onlyonce: jmp terminit ;terminit will move code from onlyonce+3 to ;endonlyonce up 3 bytes, thereby nullify ; ;the call to itself when this routine is called ; ;next time around. execution after terminit ;is returned to onlyonce call vcuroff ;turn the present cursor off lxi d,vdisp0ex ;set up dummy return address for most routines push d LHLD VDISPADDR ;GET ADDRESS OF ROUTINE ;WHhld vmemadd ;preload hl=>de with vmemadd XCHG PCHL ;BRANCH TO ROUTINE ; ; ;ROUTINE VDISP0 ; ; This routine is invoked when any character is input which does not rely on previous ;data to determine what action should be taken (see the comments contained in VDISP). Characters ;are scanned for a match in the vdtab in the first byte location. IE the the table contains ;a two byte sequence for each entry. The first byte represents the leadin character of the two ;byte sequence if the second byICH SHOULD BE INVOKED AT THIS POINT ; ;NOTE:**** must have C register = character PCHL ; nop ;leave some space for possible patch/expansion nop nop nop nop nop nop endonlyonce equ $ ; ; The next section is the exit section to be executed when the next ;character is not to be used in conjunction with the previous character ;input. It is also the initial condition for termdrv routine. ; retnull: ;null return from dispatch tables pop d ;get rid of extra return address to te is not 0FFH. If the second byte is 0FFH the first byte does not ;indicate a leadin, but the actual character. IE in the original configuration a 07H is a bell ;character by itself (does not require a two character sequence). ; If the second byte is 0FFH the routine contained in same entry position in the table ;"VADDRTAB" is effectively called. If the second byte is non-0FFH the first byte is stored ;for routine VDISP1 and VDISPADDR is set to point to VDISP0. ; If character is not found in   the first byte column of VADDRTAB the routine called simply ;places the character on the screen. This includes characters lower than 20H and higher than ;7FH although normal program execution should not do this. The character generator has character ;representations for all characters. ; A third table "VSPECTAB" is used by the routine VDISPATCH VDISP0 and VDISP1 which specifies ;special actions to be taken before the actual handler is invoked. Such as mapping instructions ;to VMAP and the specia address of next character if have not changed lines db 20h,0ffh and vcuraex-$-1 ; shld vmemadd ;now check for have to scroll xchg lhld vmemend ora a ;reset carry ;dsbc d db 0edh,D*8+42h ;jrz vcurascroll db 28h,0ffh and vcurascroll-$-1 ; lxi h,48 ;put into first column on next line dad d ;jr vcuraex db 18h,0ffh and vcuraex-$-1 ; vcurascroll: xchg ;get end of screen back lxi d,-80 ;put in column 0 of last line dad d shld vmemadd jmp vscroll ; vcuraex: shld vmemal for the routine to do ignore special routines- as this routine may not be ;ignored. ; The cursor is turned on only by VDISP. These routines set up VXYPOS for this routine. ; VDISP0: LDA VREGBC ;GET CHARACTER WHICH HAS BEEN INPUT ; ; ADDING CODE FOR FASTER CHECK OF NORMAL (NON CONTROL CHARACTERS) ; NOTE:MULTIPLE LEADIN AVAILABLE IF ALL BUT ONE LESS THAN 20H ; LXI H,VLEADIN CMP M JZ VDISP03 CPI BLANK ;jrnc vputchar ;output character if greater than space ; ;check for nulls-skip ndd ret ; ; ;ROUTINE VDISP1 ; ; This routine is invoked when any character is input which relies on previous ;data to determine what action should be taken (see the comments contained in VDISP). Characters ;are scanned for a match in the vdtab in the second byte location. IE the the table contains ;a two byte sequence for each entry. The first byte represents the leadin character of the two ;byte sequence if the second byte is not 0FFH. If the second byte is 0FFH the first byte does not ;indiulls db 30h,0ffh and vputchar-$-1 ana a rz ;back to vdisp0ex ; VDISP03: STA VDISPSAV ;store for vdisp1, leadin check LXI H,vdtab ;LOAD ADDRESS OF vdtab INTO HL FOR VSEARCH CALL VSEARCH ;jrnz vputchar ;junp if no match, just put character on the screen db 20h,0ffh and vputchar-$-1 ; ; THIS SECTION HAS NOW RECOGNIZED THE BEGINNIN OF A SPECIAL CONTROL SEQUENCE lxi d,vnumtab-1 ;POINT TO SECOND BYTE OF EXPECTED SEQUENCE dad d MOV A,M ; GET SECOND CHARACTER INR A ; TESTING FOR 0FFH cate a leadin, but the actual character. IE in the original configuration a 07H is a bell ;character by itself (does not require a two character sequence). ; If the second byte is matched in the vdtab in the second byte location, and the first byte ;for that entry matched, matches the character saved by VDISP0 the routine contained in same entry ;position in the table "VADDRTAB" is effectively called. If the second byte does not match any 2nd ;byte in vdtab or the two character does not match, then=> SINGLE CHARACTER SEQUENCE ;jrz vdpchl ;goto routine found by vsearch-single byte db 28h,0ffh and vdpchl-$-1 ;jr vdisp1ex ;set up vdisp (dispatch routine) to goto vdisp1 db 18h,0ffh and vdisp1ex-$-1 ; ;PUT CHARACTER ONTO THE SCREEN ; This section is used to place the character contained in VREGBC (C register part) at the ;screen location contained in VXYPOS. ; VPUTCHAR: ; LDA VREVFLAG ;SECTION DOES REVERSE VIDEO ENTRY MOV B,A LDA VREGBC ;GET CHARACTER TO BE PLACED ORA B ;PUT IN no action is taken and both characters ;are ignored and VDISPADDR is set back to VDISP0. ; A third table "VSPECTAB" is used by the routine VDISPATCH VDISP0 and VDISP1 which specifies ;special actions to be taken before the actual handler is invoked. Such as mapping instructions ;to VMAP and the special for the routine to do ignore special routines- as this routine may not be ;ignored. ; VDISP1: LDA VREGBC ;GET CHARACTER WHICH HAS BEEN INPUT LXI H,vdtab2 ;LOAD ADDRESS OF vdtab OFFSET TO SECO REVERSE VIDEO BIT lhld vmemadd MOV M,A ; ; This section is responsible for advancing the cursor position(VXYPOS). When the end ;of a line is reached the advance causes the cursor to move to the first column of the ;next line. If the next line is off the screen, the scroll routine is called. The ;routine is also responsible for storing the HL register pair into VXYPOS. ; VCURADVA: lhld vmemadd ;GET PRESENT CURSOR POSITION inx h ;to new position mvi a,7fh ana l ;jrnz vcuraex ;storeND CHARACTER INTO HL FOR VSEARCH CALL VSEARCH ; VDISP1A: ;ENTRY FOR RETRY FOR DOUBLE MATCH ;jrnz vputchar ;junp to abort exit - no match when there should have been-just display character db 20h,0ffh and vputchar-$-1 ; lxi d,-(vnumtab+1) ;POINT TO LEADIN CHARACTER OF TWO CHARACTER SEQUENCE push h dad d LDA VDISPSAV ;GET CHARACTER FROM BEFORE CMP M ;WAS IT THE SAME pop h JZ VDPCHL ;NOW HAVE DISPATCHABLE ROUTINE TO EXECUTE (COULD BRANCH STRAIGHT THERE) ; CALL VSEARL1 ;CONTINUE SE  ARCH ;jr vdisp1a ;go back and continue as if no previous match was found db 18h,0ffh and vdisp1a-$-1 ; ; ; ;ROUTINE VDISPX ; ; This routine is invoked when a character is input which is to be interpretted as the ;X-coordinate of the cursor addressing. Ordering is taken care of by ; VDISPX: lda vregbc ;get parameter lxi h,vxposoff ;subtract offset sub m ; so it is 0-origin ani 7fh ;just in case mov b,a mvi a,numcol-1 ;ie 80 column has numcol=80 cmp b ;jrnc vdispxsk db 30h ;HL now has proer offset for screen xchg lhld vmembase dad d mov a,m ANI 7FH ;SAVE FOR RETURN ROUTINES STA VREGPSW+1 ;STORE IN A REGISTER RETURN ; ; The next section is the exit section to be executed when the next character input ;is the Y-coordiate. This is dependent on the value in VXYROW. If the value is 0 the X-coordinate ;is the next character input after the two character leadin. If the value is non-zero, the ;Y-coordinate is the character after the two character leadin. IE ,0ffh and vdispxsk-$-1 mov b,a ;force to bottom line if was out of bounds vdispxsk: lhld vmemadd ;get current position mvi a,30h ;around the hole add b mov b,a mov a,l ani 80h ;top bit is part of row, not column so we preserve it ora b ;bring in the column mov l,a mov a,m ;pick up character at that location and return it to calling routine ani 7fh ;strip off reverse video bit sta vregpsw+1 ; ; The next section is the exit section to be executed when the next character inthis routine this routine ;will be exit code for the routine VDISP1 if the cursor addressing is done row, then column. ;It will be the exit code for VDISPX if the cursor addressing is done column, then row. ; shld vmemadd LDA VXYROW ;CHECK FOR RETURN CODE-HAS CURSOR ADDRESSING BEEN COMPLETED ORA A rz ;FINISHED CURSOR ADDRESSING - VOUT PLACES CURSOR pop d ;get rid of return to vdisp0ex LXI H,VDISPX JMP VDISPEX ;WAITING FOR THE X-COORDINATE ; ; ; ; ;ROUTINE VSEARCH ; ; This routput ;is the X-coordiate. This is dependent on the value in VXYROW. If the value is 0 the X-coordinate ;is the next character input after the two character leadin. If the value is non-zero, the ;Y-coordinate is the character after the two character leadin. IE this routine this routine ;will be exit code for the routine VDISP1 if the cursor addressing is done column, then row. ;It will be the exit code for VDISPY if the cursor addressing is done row, then column. ; shld vmemadd LDA VXYROW ;CHECine is used by VDISP to search the DISPATCH table for matches with the ;character contained in the C register (this may be obtained by direct loading of ;the save locations used by VRESSTAT).The beginning of the table address is contained ;in the HL register pair. The table consists of two bytes per entry of which only ;one entry is looked at depending on whether or not the character being searched for is the ;first character of a sequence or the second. The decision of which character to look at isK FOR RETURN CODE-HAS CURSOR ADDRESSING BEEN COMPLETED ORA A rnz ;FINISHED CURSOR ADDRESSING - VOUT PLACES CURSOR pop d ;get rid of return to vdisp0ex LXI H,VDISPY JMP VDISPEX ;WAITING FOR THE Y-COORDINATE ; ;ROUTINE VDISPY ; ; This routine is invoked when a character is input which is to be interpretted as the ;Y-coordinate of the cursor addressing. Ordering is taken care of by ; VDISPY: lda vregbc ;get zero based index value lxi h,vyposoff sub m ; ; CHECK FOR 0-number of  ;done by loading the dispatch address with different values. Note that the multi-sequence ;for cursor addressing is done in the same way. ; The table is terminated by a 0 entry (last word in the table is zero). The B register ;on return contains the entry number into the table origin 0. The maximum table length is ;255. ; When no match is found the zero flag is reset. ; VSEARCH: lxi b,vnumspec ;table length....??????check resulting number vsearl1: ;ccir db 0edh,0b1h RET ; ; ; ;Rlines ON A REGISTER- OR COULD GO NUTS ;ANI 1FH ;SO CHECK WILL NOT FAIL ON NEGATIVE NUMBERS ani 3fh ;bug fix - Aug 31/83 mov b,a ;save lda vnumlines cmp b ;jrnc vdispy1 db 30h,0ffh and vdispy1-$-1 mov b,a ; VDISPY1: lhld vmemadd ;generate offst from base of VDM mov a,l ani 7fh mov l,a ;slar l ;shift in the line(row) number ; bottom bit of line to msb of L register db 0cbh,20h+L ;srlr b ;upper 4 bits (1-4) in register B db 0cbh,38h+B ;rarr l db 0cbh,18h+L mov h,b OUTINE RCLESCRN ; ; This routine is part of the DISP routines called thru the dispatcher. It clears the screen and ;causes the cursor to move to the HOME position (0,0) ; RCLESCRN: lhld vmembase ;address of first line-includes 48 byte hole lxi d,48 ;want to ignore the hole dad d shld vmemadd ;jr vceos db 18h,0ffh and vceos-$-1 ; ;ROUTINE RCLEOL ; ; This routine performs the setup for CLEAR TO END OF LINE from present cursor position ; RCLEOL: xchg ;get vmemadd into hl jmp vceo  l ;goto and clear the rest of the line ; ;ROUTINE RCLEOP ; ; This routine clears the screen from the current cursor position to the end of the screen ;including the cursor position ; RCLEOP: xchg ;get vxypos into hl ; ;ROUTINE VCEOS ; ; This routine clears from the memory address passed in the HL register to the end of the screen. ; VCEOS: mvi a,80h ana l mov e,a mov d,h xchg ;save hl lxi b,48 ;start at beginning of line dad b xchg ;de now has beginning of current linethe cursor right. Will not go past the last ;column (in 64/128 [80/96]modes) ; RCURRI: xchg ;vmemadd to hl mov a,l ani 7fh cpi 7fh ;check for last column rz inr l ;jr rcurex db 18h,0ffh and rcurex-$-1 ; ; ; ;ROUTINE RDELLINE ; ; This routine will delete the line that the cursor is on, scrolls the screen upwards from that ;line and blanks the bottom line. The cursor will remain in the same spot. If the cursor is on the ;bottom line that line will be blanked and no scroll occurs ( vceos1: push d call vceol pop h lxi d,128 ;moving down to next line dad d push h mov a,l ;check against exact match, we are in column 0 ani 80h ;note: this instruction also resets the carry flag mov l,a ;lded vmemend db 0edh,5bh dw vmemend ;dsbc d db 0edh,d*8+42h pop d mov h,d mov l,e ;jrnz vceos1 db 020h,0ffh and vceos1-$-1 ret ; ; ; ;ROUTINE RCURLEFT ; ; This routine performs the cursor left code. No execution if on first column of line. ; RCURLEFT: mov property of VSCROLLENTRY). ; RDELLINE: mov a,e ani 80h ori 30h ;beginning of line mov e,a lxi h,128 dad d jmp vscrollentry ; ;ROUTINE RINSLINE ; ; This routine will insert a blank line that the cursor is on after the lines are moved down. The ;bottom line is lost. The cursor does not move. If the line to be inserted was the bottom line, no ;lines are moved - the bottom line is just blanked. ; RINSLINE: ; ;MOVE LINES DOWN xchg dad h ;getting row number mov a,h ani 3fh a,e ani 7fh cpi 30h ;column zero check rz mov h,d dcr e mov l,e ;jr rcurex db 18h,0ffh and rcurex-$-1 ; ;ROUTINE RCURHOME ; ; This routine sets the cursor home. ; RCURHOME: lxi d,30h lhld vmembase dad d ;jr rcurex db 18h,0ffh and rcurex-$-1 ; ;ROUTINE RCURDOWN ; ; This routine performs the code required to do the cursor down. If the cursor is on the bottom line ;the screen scrolls up one line and the cursor does not move off the bottom line. ; RCURDOWN: lxi h,128 dmov b,a ;B register has current line number+offset lhld vmemend lxi d,-80 dad d ;gives us column 0 of last line mov d,h ;save last line address into de register mov e,l dad h ;getting last row number+offset mov a,h ani 3fh sub b ;number of lines to move ;jrz rinsll2 db 28h,0ffh and rinsll2-$-1 ; rinsll1: push psw ;save lines to move lxi h,-128 ;generate destination line address dad d push h call vmov pop d ;new destination was old source line pop psw ;counter ad d push h ;hl has new address, check if past end of screen mov a,l ;check for past end of screen, next line past screen ani 80h ; by equal end mov l,a ;lded vmemend db 0edh,5bh dw vmemend ora a ;note that carry flag is reset ;dsbc d db 0edh,d*8+42h pop h jz vscroll ;do not fall thru-cursor position is the same RCUREX: SHLD vmemadd ret ;back to vdisp0ex ; ;ROUTINE RCURCR ; ; This routine performs the code for the cursor carraige return ; RCURCR: xchg mov a,l andcr a ;jrnz rinsll1 db 020h,0ffh and rinsll1-$-1 rinsll2: lhld vmemadd ;clear present line mov a,l ani 80h ori 30h mov l,a jmp vceol ; rmoddisp: ; lhld vdispend xchg lhld vdispbase lda vdispline ; ;jr vmod db 18h,0ffh and vmod-$-1 ; rmodnorm: ; lhld vnormend xchg lhld vnormbase ; lda vnormline ; ;jr vmod db 18h,0ffh and vmod-$-1 ; rmodstat: ; lhld vstatend xchg lhld vstatbase lda vstatline vmod: shld vmembase xchg shld vmemend sta vnumlinesi 80h ori 30h mov l,a ;jr rcurex db 18h,0ffh and rcurex-$-1 ; ;ROUTINE RCURUP ; ; This routine performs the code required for cursor up. Does nothing if on top line. ; RCURUP: lxi h,-128 dad d ;lded vmembase ;check to see if on the top line db 0edh,5bh dw vmembase ora a push h ;save the new address... it is required later ;dsbc d db 0edh,D*8+42h pop h rc ;would have put it off screen ;jr rcurex db 18h,0ffh and rcurex-$-1 ; ;ROUTINE RCURRI ; ; This routine performs  lxi h,48 ;generate new cursor position dad d ; at home for that screen shld vmemadd ret ; ; ;ROUTINE RREVON ; ; This routine turns the reverse video on. Note - only affects character output ;-not control codes although the cursor will be reversed on reverse video fields ; RREVON: MVI A,80H RREVEX: ;EXIT POINT FOR REVERSE VIDEO OFF/ON STA VREVFLAG ret ; ;ROUTINE RREVOFF ; ; This routine turns the reverse video off. See note on RREVON routine ; RREVOFF: XRA A sta vrevflag   ret ; ;ROUTINE RCURADD ; ; This routine is responsible for setting up the parameters for cursor addressing. ; RCURADD: ; LDA VXYROW ;CHECKING FOR ORDER ORA A LXI H,VDISPY ;PRESET pop d ;dont want to go to vdisp0ex JNZ vdispex ; JUMP IF Y (LINE) FIRST BEFORE X (COLUMN) ; LXI H,VDISPX jmp vdispex ; setup x before y ; ; ;ROUTINE RBELL ; ; This routine causes the bell to beep by pulsing a bit on a port. ; RBELL: if bellon ; ; generate a tone-same as parallel keyboard inpt line of vdm.(0f020h or vidmbase+20h) ; ldhsloop: ;inp a db 0edh,78h dcr e ;jrz lddoneload db 28h,(lddoneload-$-1) and 0ffh ; ;finish count down to complete 96 char count ; inr c ;set to point to next data byte nop nop nop mvi a,20 ldcntdwn: dcr a jnz ldcntdwn ;jr ldhsloop db 18H,(ldhsloop-$-1) and 0ffh lddoneload: ;interupt restored on termdrv exit ret ; ; ;Routine RLDTERM ; This routine loads a character via the terminal driver. The ; escape sequence is sent follout ; ; variables are not defined lhld belcycle ;number of cycles to beep rbell1: in blport ;turn the bell bit high ori blbit out blport ; lda belhigh rbell2: dcr a jnz rbell2 ; in blport ;turn the bit low ani (not blbit) and 0ffh out blport lda bellow rbell3: dcr a jnz rbell3 ; dcx h mov a,l ora h jnz rbell1 endif ret ;back to vdisp0ex ; ;ROUTINE rcuron ; This routine makes the cursor turn on ; rcuron: xra a rcursex: sta vpcur ret ;back to vwed by eight data bytes and then the ; character number to be loaded. Data bytes format is as in RLDMEM ; Nine byes must be sent after the escape sequence rldterm: mvi a,9 ;nine bytes to be loaded sta rldcnt lhld vidmbase ;data area for loading shld ldptr ; save in pointer form lxi h,vrldmem ;set up next routine to be executed pop d ;get rid of extra return jmp vdispex ;jump to exit code ; ;Routine VRLDMEM ; This routine called repeatedly to store data bytes vrldmem: lda vregbc disp0ex ; ;ROUTINE rcuroff ; This routine makes the cursor turn off ; rcuroff: xra a cma ;jr rcursex db 18h,0ffh and rcursex-$-1 ; ;ROUTINE rnochon ; This routine turns the control code interpretation off ; rnochon: xra a cma rnochex: sta vnocheck ret ;back to vdisp0ex ; ;ROUTINE rnochoff ; This routine turns the graphics mode off - NORMAL mode only control code ;acknowledged when in graphics mode. ; rnochoff: xra a ;jr rnochex db 18h,0ffh and rnochex-$-1 ; ; ; ;Ro;data byte to store lhld ldptr ;where data to be stored mov m,a inx h shld ldptr lda rldcnt ;check for last byte received dcr a jz vchload sta rldcnt pop d ;extra return address lxi h,vrldmem ;set up next character execute address-same jmp vdispex ; ; ;ROUTINE VSCROLL ; ; This routine scrolls the screen up one line. Any routine which calls this one is responsible ;for setting VXYPOS itself, HL contains address of source line for vscrollentry, DE the destination ; VSCROLL: utine VCHLOAD ; This routine actually loads the character font from vidmbase ;Interrupts are disabled in portions of this routine for up to ;16.7 milliseconds ; vchload: lhld vidmbase ;load base of crt screen mov b,h mov c,l ;lxi h,8 ;load up which character ;dad b mov d,m ;character to be loaded lxi h,20h ;set up the 16 bytes scanned but not displayed dad b mvi a,16 ldcontmov: mov m,d inx h dcr a ;jrnz ldcontmov db 20h,(ldcontmov-$-1) and 0ffh ; inx b ;reg BC points lhld vmembase lxi d,30h dad d xchg lxi h,128 dad d vscrollentry: push d push h ;slar l ;checking line numbers db 0cbh, 20h + L ;ralr h db 0cbh, 10h + H lda vmemend ;slar a db 0cbh, 20h + A lda vmemend+1 ;ralr a db 0cbh, 10h + A cmp h ;jrz vscroex db 028h,0ffh and vscroex-$-1 pop h push h call vmov pop h pop d lxi b,128 dad b xchg dad b xchg ;jr vscrollentry db 018h,0ffh and vscrollentry-$-1 vscroex: pop h pop h jmp vceol ; ; ;ROUTINE VCEOto the 8 binary ;representation data bytes. di ;interrupt must be disabled due to timing ; ldvsloop: ; ;********************************************************** ; CODE STARTING FROM HERE MUST BE PRECISELY TIMED ; ;clear any pending IRQA interrupts ; in piaport ; ;wait for Vertical Sync interrupt cycle ; ldwaitinterrupt: in piaport+1 ana a ;look for IRAQA interrupt jp ldwaitinterrupt ;12 t states ; mvi e,8 ;We should be at the horizontal retrace at the start of the ;firsL ; Routine takes as a parameter the memory address of the first character ;to be blanked in the HL register ;Blank first character - saves confusion ; VCEOL: lxi d,(blank shl 8) or 7fh ;blank and end condition vceol1: mov m,d inx h mov a,l ana e ;jrnz vceol1 db 20h,0ffh and vceol1-$-1 ret ; ;ROUTINE VMOV ; ; Routine to move lines from line whose address is in the HL regisiter to line whose ;address is contained in the DE register. ; VMOV: lxi b,80 ;line length ;ldir db 0e  dh,0b0h ret ; ;ROUTINE VCUROFF ; This routine is responsible for turning the cursor off when VOUT2 is entered ;from location specified by VXYPOS. ; vcuroff: ; same as cursor on routine-flipping top bit ; ;ROUTINE VCURON ; This routine is responsible for turning the cursor on when VOUT2 is exited ;from location specified by VXYPOS. ;if vpcur set does nothing ; vcuron: lda vpcur ;do nothing flag ora a rnz ; ;entry for flipping top bit vcurton: lhld vmemadd mov a,m xri 80h mo ; terminal driver is first called - can be overwritten after the driver ; received the first character(whatever it may be) ; terminit: push b push psw ; ;make sure terminit is only done once ;move codes immediately below up 3 bytes ; lxi b,endonlyonce-onlyonce-3 lxi h,onlyonce+3 lxi d,onlyonce ;ldir db 0edh,0b0h ; ;setup video display memory addresses ; lda hz cpi clk50 mvi a,clk50 ;50hz lxi h,vdm50 jz loadparm ; mvi a,clk60 ;60hz lxi h,vdm60 ; ;initialize vv m,a ret ; ;* * * * * * * * * * ; ; Video variables - not in common ; vidmbase dw 0 ;video memory address - setup at terminit time vclkfrq db 0 ;clock frequency ; VDISPADDR: DW VDISP0 ;ADDRESS of next DISPATCH ADDRESS VDISPSAV: DB 0 ;LEADIN CHARACTER SAVE (VDISP0) VNOCHECK: DB 0 ;NON-ZERO CONTROL CODES IGNORED VREVFLAG: DB 0 ;80H=>REVERSE VIDEO, 00H=>NORMAL VIDEO vpcur: db 0 ;non zero for not turning cursor on when exiting ; ; on entering or exiting from vout VADDRTAB: ;ENTRIES Mideo display memory parameters ; loadparm: sta vclkfrq shld vidmbase ;init base of video display momory ; lxi h,vidend ;set up alpha screen parameters shld vstatend lda vstatline call vidset shld vstatbase shld vnormend lda vnormline call vidset shld vnormbase shld vdispend lda vdispline call vidset shld vdispbase call rmodnorm ;use video routine to set up parameters ; pop psw pop b ; jmp onlyonce ; vidset: ;utility to help set up alpha video parms inr a ;ATCHING vdtab FOR ADDRESS OF ROUTINE ; TO BE EXECUTED ON MATCH ; ;NOTE: this table must correspond to the vdtab- but in reverse order dw retnull ;pixel pick - not implemented in the alph mode dw retnull ;pixel mode overwrite - not implemented in the ; alph mode - only here to standardize alpha ; terminal driver with the graphics. cY. dw rrevoff ;reverse video off dw rrevon ;reverse video on dw retnull ;delete character-NOT implemented dw retnull ;insert character-NOTbase 1 rz ;zero lines mov b,a lxi d,80h ;line length vids1: ora a ;reset carry ;dsbc de db 0edh,52h ;djnz vids1 dcr b jnz vids1 ret ; ; ;* * * * * * * * * * ; org vidparm ; ;these locations must match the vout,use6,use7,use8,use9 equates in the bios ; jmp evout ;terminal emulator entry - banked portion ; dw usr6 ;addresses of user configurable tables dw usr7 ; used by some Megatel utilites dw usr8 dw usr9 usr6: VxPOSOFF: DB 0 ;;OFFSET FOR CURSOR ADDRESS implemented dw rldterm ;load character via terminal vnochentry equ ($-vaddrtab)/2 dw rnochoff ;no check mode off (semi-graphics off) dw rnochon ;no check mode on (graphics on) dw rcuron ;cursor on dw rcuroff ;cursor off dw rbell ;bell dw rmoddisp ;display mode-top dw rmodnorm ;normal mode dw rmodstat ;status mode-bottom dw rrevoff ;reverse video off dw rrevon ;reverse video on dw rcurhome ;cursor home dw rcurleft ;cursor left (backspace) dw rcurri ;cursor right dw rING for x coordinate VyPOSOFF: DB 0 ;;OFFSET FOR CURSOR ADDRESSING for y coordinate VXYROW: DB 0 ;;ZERO=> X,Y (COLUMN,ROW) CURSOR ADDRESSING ORDER VLEADIN: DB 1BH ;;LEADIN CHARACTER - REQUIRED ONLY IF LEADIN GREATER EQUAL ; ;; 20H or multiple leadins-only 1 allowed < 20h usr7: belcycle: dw blcycle ;;number of cycles for bell to produce belhigh: db blhigh and 0ffh ;;number of loops for high portion of cycle bellow: db bllow and 0ffh ;;number of loops for low portion of cycle ; if alphtecurup ;cursor up dw rinsline ;insert line dw rdelline ;delete line dw rcleop ;clear to end of page dw rcleol ;clear to end of line dw rcuradd ;cursor address leadin dw rclescrn ;clear screen and home dw rcurcr ;carriage return dw rcurdown ;cursor down (line feed) ds 10h ; ;data storage ; rldcnt: ds 1 ;counter for number of data bytes still to load ldptr: ds 2 ; and where to load them-in video screen ; ; ;terminal driver initialization - this section is required only when therm vmemadd: dw 0 ;;cursor position initialized to start of screen vmembase: dw 0 ;;base of screen line - 48 bytes before displayed screen vnumlines: db 0 ;;number of lines on the screen vmemend: dw 0 ;;last cursor position+1 vdispbase: dw 0 ;;base of screen line - 48 bytes before displayed screen vdispline: db vdpline and 0ffh ;;number of lines on the screen vdispend: dw 0 ;;last cursor position+1 vnormbase: dw 0 ;;base of screen line - 48 bytes before displayed screen vnormline: db vnmline and   0ffh ;;number of lines on the screen vnormend: dw 0 ;;last cursor position+1 vstatbase: dw 0 ;;base of screen line - 48 bytes before displayed screen vstatline: db vstline and 0ffh ;;number of lines on the screen vstatend: dw 0 ;;last cursor position+1 endif ; if not alphterm ; ; alpha terminal emulator running under hardware graphics mode ; curscrn: ; vtopcrt dw tscrn2 ;top left of usable crt votopcrt dw tscrn2+col$off ;top left of used crt screen lines db line2 and 0ffh nbr1 db ((lsplay mode-top screen invoked DB 07H ;;BELL db 1bh ;;cursor off db 1bh ;;cursor on DB 1bh ;;NO CHECK MODE ENTRY on (graphics on) db 1bh ;;no check off (graphics off) db 1bh ;;character load - terminal db 1bh ;;delete character - NOT implemented db 1bh ;;insert character - NOT implemented DB 1BH ;;REVERSE VIDEO ON DB 1BH ;;REVERSE VIDEO OFF db 1bh ;;cmode-see above db 1bh ;;cpix pixel pick if alphterm db 0 endif if not alphterm db 1bh ;;full screen = statine2-1)*(chrhite/2)) and 0ffh nbr2 db (line2*(chrhite/2)) and 0ffh nbr3 dw (line2-1)*chrhite*lineleng-lineleng nbr4 dw chrhite*line2 - 1 endcurscrn: ; bytomove dw endcurscrn-curscrn ;number of bytes to move ; statscrn: ;bottom screen dw tscrn3 dw tscrn3+col$off db line3 and 0ffh db ((line3-1)*(chrhite/2)) and 0ffh db (line3*(chrhite/2)) and 0ffh dw (line3-1)*chrhite*lineleng-lineleng dw chrhite*line3 - 1 ; normscrn: dw tscrn2 ;top left of usable crt dw +disp+norm screen endif db 0,0,0,0,0 ;expansion ; usr9: ; ; following section is the second byte of the control sequences, 0ffh=> no second character ; NOTE: vdtab2 must immediately follow vdtab vdtab2: DB 0ffh ;CURSOR DOWN (LINE FEED) DB 0FFH ;CARRIAGE RETURN DB 0FFH ;CLEAR SCREEN DB 3DH ;CURSOR ADDRESS LEADIN DB 15H ;CLEAR TO END OF LINE DB 16H ;CLEAR TO END OF PAGE DB 14H ;DELETE LINE DB 13H ;INSERT LINE DB 0FFH ;CURSOR UP DB 0FFH ;CURSOR RIGHT DB 0FFH ;CURSOR tscrn2+col$off ;top left of used crt screen db line2 and 0ffh db ((line2-1)*(chrhite/2)) and 0ffh db (line2*(chrhite/2)) and 0ffh dw (line2-1)*chrhite*lineleng-lineleng dw chrhite*line2 - 1 ; dispscrn: dw tscrn1 ;top left of usable crt dw tscrn1+col$off ;top left of used crt screen db line1 and 0ffh db ((line1-1)*(chrhite/2)) and 0ffh db (line1*(chrhite/2)) and 0ffh dw (line1-1)*chrhite*lineleng-lineleng dLEFT (BACKSPACE) DB 0FFH ;CURSOR HOME DB 1FH ;REVERSE VIDEO ON DB 19H ;REVERSE VIDEO OFF DB 17H ;status mode-bottom screen invoked DB 18H ;normal mode-main screen db 1dh ;display mode-top screen invoked DB 0FFH ;BELL db 12h ;cursor off db 11h ;cursor on DB 10h ;NO CHECK MODE ENTRY on (graphics on) db 09h ;no check off (graphics off) db 01h ;character load - terminal db 03h ;delete character - NOT implemented db 04h ;insert character - NOT implemented DB 1FH ;REVEw chrhite*line1 - 1 ; fullscrn: dw tscrn1 dw tscrn1+col$off db totline and 0ffh db ((totline-1)*(chrhite/2)) and 0ffh db (totline*chrhite/2) and 0ffh dw (totline-1)*chrhite*lineleng-lineleng dw chrhite*totline - 1 endif ; usr8: ; ;Note: the vdtab AND THE vdtab2 MUST BE CONSECUTIVE ; vdtab: ;; ENTRIES - FIRST IS LEADIN, NEXT IS CHARACTER ;; 0 ENTRY TERMINATES LIST (WORD OF 0'S) ;; 0FFH ENTRY IN SECOND BYTE INDICATES FIRST CHARACTER IS ;; FULL INSTRUCTION ;last ENTRY IRSE VIDEO ON DB 19H ;REVERSE VIDEO OFF db cmode ;mode for pixel overwrite db cpix ;pixel if alphterm db 0 endif if not alphterm db 1ch ;full screen endif db 0,0,0,0,0 ;expansion ; ;stack and register saves ; ds 50 ;video stack vregbc ds 2 vregde ds 2 vregpsw ds 2 vregsp ds 2 vstack equ $ vreghl dw 0 ; ; 'front/back end of terminal emulator module' evout: ; SHLD VREghl ;save sp and registers LXI H,0 DAD SP LXI SP,VSTACK MOV A,C ;for CP/M 1.4 compatibilityS TERMINATOR DB 0AH ;;CURSOR DOWN (LINE FEED) DB 0DH ;;CARRIAGE RETURN DB 1AH ;;CLEAR SCREEN DB 1BH ;;CURSOR ADDRESS LEADIN DB 1BH ;;CLEAR TO END OF LINE DB 1BH ;;CLEAR TO END OF page DB 1BH ;;DELETE LINe DB 1BH ;;INSERT LINE DB 0BH ;;CURSOR UP DB 0CH ;;CURSOR RIGHT DB 08H ;;CURSOR LEFT (BACKSPACE) DB 1EH ;;CURSOR HOME DB 1BH ;;REVERSE VIDEO ON DB 1BH ;;REVERSE VIDEO OFF DB 1Bh ;;status mode-bottom screen invoked DB 1BH ;;normal mode-main screen db 1bh ;;di - do not remove push h ;stack is in common in the banked system push psw PUSH D PUSH B ; if banked call sinvdm ;switch in vdm bank call indvout ;call terminal emulator call soutvdm ;switch out vdm bank, switch in original bank endif if not banked call indvout ;the system independent terminal emulator endif POP B POP D POP PSW POP H ;OLD STACK POINTER SPHL LHLD VREghl ;RESTORE HL REGISTER jmp bnkinrp ;restore interrupt and return ; orgbank db 0 ;save bank   ; end ;switch in vdm bank call indvout ;call terminal emulator call soutvdm ;switch out vdm bank, switch in original bank endif if not banked call indvout ;the system independent terminal emulator endif POP B POP D POP PSW POP H ;OLD STACK POINTER SPHL LHLD VREghl ;RESTORE HL REGISTER jmp bnkinrp ;restore interrupt and return ; orgbank db 0 ;save bankWhen generating a sysgen image(see sysgen documentation), the boot strap ;has to be located to memory address from 900h to 97fh, the ccp and bdos from ;980h to 1f7fh, the bios to 1f80h, the relocator to the end of the bios (end is ;determined by the size of bios), and the cold system initiallization section ;to the end of the bios + 128. Other components located after the init section ;are the standalong terminal emulator, the memory management routine ;and the character font data set. By configuri: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͈*ng(patching according to doc) ;the system generating program(qsysgen.com), we are able to construct all these ;components in desired order before writing to the system tracks. ; ;So, starting at track 0 sector 1, the disk will contain the boot strap, ;the code relocation module, the system initialization, the standalong ;terminal, the memory management routine, the operating system ;(ccp, bdos, bios), and finally the character font data set, all in this order. ; ; false equ 0 true equ 0ffffh fDM!  ::=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͈*alsee equ false ;names used in filling a 6 byte parameter trueee equ true ; so there is no typo ; ;* * * * * * * * * * ; ;bootstraping system from disk - 128 bytes ; ;* * * * * * * * * * ; doubside equ not FALSE ;|014| double sided drive secttrack equ 17 ;|015| physical sector per track rate equ 00 ;|016| step rate secsize equ 512 ;|017| physical sector size ;where to read in the entire system. not counting sector 1 read in by the prom loadaddr equ 80h+secsize ;total size of code to be booted from the system tracks not counting sector 1 ;syssize=sizeof(system init + term driver + move + ccp + bdos + bios + chr.dat) syssize equ 5000h-secsize ;4 tracks for now; calculation based on ; 5-1/4", 10 spt, 512 byte per sector numsects equ (syssize+secsize-1)/secsize ;nmber of 'secsize' sectors ; ccp equ 0ac00h ;where to put ccp and bdos bios equ ccp+1600h ;where bios will be runing biossize equ 1c00h ;total size of the bios module bootfail equ 0ff00h ;branch t; BOOT STRAP FOR THE QUARK 100 - CP/M 2.24 r01 ; ; ; -Copyright (c) 1980 ; Digital Research ; Box 579, Pacific Grove ; California, 93950 ; -Copyright (c) 1985 ; Megatel Computer Technologies ; 150 Turbine Drive ; Weston, Ontario ; M9L 2S2 ; ; ;July/85 - modified for the 64k board. ;April/85 - complete rework of the boot sector, system load, and system ; initialization. cY. ; ;Source contains a 128-byte boot strap, a 128-byte code relocator, and ;a 1K cold system initiallization. ; ;o boot prom error routines ; stepinre equ 48h or rate ;used to restore the drive..so will not miss track 0 sensor stepinc equ 5ch or rate ;used in stepin routine to get to the next track restore equ 8 or rate readcmnd equ 88h ;read command ; dskcmnd equ 80h ;diskcommand port dskstat equ 80h ;disk status port dskdata equ 83h ;disk data port sectreg equ 82h ;disk sector register dskselport equ 76h ;pia peripheral register b sidebits equ 10h ;bit mask to select sides dskintrq equ 77h    ;intrq is on cb1 of 6821 intrq equ 7h ;bit number for intrq on dskintrq port(above) intmask equ 80h ;mask for intrq ; stack equ 080h ;stack just above this program retries equ 10h ;number of retries ; org 80h ; lxi sp,stack mvi c,retries+1 retry: dcr c jz bootfail in dskselport ;reset to side 0 ori sidebits out dskselport lxi h,retry ;set up retry address on the stack push h mvi b,4 ;number of steps to take in before restore..do not overshoot track 0 restin: mvi * * * * * ; vers equ 000022 ;version 2.2 bios versp2 equ 041h ;internal version number ; clk50 equ 50 ;;50 ticks per second - 50 hz clk60 equ 60 ;;60 ticks per second - 60 hz ; pprport equ 05fh ;;parallel printer port viaport equ 60h ;;VIA-6522 base address-16 ports piaport equ 74h ;;PIA-6821 base address-4 addresses aciaport equ 78h ;;ACIA-6850 base address- 2 addresses ; nserdata equ aciaport+1 ;;data port for hardware serial channel nserstat equ aciaport ;;status port for hardware a,stepinre call wfintr dcr b ;jrnz restin db 020h,(restin-$-1) and 0ffh ; mvi a,restore ;restore drive to track 0 call wfintr ani 98h rnz ;try again ; ;exx ;put loadaddr and port number into other bank db 0d9h lxi h,loadaddr mvi c,dskdata ;exx db 0d9h lxi d,200h or numsects ;d=sector, e=number of sectors to load ; readsect: mov a,d out sectreg ; ;section is not be required for single sided disks in dskselport ; only for double sided with FD1797 ...MaTed ani sidserial channel txrdy equ 1 ;;bit one is the transmitter data register empty-1=>ready rxrdy equ 0 ;;bit zero is the receiver data register full-1=>data ready blbit equ 000001 ;low bit..see vout ; piadra equ 74h ;;pia data reg A or pia data direction cntl reg piacra equ 75h ;;peripheral interface adapter control reg A piapb equ 76h blport equ viaport ;;on PB0 of 6522-initialization code change if modifying this ; init1 equ 00017h ;;master reset,8 bits+1 stop,rts=high,xmit interrupt disablebits ;see what side we are on mvi a,0 ;preset for even side-do not kill flags ;jrnz readsid0 db 020h,(readsid0-$-1) and 0ffh mvi a,2 ;side 1 readsid0: ori readcmnd call wfintr ani 9ch rnz ;to error retry if not good ; dcr e ;decrement number of sectors to load jz sysinit ;if all sectors loaded, go initialize system ; inr d ;sector number mvi a,secttrack cmp d ;jrnc readsect db 030h,(readsect-$-1) and 0ffh ; ;must move to the next track mvi d,1 ;reset sector if ed init2 equ 00015h ;;divide 16,8 bits+1 stop,rts=high,xmit interrupt disabled ; softrate equ 7 ;|005|initial rate for software serial channel hardrate equ 14 ;|006|initial rate for hardware serial channel ; ;Note the following printer strobe equates are setup to accommodate different ;hardware board layout. There is a revision number underneath the Z80B chip ;(on the underside of the board). Board revision 1.0 to 4.0 are marked as ;REV 1.0, REV 2.0, REV 3.0, and REV 4.0. Revision 5.0doubside in dskselport xri sidebits ;just toggle the side bit out dskselport ; to select the other side ani sidebits ;if bit is a 1 we are on even side, and have to move to next track, ;even (=0) no move ;jrz readsect db 28h,(readsect-$-1) and 0ffh endif ; mvi a,stepinc ;move to the next track call wfintr ani 98h rnz ;jr readsect db 18h,(readsect-$-1) and 0ffh ; wfintr: ;routine for waiting for disk completion ; ;inputs the CB1 here to wait for completion out dskcmnd wf is marked as 05R00. ;Set the 'rev500' flag to true only if your board's revision number is ;05R00. ; prtack equ 0 ;printer acknowledge init value rev500 equ TRUE ;|001| hardware board revision number if rev500 prtstrobe equ 0eh ;normal endif if not rev500 prtstrobe equ 0ch ;signal is inverted before output endif pstrobe equ prtack or prtstrobe ; blcycle equ 000100 ;;number of cycles for bell to produce blhigh equ 000020 ;;number of loops for high portion of cycle bllow equ 000020 ;intr1: in dskintrq ;port address of CB1 port ani intmask ;test the disk completion bit-interupt request ;jrz wfintr1 db 28h,(wfintr1-$-1) and 0ffh xthl ;delay for 1793 (disk controller) to set up return xthl ; code in dskselport ;make the disk completion interrupt go away in dskstat ;get status, in case needed ret ; stepin: ;routine to step in one track mvi a,stepinc call wfintr ani 98h ret ; ;* * * * * * * * * * ; ; cold system initiallization equates ; ;* * * * * ;number of loops for low portion of cycle ; ; absolute(fixed) origin of variables/routines in common memory ; these are the addresses we want the code to run at when system is up ; vidparm equ 0ea80h ;terminal emulator variables, and stack mvfix equ vidparm+100h ;start location of memory managment module ; ; linkage to memory management routines used by other O/S components ; ;bank/move routne jump table entry points - absolute address ; Ymove equ mvfix ;entry point for move routine Yxmove e  qu mvfix+3h ;; xmove Ybank equ mvfix+06h ;; bank ;;for coldboot(for both the loader and bios) bankinit equ mvfix+09h ;; bank init ivdmbank equ mvfix+0ch ;; vdm init ;;for interrupt servicing svdmbank equ mvfix+0fh ;; select vdm bank from non mapped stpabank equ mvfix+12h ;; select tpa bank from non mapped ;;for terminal emulator servicing sinvdm equ mvfix+15h ;; select vdm bank from anywhere soutvdm equ mvfix+18h ;; restore original bank after sinvdm ; ;abosolute address in move/bank routinestes ;* * * * * * * * * * ; valpha equ trueee ; ;flag to tell alphanumeric video alphterm equ valpha ;;alpha-numeric terminal driver ; vidend equ 00000h ;end of screen + 1-system equate vdmend equ vidend ;;end of vdm - common to all vdm configurations vout equ vidparm ;front/bank end of indvout equ vouteaddr ;system independent portion of vout voutsz equ voutsize ;alpha numeric terminal emulator size(maximum) ; ;graphics primitives at - note that the entry point is rst 5 indgprim equ i ; top16k equ mvfix+1bh ;;accessing hidden memory hz equ mvfix+1ch ;;clock pulse( value 50/60 for 50/60 hz) memsize equ mvfix+1dh ;;0 - 128k, 1 - 256k bnkinrp equ mvfix+1eh ;;ei/nop, ret curbnk equ mvfix+20h ;; = @cbnk banktab equ mvfix+21h ;;address of the bank select table used by ; ;; the bank routine ; ;size of the modules/data of the operating system ; Note that non resident code/data are overwritten when ccp, bdos, ; and bios are moved to their execution address. The idea is to pndvout+voutsz ;system independent primitive functions ; ;graphics video display memory starts gvdm50 equ vidend-7800h ;;start addr of vdm for 50hz gvdm60 equ vidend-6000h ;;for 60hz ; ;alpha video display memory starts vdm50 equ vidend-1400h ;;top of video display memory address - 50 hz vdm60 equ vidend-1000h ;; for 60 hz ; f6clr equ 0ff92h ;;clear F6 of the sam register ;;to move the bottom of vdm from 0ffffh to 8000h ; ;number of graphics displayable lines refline50 equ (vdmend-gvdmut ; as much initialization as possible in the non resident portion ; of the system to increase TPA size. ; voutsize equ 0b00h ;;alpha terminal emulator size - maximum fixsize equ 100h ;;emulator variables+stack+vout entry+table initsize equ 300h ;;system init section - non resident movesize equ 300h ;;move/bank routine size ossize equ 1600h+biossize ;max possible size of the OS itself is ; vidparm-ccp chrsize equ 0800h ;charactor font data size - non resident ; ;where the modules/dat50)/96 ;;number of vertical pixels - 50hz refline60 equ (vdmend-gvdm60)/96 ;; of 60hz ; ;number of grphics displayed lines vdpline equ -1 + 1 ;|008| ;;number of lines on the screen minus 1 vnmline equ -1 + 27 ;|009| ;;number of lines on the screen minus 1 vstline equ -1 + 2 ;|010| ;;number of lines on the screen minus 1 refline equ vdpline+vnmline+vstline+3 ;;total number of lines cY. lines equ vdpline+vstline+vnmline+3 ; lf equ 0ah cr equ 0dh eot equ 04h ; ;* * * * * * * * * *a are initially loaded by the bootstrap ; initladdr equ 180h ;;system init voutladdr equ initladdr+initsize ;;terminal emulator fixladdr equ voutladdr+voutsize ;;emulator variables and entry moveladdr equ fixladdr+fixsize ;;memory management routine osladdr equ moveladdr+movesize ;operating system xchrset equ osladdr+ossize ;character font ; ;calculated location of ccp on disk, based on load address ; cpmsect equ secsize/128 ;number of cpm sectors in a physical sector totsect equ secttrack* ; ; move code to their execution addresses - init, bank, term driver etc ; ;* * * * * * * * * * ; org 100h ; sysinit: ; ; running in loader bank - interrupt must be disabled (presently di by prom) ; in piacra ;disable clock interrupt ani 0feh out piacra ; lxi h,gvdm50 ;clear 800h to 7fffh of vdm lxi d,gvdm50+1 lxi b,vdmend-gvdm50-1 xra a mov m,a ;ldir db 0edh,0b0h ; ;move codes from loader address(read in by bootstrap) ;to execution address ; lxi h,initladdr ;bank, cpmsect ;total cpm sectors on a track toccp equ (osladdr-80h)/128 ;total cpm sectors before ccp ccptrack equ toccp/totsect ;track is base 0 ccpsect set (toccp mod totsect)+1 ;sector number is base 1 ; ;where the modules/data are to be move to for execution ; initeaddr equ 0a000h ;;system init vouteaddr equ 0e680h ;;terminal driver fixeaddr equ vidparm moveeaddr equ mvfix oseaddr equ ccp chrset equ initeaddr+initsize ;;character font data ; ;* * * * * * * * * * ;terminal emulator equaports and vdm initialization lxi d,initeaddr lxi b,initsize ;ldir db 0edh,0b0h lxi h,osladdr ;ccp, bdos, bios lxi d,oseaddr lxi b,ossize ;ldir db 0edh,0b0h ;copy terminal emulator (independent portion) to video bank lxi h,voutladdr ;from load address lxi d,vouteaddr ;to execution address lxi b,vout-indvout ;actual allowed size ;ldir db 0edh,0b0h lxi h,fixladdr ;fixed variables (for video/move/bank) lxi d,fixeaddr lxi b,fixsize ;ldir db 0edh,0b0h lxi h,moveladdr ;move   routine lxi d,moveeaddr lxi b,80h ;ldir db 0edh,0b0h ; jmp initeaddr ;execute stand along cold boot(one time only) ; ;go do bios cold boot ; gobios: mvi e,ccptrack and 0ffh ;track ccp is on mvi d,ccpsect and 0ffh ;starting sector ccp is on jmp bios ;go do bios cold boot ; ; ;* * * * * * * * * * ; ;initialize banking, terminal emulator, vdm, ports etc. ; this section will sit in common memory ; ;* * * * * * * * * * ; org initeaddr ; lxi h,xchrset ;copy character font datahz cpi clk50 jz soft50 lxi h,softrate60 soft50: dad d mov a,m out viaport+8h ; mvi a,2 ;set memory size to 64k sta memsize ; ;*************************************************************************** ; ; VIDEO DISPLAY MEMORY INITIALIZATION ; ; RUN IN VIDEO BANK ; ; if not alphterm ; mvi a,0c9h ;stuff a ret instruction where the independent sta indgprim ; portion of the graphics primitives would be ; ; graphics ; ; set up character data in vdm holes mvi a,0 lx lxi d,chrset lxi b,chrsize ;ldir db 0edh,0b0h ; mvi a,0 ;disable interrupt enabling from move/bank/video calls sta bnkinrp ; lxi sp,sysstack ;set up stack ; mvi a,0c9h ;store return at interrupt location sta 38h ; ;init I/O ports ; mvi a,init1 ;init simplex serial out nserstat xthl xthl mvi a,init2 out nserstat ; ;other hardware initialization mvi a,80h ori blbit ;setup for bell bit ;CHECK out viaport+2 ;ddrb ; mvi a,0d4h out viaport+0bh ;acr mvi a,0i d,gvdm60 lxi h,chrset setchar: lxi b,8 ;ldir db 0edh,0b0h push h lxi h,96-8 dad d xchg pop h dcr a jnz setchar ; ;set up vdm here ; ;Need to change video display memory address before the sam checks for the vdm ;address again. The check is done between the CA1 high-to-low to low-to high ;transition period, about 180 usec. ; ;wait for IRQA1 interrupt flag to be set - set by low-to-high transition of CA1 ; waitirqa: in piacra ana a jp waitirqa ; ;wait for trailing e out viaport+5 ;t1c-h mvi a,pstrobe and 0ffh out viaport+0ch ;pcr mvi a,4ch out viaport+8h ;t2c-l mvi a,0 out viaport+9h ;t2c-h mvi a,0ffh out viaport+0ah ;shift register ; in viaport+0bh ;disable shift register..Not sure if needed ani 0e3h out viaport+0bh ; xra a ;reset counters out viaport+9h ; in viaport+0bh ;turn shift register operation back on ori 14h out viaport+0bh xra a ;turn to marking condition cma out viaport+0ah ; ;QUARK Clock frequency check. CODdge of interrupt signal - about 8 usec ; waitclr: in piacra ana a jp setsam in piadra ;clear interrupt jmp waitclr ; setsam: ; ;setup the sam register - no affect until the next high-to-low transition ; lxi h,0ff91h ;f5 set call 0bh ; lda hz cpi clk50 jz clock50 lxi h,0ff8dh ;f3 set lxi b,0ff88h ;f1 clear jmp clockdone ;change to relative if space needed clock50: lxi h,0ff8ch ;f3 clear lxi b,0ff89h ;f1 set clockdone: push h push b ; in piapb ;set up for turn E STARTING FROM HERE are TIMED ; mvi h,0ffh ;60 hz with 32 lines ;clear any pending IRQA interrupts waitclear: in piacra ana a jp waitintrpt in piadra jmp waitclear ;wait for Vertical Sync interrupt cycle waitintrpt: in piacra ana a ;look for IRAQA interrupt jp waitintrpt ;12 t states nop nop in piadra ;clear interrupt ;We should be at the horizontal retrace at the start of the ;first line of video display memory scan wloop2: mvi l,23 ;96 chars per line wloop1: dcon graphics mode bit ani 0bfh mov b,a ;save for later ; LXI H,0FF86H CALL 0Bh ; LXI H,0FF88H LXI H,0FF8AH CALL 0Bh ; LXI H,0FF8DH LXI H,0FF90H CALL 0Bh LXI H,0FF92H CALL 0Bh ; pop h ;f1 clear/set-for 50/60hertz CALL 0Bh pop h ;f3 set/clear-for 50/60 hertz CALL 0Bh ; ;change the active transition for setting interrupt flag from low-to-high ;to high-to-low ; in piacra ani 1111$1101b out piacra ; ;wait for flag set - generated by the high-to-low transition ; ghir l jnz wloop1 dcr h jnz wloop2 ;check for iraqa interrupt. if interrupt, then it is a 60 hz board in piacra ana a ;look for IRAQA interrupt mvi a,50 jp lhz50 ;no interrupt ;60 hz mvi a,60 lhz50: sta hz ; mvi a,hardrate ;full duplex baud rate add a mov e,a mvi d,0 lxi h,hardrate50 lda hz cpi clk50 jz hard50 lxi h,hardrate60 hard50: dad d mov a,m out viaport+4 ;t1c-l ; mvi a,softrate ;simplex baud rate add a mov e,a mvi d,0 lxi h,softrate50 lda tolow: in piacra ana a jp ghitolow ; xthl ;wait awhile xthl ; ; mov a,b ;to graphics mode out piapb ; LXI H,0FF85H ;V2 set for graphics mode CALL 0Bh ;setup has immediate affect ; endif ; ;put active CA1 transiton for setting interrupt flag back to low-to-high ; in piacra ;put clock interrupt to low-to-high ori 2 out piacra ; ;initialize video display memory starting address ; if alphterm lda hz cpi 60 lxi h,vdm60 jz initparm lxi h,vdm50 initparm: shld vi  dmbase ;init base of video display momory ;run in video bank lhld vidmbase xchg ;pass vdm addr in reg DE lxi h,chrset ;pass char set addr in reg HL call chrldr ;monochrome character loader endif ; jmp gobios ;goto bios ; ; use$3: ;for user function hardrate60: ;see appendix A tables II-IV of quark user manual ;60 hertz-default dw 0 ;zero baud dw 930 ;50 dw 620 ;75 dw 422 ;110 dw 345 ;134.5 dw 309 ;150 dw 154 ;300 dw 76 ;600 dw 37 ;1200 dw 24 ;1800 dw nterrupted due to precise timing ; vdm holes are not saved/restored ; di ; ;set up variables in the registers before counting start ; ;exx - switch in the alternate bank registers ; db 0d9h lda firstchar mov c,a lda nbrochar mov b,a LHLD VDMADDR lxi d,vdmdbytes+vdmudoffs ;offset to the address of next line ; ;while bank is switched, set up the first line with 16 bytes of two char ;with 8 bytes each ; mvi a,bytepchar initln: mov m,c inx h dcr a jnz initln ; inr c 18 ;2400 dw 11 ;3600 dw 8 ;4800 dw 5 ;7200 dw 3 ;9600 dw 1 ;19200 hardrate50: ;50 hertz dw 0 ;zero baud dw 967 ;50 dw 644 ;75 dw 439 ;110 dw 358 ;134.5 dw 321 ;150 dw 160 ;300 dw 79 ;600 dw 39 ;1200 dw 25 ;1800 dw 18 ;2400 dw 12 ;3600 dw 8 ;4800 dw 5 ;7200 dw 3 ;9600 dw 1 ;19200 use$4: ;for user function softrate60: ;60 hertz dw 0 ;zero baud dw 153 ;1200 dw 102 ;1800 dw 76 ;2400 dw 50 ;3600 dw 37 ;4800 dw 24 ;7200 dw 17 ;9600 dw 8 ;19200dad d ;next line ; db 0d9h ;switch back ; lhld chrsetaddr xchg ;store in reg DE ldax d lxi b,regbcaddr stax b inx d ;move to next vsm line of characters ; ; vsloop: ; ; this line is counted towards the last 80 char of the last frame ; mvi h,(bcnt-1)*8+1 ;store line per frame count in register H mvi l,(bcnt*8) and 0ffh ; ;****************************************************************************************************** ; CODE STARTING FROM HERE MUST BE PRECISELY TIMED  softrate50: ;50 hertz dw 0 ;zero baud dw 159 ;1200 dw 106 ;1800 dw 79 ;2400 dw 52 ;3600 dw 38 ;4800 dw 25 ;7200 dw 18 ;9600 dw 8 ;19200 ; ds 50 sysstack: ; ;* * * * * * * * * * ; ; UTILITIES ; ;* * * * * * * * * * ; ; if alphterm ; vidmbase dw 0 ; ; ;QUARK monochrome character font loader for loader bios initialization ; ;July/84 - copied from chrldr.asm of cp/m 3.001r01. cY. ; ; V A R I A B L E S for monochrome char loader ; firstchar db 000H nbrochar db 000; ;clear any pending IRQA interrupts ; IN PIACRAPORT ANA A JP waitinterrupt ; in piadraport ; ;wait for Vertical Sync interrupt cycle ; waitinterrupt: in piacraport ana a ;look for IRAQA interrupt jp waitinterrupt ;12 t states ; nop nop ; ; ;We should be at the horizontal retrace at the start of the ;first line of vsm. ; hsloop: ;in l,(c) db 0edh,070h nop ; ;five chars to the end of HS retrace, or five chars before the start of vsm line(80 bytes) display ; dcr h ;tot nbr of chars loaded; multiples of twos chrsetaddr dw 0 ;starting address of character set table VDMADDR DW 0 ; ; ; S T A T I C P A R A M E T E R S ; debug equ false piacraport equ 75h ;peripheral interface adapter control register A piadraport equ 74h ;pia data register A, or pia data direction control register A ; bytepchar equ 16 ;display each char for 8 consecutive bytes linepchar equ 8 ;loading one char takes 8 lines bcnt equ 32 ;count of 32*2 chars are loaded per verticalh ; db 0d9h jz endfrm NOP jmp fill2 ; ;end of loading one frame, reset vidio display memory char load address ; endfrm: LHLD VDMADDR ; ; ;fill the 2 bytes of horizontal retrace with char. ; fill2: mov m,c inx h mov m,c inx h mov a,l ani 0fh jz fini1 ;16 bytes done nop nop nop nop nop jmp ffini fini1: dad d inr c dcr b ; jz pgmexit ;no more char to be loaded ; ffini: db 0d9h ; lxi b,regbcaddr ldax d stax b inx d dcr l jz vsl sync. ; vdmudoffs equ 32 ;not scanned byte 0 to 31 of each 128-byte line vdmudbytes equ 16 ;number of not displayed bytes per line. vdmdbytes equ 80 ;the actual displayed bytes of each line. ; regbcaddr equ 6000h ;addr must be within 0 to 3f of each page. ; chrldr: ; ;note: ;execution time variables are all stored in registers in the two register banks ; shld chrsetaddr lxi h,vdmudoffs dad d SHLD VDMADDR mvi a,0fh ana l rnz ;not on 16 byte boundary ; ;this routine can not be ioop ; ;finish count down to complete 96 char count ; mvi a,10 nop cntdwn: dcr a jnz cntdwn jmp hsloop ; ; ;routine finished. put vdm back ; pgmexit: db 0d9h ;switch to original register bank ; ret endif end ; ov a,l ani 0fh jz fini1 ;16 bytes done nop nop nop nop nop jmp ffini fini1: dad d inr c dcr b ; jz pgmexit ;no more char to be loaded ; ffini: db 0d9h ; lxi b,regbcaddr ldax d stax b inx d dcr l jz vsl  3b80h 0025h 27ch 0980h 0064h 280h 4e00h 0010h 284h 0000h 0000h - terminate table by 4 bytes of zeros In case of reading from the system tracks, the table dictates to the program to read the first sector to memory address 900h, the next 37 sectors to address 3b80h and on, the next 100 sectors to address 980h and on, and the next 16 sectors to 4e00h. In case of writting to the system tracks, the program will write the first sector from memory address 900h, the next 37 sectors from addres; ;Megatel Quark memory management routine for 64k boards ; ;July/85 -implemented for CP/M version 2.24. cY. ; -routines only exist for compatiblity to version 2.23 ; ie 64k implementation requires no memory banking, etc. ; ; ;* * * * * * * * * * ; ; absolute(fixed) origin of variables/routines in common memory ; these are the addresses we want the code to run at when system is up ; vidparm equ 0ea80h ;terminal emulator variables, and stack mvfix equ vidparm+100h ;start location of memory; ;Graphics terminal emulator is only distributed on special ;request for the 64k boards, because graphics emulation ;cuts the tpa down by 26k. Many application and utility ;programs will not run under such a small CPM (25k CPM, or 17k tpa). ; ;This null program is included to maintain compatibility with ;the installation program only. ; ret ds 'GRPHTERM.ASM IS NOT INCLUDED WITH 64K BOARDS' end  managment module ; ;for a total of 80h bytes ;* * * * * * * * * * ; ; linkage to memory management routines used by other O/S components ; ;bank/move routne jump table entry points - absolute address ; Ymove equ mvfix ;entry point for move routine Yxmove equ mvfix+3h ;; xmove Ybank equ mvfix+06h ;; bank ;;for coldboot(for both the loader and bios) bankinit equ mvfix+09h ;; bank init ivdmbank equ mvfix+0ch ;; vdm init ;;for interrupt servicing svdmbank equ mvfix+0fh ;; select vdm bank f - CP/M standard address - the remaining are stand along or banked bios modules of the O/S 3b80h system initialization 3f00h terminal emulator 4a00h teminal emulator variables and stack 4b00h memory management module 4e00h character font data set track image ----------- We choose to write the system image to the system tracks in the following sequence and size(in 128 byte sectors) : 1) bootstrap - 1 sector 2) system initialization, terminal emulator, emulatorrom non mapped stpabank equ mvfix+12h ;; select tpa bank from non mapped ;;for terminal emulator servicing sinvdm equ mvfix+15h ;; select vdm bank from anywhere soutvdm equ mvfix+18h ;; restore original bank after sinvdm ; ;abosolute address in move/bank routines ; top16k equ mvfix+1bh ;;accessing hidden memory hz equ mvfix+1ch ;;clock pulse( value 50/60 for 50/60 hz) memsize equ mvfix+1dh ;;0 - 128k, 1 - 256k bnkinrp equ mvfix+1eh ;;ei/nop, ret curbnk equ mvfix+20h ;; = @cbnk banktab e variables and stack, and the memory management moduel - 37 sectors 3) ccp, bdos, and bios - 100 sectors 4) character font data set - 16 sectors Patchable parameters -------------------- A table in QSYSGEN can be patched to resequence the system image when writting to the system tracks, or resequence the track image when reading to memory. Presently, the tables is filled out as follows : tabel patch address word word ------------------- ---- ---- 274h 0900h 0001h 278h qu mvfix+21h ;;address of the bank select table used by ; ;; the bank routine ;* * * * * * * * * * ; ;terminal emulator equates vout equ vidparm ;front/bank end of voutsz equ 0400h ;terminal emulator size(maximum) indvout equ vidparm-voutsz ;system independent portion of vout ; ;routine entry jump table - origin at 'mvfix' ; org mvfix jmp qmove jmp qxmove jmp qbank jmp qbankinit jmp qivdmbank jmp qsvdmbank jmp qstpabank jmp qsinvdm jmp qsoutvdm ; ;vars at fixed locatio  ns - address specified in CPM3EQU.LIB ;top16k db 0 ;flag set when accessing top 16k of bank ;hz db 0 ;running clock frequency 50 or 60 hz ;memsize db 0 ;0 - 128k, 1 - 256k ;bnkinrp: nop ;interrupt enable disable - byte stuffed by ret ; 'gsysei', 'gsysdi' in interrupt handler ;curbnk db 0 ;current bank selected by Ybank ;banktab dw 0 ; ; ; HL destination, DE source, BC count ; ;Ymove: qmove: mov a,b ;check for zero count ora c rz ; xchg ;ldir db 0edh,0b0h xchg  ret ; ;Yxmove: qxmove: ; ret ; ;Ybank: qbank: ; ;ivdmbank: qivdmbank: ; ;stpabank: qstpabank: ; ;svdmbank: qsvdmbank: ; ;sinvdm: qsinvdm: ; ;soutvdm: qsoutvdm: ; ;bankinit: qbankinit: ret ; end sysei', 'gsysdi' in interrupt handler ;curbnk db 0 ;current bank selected by Ybank ;banktab dw 0 ; ; ; HL destination, DE source, BC count ; ;Ymove: qmove: mov a,b ;check for zero count ora c rz ; xchg ;ldir db 0edh,0b0h xchg  *": ͫ!4¯ :1 !q4e!"!q: \ !14>!\ :!1\ :2*M!E ^#V=ځ ͻ * :w*#"m å å å å å ͫm *MRm !6 m !6 m !6 m *&̓m !6 m !6  m !60 m *&̓m !67 m !67 m !67 m *&̓m r   ! , 7 :2!q: ʊ *M8 :œ *M8 :12!:ڹ !:2â !:w>! !5 8 : !16!q:!w  t  :0Ot !q:O :O !6:2:'2:'2:'2*M *M *M :z :t  t   t *}2͟"ͻ * * *&"!q: : :: :2: !6<:2<22!!26 t >! & !6:4::H4̀ : A!26*Mt : U!6!q:a/>z!/Hy:_2:!q:A/>Z!/HҠ: 2::=O>:!pHz>͞>!6:2*M! ^#V;H ** b͸{w w y w{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o:10EB8000C3A3EBC3ABEBC3ACEBC3ACEBC3ACEBC30A :10EB9000ACEBC3ACEBC3ACEBC3ACEB00000000C907 :0DEBA00000000078B1C8EBEDB0EBC9C9C9A9 :0000000000  45QͯRP=6++++!CQEQ! ~QͯR!C?Q#Q#QbPLiUڂQ͉V͗LuQ_\_͏RPQzbg 整͏RͣRzWL_L:6=ÖQ>e`! ʬQ~wýQ ʷQ~½QQQͣRͅRQbPLͅR͉V ͣRͅRRzOR R R͗LiQ_#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5  .ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*N t !9DM!!!ͻ`is#r`i^#Vr+s! w#w͐|0 1*" COPYRIGHT(C) 1978, DIGITAL RESEARCH á 4êü /L9ASMPRNHEX͐~#fo++*s#r\6`i^#Vr+s! ^#Vr+s!!!ͻ;!97*+++:PG_*RDM*TT]!r  r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*N t !9DM!!!ͻ`is#r`i^#Vr+s! w#w͐|0   :  '<ͭ'<>V$>O$:Ğà\ÞØ`rÍÖ![w#w#b!"!F#v2[G*##~w*##~<*}q!~ڬ6![^![^#fk"͎͘!G#*####*^#Vû!^*"*!4w_#~ ʸ A:4~~# ¼ > \ ?ʻ w# !ͼ ? !ͼ {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/!)ͼ !ͼ :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?'  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&)^#fk:! 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*!{͚|͚}͚͚{!$~#͚͚> ͪ> ͪz'{ͅ>ɯ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~ ͅ@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! ~*!) " Ͱ>2lyPLnR>UX:l̅2l͓*>ERʵ2C!" """ :ʼ:*1 |R|ͦ0FIL: R  R* } *" :¿::¿üX!C^#fk[@ :Œ:=ʌG!ʆF#H vÛc*| EH ͺ,^1 ͦ *""1 EH DH ͺ,1 ͦ :  1:  " > 2   :|: |Ë  |*" ͩ !6="1 :  1}1:n:>BʋSSͦSSxS 1:  1"" ͦ 1 |͍ >O U!" 1 1!|_!^#fk $8AP`ixH ñññ81Ľ y0îH ñGîG  ñH ñ(Ľ yîH ñîîĽ y0îîH ñG 1: :,; c*| } 8O head load operation x01Head settling time after positioning x01Delay between drive selects in msec x01Tunnel erase delay 4 x06SELECT LOGICAL DRIVE TO BE DEFINED 1. DRIVE A 2. DRIVE B 3. DRIVE C 4. DRIVE D 5. Return to main menu x14 Define drive to be the same as 1. Drive A 2. Drive B 3. Drive C 4. Drive D 5. IBM 3740 format 6. KAYPRO II 7. MEGATEL 5.25" 48 tpi (CPM 2.23) 8. MEGATEL 5.25" 96 tpi (CPM 2.23) 9. MEGATEL 8" (CPM 2.23) 10. MEGATEL 5.25"Ľ 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 48 tpi (CPM 2.22) 11. MEGATEL 5.25" 96 tpi (CPM 2.22) 12. MEGATEL 8" (CPM 2.22) 13. To be defined 5 x03Single or double density 1. Single density 2. Double density x03If floppy, single or double sided 1. Single sided 2. Double sided x03Double tracking 1. Use double tracking 2. Do not use double tracking x05Physical sector size 1. 128 bytes 2. 256 bytes 3. 512 bytes 4. 1024 bytes x01Number of physical sectors per track x01Skew factor x03First sector n0 x17SYSTEM INSTALLATION PROGRAM VERSION 2.23 Please select option A, B, or C to enter the CP/M system's configuration for your MEGATEL QUARK. When you have completed the config- urations, select option D to continue with the installation procedure, or select option X to abort. If option D is selected, all user input will be saved in QSYS.DAT, and will be used as defaults for the next installation run. MAIN MENU SELECTION ------------------- A. DISK Dumber is 1. Number 0 2. Number 1 x01Gap III size x06Block size 1. 1024 bytes 2. 2048 bytes 3. 4096 bytes 4. 8192 bytes 5. 16384 bytes x01Number of directory entries x01Total number of tracks x01Number of reserved tracks 6 x05This logical drive is selected by 1. SEL 0 2. SEL 1 3. SEL 2 4. SEL 3 x04Do you wish to allocate additional BIOS memory for this drive 1. Yes 2. No 7 x03Hardware board revision number 1. 05R00 (Revision 5) 2. REV 1.0, REV 2.0,RIVE SPECIFICATIONS AND OPERATIONS B. LOGICAL DISK FORMATS AND OPERATIONS C. OTHER PERIPHERALS CONFIGURATIONS D. CONTINUE THE INSTALLATION PROCEDURE X. ABORT PROCEDURE 1 x06SELECT DRIVE UNIT TO BE DEFINED 1. DRIVE 0 ON SEL 0 2. DRIVE 1 ON SEL 1 3. DRIVE 2 ON SEL 2 4. DRIVE 3 ON SEL 3 5. RETURN TO MAIN MENU x06 Define drive to be the same as 1. Drive 0 2. Drive 1 3. Drive 2 4. Drive 3 5. To be defined 2 x03Type of drive 1. 5 1-4 inch floppy disk 2. 8 i REV 3.0, REV 4.0 x08CON: Console input and output 1. TTY: Input from and output to the full-duplex serial port 2. CRT: Input from the parallel keyboard port and output to memory mapped crt 3. BAT: Input from full-duplex serial port and output to memory mapped crt 4. UC1: Combined functions of 1. and 3. x05LST: List device ouptput to 1. TTY: The full-duplex serial port 2. CRT: Memory mapped crt 3. LPT: The Centronics parallel printer port 4. UL1: Thnch floppy disk 3 x03Number of Tracks Per Inch 1. 96 TPI 2. 48 TPI x03Stepping rate mode 1. Use hardware stepping rate 2. Use software stepping rate x06If hardware stepping rate 5.25 in. 8 in 1. 6 ms 3 ms 2. 12 ms 6 ms 3. 20 ms 10 ms 4. 30 ms 15 ms x06If software stepping rate 5.25 in. 8 in 1. 2 ms 1 ms 2. 4 ms 2 ms 3. 6 ms 3 ms 4. 8 ms 4 ms x01Motor start time x01Wait time for thee simplex serial port x01List device end-of-line to next-line delay x08Simplex serial port baud rate 1. 9600 baud 2. 7200 baud 3. 4800 baud 4. 3600 baud 5. 2400 baud 6. 1800 baud 7. 1200 baud x15Full duplex serial port baud rate 1. 9600 baud 2. 7200 baud 3. 4800 baud 4. 3600 baud 5. 2400 baud 6. 1800 baud 7. 1200 baud 8. 600 baud 9. 300 baud 10. 150 baud 11. 134.5 baud 12. 110 baud 13. 75 baud 14. 50 baud x03Vid  eo display terminal emulation mode 1. Alphanumeric mode 2. Graphic mode x01Number of rows for the DISPLAY screen x01Number of rows for the MAIN screen x01Number of rows for the STATUS screen x03If the alphanumeric mode is chosen 1. Enable the clock display 2. Disable the clock display x03If the clock displayed is enabled 1. Display at top left corner 2. Display at bottom right corner x03If the Graphic display mode is chosen, select column offset from the left side of the screen |^#V#"c~/*a+"a*c|<^#V#"cD*a+"a ~#2e"f!"h2Ew#W^x@ $•:n/>$ʕ $›];ò ;0OxGæx=G]~# !e~=7w*f~#"f?!4*hw#"h:e7~? o&)o^#Vz-~##10:? K |B{0k> k> _a{_)Disk full$)Directory full$)Memory full$)Submit file not found$)Parameter$)Too many parameters:$)Line too long:$)Submit file empty$)Control character$ K *aBd  error on line number: $ *$!]26# xm!o"_!"! "]>2j2 * How to use SUPERSUB: SUPERSUB :print this HELP message SUPERSUB / :go into interactive mode SUPERSUB / :use SUMMARY mode SUPERSUB :as in standard SUBMIT.COM In "/" (interactive) mode, SUPERSUB will prompt you a line at a time for the SUBMIT job input...logical lines may be combined on the same input line by sep- erating them with semicolons. Example: A>SUPERSUB /STAT;DIR specifies two commands on the same input line. Submitted jobs may be nested...SUPERSUB does not erase any existing submit job (appends to them instead). To insert a control character into the output, pre- fix it with a "^" (works in any mode). $P PSW ??= ÖäìEnQ_Ð"R*"!"!""2W2N2%2T!" "e""!1!++""P>28!"9:] !w 1_$$$ SUB5A_!N^#V- g  g Rů2[\ͤ>2N!""͖ Q¾:L͕ =" ͖ Q" ="=> 2 Qo insert a control character into the output, pre- fix it with a "^" (works in any mode). $P PSW ??= ÖäìEnQ_Ð"R*"!"!""2W2N2%2T!" "e""!1!++""P>28!"9:]!9" 1  $ :] ʑg\4!e~ I 1¯! S~#S!͓2n/z#"k~2m #l~# ʈ z͓ͥÈ~#7 ʓ ʓ+*]*_~s#r#"_~#  þ"]p7?!"a:n/\<ʯ*a#"a*c*]"cs#r##E?x?  7w# "]q"]q:n/V͂n:jsb>_<2j!~\>7?:m :ڝ=2> >*k~#"k;°> ɷ>c  :!"k7?:=à <:" 23  <ʎ*c  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͓ !" >- Ͷ 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.ËCOPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.*"#":2 22=_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m 2_!pp+q*oÃO$*sy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘=N#Fy}80*z{¯#z+++ ¥ z#½# · 9!`͠ y9!rͷ 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  !  # 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#  ë «   Ͷ ͐ =« 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!~  z8O!B N#N ¾SP.* |} !9":q!"= = !~  . !   #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_  )*)þ))>+><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"SO TO U Vʮ WXJY;ZJ/(@2P?W:;/2;f 2P+++ OUT OF MEMORY +++ WStatistics for drive :RA:>:: Tracks: *S#S> :6 Sys tracks: *S> :6*W*}͍ Sec/track: 7 Sec/trk 00: *WS> :6 Sec/non-trk 00: *}S> :6 Groups: *S> :' Dir groups: *ZS> :6 Sec/group: : :6 Dir entries: *#S> :6f :RO͹f2Pf(z*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""8*8!zf"8|fW:`4({ 4z4 f:<2<f{T @:i>i] xi~WTf&ˆ00Oùͤf~ ;  #AOy2R͓> ͙:`|4^#V+"b! ~#foʹ*ͮ*E|2Qʹ   *"A!"C*#yyDM/BK:=R͌*Aͮ*C͡! x,͌*A"\*C"^{ʐ*Z͍?ڐ*͍VÓ*Z DM:YĎ'>-:> 2f*#}¼|~z{ʯ 'Ø '**\͍*^"A*\"Aͮ͡2NÓ*=! u|h~> 0>(:~<u#ͨ>.:ͨ:f:~<~> b>):À ++FREE++ ::2:>2Y::›ã>::u2Y~# ڶ~ڼÿ:¨*#"I!"d!/:;#~$~!$~_#~$:W#e *d|>*2f"d *I+"I|*d:G:h҅:O*g! LAST ADDR=*g "g+|<}< f2P++ YANK MEMORY FULL ++ f:O! >2@f:@! f2P++ NO "<" SAVE COMMAND ISSUED ++ W~# ɯ2O~% !6 î y G~{4:MŒ *4} 2M*C*Aͮ͡ʹ !~#"4:O4 {¿ !~& ~ ~ ~ :, & *C*Aͮ͡ÿ  ++ EOF ++ î :Oœ 2P++ Can't dump, no sector read ++ 2PUse G command following F, or R or S following T W~;ʧ °  ͣBK ; #ͣ`i}<uu:uA ~<}u}u{ #} ~WDU.COM v8.7 05/14/84*."g "`}0! 6! "!0"g*"*"4"h"0қ""""R"""P:`ʇ"+Û*.!"+!"b DISK UTILITY v8.7 Universal Version under :a>M>C:P/M :`>0::>.:0: Type ? for help Type X to exit ͕!~WGW## > !^2Pc>282912:>2M!"4~W:L ~ W;#f 2u+ʏ-=% <ʨ>#t?ʰA- BaCD- Fd GO H- K LʞMdNP?QR:uHB z~  ~ >.:{+ #} z~W{ f{ f~;[ _ ÓTr Sʎ G 4(*S͍Vͮ >2Nî (z4*}͍̈́4͡2Nʹ Ó**A͍*}͔*C+:G}2?:Gy "=*2L:K2?- o&"=! *͍V"=2?6 ͮ͡2NÓbk:)=; :?o*}qP *}* # >2L\  \<ª 2K++ FILE NOT FOUND ++ f=2Ko&))))) >D2u ~. : ; # ~ ;#.:4#>    ɯ2x\ +~#:V !]~ @2\#~ M ~ H yO~0O#2 y<2x]  "{ *g|0 } Empty! É 2y:xʙ =_ \< File exists! Delete? 0 Y N ÀY \\<No dir space! À!0"v2z*v\7Write error x!z4*v"v*gz{*z&S sectors written. !0"g\:y_ *{f~ ʥ;ʥz4z¥*C*Aͮ͡î ~ ;z4*C+|*A|*S"A*U+"A*} to find "IN 0" use: =<0> or "(tab)H,0(CR)(LF)" use: =<9>H,0 < save current sector into memory buffer > restore saved sector ( toggle map display of erased files ? help (displays this guide) A[ff,tt] ASCII dump B[nn] Boot track number of sectors per track [More] CHANGE: CHaddress,byte,byte... (hex) CAaddress,data... (ASCIIx Allowed for imbedded hex CHfrom-through,byte, e.g. CH0-7F"Czî*C#*}͍̈́A*A#*S͍4"A!"C*S*A͍;*U͍;4(zq*}|*}͍4"Wf*A|‘*W͙f**A͍G=*=DM'>:::?<, T=*AS, S=*CS, PS=*ES~ #ͣ#-ͣ#BK,4HjA4~ f;f :~:@C:"sd #yWf*s!~ f;f4#~ f;f,i"6{<yʖf*6j~ f;f4:Nµ͡f2P++ Can't read - not positioned ++ Position by: Track then Sector,,E5 CAfrom-through,byte D[ff,tt] Dump (hex+ASCII) Fn.t Find file Gnn CP/M Allocation Group nn H[ff,tt] hex dump K[du:]filename[.ext] Dump sequential memory to disk L Log in drive LX Log in drive X M[nn] Map [from group nn] [More] N New disk P Printer toggle switch Q Quiet mode (no msgs) R Read current sector Snn Sector nn Tnn Track nn Unn User nn for Find command (CP/M-2 only) V[nn] View [nn] or Group ff><:<>>::2x<y<x<yE N0: \ |S{0:> :>*:~W~—0WÚ:#~€#z¸{ƀ_ɯ2P++ BAD DISPLACEMENT (NOT 0-7F) ++ W#~#'~  ;,->#04:A4G40))))o#~#~  ;,->#04:40bk)))o|g1 :!0O  ʬʹʹ ow#:o+>*:ow:> :!ɯ +y~:ooj  $6 !~ o ASCII sectors W Write current sector X Exit program Y Yank current sector into sequential memory Z[nn] Sleep [nn tenths] /[nn] Repeat [nn (decimal) times] [More] Cancel a function with C or Ctl-C Suspend output with S or Ctl-S Separate commands with ";" Example: G0 +;D;Z#20;/ would step in, dump, sleep 2 seconds and repeat until CTL-C is typed All "nn" usage except "/", "T", and "S:#>^:>U:c> :> :`_O S> ::HCÍ b b y:Py y>2HÅ څ:H<2H:<đ͓ک>͙*S͍V"ABK͓> ͙*"C*A͍`i͓+:2G:Wy#DM:Q?+?*b ͓*>͙-:~5g:`?&i"EDM͓Q> ͙ɯ2P++ Not within tracks 0-*SS ++  W`i"i͓ڞ> Ù>2O͓ڽt*i 2P++ READ failed, sector may be invalid ++ :O1" are hex (use #nn for decimal) (See DU.DOC for complete examples) fyo#x}/o|/g#ɷ|g}o&҈,%ƒ}o|gBKx¤!ñ T]xʱ ç:`} *}"W*.:^#"}"W^#"~#2~#2^#"^#"^"!?~:w*6 "U"Sw.:́:́&"Z would step in, dump, sleep 2 seconds and repeat until CTL-C is typed All "nn" usage except "/", "T", and "S2P++ CANNOT WRITE UNLESS READ ISSUED ++ ^ ͓OtV*i >͙Rr2P++ WRITE failed ++ > ͙> ͙:G =:`0"q"o`i"m2kk2 Operands in brackets [...] are optional Numeric values: 'n' are decimal, 'x' hex +[n] step in [n] sectors -[n] step out [n] sectors # print disk parameters for current drive =Abc search for ASCII Abc from current sector caution: upper/lower case matters use for hex:   3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1: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 S: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͐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*(&͠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!L!*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)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"!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*͠")*)) *)) 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 *) >*)>!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 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#W  -: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#WPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$10 !~=W!xe ~#Xbxʇ {z~#o}o҃i.*"#":2 22=_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m02_!ppZrEÕ~1 E@yÌH}~ÑÕ<)1z2A{2B>͉uuuu! >2:2<22<ʌ*"!n"_͟uuuu MEGATEL QUARK 51K CP/M V2.24 R01 preliminary !t >3¯2 2 1:COYFOR CP/M VS 2.23 R01COPYRIGHT (C) 1978, DIGITAL RESEARCH MEGATEL COMPUTER CORPORATION INC. (C) 1985dataxxx00  !"#$%&'()*+,-./0!~=W!x ~#ôbx {~#o}o.ÃO$ y͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ;% dN0*z{ :> :Za__> > ~#O****!*$*'*'*3F#~!uw<#H! ~#fo~~#fo~22!"MD!u"!t^#V~"#^#V#""*MD *N:ʳö!ͧ 9**+}*^#V~#N#F#"i`""*#:=*#"MD!u:"2Õ1!A:~2p:] ʇ2|\52:sd&!<MEGATEL QUARK System Generation Utility Version 2.23 R01SOURCE DRIVE NAME (OR RETURN TO SKIP) SOURCE ON , THEN TYPE RETURN DESTINATION DRIVE NAME (OR RETURN TO REBOOT) DESTINATION ON , THEN TYPE RETURN PERMANENT ERROR, TYPE RETURN TO IGNORE FUNCTION COMPLETENO SOURCE FILE ON DISKSOURCE FILE INCOMPLETE!9!|ͧ _2Aڇ!p҇}ʇqP!qB!ͧ 92:qd!<!ͧ 9_2A!p  * b͸{XU INSTALLING THE NEW SYSTEM CONFIGURATION ... SYSTEM CONFIGURATION IS NOW COMPLETE DO YOUR WISH TO SAVE DATA ENTERED (Y/N) Enter --> ABORTING THE INSTALLATION PROCEDURE .... Á ÖF=@!9DM`iw#w͐|ҷ ͐)! w#w`i^#Vr+sÏ ! 6#6! w#w͐͐x ! s#r͐| ͐|  #z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5+! s#r! ^#Vr+s͐0!v{ ! 6c#6! 6#6͐͐# ?! s#r͐͐ ?! s#r͐͐͐͐x ! s#r! 6c#6͐+|! w#w͐| ͐)! ͐s#r͐+͐~ ͐ +! s#r! 6#6͐)! w#w! ^#Vr+sn ÷ `iw#w͐|m͐)! ~#fo|a͐)! ~#fo+͐~ `i^#Vr+s%!9 DRIVE UNIT %c SPECIFICATIONS åJFA:!9DM͙͐!!g͜!!͟! s#r! 6#6͐͐!c͙!!l.ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@͜! ^#Vr+s`iw#w͐|?͐"k \͢`is#r!͐"k \͟^! 9 %s%s{ÍFA!9DM`iw#w͐|ұ͐)! w#w`i^#Vr+sÉ! 6#6! w#w͐͐r! s#r͐|͐|͐+! s#r! ^#Vr+s͐A!ru! 6c#6! 6#6͐͐#?! s#r͐͐?! s#r͐͐͐͐r! s#r! 6c#6͐+| ! w#w͐|͐)! ͐s#r͐+͐x͐+++! s#r! 6#6 ͐)*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*/EwEÅ5ñEFÀD4RJAQBu of$F+!9DM!m !Xͻ! w#w! ^#Vr+shñ`iw#w͐|i͐)! ~#fo|]͐)! ~#fo+͐x`i^#Vr+s!!9 LOGICAL DRIVE %c FORMAT ÜJFA:!9DM͐͐!!^͓!!͖! s#r! 6#6͐͐ !c͐!!c͓! ^#Vr+s`iw#w͐|6͐"kb͙`is#r!͐"kb͖U! 9 %s%suJFA:!9DM!i`iw#w͐|9!!Bl!!o! s#r! 6#6͐͐!ci!!Gl! ^#Vr+s! w#w͐>2>2! ^#Vr+s!|l ! ~#fo##~#fon&;! s! n&|c ! n&|c ! n}2! n}2͐| ! ~#fo~#fon&;! s! n&| ! n&| ! n}2!X!r #| ! ! "! 6! n}a !!!! !!! s#r`i6#6͐͐a !c!! `i^#Vr+s0 ! !! ! ! n&;>A— > >B£ > >C¯ > >D» > >X > X ! 6^ ! 6^ ! 6^ !X! |%͐"kzr! s#r!ci`i^#Vr+sË! 9 %s%sY$FñE_FA!9DM͐#|m͐*ڑ!XM!X!-P͐|!X!S|*&|*&|!!V͐Þ͐"!X!S*&|+*&|+!X!SQINSTALL.MSGO>F=QBAwE!9DM͐n! s! n}0ʒ3ʒ6ʒ1ʕ2ʕ4ʕ5ʕ&!͐ =|͐͐ !@!͐=|͐͐!@! n  }25!@&!!C!!!!!͐!@!9!`iF6`in}{`i! !@ú! w#w͐|Һ͐`i͐͐ns! ^#Vr+sÃ! n}0361[2[4C5C`in}1`in}2!Ä!`iI! s#r͐|U͐͐ ~#foRk{P~#foU[!Ä! n}2€`in&L|€`i6X!`iI! s#r!͐I! s#r!͐ I! s#r͐|͐|͐ |͐ n}0!͐̀+! s#r!͐ ~#foRk{͐ k͐ k;͆> ! n}2•͐n}X•!!s ͐ k;͆> !͐͐ k;͆> ! n}5͐n}X!!y ͐ k;͆> !͉͐! s#r͐! ͌!! ͐ k;͆> ͐ k;͐̓^ !9TRUE FALSE0000000000Ë JÝC%D!9DM!" w#w͐"|ҷ*͐" ?! s#r͐"?! s#r͐"k<6͐"k<#6#6͐"k<##͐ |!͐͐ !!Ä͐ |@͐͐ @!Ä! n}5h`in&L|h`i6X!`i=! s#r͐ |‹!Ä!͐=! s#r!͐ =! s#r͐|͐ ͐!Ä͐|͐ ͐!Ä! w#w͐|1͐͐6 ! ^#Vr+s! w#w͐|~͐`in}~͐͐͐`ins! ^#Vr+s9!Ä!9 Minimum of %.5s %.5s Maximum of %.5s %.5s Enter 'X' if the above is not required INVALID SELECTION TYPE Ente#͐"k \͂ s#r͐"k<͐ "k \͂ s#r͐"k<͐"k \͂ s#r͐"k< ͐ "k \͂ s#r͐"k< ͐ "k \͂ s#r͐"k< 6 ͐"k<6 ͐"k<͐"k \͂ s#r͐"k<͐"k \͂ s͐"k \n}T®"͐"k<6"͐"k<6͐"k<͐"ns͐"k<͐"r --> %.5s%c%c%c%c%c%c Enter --> %s C} ^<F*7R!9DM.`iw#w͐|}͐k;6`i^#Vr+sT`iw#w͐! ?һ͐"k \1`i^#Vr+sÃ`iw#w͐ !?͐"kb1`i^#Vr+s`iw#w͐|+͐"kz1`i^#Vr+s>2>2>2>24!!!C7! s#r͐#|ʀ!M:͐=͐@!!!c7! s#r͐#|ʾ!m:͐=͐@!!!7! s#r͐#|!:͐=͐@!k \͂ s#r͐"k<͐"k \͂ s͐ "kb͂ ! s#r͐ "kbn}T¤#͐" k###6! 6#6#͐" k###6! 6#6͐  "kb͂ ͉͐͐k! s#r͐ "kbn}T)$͐" k6=$͐" k6͐ "kbn}Tq$͐" k6Å$͐" k6͐" k͉͐͐s#r͐" k͐ s#r͐" k ͐ "kb͂ s͐" k!!7! s#r͐#|:!:͐=͐@! 9QBIOS.ASM modifying QBIOS.ASM QBOOT.ASM modifying QBOOT.ASM ALPHTERM.ASM modifying ALPHTERM.ASM GRPHTERM.ASM modifying GRPHTERM.ASM \GFÀD4RþG(H\I$F!9DM!X!Z`is#rz!c*}k!X!! w#w͐*k!X͐Rk{! ^#Vr+s6! w#w͐! ?Ҳ!X͐"k \! ^#Vr+ss! w#w͐ !?!X͐"kb! ^#Vr+sú! w# ͐ "kb͂ s͐" k ͐  "kb͂ s͐"k̃͐ ͉͐" k nѯgks#r͐  "kb͂ ! s#r͐  "kb͂ ! s#r͐  "kb͂ ! s#r͐"k̃~#fo͐͐k͉͐! s#r͐P&͉͐+! s#r͐v&͉͉͐+! s#r͐))! s#r͐͐ +͐ ͉! s#r͐"k̃~#fo))! s#r͐͐+͉͐͐+! s#r͐!( ͅ !!( ͐  w͐|4!X͐"kz! ^#Vr+s!X!!X!X!9QSYS.DAT Cannot write to QSYS.DATÏA/EÝC!9DM͐`is#r͐n! s!͐̀! s#r! n}06;31[2[4ʺ5ʺ> ͐n}1 !g ͐ k;̓8!m ͐ k;̓> !͐ ̀! s#r͐ n}0q1ʊ2ʣù͐ "k \! s#rù͐ "kb! s#rù͐ "kz! s#r!͐̀+! s#r͐ !͐͐ )̀s#r!"kb͈ ͐`is#r!$ w#w͉͐`is#rzM'!$ ^#Vr+s)'͐"k̃##͐$s͐"k̃###͐+s͐"k̃͐s͐"k̃͐+s#r͐"k̃͐+s#r!& 6! ^#Vr+s!$ w#w͐$|A(͐|((!& n!& n&|g}o!& s! ^#Vr+s!$ ^#Vr+s'!' 6͐|(!' 6! ^#Vr+s!$ w#w͐$|(͐|ک(!' n!' n&|g}o!' s! ^#Vr+s!$ ^#Vr+sm(͐"k̃ !& ns͐"k̃ !' ns͐"  k̃ ͉͐s#r͐"k̃ ͐s#r͐ ͉! s#r͐+|a)͐"6k)͐"6͐"k̃͐+s! w#w͉͐! s#rzʴ)! ^#Vr+sÎ)͐"k̃͐s͐ "kbn}T!*͐" k6͐" k#6͐" k##6é*͐" k͐"k̃~#fos͐" k#͐"k̃~#fo##s͐" k##͐"k̃~#fo#s!" ^#Vr+sÛ !29*N2R+!9DM͐"!"!"!"*`is#rzI+͐n}Q2! s#r͐#|3!U3*#"`i^#Vr+sò2*! s#r͐#"͐U3!9g34óD!9DMa3͐`is#r! w#w͐|Ҭ3`i^#Vr+s6! ^#Vr+sÄ3͐**d33!934!9DM`i6 ! 6 ͐͐3!`i3!944^3!9DM*! s#r`iw#w͐͐ Ұ4͐|4 4! 4! s#r*#"! 4! s#r*#"! w#w͐! ^#Vr+sns! ^#Vr+s`i^#Vr+s)4͐" 4!9!"4D!9DM*`is#r*+|+5!͐++*4 F+͐n}|:+͐####n}|:+͐͐#*! s#r`i^#Vr+s**!9a+Aö-.4!9DM!͐ U+`is#r͐>+>,,>™+><,> ¥+>L,>!±+>\,>#½+>l,>%+>|,>'+>ʌ,>)+>ʜ,>$+>ʬ,>&+>ʼ,>(,>,>*,>,>+,>,>c),>,-!!2!! ͣ5"*|;8!A %sMAXIMUM TABLE SPACE EXCEEDEDj=͐+|>!f>='>͐++|'>!>=͐! n&!>= INVALID DATA ENCOUNTERED IN QSYS.DAT INPUT DATA EXCEED STORAGE CAPACITY MISSING DEFAULT/INPUT DATA input type %c, number %d!9DM͐|>!4@! w#w! 6! w#w͐ n}.ʃ?͐ z*G͐ bF! s#rz*G͐|­F͐|FG͐ ͐eF͐6͐ SG!9bGR!9DM͐͐_Gs#rz҇G!͐͐s#r͐##6#6͐6͐~#foG(H!9DM! ^#Vr+sn`is{H`in} G͐! G͐`in&G#|H!HG!H!94HRâRWH>~H>cH>ʌH>oH>ʟH>{H>ʲHH! n&+H! n&!.H! n&!.H! n} H! !.H! n&!.H͐##^#Vr+s|! nÑ?!4@͐:k! s#r! ^#Vr+sn}.?͐͐++?͐4@͐ n&|@͐ n&|@͐ n&`is#r @!4@͐͐:k ͉###! s#r͐4@! 9!9DM͐  ?`is#r͐ ?! s#r! w#w͐|@! w#w͐|@͐͐"k \͐͐͐"k \͐ns! ^#Vr+sÌ@! ^#Vr+sw@!9~#fo1H|I!͐##6#6͐͐s#r͐^#Vr+s! ns&hI 2h*P/:q2> ʙR:h):RʅR=ʅR=> ™R:qw#w#w:ho&552?7:PO*R )R>2? ,  R > _ R SU:R7*PR:q2\5.S> 2?!*PS7:P)"XV>Sz> Sz2:P,"j!"l*T|˜S*j!^#V*X#^#VҐSr+s*l5*R"R*j"*lS2?ÓS#"l*T+"T*j! N#Fp+qxjS##6>2?ÐS2?7*T|DM*R*PT><T~# xT >]T2?!^#V*R:TʆT=wTÆT*PDT*R!s#r:noʡT2n& !o T . &7:P)V>jUz>jUz2:P,"j!"l*T|*lU5*R*j!ѷ3U2?-U-U!T*lT*T+"T*R"R*l#"l*j! N#Fp+qxT##6>2?T2?:no2n& !\/:q25!> 2?+ ,ҷU>2?)~2#"j!!~#fo#^#Vp+q*j~#foUs#r5*PT><T~# xT >]T2?!^#V*R:TʆT=wTÆT*PDT*R!s#r:noʡT2n& !o T . &7:P)V>jUz>jUz2:P,"j!"l*T|*lU5asm b:qbios.bbz asm b:qboot.bbz asm b:alphterm.bbz xsub ddt4 ialphterm.hex f5c,5c,2 r1A80 m100,04ff,7000 m500,05ff,7b00 iqboot.hex f5c,5c,2 r6100 m6180,627f,6c00 m100,3ff,6d00 iqcpm.sys r iqbios.hex f5c,5c,2 r5d80 m6c00,6c7f,900 m6c80,7bff,3b80 imemnage.hex f5c,5c,2 r5f80 ichr.dat r4d00 g0 save 85 qcpm.sys L TRACK c PHYSICAL TRACK  DOES NOT VALIDATE ***** UNABLE TO HOME DRIVE-ABORTING!!!! ABORTING FORMATTER