IMD 1.16: 6/09/2007 11:14:24 cp/m cp/m file loader  !"2>Ox> >**" ( y0>>G>>4jE##MUQ COPYRIGHT (C) 1978, DIGITAL RESEARCH _͌> ͌> Ì͘~#͌ç _2<ɯ2þ2<2<2<2a{_:w:>ĸ:=2w!'!5w:ĸ!ͧ͝ʂq !F#xʕ~wÆw!"  w# µ!~6͸:ø !¼#͘*~ ͌#>?͌͘q =_.:;<> 5o$>!?2*5"o@G:v:w|x2pʟ#*6?Ñw~ʦÕ#6 Ÿ.#*¿6?w®#6 #6" #~? xDIR ERA TYPESAVEREN w!y1# 6y#1 L;L>M2ɯ21ͳy͸<::‡1͘ͰA͌>>͌&;Ͱ2D:t!_~#fo\+{t!v"!âREAD ERRORâNOT FOUND! ~ #0 WxxG ~ # x~#'!?~ɯ2:=!ø:=!:øD9!~ t 6?#m͘ͰA͌>:͌> ͌:`Ox0 ±> 0> ͒x > ͒Ý͝z`D ͢&!5q#~Yq#"!6?=ͳ`9`ALL FILES (Y/N)?D9u͘!6!~Unw4!?~`͌͝`B=`KD:D9o&)|+!;ë͢͢`NO SPACECANNOT CLOSED:9_!'*5=%_Y#"DYG!~?pYp2S``Kh͢`FILE EXISTS: “:c=22͸c 9!]%C!;}|Ið=IKD!~2>F~22\!!'!~ #~#x2͘:2ͫ;1:͸qKR͢`LOAD ERRORCOMKD: !q$$$ SUBwA`lr! N!     ?" ! q!9"1@** }D!{!u!{S:A2]]úBDOS ERR ON : $BAD SECTOR$SELECT$R/O$!~6 ͺO: :  2> :y!4 5 6y:^@Oy  :@#   $O:]* N#ͺ ‘xs~+žSu¯!>wsʹNkNx#N)s#wO)~xsp *@M*>w#6*w*{*::+s#r*5Y*::͕"ڣ**s#r*4{*:@O*M!q:'2*2:!* ͼͼ*!ږ*&*:2!4u:!q:͹!:+!*&*z6!4A!6:(*&*~V*& *~$!w͢*" :2q!6!:*&* ~2:!O* :?HHҼ!4v!:`!q:2* "!6AZ :͢*&*6Z!q:2!>:>!Hr>!~Hw#~!>!w*MT`:*MTo:>!s+q:=2ʪ:!O* :!O* w{W u * * w: uZ :#!6 >!#:!O* *&*  w!4!6ͮ1 :Aͱ* "!@" :ʈ*" !6 >!څ*&* 6!4iͱ!q$:™ * 4 :¼:ҶBÿ:!6(!6:*DM$:*DM$(:!#!6:͉!6:#*}7!6IY?(>!a!6*}!6:#wO>Ҕ:=O* ~2*M2«!6*Mr*&"*&* :w:Y:!:<2:?:!6!6?>!)!)* :񇇇O! "z:񇇇O!} "*& "*&) "*M::=2:2* ~2* >w͌* "DM$* }2!" }22* M!/ ^#Vm2m*M:m2m*Mm*Mm*" m*&" m:2m* DM]mkm2mm!6!6!6!" m͌m͠m͠$m͠ m*" ͠Zm͠m͠m͠Jm͠Bm͠͹m:2m:2m:* " m*z" mͻm:|2m!6m#-6AJU[dg $:ʅ* :w:2͌: ͫ+s#r_og_{ozg_og~ ¹~ ^#V) ~ i`N#Fogo&ogv9AL00Lûöìñæ 12E2Fͻ*>!O"J2G9ʂ yM>2FMW!"D"F>2!"2!"ͦ>Gi`"Jy2Fy2Gy2Ew2F> !E~+wG>>~*D&@!!>2 9>d -6:FTw>>% :GH!fL!f*Jz!Lf:I!HxG [:Fͻ2F:<2 >2I> ##ME> >ȯy!Z!Z!Z:I$0:/O> 0yɯ>AL!z~#/Zd))fddp 64K ALTOS DOS VERS 1.42 TRANSIENT PERMANENT DISK ERROR # , 8, 9, - - . .B( 03 X3 ^3 i3 3 L4 54 F4 5 7<7 -8<8597 77888786         _1c>;1c;2U`!9"Y`!Y~ĵd!Y,:r2R`:Y*!xt|#:R`*s"+`*-W"" TEST COM uvwxyz{PBOOT HEXPASCAL ASM04PASCAL COM}~PBOOT PRNoPBOOT SYMMODEM COM PGEN ASM A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyPBOOT BAKVED COM0pqrstFOCO COM/PBIOS59 HEXA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyPASCAL DOC D COM !"PGEN COM$SYSGEN COM PGEN PRN7PGEN SYMPBIOS59 PRN 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yPASCAL COMDUMP COMTEST COM|PINIT ASMp- 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yPBIOS59 ASM+]^_`abcdefghijkBOOT ASM,BOOTER DOC-./READ ME 01A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyPGEN HEX PINIT PRNOFGHIPINIT HEXPINIT SYMA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyTEST ASM429:;<=>SID COM8%345678ASM COM\&'()*?@ABPINIT BAKp- #CDEA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yPBOOT ASMVPGEN59 COM<PGEN55 COM<PGEN BAK  2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yZ80 LIBMJKLMNOPQRSLIST COM TUPIP COM7VWXYZ[\PBIOS59 ASMT\lmn 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy SYSTEMS, INC. ; ;MODIFIED ; 10/11/78 BY WINK SAVILLE OF SVA TO READ ANY SIZE INTERPETER ; ;MODIFIED ; ; 11/8/78 BY S 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VOLUME NAME DAD D SHLD DENTP ; CALL FIND$INTERP ;THEN FIND THE INTERPRETER CA 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yQU IBASE-1000H ;TOP OF TEMP RAM DISK DIRECTORY HOME EQU BIOS+18H ;DISK HOME TO TRACK 00 SELDSK EQU BIOS+1BH ;DISK SELECT SE 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y. J. SINGER TO INITIALIZE 8251 (IMSAI SIO-2) AND DIABLO PRINTER ; BOOT EQU 0H ;LOCATION OF CP/M BOOT VECTOR BIOS$PAGE EQU 2MSIZE EQU 55 ;SYSTEM SIZE IN KILOBYTES BIOSSZ EQU 1536 ; BIOS SIZE IN BYTES ; ; ; PINIT FIRST READS IN AND SCANS THE DIRLL READ$INTERP ; AND READ IT IN ; MVI A,JMP ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL STA BOOT ; SYSTEM 'H(ALT' COMMAND A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyTTRK EQU BIOS+1EH ;SET TRACK SETSEC EQU BIOS+21H ;SET SECTOR SETDMA EQU BIOS+24H ;SET DATA TRANSFER AREA READ EQU BIOS+27A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyH ;BIOS PAGE POINTER LOCATION BIOS EQU MSIZE*1024-BIOSSZ ; LOCATION OF BIOS VECTOR TABLE IBASE EQU BIOS-1024 ; LOCATION OF TECTORY FOR THE 8080/ ; Z80 INTERPRETER (SYSTEM.MICRO). THEN THE INTERPRETER IS ; LOADED INTO MEMORY, THE BIOS PAGE POINTER SE LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE SHLD BOOT+1 ; FOR PROPER SYSTEM OPERATION MVI L,0 SHLD FIR 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yH ;READ SECTOR TO DATA AREA ; ; ; ORG IBASE ; ; LXI SP,100H MAIN: ;LET'S BOOT SYSTEM.MICRO CALL INIT$IO ;RESET I 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yHIS INIT ROUTINE INTERP$BASE EQU 100H ;FIRST LOC USED BY THE INTERPRETER PBEGIN EQU INTERP$BASE+100H;ENTRY TO THE PASCAL BOOT, AND EXECUTION ; IS STARTED AT THE SYSTEM.PASCAL BOOT VECTOR. ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTERSTSP ; JMP PBEGIN ;START BOOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITIALIZE SYSTEM MVI C,1 CALL SELDSK CALL HOME A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy/O SYSTEM ; LXI B,DIRTOP ;READ THE DIRECTORY INTO DIRTOP CALL READ$DIR ; LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyTER FIRSTSP EQU INTERP$BASE+103H DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES DTITLE EQU 06H ;OFFSET TO ENTRY TITLE DIRTOP E xCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))a{ww2/ͬ:2T/-"."$/2/>2.v:.ʸ!/6+͕%>20:.ʮ:.0209$<!5*}Ģ*V0":0: 0$  :[0-ʬ+ʬ* :[0!_0M!f0P p  !   :O0Ĝ!":O0X06 '>#G*I0!" :0 :Z0 !0N*K0:O0.4SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION [02e/*.#"X0$<5ͬ*$/"M00:T/2:/2[0 v>20*.".2[0v*R0m "R0͍"R0!/w >=G*R0*I0"R0"R0 __> ̓> ̓͊~̓#ÚO****!*$*'! ">2!4:(wNͯ>2y: 0:yv! X! ^#fkX _~ 0^ Z   2 5 8  :0‰:0=ʉG! 0ʃF#2*V0}|<r ͪ*|Ĵ:O0_͑H *V0"Ù*V0"E V» ͪ»**»"Ù*K0"X0!0NA#~"b0+"X0yʛ 'É' Ͳ >ͮ 222:0: 0 !ͮ-:0ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURCEm :/ }>͞ ¥͢ :O0*V0*ʿ͜">2:O0:0:O0!!4:0: 0,:)!4f!^!*FNͷyj*DMͿ2: K!͚u b͊<2:\_/:)j*"1!t͚sÖ*I0| E2V ,[ ͊m *R0"R0"P0 m E2D2V ,ʾ ͊:/ m :/ "> 2/:Į' ~p"K0*K0N"X0!0q#*w œ:0!x ͜ *V0*R0:_0̍"V02*M0r; !:r :0!4 :0& : 0::0!xI !4̨ e ::̮>͞ } !~5:Į ͵ FILE ON DISKSOURCE FILE INCOMPLETE>"4:O0: 2\0:0=: 0 F!Fʹ%*X0"`0>2Z0*X0":0k: 0T!T:\0¦::] \<œ!w͕b2|\ ¢! DMͿ\ô!͕b!͕u AmA2Aͦ͊!:0 : 0 -Ͳ !/6+:.;?*$/*."$/?"$/:.l*.^#V{r+s5*.^#V ʓ:.:0F: 0e%;m ">2:0b: 020 W,F:0b: 0e,ʹ:re*X0#![0~ʇ !4̨!~5 G!~Ҩ4_!p!~ʮ5^!~> >2\0:0N *K0"+"X0:0 >''!:( COPYRIGHT (C) 1977 DIGITAL RESEARCH 112O02Z0̀%!"K2.>2.*M0"$/̓%!"":g0i!"P0"R0"2:0vO0¦:0=ʦ ʦ*"X0 !':[0'Tx»!Z04TT!Z05T:\0!":]0!**V0":O0*X0~ Ĵ*͚u b͊2!>͚!͕u bA6mA2Aͦ!͕u b͊!6!>͚>ͦ͊!P͕SYSGEN VER 1 r+s!06#wÚ> 209!e/~6![0~6". :0: 0,!0699*.~6 *.: 0,Ĵ".2f/*.s#r2 0N : 0,N :0 >  > !0N#~' ) > ''*K0"V0:\0x ʹ:\0" m }*K0"+"X0''*K0"V0>"4ͬTRY TITLE DIRTOP EQU PBEGIN ;TOP OF TEMP RAM DISK DIRECTORY ; CR EQU 0DH LF EQU 0AH EOM EQU '$' ; ; ; ORG TPA ; ;  CP/M BOOT VECTOR BDOS EQU 5H ;CP/M ENTRY VECTOR TPA EQU 100H ;START OF USER AREA ; RDCON EQU 1 WRBUF EQU 9 ; NBLOCEAD$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BUFFER ADDRESS IS ALREADY IN BC-REG MVI E,4 ;DIR IS 4 BLOCKS LONG LXI 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 CALL READ$INTERP ; AND READ IT IN ; LHLD BOOT+1 ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE MVI L,0 ; FOR PROPER SY:2T/:[0 “ 2/-*M0"$/*X0!{#zڿ ~+"X0*M0+"M0wß #"K0*M0".:\0 N]T s#r+*V0*{_zW".:\02.R   JMP START ; ; ; ORG START ; ; LXI SP,100H MAIN: ;LET'S BOOT SYSTEM.MICRO CALL INIT$IO ;RESET I/O SYSTEM ; CKS EQU 32 ;MAXIMUM # OF BLOCKS FOR THE ;INTERPETER. USED TO COMPUTE START START EQU TPA+NBLOCKS*512 ;LOCATION OF THIS  H,2 ;AND STARTS AT BLOCK #2 CALL SYSRD ;GO GET IT RET ; ; FIND$INTERP: ;FIND 'SYSTEM.MICRO' MVI C,77 ;STOP AFTER ; ; ; 'PASCAL' FIRST READS IN AND SCANS THE DIRECTORY FOR THE 8080/ ; Z80 INTERPRETER (SYSTEM.MICRO). THEN THE INTERPRETER ISTEM OPERATION SHLD FIRSTSP ; JMP PBEGIN ;START BOOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITIALIZE SYSTEM RET ;THA   % *I0:/ ͪ% ͬ:O0ĭ%  :.ʢ :0¢ *K0+"X0!2<20*#"" : 00Ĩ!??" 09"K0+ALL REQUEST$DISK ;GET PASCAL DISK ON DRIVE A MVI C,0 ; THEN SELECT THE DRIVE CALL SELDSK ; LXI B,DIRTOP ;READ THE DIRECPROGRAM INTERP$BASE EQU TPA ;FIRST LOC USED BY THE INTERPRETER PBEGIN EQU INTERP$BASE+100H;ENTRY TO THE PASCAL BOOTER FIRSTTHE 77'TH ENTRY LHLD DENTP ;GET STARTING ENTRY FI$SCH$LP: LXI D,DTITLE ;ADVANCE TO TITLE STRING DAD D LXI D,SYSTLE ;SES ; LOADED INTO MEMORY AND STARTED AT THE SYSTEM.PASCAL BOOT VECTOR. ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMT'S IT ; ; REQUEST$DISK: ;ASK FOR PASCAL MVI C,WRBUF LXI D,DSKMSG CALL BDOS RD$LOOP: ;THEN WAIT FOR A CR MVI C,R"X0$< :0¢ : 0,? ʹ  *} :]0 :O0 :0 ͤ%:e0ĭ%:0 : 0  ͬͧ%vʹ TORY INTO DIRTOP CALL READ$DIR ; LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VSP EQU INTERP$BASE+103H;PASCAL INITIAL STACK POINTER DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES DTITLE EQU 06H ;OFFSET TO ENT DE-REG TO COMPARISON STRING MVI B,LENGTH+1 ;COMPARISON LENGTH FI$CMP$LP: ;START COMPARING LDAX D CMP M JNZ FI$CONT PUTER SYSTEMS, INC. ; ; ;MODIFIED ; 10/11/78 BY WINK SAVILLE TO READ IN ANY SIZE INTERPETER ; BOOT EQU 0H ;LOCATION OFDCON CALL BDOS CPI CR JNZ RD$LOOP RET ; DSKMSG: DB CR,LF,'INSERT PASAL DISK IN DRIVE A, THEN TYPE RETURN',EOM ; ; R  ͺ :0: 0 !;* _!5 ^#fkS \ h n 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0OLUME NAME DAD D SHLD DENTP ; CALL FIND$INTERP ;THEN FIND THE INTERPRETER CALL SAY$LOADING ;GOT IT SAY WHAT WE'RE UP TO  ;IT'S NOT THIS ONE INX D ;HEY, WE'VE STILL GOT A CHANCE INX H DCR B ;IS THIS THE END OF THE STRING JNZ FI$CMP$LP JMOT ;REBOOT CPM INTERP$TO$LARGE: DB CR,LF,'INTERPETER TO LARGE IT WILL OVER WRITE' DB CR,LF,'THIS PROGRAM. REASSEMBLE THISX D ;DE=2'S COMP OF FIRST BLOCK PUSH D ;SAVE ON THE STACK ;GET NEXT AVAIL BLOCK INX H MOV E,M INX H MOV D,M XCH POP H INX H ;ADVANCE BLOCK COUNT DCR E ;THEN SEE IF WE CONTINUE JNZ RR$LP RET ;LEAVE, WHEN DONE ; ; DENTP DS 2 ENGTH EQU 12 ;TITLE LENGTH SYSTLE DB LENGTH,'SYSTEM.MICRO' ; ; SAY$LOADING: ;WE'RE GOING TO LOAD THE INTERPRETER MVI C,LOCK DAD H ; SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC MVI E,4 RR$LP: ;THIS GETS CONFUSING PUSH B ;SET BUFFER ADDREP FI$FOUND ;I THINK WE FOUND IT FI$CONT: LHLD DENTP ;ON TO THE NEXT ENTRY LXI D,DENTSZ DAD D SHLD DENTP DCR C ;WAIT PROGRAM' DB CR,LF,'WITH A HIGHER STARTING ADDRESS',CR,LF,EOM ; OK: LXI B,INTERP$BASE ;AND SET IT LOAD POINT CALL SYSRG ; POP D ;HL=NXT BLOCK,DE=-(FIRST BLOCK) ;SO HL+DE=LENGTH OF SYSTEM.MICRO DAD D ;HL=LENGTH XCHG ;DE=LENGTH POP H  ; ; HOME: ;HOME SELECTED DISK TO TRACK 00 LHLD BOOT+1 MVI L,18H PCHL ; SELDSK: ;SELECT DISK (C-REG) LHLD BOOTWRBUF LXI D,LOADINGMSG CALL BDOS RET ; LOADINGMSG: DB CR,LF,'LOADING...',EOM ; ; READ$INTERP: ;PUT INTERP IN ITS PLSS PUSH D PUSH H CALL SETDMA POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR PUSH H CALL MAP ;MAP CONVERTS LOGICAL SECTOR, IS THERE ANY DIR LEFT? JNZ FI$SCH$LP ; MVI C,WRBUF ;NO INTERP THERE LXI D,NOTFNDMSG CALL BDOS ; ; REBOOT: MVI CD ;THEN READ IT RET ; ; SYSRD: ;READ BLOCKS FROM PASCAL DISKETTE PUSH D ;SAVE BLOCK COUNT PUSH H ;AND BLOCK NUMBE;HL=FIRST BLOCK , DE=LENGTH ; ;CHECK THAT WE WON'T OVERWRITE OURSELVES LXI B,NBLOCKS MOV A,C SUB E MOV A,B SBB D J+1 MVI L,1BH PCHL ; SETTRK: ;SET TRACK (C-REG) LHLD BOOT+1 MVI L,1EH PCHL ; SETSEC: ;SET SECTOR (C-REG) LHACE LHLD DENTP ;GET STARTING BLOCK MOV E,M ; INTO HL-REG INX H MOV D,M ; ;COMPUTE THE LENGTH OF THE INTERPETER PU IN HL-REG MOV C,H ; INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG PUSH H CALL SETTRK POP H MOV C,L CALL SETSEC CALL,WRBUF ;TRY TO REBOOT CP/M LXI D,REBOOTMSG CALL BDOS MVI C,RDCON CALL BDOS ;WAIT FOR ANY CHAR JMP BOOT ; FI$FOUND:R CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES POP H POP D INX H ;ADVANCE TO NEXT BLOCK DCR E ;BUT, BEFORE WE GO ONC OK ;JIF OK ;ELSE TELL OPERATOR AND REBOOT LXI D,INTERP$TO$LARGE MVI C,WRBUF CALL BDOS ;PRINT THE MESSAGE JMP REBOLD BOOT+1 MVI L,21H PCHL ; SETDMA: ;SET DATA TRANSFER ADDRESS (BC-REG) LHLD BOOT+1 MVI L,24H PCHL ; READ: ;RSH D ;SAVE FIRST BLOCK ON STACK ;TAKE 2'S COMPLIMENT OF FIRST BLOCK MOV A,E CMA MOV E,A MOV A,D CMA MOV D,A IN READ ;AND READ THE DATA POP H POP D POP B PUSH H ;ADVANCE THE BUFFER ADDRESS LXI H,128 DAD B MOV B,H MOV C,L  ;WE'VE GOT IT RET ; NOTFNDMSG: DB CR,LF,'INTERPRETER NOT FOUND',CR,LF,EOM REBOOTMSG: DB CR,LF,'REBOOTING CP/M',EOM ; LN JNZ SYSRD ; SEE IF WE'RE DONE RET ; ; READ$RX: ;READ A PASCAL BLOCK DAD H ;THERE ARE 4 IBM SECTORS TO A PASCAL B  EAD A SECTOR TO THE DATA AREA LHLD BOOT+1 MVI L,27H PCHL ; ; MAP: ;TURN LSN INTO IBM TRACK-SECTOR ; ; NOTE: TRACK 0 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy0 IS NOT USED SO BLOCK 0 ; IS AT TRACK 01 SECTOR 1 ; ; ON ENTRY: HL-REG HAS LOGICAL SECTOR NO. ; ON EXIT: H-REG HAS PHYSICAA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y  A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y  A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y Bringing UCSD Pascal up for the first time ------------------------------------------ To bring up Pascal first assu 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăyre yourself that you have a standard BIOS area (i.e. all i/o vectors are in order) and that the warm boot vector is in place.A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y Next if you have a single drive system, make sure that your BIOS ignors all requests to drive B. Two drive systems will requ 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăyire diskettes in both drives until you modify your disk drivers to return a not ready condition (i.e. a 1 in the A register) wA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y  hen the drive has no diskettee. Now bring up your standard system, and run the program PASCAL.COM supplied on the 8080/Z80 sup* *"t**|§}*^#V*^#V*!s#r*!s#rP&@ x?Gë ڎ |ą{0__ͅóK$ ::_2<2:7?O*.!":M?O*." ;THAT'S IT ; ; READ$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BUFFER ADDRESS IS ALREADY IN BC-REG MVI E,4 ;DIR  :7ʟ?ڟO*.!":M?ڴO*."*.'"**>#ʼn# ~;!"*^#V|;*# J͆~/)-CANNOT OPEN SOURCE$J?8COM! 65#6!~,F OxG0!N,F!N,F!N,F͆~—ÎNO MORE DIport diskette. This program will prompt you with a request for a Pascal system diskette in dirve A. At that time insert the U# 7!y! yA:B:C:D:BA_m ERROR - DRIVE NUMBER GREATER THAN 3 $E > $ $ *." *.'"& $ !:oͅF FILES $; *}/C͘%:0 : 0 v;:019B]Æ*.*.*.*.!*.$*.'*.*   ͔ 2ͦͶ ^͔ rͦ !ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷi.g> >کÝ!p+q*DM͡:͆ ͆:_2:`!!:*& N͆!4!6*X0#Þ!.*V0".#"X0$:d0<:0<! 0~?<#ʐ: 0͡!.".^#V"V0}{##~"V0*""J͊!/6 !/͒%:^0i ͦYy7 ¦ 'K!-! DM 'K!3!͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEËÃO$+q+p+qy͏ , $  ͌ 9!z6 # L!zw͌j# X:z 0 ͘."V0s#r+*.s#r*V0##~_"V0!.".>2.*.^#V#"."V0*V0}d##~<2.G*V0##"X0:.> u!.~w>w> u:.ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*"P0Þ%z{*P0"R0*"V0 !":O DM Pgen Version 1.0 $ Get Booter?(y/n)$ Reading Booter from drive A, type return $ Put Booter?(y/n)$ Writing BootC–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON#  P'!5^!/~ !~620͕%2.|z}z> u!.~w:.W=*u!.4C*V0^#V"V0ý!.5¯:20͕%!^4!/ :e/&ʕ:0  ý͗&{&{ý͗  !e/~&>62/-!.6*M0"$/B".2f/*"V0͗ 2f/2e/2[020 h&:0¬: 0$ʦ!*R0 >P͘% >U̘%>: 2 3>E͘%!QéÉ $ ? H Y ` e Ò ü ò ~ÏGÇåûfD?<==:e>?; ><>; ;<=R>>oz{͉͌͌}|͉͌Þ͌Þ͌ë͉͌!!o#Ã͌zg{o͌zg{o͌zg{>20![0:0/ʦg¦´/ʦA¦:[0O<QA>HHR>22[0m:B_>fD> j!052!"0!0N#~#A҄w>R͘%>V͘%>Dý>Pý>Lý>Oý>Bý>Sý>N͘% > 2͕%>20ɯ202!0~@$6^4#:[0w~$w:[00 6:[0A:[0?e@eAɷP6 óf:.O*.~H:.=!4>͕%0:/#".R͆%2G:0xa{_ ʇ ʇ:0x҇_<20>F>;>G==<==>=s;=P=*>=$?P:-?]>*<<==<;=>>y> ;:oolo&3:0: 0 ;!,ɯ2122=2 !"I0&q!1~\5_! ~͔D:2:/ *!"I0:/ :00Æ7O!~*0!ʩң)Ú "0 x:[0 '¦́'æ:[0 :[0,;%:[0 !:[0; ,-!2~B6~44O!! s#r!1~ _6^4! w!p!2~~!55o2[0:Z0ʦ:\0 :O0¦:[0':[0 !20:[0 R;/>20:Z0?:\0:O0?́;B*`0*X0++{z~ !/w:e/S:e/9ɯ2f/2d/2e/:0:e/ !2f/g/~#»S͉!f/~4!g/_:e/w2e/ɯ<*V0"36 =;>?>P?<=?>>=<<i;m=>c==>o>v<=<;8?N!Nw#w#W!"V0!.w#w#l2N!:0! 0^#=ʙV¨*0!҂ :0:0& !!>O: >202́/>20:[02́:0G:0::0l:[0'́:[0' 20/:[0'|>20^—N!! N#fiooo&)^#fk9BIO[ov ͌z{>ɯo>g͌"!6ů{_zW5>++!+"X0:Z02Z0́ͪ'2Z0X:[0*K: ḰͪX? X́ö20Pg>ã6r>ã:[0'ƒ2[0>*"V0ɯ2!4!f/6".!f/~55!d/^4!g/~f:.:e/JGwf^l͗^{:e/&{!f/4#ww&ʞGʱ2e/xf.~4^!.~w!.ͼ!.ͼ!.ͼ!/~w!$/ͼ!D/~w!T/~wN#Fp+q!.~^!.!. !. !. !/!$/ !D/!T/2 yU`:10_!~0!1s! ~͔ yU!1~N=w_! ~QZP>2 yp¼!~5 : >20>V>O>I>B͘%)D*OxG !?DM!xGyO23)#͌)=R|g}o=^͌͌rã ¡:.ʔ>+2/͕%!/6 >20>20:[02́:0:Z0: 0=!EQ<!LT:[0=!LE>!GT:[0=!GE2[0" 0!04 5~wN#Fq#p>BØ%!0" * F#%2NG*V0##~w*V0##~<͉:.t!.N!. yq~t +aG=#w#wY*M0!0n& {ozg"V0!K0{#zE EQU 48 BIOSSZ EQU 512 ; BOOT EQU 0 START EQU MSIZE*1024-BIOSSZ-1024 ENDPT EQU MSIZE*1024 NSECTS EQU (ENDPT-START)/128 S'S. DUBSID EQU FALSE ;TRUE FOR DOUBLE SIDED DRIVES. RDYLO EQU STD ;LOW WHEN READY RDYHI EQU NOT RDYLO ;NOT LOW WHEN READY Csion of your current BIOS 4) A copy of PGEN.COM The short boot loader of 1) can be generated from your current syste TRUE EQU 0FFFFH ;DEFINE VALUE OF TRUE. FALSE EQU NOT TRUE ;DEFINE VALUE OF FALSE. INTRP EQU FALSE ;TRUE IF INTERRUP JNZ DO$READ RET ; ; END BOOT "M0b*M0!0N#yʢ ~Õb!."O1:N *M0!$/{#z"V0$ _!.*V0~#~1 ~#"M0û1 !͒%Þ%SYMBTACK EQU 100H ; LOWTRK EQU 0 LOWSCT EQU 2 LOWSZE EQU NSECTS ; IOBYTE EQU 0 ACTDSK EQU 0 ; ; ; ORG BOOT ; ; LXI SPTR EQU 2 ;LISTER READY BIT CCOM EQU 0 ;CONSOLE COMMAND PORT. CDATA EQU 1 ;CONSOLE DATA PORT. CNULL EQU 0 ;CONSOLE NUm boot loader if either a source or listing of it is available. This trans- formation process is simply the reduction of a twTS ALLOWED. STD EQU TRUE ;TRUE IF STANDARD I/O. MSIO2 EQU FALSE ;TRUE IF MITS 2SIO. ISIO2 EQU FALSE ;TRUE IF IMSAI SIO-2OL TABLE OVERFLOW G*V0##~w*V0##~=*V0_###1 s#r1 ^#V1 ##"X0P wP ~O!0~z 6~=ͼ P,STACK INIT: MAIN: MVI C,LOWTRK ;NOW WE READ ONE TRACK CALL SETTRK LXI B,START ;SET STARTING RAM LOCATION LXI D,LOWS o track bootstrap into a single track one. Two programs BOOT.ASM and PBOOT.ASM are provided as inspir- ation for this proceed C380 4F80 ;This should be the same bias value as last time -R4F80 NEXT PC 0F76 0000 ;The value below NEXT is dependant OT starts at location 0, we want 0900 0900 ; to compute a bias to read it to loc 900 -R900 ;Using this bias we read PBOF 256. THE ONLY THING AFFECTED IS IS PUTTING A BOOTER ONTO A PASCAL DISK. THE STEPS TO BE FOLLOWED ARE: 1. COMPUTE Lem BIOS. Once this has been done each of the modules PBOOT, PINIT and BIOS must be assembled to produce the .HEX files which wure. NOTE: PBOOT loads its sectors to location (MSIZE-48)*1024+0BA00H and then jumps to that same point. Ion BIOS -^C ;We now leave ddt to save our work A>SAVE 16 PGEN48.COM ;Our boot writer will be called PGEN48 A>PGEN48 ;OT to PGEN's NEXT PC ; data area 0980 0000 -IPINIT.HEX ;We will now do the same proceedure with -H980 BA00 ;PINIT. OADP := MSIZE*1024-BIOSSZ-1024; BIOSORG := MSIZE*1024-BIOSSZ 2. WRITE THE PROGRAM PBOOT AND ASSEMBLE IT. PBOOT MUSill be overlayed into PGEN's data area as follows: NOTE: In the following we assume a 48k system A>DDT PGEN.COM ;f you have no inkling of how your current system boot either loads or works, you will have to prevail on your system supplier fThe booter may now be put out to Pascal PGEN VERSION 1.0 ; system disks by executing PGEN48 GET BOOTER?(Y/N)N ; as shoThis object code will go to C380 4F80 ; location 980, notice PINIT starts at -R4F80 ; BA00 (HEX) in a 48k system. NEXTT LOAD SECTORS 2 THRU 9 + BIOSSZ/128 IT MUST LOAD THEM STARTING AT LOCATION LOADP, AND THEN JUMP TO LOADP. 3. CHRead PGEN code into memory DDT VERS 1.3 ;We will be overlaying PBOOT, NEXT PC ; PINIT, and BIOS into PGEN's 0300 0100AFTER THE DOCUMENTATION WAS PRINTED WE DISCOVERED THAT A FARLY LARGE NUMBER OF PEOPLE HAVE BIOS'S LARGER THAN THE STANDARD 512 or that information. PINIT.ASM is the source for the code that boots in and starts SYSTEM.MICRO, the P-Machine interpretewn PUT BOOTER?(Y/N)Y WRITING BOOTER TO DRIVE A, TYPE RETURN AGAIN?(Y/N)N REBOOTING CP/M, TYPE RETURN  PC 0A7D BA00 ;The value below NEXT will vary with the release -IBIOS.HEX ;Last we read BIOS to location D80 -HD80 BE00 ANGE MSIZE AND BIOSSZ IN PINIT AND ASSEMBLE. 4. CHANGE BIOSSZ IN PGEN AND REASSEMBLE, THEN LOAD. (THEREBY CREATING PGE ; data area, and finally saving ; the memory image. -IPBOOT.HEX ;Set 'PBOOT.HEX' as the input file -H900 0 ;PBOBYTES. IF YOU DO... MSIZE = SIZE OF MEMORY IN KBYTES AS USUAL. BIOSSZ = SIZE OF BIOS IN BYTES. BIOSSZ MUST BE A MULTIPLE Or. A quick edit of PINIT.ASM is needed to modify the MSIZE equate to match the memory size (in kilobytes) of the current syst N.COM) 5. STITCH TOGETHER THE PIECES A) TO FIND THE OFFSET PINIT.HEX SHOULD BE READ IN WITH, USE LOADP RATHER TM BOOT VECTOR BDOS EQU 5H ;CP/M ENTRY VECTOR TPA EQU 100H ;START OF USER AREA ; RDCON EQU 1 WRBUF EQU 9 ; NBLOCKS O!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLREz8O!B N#N ¾SP.* |} !9":q!"28!"9:];,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qyO ENTRY TITLE DIRTOP EQU PBEGIN ;TOP OF TEMP RAM DISK DIRECTORY ; CR EQU 0DH LF EQU 0AH EOM EQU '$' ; ; ; ORG TPA ;  !w 1_ĤU># !L6-75A_!N^#V- g  g Rͪ !ڂ   _*ͪ ʱ ͪ څ æ *+ͪ !w{ö *#^#Vr+s+6̈́ *"s#s#r y#*}|̈́ ":N!̈́ Q1 !=:L  ! !|"!&~ #~#V z :w  /+* T+,T -Ty_xW!M6WT6!^6# ʖ,o>2^r ʖ#w6 R 1**!W~4ʼ #~#F#¼ x¼ ~#s#r#w>Qʅ = =Uͧᯕo>gͧ 'd _ͤ~#  a_!n~> 45*k~#"k @0766> >  ͤͧ:Lů2[\ͤ>2N!""͖ Q¾:L͕ =" ͖ Q" ="=> 2 Q! **" !@ *ͧ*ͧ*+ͧ  SYMBOLS NEXT PC END B=Uͧ:My^#Vͧ}~E :!&~% :w#s#r   !&~[ :LH 6[ U~E#^#Vn 6 Q!w ="!l ʖ ^!XN!~ͤ ʿ÷!_^!^#Vxʹ>-~~>=!~Un>#! ^#V#0}o|g- xD y0K GW yW W GD  z { < >'{>'>.^+~†:LUͅ>:|E}Eҹ >.*g}o|/+- , 0 ^#V#*Ny=&="&! BL<"e=L=W*e}o"gU_ *e"iͧ>::Mʓ^#V .š:n >."¯  \w#àT=:Ms#r#\}w#:M\#\>>2TB!"P#}~# ‚ :]?@ ͂>HXEw * \ͤ@ w# ͎ î ͪ: W2 _2 2 O { x! i`"EͧU!#x 0Ͱ͖ P*" !6x+"g*~E#;xt^#Vnx~E*~G *##V+^+N+y Uͧ ʮ ~+â _ Ê x. * w#͹ ͹  * ͹ ?r# :L*k*m ! ;+;  ;4D#^#V"m"k~/o>g++!.@l^#V={^'Ÿ#ͧ;ڧ zç~E#;ڧ}“"e:L*iͯ*e}¸|¸*e; ZQ{z| }=="P"U2G *  +   !># 1 UQ =xҏ|}ͤgA>͉Ag@ 2 2 w# 2 ͎  ͪͪ GтWx!̈́ P :N̕>ULTw !\~# a 2|:] !6 ͂<xü@¬xvx80x64ʼ5>=*~E*x**:L}CZMEIABDHSn!Ow #w q!\ͷ  ͹ :5 @w#ͷ : G6# .̹  U ͹ I 6# W  6   w#j !ex#  'š 'S_Á#0 )DM)) O ä^*^#V#^))))o" s#r#!^4-2FUQ2G"H"JDM1 !F6M ; "=M ͡ =M YP͡ !&~ʇ #^#V:Fʀ *{€ z€ "#~62"Ç }͉ ÉŸ|}!w s#r :[_!~![4\ͤ2[õ7U>?  mͤ!o"k>  P!"U2T"+"!91*~:"2F!B~M#^#V#~ @͢!W~6p=G#^#V#~x_ʔ#"!N#F$$$I"I$! !$I@!B B"D$!D $I$$H$! $I $I$I $H @@$"UUUUUU@H"H$I$IDBI$H!$HI$$DHDB CR,LF,'INSERT PASAL DISK IN DRIVE A, THEN TYPE RETURN',EOM ; ; READ$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BUFFʘ>#E> <:T!Mʮ<ڮ>=_~/w/w{<=YPõ"*##F+N+~P TO CALL READ$INTERP ; AND READ IT IN ; LHLD BOOT+1 ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE MVI L,0 ; FOR PROPEڔ *R>7* :%9!&~#~#V*z~==2%wo:LͰ* Ug{z<339E5DAA093 :10EA00F20CB10E1CDAA10FE20DA850EC3A63F :100EB0000E2A060@1E002BCDAA10FE09CAR SYSTEM OPERATION SHLD FIRSTSP ; MVI C,WRBUF ; REBOOT CPM LXI D,REBOOTMSG CALL BDOS MVI C,RDCON ; WAIT FOR CR CA_9o!=Ͱ* *͐ * :F9*JMD*H:G7* U͢!"P 2%>**͖ \" m*"e  PASS !T~*U+"U| CALL REQUEST$DISK ;GET PASCAL DISK ON DRIVE A MVI C,0 ; THEN SELECT THE DRIVE CALL SELDSK ; LXI B,DIRTOP ;READ THE DBD@@BI@$ $HBD!B HI$$$"$ D$"I $I$D$B" @@@D@"!B""D"ET ; ; FIND$INTERP: ;FIND 'SYSTEM.MICRO' MVI C,77 ;STOP AFTER THE 77'TH ENTRY LHLD DENTP ;GET STARTING ENTRY FI$SCH$D40EFE73 :100EC0000DCAD40EFE21DAE110771C7BFE10D2E1B0 :100ED00010C3B60ED5E5EB2A0600235E2356E17259 :10 @!!BH @@LL BDOS JP BOOT ; ; ; INIT$IO: ;INITIALIZE SYSTEM RET ;THAT'S IT ; ; REQUEST$DISK: ;ASK FOR PASCAL MVI C,WRBUˆw=2%~ !~##ʞ‘Z:"*#w2"*F#͋!Os!^#V  /``]]S`Ncc::^#V#IRECTORY INTO DIRTOP CALL READ$DIR ; LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER LXI D,DENTSZ ; TO FIRST ENTRY AFTER T@$D$$ HBH!@ DHDIHI!$"D!"D I$I "D @B$$@B$ $$LP: LXI D,DTITLE ;ADVANCE TO TITLE STRING DAD D LXI D,SYSTLE ;SET DE-REG TO COMPARISON STRING MVI B,LENGTH+1 ;COMPARISONABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HIF LXI D,DSKMSG CALL BDOS RD$LOOP: ;THEN WAIT FOR A CR MVI C,RDCON CALL BDOS CPI CR JNZ RD$LOOP RET ; DSKMSG: *^#V>ecx'g8_c*c:O?*###c>e><7*P|ʘ!ON*!HE VOLUME NAME DAD D SHLD DENTP ; CALL FIND$INTERP ;THEN FIND THE INTERPRETER CALL SAY$LOADING ;GOT IT SAY WHAT WE'RE U  LENGTH FI$CMP$LP: ;START COMPARING LDAX D CMP M JNZ FI$CONT ;IT'S NOT THIS ONE INX D ;HEY, WE'VE STILL GOT A CHANCNTERP$TO$LARGE MVI C,WRBUF CALL BDOS ;PRINT THE MESSAGE JMP REBOOT ;REBOOT CPM INTERP$TO$LARGE: DB CR,LF,'INTERPETER F FIRST BLOCK MOV A,E CMA MOV E,A MOV A,D CMA MOV D,A INX D ;DE=2'S COMP OF FIRST BLOCK PUSH D ;SAVE ON THE ST,128 DAD B MOV B,H MOV C,L POP H INX H ;ADVANCE BLOCK COUNT DCR E ;THEN SEE IF WE CONTINUE JNZ RR$LP RET ;LER NOT FOUND',CR,LF,EOM REBOOTMSG: DB CR,LF,'REBOOTING CP/M',EOM ; LENGTH EQU 12 ;TITLE LENGTH SYSTLE DB LENGTH,'SYSTEM.MICRE ARE 4 IBM SECTORS TO A PASCAL BLOCK DAD H ; SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC MVI E,4 RR$LP: ;THIS GETS CONFE INX H DCR B ;IS THIS THE END OF THE STRING JNZ FI$CMP$LP JMP FI$FOUND ;I THINK WE FOUND IT FI$CONT: LHLD DENTP ;OTO LARGE IT WILL OVER WRITE' DB CR,LF,'THIS PROGRAM. REASSEMBLE THIS PROGRAM' DB CR,LF,'WITH A HIGHER STARTING ADDRESS',CR,LACK ;GET NEXT AVAIL BLOCK INX H MOV E,M INX H MOV D,M XCHG ; POP D ;HL=NXT BLOCK,DE=-(FIRST BLOCK) ;SO HL+DEAVE, WHEN DONE ; ; DENTP DS 2 ; ; HOME: ;HOME SELECTED DISK TO TRACK 00 LHLD BOOT+1 MVI L,18H PCHL ; SELDSK: O' ; ; SAY$LOADING: ;WE'RE GOING TO LOAD THE INTERPRETER MVI C,WRBUF LXI D,LOADINGMSG CALL BDOS RET ; LOADINGMSG:USING PUSH B ;SET BUFFER ADDRESS PUSH D PUSH H CALL SETDMA POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR PUSH H CALL N TO THE NEXT ENTRY LXI D,DENTSZ DAD D SHLD DENTP DCR C ;WAIT, IS THERE ANY DIR LEFT? JNZ FI$SCH$LP ; MVI C,WRBUF F,EOM ; OK: LXI B,INTERP$BASE ;AND SET IT LOAD POINT CALL SYSRD ;THEN READ IT RET ; ; SYSRD: PUSH D ;SAVE BLOCK=LENGTH OF SYSTEM.MICRO DAD D ;HL=LENGTH XCHG ;DE=LENGTH POP H ;HL=FIRST BLOCK , DE=LENGTH ; ;CHECK THAT WE WON'T OVERW ;SELECT DISK (C-REG) LHLD BOOT+1 MVI L,1BH PCHL ; SETTRK: ;SET TRACK (C-REG) LHLD BOOT+1 MVI L,1EH PCHL ; SE DB CR,LF,'LOADING...',EOM ; ; READ$INTERP: ;PUT INTERP IN ITS PLACE LHLD DENTP ;GET STARTING BLOCK MOV E,M ; INTO HMAP ;MAP CONVERTS LOGICAL SECTOR IN HL-REG MOV C,H ; INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG PUSH H CALL SETTRK POP ;NO INTERP THERE LXI D,NOTFNDMSG CALL BDOS ; ; REBOOT: MVI C,WRBUF ;TRY TO REBOOT CP/M LXI D,REBOOTMSG CALL BDOS  COUNT PUSH H ;AND BLOCK NUMBER CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES POP H POP D INX H ;ADVANCE TO NEXT BLRITE OURSELVES LXI B,NBLOCKS MOV A,C SUB E MOV A,B SBB D JNC OK ;JIF OK ;ELSE TELL OPERATOR AND REBOOT LXI D,ITSEC: ;SET SECTOR (C-REG) LHLD BOOT+1 MVI L,21H PCHL ; SETDMA: ;SET DATA TRANSFER ADDRESS (BC-REG) LHLD BOOT+1 L-REG INX H MOV D,M ; ;COMPUTE THE LENGTH OF THE INTERPETER PUSH D ;SAVE FIRST BLOCK ON STACK ;TAKE 2'S COMPLIMENT O H MOV C,L CALL SETSEC CALL READ ;AND READ THE DATA POP H POP D POP B PUSH H ;ADVANCE THE BUFFER ADDRESS LXI H MVI C,RDCON CALL BDOS ;WAIT FOR ANY CHAR JMP BOOT ; FI$FOUND: ;WE'VE GOT IT RET ; NOTFNDMSG: DB CR,LF,'INTERPRETEOCK DCR E ;BUT, BEFORE WE GO ON JNZ SYSRD ; SEE IF WE'RE DONE RET ; ; READ$RX: ;READ A PASCAL BLOCK DAD H ;THER  MVI L,24H PCHL ; READ: ;READ A SECTOR TO THE DATA AREA LHLD BOOT+1 MVI L,27H PCHL ; ; MAP: ;TURN LSN INTO IBMIC7 PF FPA A A* A A A(#&&#&2#/?&#' '( v'( %:P!@"MOV H,C INR H POP D POP B RET ; ; DIV26: LXI B,-26 MVI E,0FFH DIVL: INR E DAD B MOV A,H ORA A JP DIVL 82%2%!"b0*"M0!1"%"&"@&#"K0"T0' _#~6' D':%A6'>:6'D'>.6'D'>-6'x&!,-26 MVI E,0FFH DIVL: INR E DAD B MOV A,H ORA A JP DIVL LXI B,26 DAD B RET ; ; END START 0000000000000000000@@@@@@@@@@@@@@@@AA AAQQQ"Q'Q,Q1Q6a ':%'_!% '6 4ɯ2%2]02e02d02g02%:\ LXI B,26 DAD B RET ; ; END START &)L)*Õ**x&t+!,ã-Ë,I,á&&M+*7%!I%w_:JASMPE%:L%%:M%%:I*~# NO. ; ON EXIT: H-REG HAS PHYSICAL TRACK ; L-REG HAS PHYSICAL SECTOR ; ; PUSH B PUSH D ; CALL DIV26 MOV A,L ADD x#_BH!™# 0#³# £#{ڽ#KÅ#CÅ#<: 0 JCR:0 $# $! 06 p#! 0$#CRDCXENDEQUHLTINRINXIRPJMPLDALOWLXIMODMOVMVINOPNOTNULORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRIASE =)!%w#w#w#w#w#w#>2^02_0:m$(!~#$,(~(# 3(%Aʩ(Pʩ(Sʩ(Hʩ(Lʩ(*t(+t(-¶(^0~Sʣ(MOR ; ; PUSH B PUSH D ; CALL DIV26 MOV A,L ADD A MOV B,A MVI A,12 CMP L JNC MAPC INR B MAPC: MOV C,E PRNFTYPEsHEX&FTYPEB&!%w_:%M&:%M&:%M&:%M&:%M&~*~# A MOV B,A MVI A,12 CMP L JNC MAPC INR B MAPC: MOV C,E XRA A MOV D,A MOV H,A MOV L,B MVI A,6 MAP$LOOP:  # ɯ<:0O=_^$!"F!!V#fjQ̀#G$2!!!^#Vo&)O~#F##xGyѯ *\ ?=)$=)w#Ž&!\60 ڱ&>GO#w ³&>O # &6 &6L#6I#6B#w2|r&\u'>2]0!"%![0~2%wG&!,x&>DAD D DCR A JNZ MAP$LOOP PUSH B CALL DIV26 POP B INR L MOV H,C INR H POP D POP B RET ; ; DIV26: LXI B_^#~G~W!:!x             0!0$0'0*0-000306090<0?0B0E0H0K0N0Q0T0W0Z0]0`0c0f0i0l0o0r0u0x0{0~0000 ͠'!%60#60#60#>2f0!"&:O0*!"%2%2%2%Z&%u'!-x&z{:]0ʢ)*%F)w)!"%r&\‰)*%#"%+EM OPERATION BA27 2E00 MVI L,0 BA29 220302 SHLD FIRSTSP ; BA2C C30002 JMP PBEGIN ;START BBALANCED MACRO LIB END OF ASSEMBLY G:%x-!%~--.-*P0*%O {-z-.*P0"%!%^4!%w.D D ;HL=LENGTH XCHG ;DE=LENGTH POP H ;HL=FIRST BLOCK , DE=LENGTH LXI B,INTERP$BASE ;AND SET IT LOAD POINT CALL SYSRD ;0!]0+~,:/ ,!/~ +:f0,:/++:_0,+:/#,:/ ,:_0=+!/~ +!0s!%~!%*4:0!/,G~Y+CRO' ; ; READ$INTERP: ;PUT INTERP IN ITS PLACE LHLD DENTP ;GET STARTING BLOCK MOV E,M ; INTO HL-REG INX H MOV D,~):.2]0ʢ)r&\!~-N'*%F))Z&!"%*%B&%)¼))*)6# )G&*%*%#"%~OOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITIALIZE SYSTEM B.WƐ'@'Õ*>:͕*!%^Ww*%{-|-}--{?.!%~#-6.-> ͕*> ͕*͞*> ͞*THEN READ IT RET ; ; ; SYSRD: ;READ BLOCKS FROM PASCAL DISKETTE PUSH D ;SAVE BLOCK COUNT PUSH H ;AND BLOCK NUMBER#x=+> Y+> Y+20!/>x6 #=,G!/~ pͳ'*&}?,>*/,`&%͈':^0*+,!&6S#6Y#6M#w!&w:%2%!"&ͳ'*2%`&M ; ; COMPUTE LENGTH OF INTERPETER PUSH D ;SAVE FIRST BLOCK ON STACK ;TAKE 2'S COMPLIMENT OF FIRST BLOCK MOV A,E CM!<-x&G:%7*$*x*7*x2*Ϳ'5*9**&*&w#"&!F)`&!"&*&%~ʅ*B&ŒA2F 0E01 MVI C,1 BA31 CD1BBE CALL SELDSK BA34 CD18BE CALL HOME BA37 0E00 MVI C,0 BA39 CD1BBE CALws CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES POP H POP D INX H ;ADVANCE TO NEXT BLOCK DCR E ;BUT, BEFORE WE GO ON%͛'͠'+,:%ʶ,:%.*P0"%.*>&}ʶ,>͕*æ,+,:%,l&&͈'!-x&CP/M MACRO ASSEM 2.0 NO SOURCE FILE PRESENT NA MOV E,A MOV A,D CMA MOV D,A INX D ;DE=2'S COMP OF FIRST BLOCK PUSH D ;SAVE ON THE STACK ;GET NEXT AVAIL BLOCK*`*G&`*!S-x&ö,͟**>&*@&w#">&!F)l&!">&*@&&`*_!%~ D DENTP DCR C ;WAIT, IS THERE ANY DIR LEFT? JNZ FI$SCH$LP FI$HANG: ;INTERPRETER NOT THERE, GO DUMB JMP FI$HANG ;ADD C BA21 2103BE LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE BA24 220100 SHLD BOOT+1 ; FOR PROPER SYST JNZ SYSRD ; SEE IF WE'RE DONE RET ; ; READ$RX: ;READ A PASCAL BLOCK DAD H ;THERE ARE 4 IBM SECTORS TO A PASCAL BLO DIRECTORY SPACE SOURCE FILE NAME ERROR INVALID PARAMETER: SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES UN INX H MOV E,M INX H MOV D,M XCHG ; POP D ;HL=NXT BLOCK,DE=-(FIRST BLOCK) ;SO HL+DE=LENGTH OF SYSTEM.MICRO DA*2%*b0}!,~ +*#+> *>#**> **b0~>+*#2+> *> *> *}2%!%*O*:/ :O0:%y*:%!O0•+:eODE TO SEND A MESSAGE TO CONOUT FI$FOUND: ;WE'VE GOT IT RET ; LENGTH EQU 12 ;TITLE LENGTH SYSTLE DB LENGTH,'SYSTEM.MI OCK DAD H ; SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC MVI E,4 RR$LP: ;THIS GETS CONFUSING PUSH B ;SET BUFFER ADDRES *##V+^+N+y Uͧ ʮ ~+â _ Ê x. * w#͹ ͹  * ͹ ?r# :LP B RET ; ; DIV26: LXI B,-26 MVI E,0FFH DIVL: INR E DAD B MOV A,H ORA A JP DIVL LXI B,26 DAD B RET ; 1024-BIOSSZ ; LOCATION OF BIOS VECTOR TABLE E200 = IBASE EQU BIOS-1024 ; LOCATION OF THIS INIT ROUTINE 0100 = ; ; MAP: ;TURN LSN INTO IBM TRACK-SECTOR ; ; NOTE: TRACK 00 IS NOT USED SO BLOCK 0 ; IS AT TRACK 01 SECTOR 1 ; ; ON ENURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC. ; ;MODIFIED ; 10/11/78 BY WS PUSH D PUSH H CALL SETDMA POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR PUSH H CALL MAP ;MAP CONVERTS LOGICAL SECTOR  003B = MSIZE EQU 59 ;SYSTEM SIZE IN KILOBYTES 0600 = BIOSSZ EQU 1536 ; BIOS SIZE IN BYTES  ; END IBASE  INTERP$BASE EQU 100H ;FIRST LOC USED BY THE INTERPRETER 0200 = PBEGIN EQU INTERP$BASE+100H;ENTRY TO THE PASCAL BOTRY: HL-REG HAS LOGICAL SECTOR NO. ; ON EXIT: H-REG HAS PHYSICAL TRACK ; L-REG HAS PHYSICAL SECTOR ; ; PUSH B PUSH D INK SAVILLE OF SVA TO READ ANY SIZE INTERPETER ; ;MODIFIED ; IN HL-REG MOV C,H ; INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG PUSH H CALL SETTRK POP H MOV C,L CALL SETSEC CALL  ; ; ; PINIT FIRST READS IN AND SCANS THE DIRECTORY FOR THE 8080/ ; Z80 INT#w6 R 1**!W~4ʼ #~#F#¼ x¼ ~#s#r#w>Qʅ = =Uͧᯕo>gͧ 'd OTER 0203 = FIRSTSP EQU INTERP$BASE+103H 001A = DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES 0006 = D; CALL DIV26 MOV A,L ADD A MOV B,A MVI A,12 CMP L JNC MAPC INR B MAPC: MOV C,E XRA A MOV D,A MOV H,A  ; 11/8/78 BY S. J. SINGER TO INITIALIZE 8251 (IMSAI SIO-2) AND DIABLO PRINTER ; 0000 = BOOT EQU 0READ ;AND READ THE DATA POP H POP D POP B PUSH H ;ADVANCE THE BUFFER ADDRESS LXI H,128 DAD B MOV B,H MOV C,L ERPRETER (SYSTEM.MICRO). THEN THE INTERPRETER IS ; LOADED INTO MEMORY, THE BIOS PAGE POINTER SET, AND EXECUTIOUn>#! ^#V#0}o|g- xD y0K GW yW W GD  z { < >'{>'TITLE EQU 06H ;OFFSET TO ENTRY TITLE D200 = DIRTOP EQU IBASE-1000H ;TOP OF TEMP RAM DISK DIRECTORY E618 = MOV L,B MVI A,6 MAP$LOOP: DAD D DCR A JNZ MAP$LOOP PUSH B CALL DIV26 POP B INR L MOV H,C INR H POP D POH ;LOCATION OF CP/M BOOT VECTOR 0002 = BIOS$PAGE EQU 2H ;BIOS PAGE POINTER LOCATION E600 = BIOS EQU MSIZE* POP H INX H ;ADVANCE BLOCK COUNT DCR E ;THEN SEE IF WE CONTINUE JNZ RR$LP RET ;LEAVE, WHEN DONE ; ; DENTP DS 2 N ; IS STARTED AT THE SYSTEM.PASCAL BOOT VECTOR. ; ; THIS PROGRAM PROVIDED CO  HOME EQU BIOS+18H ;DISK HOME TO TRACK 00 E61B = SELDSK EQU BIOS+1BH ;DISK SELECT E61E = SETTRK EQU BIOS+9 CD1BE6 CALL SELDSK E23C CD18E6 CALL HOME ; ; ;INITIALIZE 8251 AND DIABLO PRINTEM 'H(ALT' COMMAND E221 2103E6 LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE E224 220100 SHLD BOOT+1 ;  ----- --- ; ; LDX R,D LD R,(IX+D) MOV R,D(IX) ; LDY R,D LD R,(IY+D) MOV R,D(IY) ; STX R,D LD (IX+D),R MOV D(IX),R ;  INTO DIRTOP E209 CD54E2 CALL READ$DIR ; E20C 2100D2 LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER FFER ADDRESS IS ALREADY IN BC-REG E254 1E04 MVI E,4 ;DIR IS 4 BLOCKS LONG E256 210200 LXI H,2 ;AND STARTS AT BLO1EH ;SET TRACK E621 = SETSEC EQU BIOS+21H ;SET SECTOR E624 = SETDMA EQU BIOS+24H ;SET DATA TRANSFER AREA R ; E23F 3EAA MVI A,0AAH E241 D303 OUT 3 E243 3E40 MVI A,40H E245 D303 OUT 3  FOR PROPER SYSTEM OPERATION E227 2E00 MVI L,0 E229 220302 SHLD FIRSTSP ; E22C C30002 JMP STY R,D LD (IY+D),R MOV D(IY),R ; MVIX NN,D LD (IX+D),NN MVI D(IX) ; MVIY NN,D LD (IY+D),NN MVI D(IY) ; LDAI LD A,I LDA E20F 111A00 LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VOLUME NAME E212 19 DAD D E213 22F1E2 SHLD DENTP CK #2 E259 CDB7E2 CALL SYSRD ;GO GET IT E25C C9 RET ; ; FIND E627 = READ EQU BIOS+27H ;READ SECTOR TO DATA AREA ; ; ; E200 E247 3E8A MVI A,08AH ;1 STOP BIT, NO PARITY, 7 DATA BITS E249 D303 OUT 3 E24B 3E37 MVI A,37H E24D D303 PBEGIN ;START BOOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITII ; LDAR LD A,R LDAR ; STAI LD I,A STAI ; STAR LD R,A STAR ; LXIX NNNN LD IX,NNNN LXI IX,NNNN ; LXIY NNNN LD IY ; E216 CD5DE2 CALL FIND$INTERP ;THEN FIND THE INTERPRETER E219 CD98E2 CALL READ$INTERP ; AND READ IT I; ; Z-80 MACRO LIBRARY ; ; THE FOLLOWING MACROS ENABLE ASSEMBLING Z-80 INSTRUCTIONS ; WITH THE DIGITAL RESEARCH MACRO  ORG IBASE ; ; E200 310001 LXI SP,100H MAIN: ;LET'S BOOT SYST OUT 3 E24F 3E8F MVI A,8FH E251 D3EA OUT 0EAH ;RESET PRINTER (PORT EA) E253 C9 RET ;THAT'S IT ALIZE SYSTEM E22F 0E01 MVI C,1 E231 CD1BE6 CALL SELDSK E234 CD18E6 CALL HOME E237 0E00 MVI C,0 E23,NNNN LXI IY,NNNN ; LBCD NNNN LD BC,(NNNN) LBCD NNNN ; LDED NNNN LD DE,(NNNN) LDED NNNN ; LSPD NNNN LD SP,(NNNN) LSPD NNNN ; E21C 3EC3 MVI A,JMP ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL E21E 320000 STA BOOT ; SYSTEASSEMBLER. ; ; INVOKE WITH "MACLIB Z80" ; ; ; ; MACRO FORMATS ; ----- ------- ; ; ; MACRO ZILOG TDL ; ----- EM.MICRO E203 CD2FE2 CALL INIT$IO ;RESET I/O SYSTEM ; E206 0100D2 LXI B,DIRTOP ;READ THE DIRECTORY ; ; READ$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BU N ; LIXD NNNN LD IX,(NNNN) LIXD NNNN ; LIYD NNNN LD IY,(NNNN) LIYD NNNN ; SBCD NNNN LD (NNNN),BC SBCD NNNN ; SDED NNNN LIT B,R ; SETB B,R SET B,R SET B,R ; RES B,R RES B,R RES B,R ; BITX B,D BIT B,(IX+D) BIT B,D(IX) ; BITY B,D BIT B,(IY+D CP (IX+D) CMP D(IX) ; CMPY D CP (IY+D) CMP D(IY) ; INRX D INC (IX+D) INR D(IX) ; INRY D INC (IY+D) INR D(IY) ; DCRX R D(IX) ; RARY D RR (IY+D) RARR D(IY) ; SLAR R SLA R SLAR R ; SLAX D SLA (IX+D) SLAR D(IX) ; SLAY D SLA (IY+D) SLAR IR ; CCD CPD CCD ; CCDR CPDR CCDR ; ADDX D ADD (IX+D) ADD D(IX) ; ADDY D ADD (IY+D) ADD D(IY) ; ADCX D ADC (IX (C),R OUTP R ; INI INI INI ; INIR INIR INIR ; OUTI OTI OUTI ; OUTIR OTIR OUTIR ; IND IND IND ; INDR D (NNNN),DE SDED NNNN ; SSPD NNNN LD (NNNN),SP SSPD NNNN ; SIXD NNNN LD (NNNN),IX SIXD NNNN ; SIYD NNNN LD (NNNN),IY SIYD ) BIT B,D(IY) ; SETX B,D SET B,(IX+D) SET B,D(IX) ; SETY B,D SET B,(IY+D) SET B,D(IY) ; RESX B,D RES B,(IX+D) RES B,D(IX) D INC (IX+D) INR D(IX) ; DCRY D DEC (IY+D) DCR D(IY) ; NEG NEG NEG ; IM0 IM0 IM0 ; IM1 IM1 IM1 ; IM2 IM2 D(IY) ; SRAR R SRA R SRAR R ; SRAX D SRA (IX+D) SRAR D(IX) ; SRAY D SRA (IY+D) SRAR D(IY) ; SRLR R SRL R SRLR R ; S+D) ADC D(IX) ; ADCY D ADC (IY+D) ADC D(IY) ; SUBX D SUB (IX+D) SUB D(IX) ; SUBY D SUB (IY+D) SUB D(IY) ; SBCX D SBC INDR INDR ; OUTD OTD OUTD ; OUTDR OTDR OUTDR ; RLCR R RLC R RLCR R ; RLCX D RLC (IX+D) RLCR D(IX) ; RLCY D NNNN ; SPIX LD SP,IX SPIX ; SPIY LD SP,IY SPIY ; PUSHIX PUSH IX PUSH IX ; PUSHIY PUSH IY PUSH IY ; POPIX POP  ; RESY B,D RES B,(IY+D) RES B,D(IY) ; JR ADDR JR ADDR-$ JMPR ADDR ; JRC ADDR JR C,ADDR-$ JRC ADDR ; JRNC ADDR JR NC,ADD IM2 ; DADC RR ADC HL,RR DADC RR ; DSBC RR SBC HL,RR DSBC RR ; DADX RR ADD IX,RR DADX RR ; DADY RR ADD IY,RR DADY RRLX D SRL (IX+D) SRLR D(IX) ; SRLY D SRL (IY+D) SRLR D(IY) ; RLD RLD RLD ; RRD RRD RRD ; ; ; ; @CHK MACRO USE (IX+D) SBB D(IX) ; SBCY D SBC (IY+D) SBB D(IY) ; ANDX D AND (IX+D) ANA D(IX) ; ANDY D AND (IY+D) ANA D(IY) ; XORX D  RLC (IY+D) RLCR D(IY) ; RALR R RL R RALR R ; RALX D RL (IX+D) RALR D(IX) ; RALY D RL (IY+D) RALR D(IY) ; RRCR R RRCIX POP IX ; POPIY POP IY POP IY ; EXAF EX AF,AF' EXAF ; EXX EXX EXX ; XTIX EX (SP),IX XTIX ; XTIY EX (SP),IR-$ JRNC ADDR ; JRZ ADDR JR Z,ADDR-$ JRC ADDR ; JRNZ ADDR JR NZ,ADDR-$ JRNZ ADDR ; DJNZ ADDR DJNZ ADDR-$ DJNZ ADDR ; PCIR ; INXIX INC IX INX IX ; INXIY INC IY INX IY ; DCXIX DEC IX DCX IX ; DCXIY DEC IY DCX IY ; BIT B,R BIT B,R BD FOR CHECKING 8 BIT DISPLACMENTS ; @CHK MACRO ?DD ; USED FOR CHECKING RANGE OF 8-BIT DISP.S IF (?DD GT 7FH) AND (?DD LT 0FF XOR (IX+D) XRA D(IX) ; XORY D XOR (IY+D) XRA D(IY) ; ORX D OR (IX+D) ORA D(IX) ; ORY D OR (IY+D) ORA D(IY) ; CMPX D  R RRCR R ; RRCX D RRC (IX+D) RRCR D(IX) ; RRCY D RRC (IY+D) RRCR D(IY) ; RARR R RR R RARR R ; RARX D RR (IX+D) RARY XTIY ; LDI LDI LDI ; LDIR LDIR LDIR ; LDD LDD LDD ; LDDR LDDR LDDR ; CCI CPI CCI ; CCIR CPIR CCX JMP (IX) PCIX ; PCIY JMP (IY) PCIY ; RETI RETI RETI ; RETN RETN RETN ; INP R IN R,(C) INP R ; OUTP R OUT 80H) 'DISPLACEMENT RANGE ERROR - Z80 LIB' ENDIF ENDM LDX MACRO ?R,?D @CHK ?D DB 0DDH,?R*8+46H,?D ENDM LDY MACRO ?B 0EDH,0A1H ENDM CCIR MACRO DB 0EDH,0B1H ENDM CCD MACRO DB 0EDH,0A9H ENDM CCDR MACRO DB 0EDH,0B9H ENDM PIX MACRO DB 0DDH,0F9H ENDM SPIY MACRO DB 0FDH,0F9H ENDM PUSHIX MACRO DB 0DDH,0E5H ENDM PUSHIY MACRO DBDB 0EDH,44H ENDM IM0 MACRO DB 0EDH,46H ENDM IM1 MACRO DB 0EDH,56H ENDM IM2 MACRO DB 0EDH,5EH ENDM BCLDED MACRO ?NNNN DB 0EDH,5BH DW ?NNNN ENDM LBCD MACRO ?NNNN DB 0EDH,4BH DW ?NNNN ENDM LSPD MACRO ?NNNN DB 0EDO ?D @CHK ?D DB 0DDH,0AEH,?D ENDM XORY MACRO ?D @CHK ?D DB 0FDH,0AEH,?D ENDM ORX MACRO ?D @CHK ?D DB 0DDH,0R,?D @CHK ?D DB 0FDH,?R*8+46H,?D ENDM STX MACRO ?R,?D @CHK ?D DB 0DDH,70H+?R,?D ENDM STY MACRO ?R,?D @CHK ?D  ADDX MACRO ?D @CHK ?D DB 0DDH,86H,?D ENDM ADDY MACRO ?D @CHK ?D DB 0FDH,86H,?D ENDM ADCX MACRO ?D @CHK ?D  0FDH,0E5H ENDM POPIX MACRO DB 0DDH,0E1H ENDM POPIY MACRO DB 0FDH,0E1H ENDM EXAF MACRO DB 08H ENDM EXX M EQU 0 DE EQU 2 HL EQU 4 IX EQU 4 IY EQU 4 DADC MACRO ?R DB 0EDH,?R*8+4AH ENDM DSBC MACRO ?R DB 0EDH,?R*8+42H H,07BH DW ?NNNN ENDM LIXD MACRO ?NNNN DB 0DDH,2AH DW ?NNNN ENDM LIYD MACRO ?NNNN DB 0FDH,2AH DW ?NNNN ENDM B6H,?D ENDM ORY MACRO ?D @CHK ?D DB 0FDH,0B6H,?D ENDM CMPX MACRO ?D @CHK ?D DB 0DDH,0BEH,?D ENDM CMPY MACRO ? DB 0FDH,70H+?R,?D ENDM MVIX MACRO ?N,?D @CHK ?D DB 0DDH,36H,?D,?N ENDM MVIY MACRO ?N,?D @CHK ?D DB 0FDH,36H,?DDB 0DDH,8EH,?D ENDM ADCY MACRO ?D @CHK ?D DB 0FDH,8EH,?D ENDM SUBX MACRO ?D @CHK ?D DB 0DDH,96H,?D ENDM SUBY ACRO DB 0D9H ENDM XTIX MACRO DB 0DDH,0E3H ENDM XTIY MACRO DB 0FDH,0E3H ENDM LDI MACRO DB 0EDH,0A0H ENDM DADX MACRO ?R DB 0DDH,?R*8+09H ENDM DADY MACRO ?R DB 0FDH,?R*8+09H ENDM INXIX MACRO DB 0DDH,23H ENDM INSBCD MACRO ?NNNN DB 0EDH,43H DW ?NNNN ENDM SDED MACRO ?NNNN DB 0EDH,53H DW ?NNNN ENDM SSPD MACRO ?NNNN DB 0EDD @CHK ?D DB 0FDH,0BEH,?D ENDM INRX MACRO ?D @CHK ?D DB 0DDH,34H,?D ENDM INRY MACRO ?D @CHK ?D DB 0FDH,34H,,?N ENDM LDAI MACRO DB 0EDH,57H ENDM LDAR MACRO DB 0EDH,5FH ENDM STAI MACRO DB 0EDH,47H ENDM STAR MACRO MACRO ?D @CHK ?D DB 0FDH,96H,?D ENDM SBCX MACRO ?D @CHK ?D DB 0DDH,9EH,?D ENDM SBCY MACRO ?D @CHK ?D DB 0FDENDM LDIR MACRO DB 0EDH,0B0H ENDM LDD MACRO DB 0EDH,0A8H ENDM LDDR MACRO DB 0EDH,0B8H ENDM CCI MACRO DXIY MACRO DB 0FDH,23H ENDM DCXIX MACRO DB 0DDH,2BH ENDM DCXIY MACRO DB 0FDH,2BH ENDM BIT MACRO ?N,?R DH,73H DW ?NNNN ENDM SIXD MACRO ?NNNN DB 0DDH,22H DW ?NNNN ENDM SIYD MACRO ?NNNN DB 0FDH,22H DW ?NNNN ENDM S?D ENDM DCRX MACRO ?D @CHK ?D DB 0DDH,035H,?D ENDM DCRY MACRO ?D @CHK ?D DB 0FDH,35H,?D ENDM NEG MACRO  DB 0EDH,4FH ENDM LXIX MACRO ?NNNN DB 0DDH,21H DW ?NNNN ENDM LXIY MACRO ?NNNN DB 0FDH,21H DW ?NNNN ENDM H,9EH,?D ENDM ANDX MACRO ?D @CHK ?D DB 0DDH,0A6H,?D ENDM ANDY MACRO ?D @CHK ?D DB 0FDH,0A6H,?D ENDM XORX MACR B 0CBH,?N*8+?R+40H ENDM SETB MACRO ?N,?R DB 0CBH,?N*8+?R+0C0H ENDM RES MACRO ?N,?R DB 0CBH,?N*8+?R+80H ENDM BITX NDM RRCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 0EH ENDM RARR MACRO ?R DB 0CBH, 18H + ?R ENDM RARX MACRO ?D @CHK  DB 0EDH,0B3H ENDM OUTD MACRO DB 0EDH,0ABH ENDM OUTDR MACRO DB 0EDH,0BBH ENDM RLCR MACRO ?R DB 0CBH, 001!9"1} CP/M LIST VERS 1.40 $} BY S J SINGER $ ^* !N{p y#~m~!-$-1 ENDM JRNZ MACRO ?N DB 20H,?N-$-1 ENDM DJNZ MACRO ?N DB 10H,?N-$-1 ENDM PCIX MACRO DB 0DDH,0E9H ENDM PRLY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 3EH ENDM RLD MACRO DB 0EDH, 6FH ENDM RRD MACRO DB 0EDH, 67H ENDM MACRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+46H ENDM BITY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+46H ENDM SETX MA?D DB 0DDH, 0CBH, ?D, 1EH ENDM RARY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 1EH ENDM SLAR MACRO ?R DB 0CBH, 20H + ?RH + ?R ENDM RLCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 06H ENDM RLCY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 06H END:G* pp####yp,""*+"d ʰ-p*'"*yp,"pxG# #`CIY MACRO DB 0FDH,0E9H ENDM RETI MACRO DB 0EDH,4DH ENDM RETN MACRO DB 0EDH,45H ENDM INP MACRO ?R DB 74954 DB CR,LF,'WITH A HIGHER STARTING ADDRESS',CR,LF,EOM ; OK: 42BD 01000CRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+0C6H ENDM SETY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+0C6H ENDM RESX MA ENDM SLAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 26H ENDM SLAY MACRO ?D @CHK ?D DB 0FDH, 0CBH, ?D, 26H ENDM SRAM RALR MACRO ?R DB 0CBH, 10H+?R ENDM RALX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 16H ENDM RALY MACRO ?D @CHK ?D d   ))))od G>9x0{&o {@ 7dz=N Fz^ U}"*~=<#"*}/o|/g#"*0EDH,?R*8+40H ENDM OUTP MACRO ?R DB 0EDH,?R*8+41H ENDM INI MACRO DB 0EDH,0A2H ENDM INIR MACRO DB 0EDH,0B2H 1 LXI B,INTERP$BASE ;AND SET IT LOAD POINT 42C0 CDC442 CALL SYSRD ;THEN READ IT 42C3 C9 RET CRO ?N,?D @CHK ?D DB 0DDH,0CBH,?D,?N*8+86H ENDM RESY MACRO ?N,?D @CHK ?D DB 0FDH,0CBH,?D,?N*8+86H ENDM JR MACRR MACRO ?R DB 0CBH, 28H+?R ENDM SRAX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 2EH ENDM SRAY MACRO ?D @CHK ?D DB 0F DB 0FDH, 0CBH, ?D, 16H ENDM RRCR MACRO ?R DB 0CBH, 08H + ?R ENDM RRCX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 0EH E}/o|/g"\2|2 222<22I ô>2 *>  SOME KIND OF ERROR $ ENDM IND MACRO DB 0EDH,0AAH ENDM INDR MACRO DB 0EDH,0BAH ENDM OUTI MACRO DB 0EDH,0A3H ENDM OUTIR MACRO  ; ; SYSRD: 42C4 D5 PUSH D ;SAVE BLOCK COUNT 42C5 E5 PUSH H ;AND BLOCK O ?N DB 18H,?N-$-1 ENDM JRC MACRO ?N DB 38H,?N-$-1 ENDM JRNC MACRO ?N DB 30H,?N-$-1 ENDM JRZ MACRO ?N DB 28H,?NDH, 0CBH, ?D, 2EH ENDM SRLR MACRO ?R DB 0CBH, 38H + ?R ENDM SRLX MACRO ?D @CHK ?D DB 0DDH, 0CBH, ?D, 3EH ENDM S FILE NOT FOUND $PAGE\!6!"!5*~#"!4 5 a2 ‹:;> :<<*(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)E: ;HOME SELECTED DISK TO TRACK 00 4300 2A0100 LHLD BOOT+1 4303 2E18 MVI L,18H 4305 E9 PCHL ::=H (ͫ!6:*D͈!B6::3/HY!6:> !/>HH;ͫ:͎#~$€#_ 'I > I:¶>^I@I> I:oO***-$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1. :2͆2:1.#"2 ʕ ±2 ʘ ʘ ʘI > I:¶>^I@I> I:oO*** COPYRIGHT (C) 1978, DIGITAL RESEARCH, PIP VERS 1.4$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNT ; SELDSK: ;SELECT DISK (C-REG) 4306 2A0100 LHLD BOOT+1 4309 2E1B MVI L,1BH 430B E9 !Bw:<2:œ:¬ͭ :!Cҿ!6: !6:!6:!6*'D͈::,: *.y!6+6+6!6#6!16#6:Ҵ*̓b͓!~6:*:Mͺ!*/!6!A6!6+6e͈:Ö:5:=2:  * O: -> I:@!IO*[* : F> I> I> IPAGE ~#IO d |[{0~TYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$AB PCHL ; SETTRK: ;SET TRACK (C-REG) 430C 2A0100 LHLD BOOT+1 430F 2E1E M: HHGͫ: 2%::ͭ :GF:2Äv!.q!^*8!g*6: >͆BLOCK COUNT 42F9 1D DCR E ;THEN SEE IF WE CONTINUE 42FA C2D542 JNZ RR$LP 42FD C9 RET ;LEAVE, WHEN DXD͈:͜:3)\:2e:pG:!3H͜XD͈:we!D +pG:–͎#~$€#_ ʘ ʘI > I:¶>^I@I> I:oO***ORTED$BAD PARAMETER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID\(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)!q*&̓ ̓ ̓!p+q͓* ̓ ̓!q*&̓!p+q*͆2!p+q*͆2!p+q*͆2ONE ; ; 42FE DENTP DS 2 ; ; HOMy: ʍÖpG!~6e͈:!3ҵͫ!C6:ͣ!6:/>!/Hͫ:<2D:  * O: -> I:@!IO*[* : F> I> I> IPAGE ~#IO d |[{0~ FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$$$$NOT FOUND$COPYING  ͆2!p+q*̓!p+q*͆!p+q*͆!p+q*͆2!p+q*̓!6 ̓ ͆ ̓q:A/>Z!/HҠ: 2::=O>:!pHz>͞>!6:2*M! ^#V;H **M8 :œ *M8 :12!:ڹ !:2â !:w>! !5 8 : !16!q:!w  t 5:2:2!4¥:[$Ü:0!6:.jZ2O͠j: T:*d g=:[u!~5!6:e:ր2O:2ä !:2͂!6:! e2!6:ր! *& :͏ 2!46> ::Ð!q:7!wO! ~2A*& :w>!:R!74W!76>:~<2~!k> *~& NVZ2!p+q*̓> >ڦÚ!p+q*DM͞:̓ ̓:}2:~!!:*& N̓!4!6::*?~2*#"_2͒2!6H!6H!6 H͆2ppppppppͫ!6Ú :0Ot !q:O :O !6:2:'2:'2:'2*M *M *M :z :t  t   t ::<2*6 * 6 !q!6> !*&G :>!4©>:<2O* :w:?!36!q!6?!: *": ͫ!4¯ :1 !q4e!"!q: \ !14>!\ :!1\ :2*M!E ^#V=ځ ͻ ‡y!p+q!36!6+6 !6: һ: µ!6ày:~2}*M͠!6!6!6>!*& 6!4!4 :͓~!s+p+q+p+q:=2G ** w*#"*#" !"*AMͺ!6:9!ڴ **?DM͂D2ʣ :!6Ú!6Ú!6͆2'2=HX[^adgjmpy:2::2!6*Mͭ :2:D*}2͟"ͻ * * *&"!q: : :: :2: !6<:2<22!!26 t !q*&*~!46Z2: :]H:A2O>e: \Z2bͫ:S:QHҫ:~ * :w*#"m å å å å å ͫm *MRm !6 m !6 m !6 m *&̓m !6 m !6  m !6!66#6#6!6*M͠B:&:*69Z2::':S:” A<2O>ny*M͠ґ:ʍ ͫ*"*?6:92í *"!4Z !"!}=2 !6!"*Mͺ!6:!H * ": :B:<22%: 2:DpDz>>ͫ:S:2:b*MV:q*M}:>!8Ґ:8>! & !6:4::H4̀ : A!26*Mt : U!6!q:a/>z!/Hy:_2:!<2Z2: HڢÄZ2Z202O> !6Z202O> *&ͪ*& !s*& :w$60 m *&̓m !67 m !67 m !67 m *&̓m r   ! , 7 :2!q: ʊ [‡!~5!6:ʝ!6#6>!!6:<2O>/:!O!R *M Hó: !6Z[!~: * !"!4*DM͂e/7 ͫ*"!4 :1 :<2!":ʚ ͂e!:q2q:2=28> >>!6Ү!65+N! ~2!54ͤ2¼>>!*M:25!6:7<26>! *M!6!8 Z2:_!6=!6>'!.ͭ !4!p+q*n !r+s+p+q*~$v** e>*#"*#"L>u2:_og_{ozg^#V))) _{ozg#V) ¿^#V|g}o i`N#Fog H =6#6>!*& ~ʼ::Hڼ!6!4‡:H *"*="ͻ **M CEL EQU 1CH ;CLEAR TO END OF LINE (^BACKSLASH) SSEQ EQU 1DH ;GOTOXY START SEQUENCE BYTE. ; ;DEFINE SYMBOLS YOU DONT WANT TO͞U͓͞z˜yͫ*MͺnB2Cn /ee?:ͫ!6!"!"*AMͺDC00H ;POLY BOARD RAM HADD EQU 0ECH ;HI BYTE OF ADDRESS BIT7 EQU 80H ;HI BIT ON TO PRINT ASCII.. BS EQU 'H'-40H ;BACK-SPACE LBҒ/:!6!6}2:!6:2͞z>!6må!62}2m:F!6#6*AMͺ͂\!:=-:W:S͓ͫ:<2:_!e eD PRINT...... ; NULLIT EQU 0 ;NULL BEL EQU 'G'-40H ;YOU AINT GOT NO BELL. ; DUAL EQU FALSE ;TRUE IF DUAL DRIVE. PERSCI EQ:ͫ!d6MB2B*;">!6ͫ>!Eͫ!q:Z:Q2r_!r6*}v!r4ͭ _'ͻ *MF EQU 0AH ;LINE FEED CR EQU 0DH ;CARRIAGE RETURN VT EQU 'K'-40H ;CURSOR UP SYM FS EQU 'L'-40H ;CURSOR RIGHT. SYN EQU 'Z'-40H>>"2:!0!52!BFRm:O>>!p+q:l!6*DM͞:|!6̀ :ON AND LEAD IN TABLE ; TBL1: DB ICOL ; NOTHING SPECIAL DB ECOL ; NULL DB ZCOL ; HOME DB ICOL ; RIGHT DB DCOL ; LE :<2–͞͠p͓!6> !*&e ~2 : .̓*M̓!4¨>!:=2A::2A:4U FALSE ;TRUE IF FAST SEEK (PERSCI). DISK EQU 0F8H ;DISK BASE ADDRESS. DCOM EQU DISK ;DISK COMMAND PORT. DSTAT EQU ͺe:—ͫ/eeu /eR!=>͜+!9s!"?@=!"=*;*="=ͼ ;HOME AND CLEAR SCREEN HOM EQU '^'-40H ;CTRL-UP ARROW HOMES CURSOR. RUB1 EQU 5FH ;RUB CHAR RUB2 EQU 7FH ;OTHER RUB CHAR (ACKҺu2—!6Ä*& :w:<2OڶR:>}20O> :0:AO>$R:A ͽͽH!;LIST NULL COUNT. STPRAT EQU 1 ;RATE 1=6MS, 2=10MS, 3=20MS. ; ;THIS AREA DEFINES THE EQUATES USED BY THE POLY TYPE ;VIDE͜>!:=2::2!A:*͜y: 9͜!p+q+D*DM! D͈::=Hy͜:~2DISK ;DISK STATUS PORT. TRACK EQU DISK+1 ;DISK TRACK PORT. SECTP EQU DISK+2 ;DISK SECTOR PORT. DDATA EQU DISK+3 ;DISK DATA "?͟";"=ͼ:!2@:!Qbyb*Mͭ Q:ò :2}ͣ! BOTH CHARS) PSPACE EQU ' '+BIT7 ;SPACE CHAR FOR POLY. CURSYM EQU 0FFH ;CURSOR SYMBOL CES EQU 'Y'-40H ;CLEAR TO END OF SCREENwO`iͿͱ͛2O>r:!\!6:!\:=O! Nͭ !4< ͭ  ͭ :o͓*& 6$O DIVERS. ; PSTAT: EQU 0ECH ;POLY STATUS PDATA: EQU PSTAT+1 ;POLY DATA PORT PMASK: EQU 1 ;POLY DATA READY MASK VADD: EQU 0E  PORT. WAIT EQU DISK+4 ;DISK WAIT PORT. DCONT EQU DISK+4 ;DISK CONTROL PORT. RTCNT EQU 10 ;RETRY COUNT. IF ISIOTRK ;SEEK TO TRACK IN REG A. JMP SETSEC ;SET SECTOR NUMBER. JMP SETDMA ;SET DISK STARTING ADR. READN: JMP READ ;READ SELON. ; USER PROGRAMS MAY USE THESE ENTRY POINTS ; ALSO, BUT NOTE THAT THE LOCATION OF THIS ; VECTOR CHANGES WITH THE MEMORY SIROC TECH SOLOS, CALL CLRSCR ;CLEAR SCREEN. ENDIF XRA A ;CLEAR SCRATCH AREA. MVI C,ENDZ-STARTZ ;GET LENGTH OF ZERU CBASE+3106H ;START OF BDOS 1.4. CPML EQU 1500H ;LENGTH OF CPM SYSTEM-BIOS. NSECTS EQU CPML/128 ;NUMBER OF SECTORS IN IT.  THEM HERE. ENDIF IF VDM ;IF PROC TECH VDM, CALL CLR ;CLEAR VDM SCREEN. ENDIF IF STD ;IF STANDARD I/O, ; ;IN2 ;IF IMSAI SIO-2, CKBR EQU 00000010B ;KEYBOARD READY BIT. CPTR EQU 00000001B ;PRINT READY BIT. ENDIF ECTED SECTOR. WRITEN: JMP WRITE ;WRITE SELECTED SECTOR. ; THESE ENTRY POINTS ADDED BY TARBELL ELECTRONICS. JMP READN ;READZE. ; BEGIN: JMP BOOT ;FROM COLD START LOADER. WBOOTE: JMP WBOOT ;FROM WARM BOOT. JMP CONST ;CHECK CONSOLE KB STATUS. O AREA. LXI H,STARTZ ;GET SCRATCH ADDRESS. BOOTL: MOV M,A ;PUT ZERO IN MEMORY. INX H ;INCREMENT POINTER. DCR C ;DEC IF DUBSID ;IF DOUBLE-SIDED, ORG CPMB+083BH ;DISK PARAMETER BLOCK. DB 7FH ;DIRMAX. DB 04H ;BLKSHF. DB 0FITIALIZE POLY DRIVER ROUTINE ; INITP: LXI H,VADD ;VIDEO ADDRESS SHLD CURS ;STORE IT MVI A,PSPACE ;POLY SPACE STA UND LRBIT EQU CPTR ;LISTER READY BIT. SPIND EQU MSIZE*1024-2 ;SPOOL MODE INDICATOR. SPOOL EQU MSIZE*1024-400H ;SPOOLER ENTRY  WITH NO HEAD LOAD. JMP WRITEN ;WRITE WITH NO HEAD LOAD. ; ; BOOT ; THIS SECTION IS EXECUTED WHENEVER RESET AND RUN ; IS JMP CONIN ;READ CONSOLE CHARACTER. JMP CONOT ;WRITE CONSOLE CHARACTER. JMP LIST ;WRITE LISTING CHAR. JMP PUNCH ;WRITEREMENT COUNTER. JNZ BOOTL ;LOOP TILL DONE. MVI A,0F2H ;SET LATCH CODE = F2. STA LATCH CALL SETUP ;SET UP JUMPS. IN H ;BLKMSK. ; ORG CPMB+1072H ;CP/M PATCH. CALL CPMB+0AF4H NOP!NOP!NOP MOV A,C LXI H,CPMB+14F8H ENDIF ORG MVI A,'Z'-40H ;CLEAR SCREEN SYM. CALL DRIVE ENDIF IF ISIO2 ;IF IMSAI SIO2, MVI A,0AAH ;INITIALIZE SIO 2-2. OUT LOCATION. IF SPLER ;IF SPOOLER INSTALLED, CBASE EQU (MSIZE-18)*1024 ;BASE FOR LATER CALCS. ENDIF IF NOT SPLER ;IF PUSHED, AFTER THE COLDSTART LOADER READS IN ; THE CPM SYSTEM. ; BOOT: LXI SP,80H ;SET STACK POINTER. IF SPLER ;IF SPOO PUNCH CHAR. JMP READER ;READ READER CHAR. JMP HOME ;MOVE DISK TO TRACK ZERO. JMP SELDSK ;SELECT DISK DRIVE. JMP SET CDATA ;CLEAR CONSOLE STATUS. LXI H,SMSG ;PRINT OPENING MESSAGE. CALL PMSG CALL CONIN ;READ # OF DISKS. MOV C,A ;ECHOCPMB+1500H ;START OF BIOS. ; ; I/O JUMP VECTOR ; THIS IS WHERE CPM CALLS WHENEVER IT NEEDS ; TO DO ANY INPUT/OUTPUT OPERATI CCOM MVI A,40H OUT CCOM MVI A,0CEH OUT CCOM MVI A,37H OUT CCOM ENDIF IF SOLOS ;IF PSPOOLER NOT IN, CBASE EQU (MSIZE-17)*1024 ;BIAS FOR LARGER THAN 17K. ENDIF CPMB EQU CBASE+2900H ;START OF CPM. BDOS EQLER INSTALLED, MVI A,0FFH ;SET INITIAL SPOOL TO OFF. STA SPIND ENDIF IF INTRP ;IF INTERRUPTS ALLOWED, EI ;ENABLE   THE CHAR. CALL CONOT ANI 7 ;LOOK AT 3 LSB'S. STA NODSKS ;SAVE IT. GOCPM: LDA DISKNO ;GET DISK NUMBER TO MOV C,A ;RACK. ALDON: LDA TEMP ;RESTORE DISK NUMBER. IF INTRP ;IF INTERRUPTS ALLOWED, EI ;ALLOW THEM AGAIN HERE. ENDIF S SETTRK POP B ;RESTORE B&C. JNZ RDERR ;IF ERROR, PRINT MESSAGE. RBLK1: SHLD DMAADD ;SET STARTING ADDRESS. CALL SETSEC BOUT? RZ ;IF SO, DON'T PRINT IT. LDA LASTCHAR ;GET NO PRINT FLAG. CPI 7FH ;IS IT A RUBOUT JNZ CONOTA ;NOT SET, SO PR ;SET STACK POINTER. IF INTRP ;IF INTERRUPTS ALLOWED, EI ;ALLOW THEM HERE. ENDIF LDA DISKNO ;SAVE DISK NUMBER. F. RET ;RETURN FROM CONST. ; ; READ A CHARACTER FROM CONSOLE. ; CINSPL: IF SPLER ;IF SPOOLER INSTALLED, CALL SPLTPASS TO CCP IN C. JMP CPMB ;JUMP TO CCP. ; ; SET UP JUMPS INTO CP/M IN LOWER MEMORY. ; SETUP: MVI A,0C3H ;PUT JMP TO WBOTA DISKNO CALL SETUP ;SET UP JUMPS. JMP GOCPM ;GO BACK TO CPM. ; RDERR: LXI H,BTMSG ;GET ADDRESS OF "BOO;READ STARTING AT SECTOR IN C. CALL READ2 JNZ RDERR ;IF ERROR, PRINT MESSAGE. DCR D ;DECREMENT SECTOR COUNT. JZ ALDINT. XRA A ;RESET THE FLAG STA LASTCHAR ;TO ZERO. MVI C,5FH ;ANOTHER BACKSPACE. CONOTA: MOV A,C ;GET OUTPUT CHAR STA TEMP MVI C,0 ;SELECT DISK ZERO. CALL SELDSK CALL HOME ;MOVE TO TRACK ZERO. JNZ RDERR ;IF ERROR, PRINT MESSAGE. 0 ;CHECK LIST READY BIT. ENDIF CONIN: IN PSTAT ;READ STATUS ANI PMASK JNZ CONIN IN PDATA ;READ DATA ANI 7FH ;REMOOT STA 0 ;ADR AT ZERO. LXI H,WBOOTE SHLD 1 STA 5 LXI H,BDOS ;PUT JUMP TO BDOS SHLD 6 ;AT ADR 5,6,7. LXI H,T ERROR". CALL PMSG ;PRINT IT. CALL CONIN ;READ A CHAR FROM CONSOLE. JMP WBOOT ;DO A WARM BOOT. ; ; CHECK CONSOLE INPUTON ;ALL DONE WHEN D=0. INR C ;INCREMENT SECTOR NUMBER. MOV A,C ;IF SECTOR NUMBER CPI 27 ;IS NOT 27, JC RBLK1 ;KEE CALL DRIVE ;TO POLY DRIVER RET ;**** DRIVE ;POLY DRIVER WITH X-Y CURSOR ADDRESSING. ;CURSOR ADDRESSING IS DONE WITH THE MVI D,NSECTS ;GET # SECTORS FOR CPM READ. LXI B,2 ;TRACK (B)=0, SECTOR (C)=2. LXI H,CPMB ;GET STARTING ADDRESS. IF IVE PARITY BIT STA LASTCHAR CPI 5FH ;IS IT A RUBOUT RNZ ;RETURN IF NOT. MVI A,7FH ;RESTORE RUBOUT STA LASTCHAR RET 80H ;SET DEFAULT DMA ADR. SHLD DMAADD RET ;RETURN FROM SETUP. IF TUART ;IF CROMEMCO TUART, BAUDRS: DB 94H,0CEH,0A2 STATUS. ; CONST: IF SPLER ;IF SPOOLER INSTALLED, CALL SPLT0 ;CHECK SPOOLER STATUS. ENDIF IN PSTAT ;READ CONSOLP READING ON THIS TRACK. MVI C,1 ;OTHERWISE, RESET SECTOR=1, INR B ;INCREMENT TRACK NUMBER, JMP RDBLK ;AND READ NEXT TSEQUENCE: ; 1DH,Y-BYTE,X-BYTE (1DH,HORIZ,VERT). ; DRIVE: PUSH PSW ;SAVE REGISTERS PUSH B PUSH D PUSH H MOV B,A LNTRP ;IF INTERRUPTS ALLOWED, DI ;DISABLE THEM HERE. ENDIF RDBLK: PUSH B ;SAVE B&C. MOV C,B ;GO TO TRACK IN B. CALL;RETURN FROM CONIN. ; WRITE A CHARACTER TO THE CONSOLE DEVICE. ; CONOT: MOV A,C ;GET CHARACTER. CPI 7FH ;IS IT A RUH,92H,88H,84H,82H,1 ENDIF ; ; WARM-BOOT: READ ALL OF CPM BACK IN ; EXCEPT BIOS, THEN JUMP TO CCP. ; WBOOT: LXI SP,80HE STATUS. ANI PMASK ;LOOK AT KB READY BIT. MVI A,0 ;SET A=0 FOR RETURN. RNZ ;NOT READY WHEN NOT 0. CMA ;IF READY A=F! HLD XYADD ;TESTS H,L IN GOT1 & GOT2 LDA XYFLAG ;GET X-Y SEQ FLAG ORA A ;HAS IT BEEN SET JNZ GOT2 ;X-Y SEQ HAS STARTED. M JNZ LASTL LXI H,VADD+400H-40H ;BEGINNING BOTTOM LINE. FINI: MOV A,M ;WRAP IT UP MVI M,CURSYM ;CURSOR TO SCREEN STA UND  PAST IT INX H DONE: MOV A,L ANI 3FH ;CHECK R.H.SIDE CPI 3FH JZ FINI ;DONT GO PAST E.O.L. MOV A,H CPI HADD+4 ;OFF-SING SPACES INX H MOV A,H CPI HADD+4 ;END OF SCREEN? JNZ CLESCR RESTOR: LHLD CURS ;RESTORE H,L JMP FINI ;AND DONT MURN. JZ CURET CPI VT ;CURSOR UP,CTRL-K JZ UP CPI FS ;CURSOR RIGHT,CTRL-L JZ FOW CPI HOM ;CURSOR HOME,CTRL-^ JZ HOMINI ;DONE WITH HOME CURET: MOV A,L ;CR SENDS CURSOR ANI 0C0H ;TO BEGINNING OF LINE MOV L,A JMP FINI ;DONE LINF: LXI OV A,B ;GET BACK ACCUM. CPI SSEQ ;CHECK FOR FIRST GOTXY REQUEST. JZ GOT1 ;YEP, IT STARTED. CPI BEL ;IF YOU AINT GOT A DI;STORE CHAR UNDER CURSOR SHLD CURS ;AND THE CURSOR ADDRESS POP H POP D ;POP ALL REG. POP B POP PSW ;ALL REGISTERS RCREEN JNZ FINI ;WRAP IT UP IF OK LXI H,VADD ;OTHERWISE LXI D,VADD+64 ;SET FOR SCROLL SCROLL: LDAX D ;GET CHAR MOV M,A ;OVE CURSOR GOT1: MVI L,0FFH ;PUT IMPOSSIBLE X-Y BYTE IN L SHLD XYADD ;FOR LATER TEST MOV A,L ;0FFH TO A ALSO STA XYFLAER CPI SYN ;CLEAR SCREEN,CTRL-V JZ CLEAR CPI CES ;CLEAR TO END OF SCREEN,CTRL-Z JZ CLESCR CPI CEL ;CLEAR TO END OF LIND,64 ;LINE-FEED, DOWN ONE LINE DAD D JMP DONE ;TEST IF SCROLL NECESSARY BSERA: MVI M,PSPACE ;SPACE FOR ERASE BACK: DCX HNGER, JZ GOBACK ;GET OUT CPI NULLIT ;NULL SYM JZ GOBACK JMP GOGO ;ELSE DO YOUR THING. GOBACK: POP H ;DO A GRACEFUL EXIESTORED RET ;DONE!! UP: LXI D,-64 ;UP ONE LINE DAD D ;SUBTRACT 64 FROM H,L FIX: MOV A,H ;DONT GO OFF TOP ANI 3 ORI HAND MOVE IT UP 64 LOCATIONS INX D ;INCR D,E INX H ;AND H,L MOV A,D ;CHECK POINTER CPI HADD+4 ;WITH END OF SCREEN+1 JNZG ;SET THE FLAG. JMP GOBACK ;AND EXIT GOT2: MVI A,0FFH ;GETS HERE IF L HAS BEEN CMP L ;SET JNZ DANCE ;IF NO MATCH,STE,CTRL-BACKSLASH JZ CLINE CPI RUB1 ;5FH RUB JZ BSERA CPI RUB2 ;7FH RUB JZ BSERA ORI BIT7 ;ALL OTHER CHARS ARE PRINTA ;THEN BACK UP JMP FINI CLINE: LHLD CURS ;GET CURRENT LOC. CLIN1: MVI M,PSPACE ;SPACES MOV A,L ;CHECK EOL. ANI 3FH T. POP D POP B POP PSW RET GOGO: LHLD CURS ;GET CURSOR ADDRESS. LDA UND ;AND SYMBOL UNDER IT. MOV M,A ;RESTORE SYMBADD MOV H,A JMP FINI CLEAR: LXI H,VADD ;CLEAR SCREEN CLOOP: MVI M,PSPACE ;AND HOME CURSOR INX H ;AND PRINT SPACES MO SCROLL ;KEEP GOING IF NOT THERE. LASTL: MVI M,PSPACE ;BLANK BOTTOM LINE INX H MOV A,H ;CHECK H,L OFF-SCREEN CPI HADD+4 AGE IS SET MOV A,B ;A CONTAINS Y-BYTE NOW SUI 20H ;SUBTRACT OFFSET ANI 3FH ;FAR RIGHT OF SCREEN! MOV L,A ;BINARY VALBLE MOV M,A ;PUT IT ON T.V. FOW: MOV A,L ;TEST FOR R.H.SIDE OF SCREEN ANI 3FH CPI 3FH ;END OF LINE? JZ FINI ;DONT WRITECPI 3FH ;IS IT THERE? JZ RESTOR ;DONT MOVE CURSOR INX H ;KEEP GOING TO EOL. JMP CLIN1 CLESCR: MVI M,PSPACE ;START WRITOL MOV A,B ;GET BACK INCOMING CHAR. CPI BS ;BACKSPACE,CTRL-H JZ BACK CPI LF ;LINE FEED. JZ LINF CPI CR ;CARRIAGE RETV A,H CPI HADD+4 ;CHECK END OF SCREEN JNZ CLOOP ;KEEP GOING OTHERWISE HOMER: LXI H,VADD ;BEGINNING ADDRESS NATCH JMP F" . TO L SHLD XYADD ;SAVE IT JMP GOBACK ;FOR LATER DANCE: PUSH H ;SAVE H,L LHLD CURS ;GET OLD CURSOR LOCATION LDA UND ;ETURN FROM SELDSK. SELMOR: POP A ;MAKE STACK RIGHT. MOV A,M ;GET OLD DISK NUMBER. IF DUAL ;IF DUAL DRIVE, ANI 0FXI H,DISKDR ;GET ADR OF OLD DISK NO. CMP M ;NEW = OLD? RZ ;IF SO, RETURN. PUSH A ;SAVE DISK NUMBER. LDA NODSKS ;GE A,C ;GET NEW TRACK NUMBER. IF DUBSID ;IF DOUBLE-SIDED DISK, RRC ;SHIFT RIGHT ONCE. PUSH PSW ;SAVE REVISED TRACK NUMT JMP ZIPIT ;OTHERWISE,FORGET IT ONSCRN: SHLD CURS ;X-Y ADDR IN CURS ZIPIT: LXI H,0 ;BIG ZERO SHLD XYADD ;ZERO THIS, W REG. MOV A,C ;UPDATE OLD DISK NUMBER. STA DISKDR CMA ;BITS INVERTED INTO LATCH. ADD A ;PUT BITS 1&2 AT 4&5. ADD AND CHAR. UNDER IT. MOV M,A ;RESTORE CHAR AND WIPE OUT CURSOR. POP H ;RESTORE LATEST H,L MOV A,B ;B CONTAINS X-BYTE NOW EH ;CLEAR OUT BIT 0. ENDIF MOV E,A ;PUT OLD DISK NO. IN D&E. MVI D,0 LXI H,TRTAB ;GET ADDRESS OF TRACK TABLE. DADT NUMBER OF DISKS. DCR A ;IF MORE THAN ONE DISK, JNZ SELMOR ;TAKE CARE OF IT. LXI H,MNTMSG ;GET ADR OF MOUNT MESSAGE.BER. LDA LATCH ;GET LATCH CODE. JC SIDE2 ;IF TRACK # ODD, SIDE #2. ORI 40H ;CLEAR LATCH BIT FOR SIDE 1. JMP SETLAT E ARE DONE XRA A ;SMALL ZERO STA XYFLAG ;SET THIS ALSO JMP RESTOR ;DEFINE STORAGE AREA FOR POLY DRIVER ; CURS DS 2 ;C A ADD A ADD A ORI 2 ;MAKE LATCH COMMAND. STA LATCH ;SAVE LATCH CODE. XRA A ;SET A = 0. RET ;RETURN FROM SELSUI 20H ;SUBTRACT OFFSET ANI 0FH ;BOTTOM OF SCREEN ORA A ;IS IT A ZERO? JZ FIXCUR ;IF SO,SKIP DADS. LXI D,64 ;NO. O D ;ADD DISK NO. TO ADDRESS. IN TRACK ;READ 1771 TRACK REGISTER. MOV M,A ;PUT INTO TABLE. MOV A,C ;GET NEW DISK NUMB CALL PMSG ;PRINT "MOUNT ". POP A ;GET DISK NUMBER. STA DISKDR ;UPDATE OLD WITH NEW. ADI 'A' ;ADD ASCII FOR 'A'. M;GO AHEAD AND SET LATCH. SIDE2: ANI 0B2H ;SET LATCH BIT FOR SIDE 2. SETLAT: OUT DCONT ;OUTPUT TO THE LATCH. STA LATCH ;SAURSOR ADDRESS XYFLAG DB 0 ;INITIALLY ZERO XYADD DW 0 UND DS 1 ;STORE SYMBOL UNDER CURSOR ; ; SELECT DISK NUMBER ACCORDSK. ; ; MOVE DISK TO TRACK ZERO. ; HOME: MVI C,0 ;SEEK TO TRACK ZERO. ; ; SET TRACK NUMBER TO WHATEVER IS IN REGISTER C.F CHARS/LINE. LDOWN: DAD D ;DOWN ONE LINE DCR A ;COUNT IT WITH X-BYTE JNZ LDOWN FIXCUR: XCHG ;H,L TO D,E LXI H,VADD ER. IF DUAL ;IF A DUAL DRIVE, ANI 0FEH ;CLEAR BIT 0. ENDIF MOV E,A ;PUT NEW DISK NO. IN D&E. LXI H,TRTAB ;GETOV C,A ;PUT INTO C. CALL CONOT ;PRINT IT. CALL CONIN ;READ A CARRIAGE RETURN. XRA A ;SET A=0 FOR NO ERRO IND. RET ;RVE THE CODE. POP PSW ;RESTORE THE TRACK NUMBER. ANI 7FH ;CLEAR MSB. MOV C,A ;SET C=TRACK NUMBER. ENDIF STA TRK DING TO REGISTER C. ; SELDSK: MOV A,C ;GET NEW DISK NUMBER. ANI 3 ;ONLY LOOK AT 2 LSB'S. STA DISKNO ;SAVE DISK NO. L ; ALSO PERFORM MOVE TO THE CORRECT TRACK (SEEK). ; SETTRK: LDA LATCH ;GET LATCH CODE. OUT DCONT ;SELECT DRIVE NOW. MOV ;GET BEGINNING DAD D ;H,L NOW POINTS AT X-Y ADDR. CHKLOC: MOV A,H ;IS IT ON SCREEN? CPI HADD+4 JM ONSCRN ;OK, STORE I ADDRESS OF TRACK TABLE. DAD D ;ADD DISK NO. TO ADDRESS. MOV A,M ;GET NEW TRACK NUMBER. OUT TRACK ;PUT INTO 1771 TRACK# ;UPDATE OLD WITH NEW. CALL SEEK ;MOVE TO NEW TRACK. RET ;RETURN FROM SETTRK ROUTINE. ; ; SET DISK SECTOR NUMBER. ; SETSDCR A ;DECREMENT COUNT. JNZ RRETRY ;TRY TO READ AGAIN. LXI H,RDMSG ;PRINT "READ ". ERMSG: CALL PMSG ;PRINT ORIGIN MESSAOR INTRQ. ORA A ;SET FLAGS. JP RDDONE ;DONE IF INTRQ. IN DDATA ;READ A DATA BYTE FROM DISK. MOV M,A ;PUT BYTE INT1771 OUT DCOM ;TO READ ADDRESS. IN WAIT ;WAIT FOR DRQ OR INTRQ. IN DDATA ;READ THE TRACK ADDRESS. MOV B,A ;SAVE INRCNT ;STORE IN ERROR CTR. LHLD DMAADD ;GET STARTING ADR. MVI A,0D0H ;CAUSE INTERRUPT. OUT DCOM XTHL ;SOME DELAY. XT IS HIGH, LXI H,BSYMSG ;PRINT "BUSY". CNZ PMSG ENDIF PERMSG: LXI H,ERRMSG ;PRINT "ERROR." CALL PMSG MVI A,1 ;SEEC: MOV A,C ;GET SECTOR NUMBER. STA SECT ;PUT AT SECT # ADDRESS. RET ;RETURN FROM SETSEC. ; ; SET DISKGE. ERMSG1: IF NOT VDM ;IF NOT PROC TECH VDM, MOV A,D ;GET ERROR BITS. ANI 80H ;IF BIT 7 HIGH, LXI H,NRMSG ;"NOT RO MEMORY. INX H ;INCREMENT MEMORY POINTER. JMP RLOOP ;KEEP READING. RDDONE: IN DSTAT ;READ DISK STATUS. IF INTRP REGISTER B. CHKS2: IN WAIT ;WAIT FOR INTRQ. ORA A ;SET FLAGS. JP CHKS3 ;DONE WITH READ ADR OP. IN DDATA ;READ ANHL IF INTRP ;IF INTERRUPTS ALLOWED, DI ;DISABLE THEM HERE. ENDIF IN DSTAT ;READ STATUS. ANI 20H ;LOOK AT HLD T FOR PERM ERR MSG. ORA A ;SET FLAGS. RET ; ; ERCHK - CHECK FOR RECORD NOT FOUND ERROR. ; ERCHK: MOV D,A ;SAVE ERROR  DMA ADDRESS. ; SETDMA: MOV H,B ;MOVE B&C TO H&L. MOV L,C SHLD DMAADD ;PUT AT DMA ADR ADDRESS. EADY". CNZ PMSG MOV A,D ;GET ERROR BITS. ANI 10H ;IF BIT 4 IS HIGH, LXI H,RNMSG ;PRINT "RECORD NOT FOUND" CNZ PMSG  ;IF INTERRUPTS ALLOWED, EI ;ALLOW AGAIN HERE. ENDIF ANI 9DH ;LOOK AT ERROR BITS. RZ ;RETURN IF NONE. CHECK: CALL OTHER BYTE. JMP CHKS2 ;DO IT AGAIN. CHKS3: IN DSTAT ;READ DISK STATUS. ORA A ;SET FLAGS. JZ CHKS4 ;READ ADR OK IF 0BIT. LDA SECT ;GET SECTOR NUMBER. READ1: OUT SECTP ;SET SECTOR INTO 1771. MVI A,8CH ;READ WITH HEAD LOAD JZ READE ;HBITS IN D. ANI 10H ;IF RECORD NOT FOUND, JNZ CHKSK ;DO A CHECK ON SEEK. MOV A,D ;OTHERWISE RESTORE BITS ORA A ;SET RET ;RETURN FROM SETDMA. ; ; READ THE SECTOR AT SECT, FROM THE PRESENT TRACK. ; USE STARTING ADDRESS AT DMAADD. ; READ:  MOV A,D ;GET ERROR BITS. ANI 8H ;IF BIT 3 IS HIGH, LXI H,CRCMSG ;PRINT "CRC ERROR". CNZ PMSG MOV A,D ;GET ERROR BERCHK ;CHECK FOR SEEK ERROR. LXI H,RECNT ;GET RD ERR COUNT ADDR. INR M ;ONE MORE ERROR. LDA ERCNT ;GET ERROR COUNT. . CALL HOME ;OTHERWISE, HOME FIRST. JMP CHKS5 CHKS4: MOV A,B ;UPDATE TRACK REGISTER. OUT TRACK CHKS5: LDA TRK ;GET READ NOT LOADED. MVI A,88H ;CODE FOR READ W/O HD LD. READE: OUT DCOM ;SEND COMMAND TO 1771. RLOOP: IN WAIT ;WAIT FOR DRQ  FLAGS, RET ;AND RETURN. ;CHECK FOR SEEK TO CORRECT TRACK, ;AND CHANGE IF NECESSARY. CHKSK: MVI A,0C4H ;SEND COMMAND TO  IF SPLER ;IF SPOOLER INSTALLED, CALL SPLT1 ;CALL SPOOLER. ENDIF READ2: MVI A,RTCNT ;GET RETRY COUNT. RRETRY: STA EITS. ANI 4H ;IF BIT 2 IS HIGH, LXI H,LDMSG ;PRINT "LOST DATA". CNZ PMSG MOV A,D ;GET ERROR BITS. ANI 1 ;IF BIT 1$ EQUIRED TRACK NO. CALL SEEK ;MOVE THE HEAD TO IT. MOV A,D ;GET ERROR BITS. ORA A ;SET FLAGS. RET ;RETURN FROM ERCHK.K "$" AT $1dB" '+!Vs~!҄ ; ; WRITE THE SECTOR AT SECT, ON THE PRESENT TRACK. ; USE STARTING ADDRESS AT DMAADD. ; WRITE: IF SPLER ;IF SPOOLER IN*d 6*+"!##s#r!'6!-6:] :m HB͌ :\2VR 2b:=2!\6:l2v:2}:=2͆  WAIT EQU 0FCH 0600 = BIOSSZ EQU 1536 ;12 SECTORS E200 = LOADP EQU MSIZE*1024-BIOSSZ-1024 0014 = M/ *DMc â:72-× :8 ::H͇ͣ͟× :7HҔ :8A"!76*9"=*"?͓0 SECTORS FROM THE DISK ; STARTING WITH SECTOR 2. (SECTORS 2 - 21) ; THE STARTING LOAD POINT IÜ^q!86 :2ҷ. -¦ͳ >!^÷!6!6͠ !6:!6Oú͖28!^6STALLED, CALL SPLT1 ;CALL IT. ENDIF MVI A,RTCNT ;GET RETRY COUNT. WRETRY: STA ERCNT ;STORE IN ERROR COUNTER. LHLD Dͽ !d6 !"9*";!61!6#ú1!6?ú1!6>1|~ *M n *8M c 1!$6!6!#6:%2E NSECTS EQU 20 ;NUMBER OF SECTORS. 0000 ORG 0 0000 310001 BOOT: LXI SP,100H 0003 010200  ͯ !76͓Ñ :8F==:L-Ñ :8J=e:2eL:=2:<2!҆*& ~28S 0D600H FOR A 55K SYSTEM. ; THE LOADER JUMPS TO 0D600H ON COMPLETION OF LOAD. ; :,!T:^,*^& ~28:^<2^× Q=D[ { × ͣ:8-W!76:8#hå|҅͋:8:‚!86LMAADD ;GET STARTING ADR. MVI A,0D0H ;STATUS INTERUPT FOR 1771. OUT DCOM ;COMMAND 1771. XTHL ;WAIT FOR STATUS. XTHL ;!::2{ × H;:28:2:82À× :8IU!:%:H2#c͙D9:86:8:8Ê COPYRIGHT (C) 1978, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE ITNEW FILE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAe*9"`*M*Ͱ/ҟÜ!:9J"=!76͓*`"9TÑ :8M:H%! 6>3Jͦ: <2 O!6 ; 003B = MSIZE EQU 59 ;MEMORY SIZE IN DECIMAL KB. 00F8 = DCOM EQU 0F8H 00F8 = DSTAT EQå:8:¥͋ͷ:7¥*3#"3ұ!76:8B!7>w!"=*"?͓× :8C͓ͦ× :8D͙ͦ× :8K ; PASCAL BOOT LOADER ; ; THIS IS A MODIFICATION OF TARBELL'S CP/M COLD STARTH:8Hҽc !"3!76#~±͇ú͙͙:8>9Jú*9d ~28O :8 *)+")!86:8%  Hqy : 2! 6*3#s#rÑ :8N†=҃*Ͱ/Ҁ8 Oú"ͯ!76!"=͓)!76;=}Ü7[ -„!%q:ʚ*%M !(q:(a/>z!(/H!)q*)M͢:)_:)!*q:&**Mͺ:*!,p+q!'"/!.6>/")!U6!6!6!T6*M[ k  *M[ !06:V!0 *~*YDMk \ 2 >! ͌ *~*Y6:V20 *"?;9=ò OE2M'*9d :Mw:M A!Nq:'X*NM:N;=l*;d ~2OOͮ :Op+qc *DMn !p+q* !p+q*2!p+q*2!p+q*2!p+q*!p+q*!p+q* *3#"3*9"A!"E+"C2*;"A*"E!"C!J6:JҼEA=2I*C*A"Gd ~ Ht*G"A>*++"+*3+"0Ñ :8S=eL:29J+s#r!:*& ~28:<2ïÔÑ :8WͷÑ :8X\ ͛  ͆ JY*+*/{2-*+*/"+*/! "/:-!.Q!.6:-0O V  !2p+q:-/i*1DM:   :#~"~:0<20¸  !"~W~=* ͩ *~*Y~21B *~#"~:1*M[ !#+!3s{b ͧ !26:3!2ڣ **|DMk Š\Ҷ;=Mڰó\Ñ!76!"=*;"?͓͎\?;=!76͓ͷ!p+q*2!p+q*!6͐  O >>!&q*&&!(p+q*':U3>32J:I/Ҭ!J6CA=+s#rù:Jҹ*G"A7:7*A"=*9+"?*;#"=*A#"?*9#"9*;#";*9+"9*;+" Y :U/, ͆ !U6  :, ͌ *="b?b=Y *bd N *b"b5 Ñ :8Z† v ͜ v ú҃ {  Ï* *)DMZ:ʢ͐>!8 ҹÜ!: >!J*!+"!>3Ü! 6: <2 =O!6 N:# [ ʏ ͌ *":2<22j ͧ !"!4qW= F **|:4w*#"!5q:T ͛  ͌ !T6*T&  28*8Mͮ  ;9=*ò*9d :8w:8 Cͦ28:8 :#/HH/DҒ:8 !86 ͓!86  c )~ [ͳ c { !/p+q.*.DMd -´ *W"~!"!h6!|6.![\ - !: *M[ \ :;*)#")!Kq:7T?;=Q:KN*;d ~2L @*9d :LwÒ=9=Ғ*9d ~2L z*)+"):Kҏv Ñ :8ʑ ç× çv!q*&!q: !4: !6*Mͥ !q: :O>H2y !6  ͜ O:$X!$6:!-A;=;Z>͐F* , !%6  !6!:%2$t*%& 6 :%<2%=O!:5w:T<2T!h6*}+:h<2hͮ F [ͳ :?͌ d͢ |*M[ .[\ -W[ |g͢ *M[ [ .k :8Œç͓e*& :8w:<2dگò!Qs+q*;"R!U6:U/R=H(*R#"?"R:P2T*T& *?d !Q @~ { *M[ \͠ :: \ :1 ͌ U~ c ^͢ [ !:] *M[ [ a͢ [ [ !{6: ͌ !*;d :LwT  ͓:7*;"?93=!"=39="=*9"=;=3M*"?*3*;!6:! *M͵ !4 !q: [ : : H: H[ ^ :@2*M     !p+q* ! N*M[ k :ڴ͈ ʯ>!6:<2=O! N!"3>3J!"3/*3+"3>>!"+:7& A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y' A 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy 2͵ ͋ ͖ ͖ Ăy0