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 ͖ 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 yA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyURN$!BM*BA ©A#›AA*B"B ’A A A INTERPRETER NOT FOUND $ REBOOTING CP/M$ SYSTA 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 yEM.MICRO B LOADING...$*B^#V{/_z/W#^#V yxҽBKB ÿA INTERPETER TO LARGE IT WILL OVER WRITE THIS PROGRA 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ͯ ͖ (ĂyM. REASSEMBLE THIS PROGRAM WITH A HIGHER STARTING ADDRESS $BB#B))C$CL CMCC! DM#BSTA 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 y*.*.*.*.!*.$*.'JC}G> 3CKWgh>=:CJC,a$ |OC  2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y1?A@AC̈́A!"B͍ABB*." A SA HA INSERT PASAL DISK IN DRIVE A, THEN TYPE RET 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 2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y LOADING...$*B^#V{/_z/W#^#V yxҰB>B òA INTERPETER TO LARGE IT WILL OVER WRITE THIS PROGRAM. REASSEMBLE 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ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (Ăy THIS PROGRAM WITH A HIGHER STARTING ADDRESS $ͷBB#·B)) CCLBMCC! DM#BST*.*.*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 yL TRACK ; L-REG HAS PHYSICAL SECTOR ; ; PUSH B PUSH D ; CALL DIV26 MOV A,L ADD A MOV B,A MVI A,12 CMP L  2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y.*.!*.$*.'=C}G> &CKWgh>=-C=C,a$ |BC  2͵ ͋ ͖ ͖ Ăy0 ͖ 2ͯ 1 'd ! ^#V#*0}o|g*  ":D x=D y12A3ABwA!"B̀AAB*." FA ;A INSERT PASAL DISK IN DRIVE A, THEN TYPE RETURN$!ͷBA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyJNC MAPC INR B MAPC: MOV C,E XRA A MOV D,A MOV H,A MOV L,B MVI A,6 MAP$LOOP: DAD D DCR A JNZ MAP$LOOP PUA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyA 2 ͠ ͻ ͵ ͠ ͖ 8{ Ăy0 2͵ ͖ Gͻ ͋ ͖ 1ͻ ͯ 2ͯ ͖ (ĂyM*BA œA#ŽAA*B"B …A A A INTERPRETER NOT FOUND $ REBOOTING CP/M$ SYSTEM.MICRO B+ SH B CALL DIV26 POP B INR L MOV H,C INR H POP D POP B RET ; ; DIV26: LXI B,-26 MVI E,0FFH DIVL: INR E  LIBX$$$$$$$LIB>!Zڢ8 ғú>U:Z<2Z€!76!"39=ò!86 !86 !&6*8M͢2[*8M28:[/!9"p1!j>w#2f2g2h!j_w:F:og,w>_ - FOCO - $I ÊCP/M FAST FORMAT-COPY  y=!z{w# % w!P͠ y͓}*w#"͌ @.@<!Eͷ~P  DAD B MOV A,H ORA A JP DIVL LXI B,26 DAD B RET ; ; END START 19B]Æ*.*.*.*.!*.$*.'*.*   ͔ 2ͦͶ ^͔ rͦ !'+w!&6ͦ28!\q!\:8:H:H!]q*]Myc *]Mͥ j ͜ Oͺ2]c :]Yv>>:8UTILITY $j øCOPYRIGHT OCT 1978 BY S J SINGER $  *$ >2a1!s#  >> 2`2b2]2^2_:T2U/H%:T<2T*?#"?:U9*?+"?͓:U!6e:2*Ͱ/]Ü*8Mͺ:<2=O! Hq*+*)!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷi ͦYy7 ¦ 'K!-! DM 'K!3!02_O> /!"3|Ҷ*3)))*3) *_& "3Ñ)3=!76)3=+s#r!763)="3DM!>2e2x?G #-#  7!@BGNOVALO>2b!@_dRETRYro<2`!@DMZ!#6:7¦!"+*9"Vì*="V*V+d ~2X :Hc *="V?V=:X y*+#"+8 Ü*V͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEË DM Pgen Version 1.0 $ Get Booter?(y/n)$ Reading Booter from drive A, type return $ Put Booter?(y/n)$ Writing Boot))덑o|g =^#V) ^#V|g}o '_{ozgi`N#Fogo&og H X=WMAP!@ÜCOPY!@óFORM !@VALIDQ* ͜ ͜ y2d2n2]<2o! !d ~2XO *V"V!"3*3"5*5"3"͟:72Y!76͇:Y27?=>=JHwz)!Z6C–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# er to drive A, type return $ Again?(y/n)$ Rebooting CP/M, type return $,  !@NOFILL">2^!@27NOVER?>2]!@OSFORM[>2_H!@nrCOPY~!# uS$u  ê VALIDATION ERROR DRIVE $   HARD ERROR$   THERE WAS 1 RETRY$  M H! 2hE DISK $Y s æ COPYING $ :_FORMAT FROM $ ɯ2S!2hH2S:h:S!b   ! y2 2~2 ~21 $* : IM *X $R : pM *Ç :n͈:o͈:22:n!o LOAD SOURCE DISK, TYPE RETURN $ :n͈:G:dO! x2S: FORMAT, SECTOR NO TO CORRECT $  !s# .  >:~ s WRITING NON STANDARD FORMAT ON DISK $I  e !u4ʦ y*Ìy2n!@üTO4*2o!n4 SOURCE AND DESTINATION DRIVE ARE THE SAME $!@  SKEW2 !@' + SPEC 5 $1  W STANDARD IBM FORMAT $@  ! !@u { OFFSET҄  SECTOR FORMAT DRIVE $ :h/ TRACK $' *SC $@ s !]2h>2S!@rwUSING҃ͥ $y : M *î $ : M *# ͈:O!.> ! >ͮx2:o!naN LOAD DESTINATION DISK, TYPE RETURN $( :o͈:G:dO !x2S:2Î $   PHYSICAL LOGICAL SECTOR SECTOR $  * $  !s#  >! )IS THIS WHAT YOU WANT? (Y/N) $  ͗@DISK $: :n[ TO DISK $Q :o:_½!@Å2eí INSERT DISK TO BE FORMATTED IN DRIVE $  :h TYPE CARRIAGE RETURN $  :h:2S:bÃ2S:h͈:S!:S âb2W2Y2S͈:S :SL<2S>!ͮ!ͤï:W  SUCCESSFUL VALIDATION DRIVE >>>y~#>`>>ʞ ʗ! >ͮrx2àò COPY COMPLETE$ 2S!@USINGͥ2S:n͈!:Sb:o2h!~ n !G:_+ps q# ' 2c!s# ? !:cWx[ ʢ>>â :>Y!>+|ͤ:e!ͮ!OVVV# 9 FORMAT READ FROM SOURCE DISK$ s K $G e ÉINCORRECT SECTOR NUMBER READ FROM SOURC SECTOR MAPPING $v   PHYSICAL LOGICAL PHYSICAL LOGICAL $   SECTOR SECTOR SECTOR SECTOR $*.  |{0__:!SE THRU $> *s TYPE RETURN TO BEGIN COPY $V  $  : M *ï $  !s# ¾  >!nu w# u s  TYPE RETURN TO-  :f:a*p; PREMANENT DISK ERROR ON DRIVE $ :h\QB $M cA $_ ê ERROR -É-ҕͥ2:ɯ}o|g ʼY@y yA:B:C:Y<2Y:[=2[lü PERMANENT WRITE ERROR TRACK $ Â~2U# ~2Uͤ~2Ud# @SECTOR,!@')S 5ͮ} 2324" @OP-uͮ} 24!3oG~24pB* @ ڎ>  ŽGxʰ!j:g_w ERROR IN HOMING DRIVE $ :g:`2[:`!9";1U2.2/:,:og,ʿw$R CP/M DUMP UTILITY (AUG 5 1978) $/ ~COPYRIGHT 1978 BY S. J. SINGER $] SECTOR NUMBERS MUST BE GREATER THAN ZERO$v  ERROR - SECTOR GREATER THAN 26$ 7!# SORRY YO:D:A_B ERROR - DRIVE NUMBER GREATER THAN 3 $  $ $22!@~2UYͤ:]^~2U# ^P VALIDATING DESTINATION DISK $/ :oÆ! >}w#p!jÉEDIToBÜ EDIT - $ !s# « >!WRITE!STOP! 02[:U"xw#:Y<2Y:[=2[<*:^V*>w# MYz PERMANENT READ ERROR TRACK $\  Í *$ >2-1U27!" !s# ® >!\!s# !̈́2/x~# !@ x?G U ALREADY USED THAT ONE$ #U MISSING OPERAND, PLEASE START OVER $- Ú ERROR IN ENTERING DECIMAL É-ҕͥ2:ɯ}o|Y@y yA:B:C>2R~ʒ#È#~2S##~:R=ʪ2R È!Gw>+#ùO!g~_!jwy_!j~y͈y2gy O)))) }'.$|1}$"  YKƐ'@'_: B: B * ~B *SÔ SECTOR $ *Uí DRIVE $ :g!W4>ͤ:`2[:`2[:U"xO#:Y<2Y:[= ## 7!@08VALIDATEڵ!@KPGROUP !@ceG !@x{MAP7 !NUMBER, PLEASE START OVER$c M TRACT NUMBER MUST BE BETWEEN 0-76 $ !7# :D:A_B ERRO/2i@u*=0 ?))) O &"}`2>L2!@diTRACKҕͥ22!@!s# ‡ >}ҫ.C:ʻ}* w : <2 ?!" ͎Ï!T !2[*!D PERMANENT VERIFY 0R READ CRC ERROR TRACK $ Â:`2[l:`2[:Uxt@ÓTRACKګ!@èT Eø~!# îͮ0 ?))) O } 22!@FORMAT !$ _Gʄ{'>ʄ D͈$\ SEEK ERROR TRACK $H s DRIVE $k :gFE02 CPI ZCOL-1 ; ZERO COLUMN IF NECESSARY JRNZ YC1 FA81+2002 DB 20H,YC1-$-1 FA83 AF . TRACK 4ͮ} 21!(*S G!=DSECTOR 4ͮ} 20!̈́b2/i $e æCAUTION - TH$S  :/͵ * ñ $  ~ 0$  :8<28 1$  x y z$p  :5!oà SECTOR $  !:6o >27y :2M? O*."  :/_!w> w# "[HIS INIT ROUTINE INTERP$BASE EQU 100H ;FIRST LOC USED BY THE INTERPRETER PBEGIN EQU INTERP$BASE+100H;ENTRY TO THE PASCAL BOO~ w# …!\He!òCOM»!" :/_\z \ :._:-nÆT, AND EXECUTION ; IS STARTED AT THE SYSTEM.PASCAL BOOT VECTOR. ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTERIS COMMAND MOVES A SECTOR ON THE DISK$t  DO YOU WANT TO CONTINUE (Y/N) $ Y!w:07 ? O* " ¿ #¼  Ü 3 $%  *8k GROUPS REMAINING ON DISK OUT OF 243 $D  :/:/! DRIVE $  :/͵: TRACK $2  !:2o *[!w: B: Br $o  ~TER FIRSTSP EQU INTERP$BASE+103H DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES DTITLE EQU 06H ;OFFSET TO ENTRY TITLE DIRTOP E!" * : B: B $ ~B #y L  ) * ~l n>._#y ‹ SYSTEMS, INC. ; ;MODIFIED ; 10/11/78 BY WINK SAVILLE OF SVA TO READ ANY SIZE INTERPETER ; ;MODIFIED ; ; 11/8/78 BY S.!":1M?O*.":/_!w*.*"=y :37_?_O*.!"] :2M?wO*."u :/__25<26:67ʩ ?ک O*.!" :5M?ھ O*." *." *.'" INPUT ERROR$   INCORRECT B y £  z# }   * " [  ͮ} 28 @ 29y  ESECTOR NUMBER$  5 INCORRECT TRACK NUMBER$  o INCORRECT GROUP NUMBER (GREATER THAN 242)$C  :/±  _  * " * " >2625:/_:5M?O*." :67?O*.!" *.. J. SINGER TO INITIALIZE 8251 (IMSAI SIO-2) AND DIABLO PRINTER ; BOOT EQU 0H ;LOCATION OF CP/M BOOT VECTOR BIOS$PAGE EQU 2*.'"é DRIVE $ :/͵ - TRACK $ !:2o  |{0__MSIZE EQU 59 ;SYSTEM SIZE IN KILOBYTES BIOSSZ EQU 1536 ; BIOS SIZE IN BYTES ; ; ; PINIT FIRST READS IN AND SCANS THE DIR:9<29 &:8oT))):9_><# w22~2324:/_`o" !"8Á GROUP ALLOCATION MAP DRIVE -  æ NO FILE BY THAT NAME ON DRIVE A$   NO FILE BY THAT NAME ON DRIVE B$   DISK DEAD ERROR$  n'" m :626<26:523>24BÔ6# > w# P cY .xw# c7yʃ# ECTORY FOR THE 8080/ ; Z80 INTERPRETER (SYSTEM.MICRO). THEN THE INTERPRETER IS ; LOADED INTO MEMORY, THE BIOS PAGE POINTER SE/  ERROR IN FILE NAME$ 8 ADDRESS ERROR$' Ïc ERROR - HEX INPUT ONLY $F ? :._*. DCR A ;DECREMENT COUNT. JNZ WRETRY ;TRY TO WRITE AGAIN. WERR0: LXI H,WTMSG ;PRINT "WRITE ". IF NOT VDM ;IF NOT PR;WAIT FOR READY. ORA A ;SET FLAGS. JP WDONE ;HOP OUT WHEN DONE. MOV A,M ;GET BYTE FROM MEM. OUT DDATA ;WRITE ONTOHERE, GO DUMB E287 C387E2 JMP FI$HANG ;ADD CODE TO SEND A MESSAGE TO CONOUT FI$FOUND:  0 FB10 CDC0FB XR2: CALL CONOUT DJNZ XR2 ; FORWARD SPACE TILL BACK TO ORIG POSITION FB13+10FB DB70 13 INX D ;HEY, WE'VE STILL GOT A CHANCE E271 23 INX H E272 05 DCR B ;IS THIS THE END OF THE STR;@ڨyʨ ÌyA:B:C:D:A_ ERROR - DRIVE NUMBER GREATER THAN 3 $  $INTERP: ;FIND 'SYSTEM.MICRO' E25D 0E4D MVI C,77 ;STOP AFTER THE 77'TH ENTRY E25F 2AF1E2 LHLD DENTP ;GET START DISK. INX H ;INCREMENT MEM PTR. JMP WLOOP ;KEEP WRITING. WDONE: IN DSTAT ;READ DISK STATUS. IF INTRP ;IF INTERRU ;WE'VE GOT IT E28A C9 RET ; 000C = LENGTH EQU 12 ;TITLE LENGTH E28B 0C53595354SYSTLE DCHANGE IT BACK. IF INTRP ;IF INTERRPUTS ALLOWED, DI ;DISABLE THEM HERE. ENDIF IN DSTAT ;GET 1771 STATUS. ANI ING E273 C26BE2 JNZ FI$CMP$LP E276 C38AE2 JMP FI$FOUND ;I THINK WE FOUND IT FI$CONT: E279 2AF1E2$ $ $ FILE NAME$ 8 ADÏc ERROR - HEX     ING ENTRY FI$SCH$LP: E262 110600 LXI D,DTITLE ;ADVANCE TO TITLE STRING E265 19 DAD D E266 118PTS ALLOWED, EI ;ENABLE AGAIN HERE. ENDIF ANI 0FDH ;LOOK AT THESE BITS. PROCER: RZ ;RETURN IF NO ERR. CALL ERCHK ;B LENGTH,'SYSTEM.MICRO' ; ; READ$INTERP: ;PUT INTERP IN ITS PLACE E298 2A20H ;CHECK FOR HEAD LOAD. LDA SECT ;GET SECTOR NUMBER. WRITE1: OUT SECTP ;SET THE SECTOR INTO 1771. MVI A,0ACH ;SET UP 1 LHLD DENTP ;ON TO THE NEXT ENTRY E27C 111A00 LXI D,DENTSZ E27F 19 DAD D E280 22F1E2 SHLD DENTP E28,0DH FB07 CDC0FB CALL CONOUT ; REPOSITION CURSOR ON ORIGINAL LINE FB0A 0E0C MVI C,RIGHT ; FORWARD SPACE FB0C 4BE2 LXI D,SYSTLE ;SET DE-REG TO COMPARISON STRING E269 060D MVI B,LENGTH+1 ;COMPARISON LENGTH FI$CMCHECK/CORRECT SEEK ERR. LXI H,WECNT ;GET ADR OF WRITE ERR CTR. INR M ;ONE MORE WRITE ERROR. LDA ERCNT ;GET ERROR COUNTF1E2 LHLD DENTP ;GET STARTING BLOCK E29B 5E MOV E,M ; INTO HL-REG E29C 23 INX H E29D 56 MOV771 FOR WRITE. JZ WRITE2 ;HEAD IS NOT LOADED. MVI A,0A8H ;CODE FOR WRITE W/O HD LD. WRITE2: OUT DCOM WLOOP: IN WAIT 3 0D DCR C ;WAIT, IS THERE ANY DIR LEFT? E284 C262E2 JNZ FI$SCH$LP FI$HANG: ;INTERPRETER NOT T3 MOV B,E ; COL POSITION TO B FB0D 78 MOV A,B FB0E B7 ORA A FB0F C8 RZ ; EXIT IF AT COLP$LP: ;START COMPARING E26B 1A LDAX D E26C BE CMP M E26D C279E2 JNZ FI$CONT ;IT'S NOT THIS ONE E20  D,M ; ; COMPUTE LENGTH OF INTERPETER E29E D5 PUSH D ;SAVE FIRST BLOCK ON STACK  ; SO MULT LOGICAL BLOCK BY 4 TO GET 1ST SEC E2C6 1E04 MVI E,4 RR$LP: ;THIS GETS CONFUSING E2C8 CCK COUNT E2B8 E5 PUSH H ;AND BLOCK NUMBER E2B9 CDC4E2 CALL READ$RX ;BUFFER IS ADVANCED BY 512 BYTES E2BC E1  ; ; MAP: ;TURN LSN INTO IBM TRACK-SECTOR ; ; NOTE: TRA; E2AC D1 POP D ;HL=NXT BLOCK,DE=-(FIRST BLOCK) ;SO HL+DE=LENGTH OF SYSTEM.MICRO E2AD 19 EAD THE DATA E2E0 E1 POP H E2E1 D1 POP D E2E2 C1 POP B E2E3 E5 PUSH H ;ADVANCE THE BUFF ;TAKE 2'S COMPLIMENT OF FIRST BLOCK E29F 7B MOV A,E E2A0 2F CMA E2A1 5F MOV E,A 5 PUSH B ;SET BUFFER ADDRESS E2C9 D5 PUSH D E2CA E5 PUSH H E2CB CD24E6 CALL SETDMA E2CE E1  POP H E2BD D1 POP D E2BE 23 INX H ;ADVANCE TO NEXT BLOCK E2BF 1D DCR E ;BUT, BEFORE WE GCK 00 IS NOT USED SO BLOCK 0 ; IS AT TRACK 01 SECTOR 1 ; ; ON ENTRY: HL-REG  DAD D ;HL=LENGTH E2AE EB XCHG ;DE=LENGTH E2AF E1 POP H ;HL=FIRST BLOCK , DE=LENGTH E2B0 010001 LXI BER ADDRESS E2E4 218000 LXI H,128 E2E7 09 DAD B E2E8 44 MOV B,H E2E9 4D MOV C,L E2EA E1  E2A2 7A MOV A,D E2A3 2F CMA E2A4 57 MOV D,A E2A5 13 INX D ;DE=2'S COMP OF FIRST BLOCK  POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR E2CF E5 PUSH H E2D0 CDF3E2 CALL MAP ;MAP CONVERTS LOGICAL SECO ON E2C0 C2B7E2 JNZ SYSRD ; SEE IF WE'RE DONE E2C3 C9 RET ; ; HAS LOGICAL SECTOR NO. ; ON EXIT: H-REG HAS PHYSICAL TRACK ; L-REG HAS PHYSICAL SECTOR ,INTERP$BASE ;AND SET IT LOAD POINT E2B3 CDB7E2 CALL SYSRD ;THEN READ IT E2B6 C9 RET ;  POP H E2EB 23 INX H ;ADVANCE BLOCK COUNT E2EC 1D DCR E ;THEN SEE IF WE CONTINUE E2ED C2C8E2 JNZ E2A6 D5 PUSH D ;SAVE ON THE STACK ;GET NEXT AVAIL BLOCK E2A7 23 TOR IN HL-REG E2D3 4C MOV C,H ; INTO PHYSICAL TRACK, H-REG, SECTOR, L-REG E2D4 E5 PUSH H E2D5 CD1EE6  READ$RX: ;READ A PASCAL BLOCK E2C4 29 DAD H ;THERE ARE 4 IBM SECTORS TO A PASCAL BLOCK E2C5 29 DAD H  ; ; E2F3 C5 PUSH B E2F4 D5 PUSH D ; E2F5 CD19E3 CALL DI ; ; SYSRD: ;READ BLOCKS FROM PASCAL DISKETTE E2B7 D5 PUSH D ;SAVE BLO RR$LP E2F0 C9 RET ;LEAVE, WHEN DONE ; ; E2F1 DENTP DS 2  INX H E2A8 5E MOV E,M E2A9 23 INX H E2AA 56 MOV D,M E2AB EB XCHG  CALL SETTRK E2D8 E1 POP H E2D9 4D MOV C,L E2DA CD21E6 CALL SETSEC E2DD CD27E6 CALL READ ;AND R1 V26 E2F8 7D MOV A,L E2F9 87 ADD A E2FA 47 MOV B,A E2FB 3E0C MVI A,12 E2FD BD CMP E317 C1 POP B E318 C9 RET ; ; DIV26: E319 01E6FF L ; ; MOVE DISK TO TRACK ZERO. ; FBCA 3E0A H LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VOLUME NAME DAD D SHLD DENTP ; CALL FIND$INTERP ;THEN FIND THE INTERPRETER CA387E2C90C5359535432 :10E29000454D2E4D4943524F2AF1E25E2356D57B20 :10E2A0002F5F7A2F5713D5235E2356EBD119EBE15D :10E2B000010001CD0002 BIOSPAGE E600 BIOS 0600 BIOSSZ 0000 BOOT E2F1 DENTP 001A DENTSZ D200 DIRTOP E319 DIV26 E31E DIVL 0006 DTITLE E26B FICMPLP L E2FE D202E3 JNC MAPC E301 04 INR B MAPC: E302 4B MOV C,E E303 AF XRA A XI B,-26 E31C 1EFF MVI E,0FFH DIVL: E31E 1C INR E E31F 09 DAD B E320 7C M E304 57 MOV D,A E305 67 MOV H,A E306 68 MOV L,B E307 3E06 MVI A,6 MAP$LOOPLL READ$INTERP ; AND READ IT IN ; MVI A,JMP ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL STA BOOT ; SYSTEM 'H(ALT' COMMAND B7E2C9D5E5CDC4E2E1D1231D0E :10E2C000C2B7E2C929291E04C5D5E5CD24E6E1E59A :10E2D000CDF3E24CE5CD1EE6E14DCD21E6CD27E6BE :10E2E000E E279 FICONT E28A FIFOUND E287 FIHANG E25D FINDINTERP 0203 FIRSTSP E262 FISCHLP E618 HOME E200 IBASE E22F INITIO 0100 INTERPBA:10E20000310001CD2FE20100D2CD54E22100D21124 :10E210001A001922F1E2CD5DE2CD98E23EC3320050 :10E22000002103E62201002E00220302C3000OV A,H E321 B7 ORA A E322 F21EE3 JP DIVL E325 011A00 LXI B,26 E328 09 DAD B E329 C9 RE: E309 19 DAD D E30A 3D DCR A E30B C209E3 JNZ MAP$LOOP E30E C5 PUSH B E30F CD19E3 CALL LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE SHLD BOOT+1 ; FOR PROPER SYSTEM OPERATION MVI L,0 SHLD FIR1D1C1E521800009444DE1231DC2C8E20E :01E2F000C964 :10E2F300C5D5CD19E37D87473E0CBDD202E3044B60 :10E30300AF5767683E06193DC209E3C5SE 000C LENGTH E203 MAIN E2F3 MAP E302 MAPC E309 MAPLOOP 003B MSIZE 0200 PBEGIN E627 READ E254 READDIR E298 READINTERP E2C4 RE20E99 :10E2300001CD1BE6CD18E60E00CD1BE6CD18E63E5F :10E24000AAD3033E40D3033E8AD3033E37D3033ED3 :10E250008FD3EAC91E04210200CDB7T ; ; E32A END IBASE  DIV26 E312 C1 POP B E313 2C INR L E314 61 MOV H,C E315 24 INR H E316 D1 POP DSTSP ; JMP PBEGIN ;START BOOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITIALIZE SYSTEM MVI C,1 CALL SELDSK CALL HOME CD19E3C19E :10E313002C6124D1C1C901E6FF1EFF1C097CB7F2A1 :07E323001EE3011A0009C905 :00E200001E ADRX E2C8 RRLP E61B SELDSK E624 SETDMA E621 SETSEC E61E SETTRK E2B7 SYSRD E28B SYSTLE E2C90E4D2AB0 :10E26000F1E211060019118BE2060D1ABEC279E225 :10E27000132305C26BE2C38AE22AF1E2111A0019E4 :10E2800022F1E20DC262E2CTER FIRSTSP EQU INTERP$BASE+103H DENTSZ EQU 1AH ;DIR ENTRY SIZE IN BYTES DTITLE EQU 06H ;OFFSET TO ENTRY TITLE DIRTOP E2 z8O!B N#N ¾SP.* |} !9":q!"Qʅ = =Uͧᯕo>gͧ 'd 1/T!"]͘>2!".">>@>>7>!ͷM* y#kÊ*!ھ:=¢!02AO ֯~_!wy_!~y2/2گ:y2y2`i"> 2*> :>>T 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 AN2!"!"1:2z*!H" yڵì:2un!0Ð>/2@* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z zUn>#! ^#V#0}o|g- xD y0K GW yW W GD  z { < >'{>'" bÇ SYSTEM.MICRO*^#V{/_z/W#^#Vͷ#·))$LM!'! DM#:M}G> w#^!4:=!0z!;0z!F0z!X0z!]0z!h0!~0>Wgz>G{pʇA 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 ??= Ö_>2y:ׯ2_y!G*w:vط*xCCH*t:ywx ʊ_O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,! *##V+^+N+y Uͧ ʮ ~+â _ Ê x. * w#͹ ͹  * ͹ ?r# :LKWgh>= ,a$ | :L*iͯ*e}¸|¸*e; ZQ{z| }Êx:z> 2*> :>ʱ>~#ó^!4:=•!0z@!n0z !w0'G> 2OyxäìEnQ_Ð"R*"!"!""2W2N2%2T!" "e""!1!++""P>28!"9:]w}??ʽ#}??ʽ|½!@w#z§6#|±!~62y"t|gý!6#|!ý}oý@Ó6+ý*t;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qyn!Ow #w q!\ͷ  ͹ :5 @w#ͷ : G6# .̹  U ͹ I 6# W  6   w#j !ex#2FUQ2G"H"JDM1 !F6M ; "=M ͡ =M YP͡ !&~ʇ #^#V:Fʀ *{€ z€ "#~62"Ç >!4:=!W$~O #0NOT READY RECORD NOT FOUND CRC LOST DATA BUSY PROTECT FAULT ER1!x>w>>wwyWw yA yH->t>c>t>rw#e/v6}??#6#|*tý."w}2vC>2y>!ׯ !w# L>2u!0O 2:O>2!"3 ROR. RED WRITE BOOT ERROR SEEK HOME MOUNT TARBELL 55K CPM V1.4 OF 7-17-78 STANDARD VERSION. HOW MANY DISKS? ʘ>#E> <:T!Mʮ<ڮ>=_~/w/w{<=YPõ"*##F+N+~ڔ *R>7* :%9!&~#~#V*z~==2%wo:LͰ* U-~~>=!~I$H D   "@DD"@ H " "BI$!$  @HHBI!$$ H  ! @AA@H@Hy Uͅ>:|E}Eҹ >.*g}o|/+- , 0 ^#V#*Ny/o>g{z<339E5DAA093 :10EA00F20CB10E1CDAA10FE20DA850EC3A63F :100EB0000E2A060@1E002BCDAA10FE09CA_9o!=Ͱ* *͐ * :F9*JMD*H:G7* U͢!"P 2%>**͖ \" m*"e  PASS !T~*U+"U|TTRK EQU BIOS+1EH ;SET TRACK SETSEC EQU BIOS+21H ;SET SECTOR SETDMA EQU BIOS+24H ;SET DATA TRANSFER AREA READ EQU BIOS+27EͧU!#x 0Ͱ͖ P*" !6x+"g*~E#;xt^#Vnx~E*~GBD@@BI@$ $HBD!B HI$$$"$ D$"I $I$D$B" @@@D@"!B""D"*k*m ! ;+;  ;4D#^#V"m"k~/o>g++!.@l^#V={^'ŸD40EFE73 :100EC0000DCAD40EFE21DAE110771C7BFE10D2E1B0 :100ED00010C3B60ED5E5EB2A0600235E2356E17259 :10 @!!BH @@ˆw=2%~ !~##ʞ‘Z:"*#w2"*F#͋!Os!^#V  /``]]S`Ncc::^#V#H ;READ SECTOR TO DATA AREA ; ; ; ORG IBASE ; ; LXI SP,100H MAIN: ;LET'S BOOT SYSTEM.MICRO CALL INIT$IO ;RESET Ixü@¬xvx80x64ʼ5>=*~E*x**:L}CZMEIABDHS@$D$$ HBH!@ DHDIHI!$"D!"D I$I "D @B$$@B$ $$  'š 'S_Á#0 )DM)) O ä^*^#V#^))))o" s#r#!^4-ABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HI*^#V>ecx'g8_c*c:O?*###c>e><7*P|ʘ!ON*!/O SYSTEM ; LXI B,DIRTOP ;READ THE DIRECTORY INTO DIRTOP CALL READ$DIR ; LXI H,DIRTOP ;SET THE DIRECTORY ENTRY POINTER P!"U2T"+"!91*~:"2F!B~M#^#V#~ @͢!W~6p=G#^#V#~x_ʔ#"!N#F$$$I"I$! !$I@!B B"D$!D $I$ /+* T+,T -Ty_xW!M6WT6!^6# ʖ,o>2^r ʖ$H$! $I $I$I $H @@$"UUUUUU@H"H$I$IDBI$H!$HI$$DH4  LXI D,DENTSZ ; TO FIRST ENTRY AFTER THE VOLUME NAME DAD D SHLD DENTP ; CALL FIND$INTERP ;THEN FIND THE INTERPRETER CAMOV A,D ;GET ERROR BITS. ANI 20H ;LOOK AT BIT 5. LXI H,WFMSG ;PRINT "FAULT ". CNZ PMSG JMP ERMSG1 ;DO COMMON MESSAG: LXI SP,100H BOOT1: LXI B,2 MVI D,NSECTS LXI H,LOADP ;STARTING LOAD ADDR FOR PROGRAM RBLK MOV A,B  JMP RBLK1 ; ; READ1: OUT SECT IN DSTAT RRC MVI A,1 JC RERR MVIJ. SINGER ; THE PROGRAM RUNS AT 0H AND LOADS 20 SECTORS FROM THE DISK ; STARTING WITH SECTOR 2. (SECTORS 2 - 21) ; THE STARTIRSCI ;IF NOT PERSCI DRIVE, OUT DDATA ;TRACK TO DATA REGISTER. BUSY: IN DSTAT ;READ DISK STATUS. RRC ;LOOK AT BIT 0. LL READ$INTERP ; AND READ IT IN ; MVI A,JMP ;SET VECTOR TO BIOS ENTRY FOR THE PASCAL STA BOOT ; SYSTEM 'H(ALT' COMMAND ES. ENDIF IF VDM ;IF PROC TECH VDM, JMP ERMSG ENDIF ; ; MOVE THE HEAD TO THE TRACK IN REGISTER A. ; SEEK: PUS OUT DDATA IN DSTAT RRC MVI A,1 JC ERROR MVI A,13H OUT DCOM  A,88H JMP READE ; READ: OUT SECT IN DSTAT RRC MVI A,1 JC RERR NG LOAD POINT IS 0D600H FOR A 55K SYSTEM. ; THE LOADER JUMPS TO 0D600H ON COMPLETION OF LOAD. ; ; MSIZE EQU 55 ;MEMORY SIZJC BUSY ;WAIT TILL NOT BUSY. MVI A,10H+STPRAT ;SET STEP RATE. ORI 4 ;VERIFY ON LAST TRACK. OUT DCOM ;ISSUE SEEK COM LXI H,BIOS+03H ;NOTE: LOC 2 MUST HAVE CURRENT BIOS PAGE SHLD BOOT+1 ; FOR PROPER SYSTEM OPERATION MVI L,0 SHLD FIRH B ;SAVE B&C. MOV B,A ;SAVE DESTINATION TRACK. MVI A,RTCNT ;GET RETRY COUNT. SRETRY: STA SERCNT ;STORE IN ERROR COUNTE IN WAIT ORA A MVI A,1 JM ERROR IN DSTAT ANI 91H JNZ ERROR MVI A,8CH READE: OUT DCOM RLOOP: IN WAIT ORA A JP RDONE IN DDATA MOV M,A E IN DECIMAL KB. DCOM EQU 0F8H DSTAT EQU 0F8H TRACK EQU 0F9H SECT EQU 0FAH DDATA EQU 0FBH WAIT EQU 0F MOV A,C CALL READ RBLK1: JNZ ERROR DCR D HALT: JZ LOADP INR C MOV A,C STSP ; JMP PBEGIN ;START BOOTING SYSTEM.PASCAL ; ; ; INIT$IO: ;INITIALIZE SYSTEM MVI C,1 CALL SELDSK CALL HOME R. IN TRACK ;READ PRESENT TRACK NO. MOV C,A ;SAVE IN C. MOV A,C ;DELAY. CMP B ;SAME AS NEW TRACK NO.? MOV A,B ;OC TECH VDM, CALL PMSG MOV A,D ;GET ERROR BITS. ANI 40H ;LOOK AT BIT 6. LXI H,WPMSG ;PRINT "PROTECT ". CNZ PMSG  INX H JMP RLOOP ; RDONE: IN DSTAT RERR: ANI 9DH RET ; ; ERROR: CMA OUT 0FFH CH BIOSSZ EQU 1536 ;12 SECTORS LOADP EQU MSIZE*1024-BIOSSZ-1024 NSECTS EQU 20 ;NUMBER OF SECTORS. ORG 0 BOOT CPI 27 JC RBLK2 MVI C,1 INR B JMP RBLK ; RBLK2: MOV A,C CALL READ1; PASCAL BOOT LOADER ; ; THIS IS A MODIFICATION OF TARBELL'S CP/M COLD START LOADER ; FOR USE WITH PASCAL 1-AUG-1978 BY S. RESTORE A FROM B. JNZ NOTHR ;JUMP IF NOT THERE. THERE: POP B ;RESTORE B&C. RET ;RETURN FROM SEEK. NOTHR: IF NOT PE5  HLT ; ; ORG 7DH JMP 0 END SY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC. ; ; 0000 = BOOT EQU 0 0005 = B CPI 27 0038 DA4100 JC RBLK2 003B 0E01 MVI C,1 003D 04 INR B 003E C30 DSTAT 005B 0F RRC 005C 3E01 MVI A,1 005E DA7400 JC RERR 0061 3E8C  OUT DCOM 001A DBFC IN WAIT 001C B7 ORA A 001D 3E01 MVI A,1 001F FA770B00 JMP RBLK ; 0041 79 RBLK2: MOV A,C 0042 CD4800 CALL READ1 0045 C32D00 &C TO H&L. FC48 69 MOV L,C FC49 22BFFF SHLD DMAADD ;PUT AT DMA ADR ADDRESS. FC4C C9 DOS EQU 5 0001 = RDCON EQU 1 0009 = WRBUF EQU 9 0900 = START EQU 900H 1380 = ENDPT EQU S 0600 = BIOSSZ EQU 1536 ; 0100 = TPA EQU 100H ; ;  MVI A,8CH 0063 D3F8 READE: OUT DCOM 0065 DBFC RLOOP: IN WAIT 0067 B7 ORA A 0068 F27200 JM ERROR 0022 DBF8 IN DSTAT 0024 E691 ANI 91H 0026 C27700 JNZ ERRO JMP RBLK1 ; ; 0048 D3FA READ1: OUT SECT 004A DBF8 IN DS BOOT1: LXI B,2 0006 1614 MVI D,NSECTS 0008 2100E2 LXI H,LOADP ;STARTING LOAD ADDR FOR PROGRAM 000TART+128+256+768+BIOSSZ ;BOOT+PINIT+SPARE+BIOS 0015 = NSECTS EQU (ENDPT-START)/128 0001 = FSTSCT EQU 1  ; PASCAL BOOT MAINTENCE PROGRAM ; ; BOOTER MAY BE READ IN FROM CURRENT PASCAL DISK A0 JP RDONE 006B DBFB IN DDATA 006D 77 MOV M,A 006E 23 INX H R 0029 79 MOV A,C 002A CD5700 CALL READ 002D C27700 RBLK1: JNZ ERROR 0030 15 TAT 004C 0F RRC 004D 3E01 MVI A,1 004F DA7400 JC RERR 0052 3E88 MB 78 RBLK MOV A,B 000C D3FB OUT DDATA 000E DBF8 IN DSTAT 0010 0F RR ; 000D = CR EQU 0DH 000A = LF EQU 0AH 0024 = EOM EQU '$' ; ND MOVED ; ONTO ANY NUMBER OF NEW DISKETTES ; ; THIS PROGRAM PROVIDED COURTE006F C36500 JMP RLOOP ; 0072 DBF8 RDONE: IN DSTAT 0074 E69D RERR: ANI 9DH 007 DCR D 0031 CA00E2 HALT: JZ LOADP 0034 0C INR C 0035 79 MOV A,C 0036 FE1B VI A,88H 0054 C36300 JMP READE ; 0057 D3FA READ: OUT SECT 0059 DBF8 IN C 0011 3E01 MVI A,1 0013 DA7700 JC ERROR 0016 3E13 MVI A,13H 0018 D3F8  ; ; 0100 ORG TPA ; ; 0100 31CA03 LXI SP,STACK 6 MAND. IN WAIT ;WAIT FOR INTRQ. IN DSTAT ;READ STATUS. ANI 91H ;LOOK AT BITS. JZ THERE ;OK IF ZERO. ENDIF IF T H&L, JMP PMSG ;AND GET ANOTHER. ; ; CBIOS MESSAGES ; IF NOT VDM ;IF NOT PROC TECH VDM, NRMSG: DB 'NOT REA LDA ERCNT ;GET ERROR COUNT. DCR A ;DECREMENT COUNT. JNZ SRETRY ;RETRY SEK. POP B ;RESTORE B&C. LXI H,SKMSG ;PR ;SET DMA ADDRESS 0127 2A0100 LHLD BOOT+1 012A 2E24 MVI L,24H 012C E9 PCHL ; TEP UNTIL C = 0. IN WAIT ;CLEAR 1771. IN DSTAT MOV A,B ;GET DEST. TRACK. OUT TRACK ;UPDATE TRACK REG. LDA LATCH112 2E18 MVI L,18H 0114 E9 PCHL ; SELDSK: ;SELECT DISK 0115 2A0100 LH PERSCI ;IF PERSCI DRIVE, MVI A,40H ;IF CARRY = 1, JC SDIR ;STEP IN. MVI A,60H ;OTHERWISE, OUT. SDIR: OUT DCOM ;ISSUEDY ',0 RNMSG: DB 'RECORD NOT FOUND ',0 CRCMSG: DB 'CRC ',0 LDMSG: DB 'LOST DATA ',0 BSYMSG: DB 'BUSY ',0 WPMSG: DB INT "SEEK ". IN DSTAT ;READ DISK STATUS. ANI 91H ;LOOK AT ERROR BITS. MOV D,A ;PUT IN REG D. JMP ERMSG ;DO COMMON  READ: ;READ A SECTOR 012D 2A0100 LHLD BOOT+1 0130 2E27 MVI L,27H 0132 E9 PCHL  ;GET LATCH CODE. ANI 72H ;MAKE COMMAND TO OUT DCONT ;SWITCH WAIT FOR IN WAIT ;SEEK COMPLETE. LDA LATCH ;RESTORE LALD BOOT+1 0118 2E1B MVI L,1BH 011A E9 PCHL ; SETTRK: ;SET TRACK 011B 2A STEP DIRECTION. MVI A,20 ;DELAY LOOP COUNT. DLOOP: DCR A ;DECREMENT COUNTER. JNZ DLOOP MOV A,C ;GET PRESENT TRACK.  'PROTECT ',0 WFMSG: DB 'FAULT ',0 ENDIF ERRMSG: DB 'ERROR.',0 RDMSG: DB 0DH,0AH,'READ ',0 WTMSG: DB 0DH,0AH,'WERR MESSAGES. ENDIF ; ; PRINT THE MESSAGE AT H&L UNTIL A ZERO. ; PMSG: MOV A,M ;GET A CHARACTER. ORA A RITE ',0 BTMSG: DB 'BOOT ERROR',0 SKMSG: DB 0DH,0AH,'SEEK ',0 HEMSG: DB 0DH,0AH,'HOME ',0 MNTMSG: DB 0DH,0AH,'MOUNT TCH TO OUT DCONT ;OLD CODE. XRA A ;MAKE GOOD RETURN. POP B ;RESTORE B&C. RET ENDIF IF NOT PERSCI ;IF NOT PER0100 LHLD BOOT+1 011E 2E1E MVI L,1EH 0120 E9 PCHL ; SETSEC: ;SET SECT SUB B ;FIGURE TRACKS TO STEP. JP STEP ;IF NEGATIVE, CMA ;FIGURE THE INR A ;TWO'S COMPLEMENT. STEP: MOV C,A ;GET MAIN: 0103 CD3901 CALL SAY$TITLE 0106 CD4201 CALL GET$BOOTER 0109 CD5D01 CALL PUT$BOOTER 010C C3;IF IT'S ZERO, RZ ;RETURN. MOV C,A ;OTHERWISE, CALL CONOT ;PRINT IT. INX H ;INCREMEN',0 SMSG: DB 0DH,0AH,'TARBELL ' DB MSIZE/10+'0',MSIZE MOD 10 + '0' DB 'K CPM V1.4 OF 7-17-78' DB 0DH,0AH IF STSCI DRIVE, PUSH H ;SAVE H&L. LXI H,SECNT ;GET ADR OF SEEK ERR CTR. INR M ;ONE MORE SEEK ERROR. POP H ;RESTORE H&L.OR 0121 2A0100 LHLD BOOT+1 0124 2E21 MVI L,21H 0126 E9 PCHL ; SETDMA: DIFFERENCE. MVI A,1 ;PERSCI STEP COMMAND. STEP1: OUT DCONT ;STEP PERSCI (E-14). DCR C ;COUNT THE STEP. JNZ STEP1 ;S8601 JMP REBOOT ; ; HOME: ;HOME DISK 010F 2A0100 LHLD BOOT+1 07 D ;IF STANDARD I/O, DB 'STANDARD ' ENDIF IF SPLER ;IF SPOOLER INSTALLED, DB 'SPOOLER ' ENDIF IF MSIO2 ;IG JNZ FI$CMP$LP JMP FI$FOUND ;I THINK WE FOUND IT FI$CONT: LHLD DENTP ;ON TO THE NEXT ENTRY LXI D,DENTSZ DAD D SHLIS 4 BLOCKS LONG LXI H,2 ;AND STARTS AT BLOCK #2 CALL SYSRD ;GO GET IT RET ; ; FIND$INTERP: ;FIND 'SYSTEM.MICRO'  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 ONNG DEVICE. ; LIST: IF LNULL AND NOT VDM MVI A,0DH ;IF IT'S A CR, CMP C ;THEN HOP OUT TO JZ LINUL ;NULL ROUTINE. A 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 BLOCKF MITS 2SIO, DB '2SIO ' ENDIF IF ISIO2 ;IF IMSAI SIO-2, DB 'SIO-2 ' ENDIF IF TUART ;IF TUART, DB 'TUARTD DENTP DCR C ;WAIT, IS THERE ANY DIR LEFT? JNZ FI$SCH$LP FI$HANG: ;INTERPRETER NOT THERE, GO DUMB JMP FI$HANG ;ADD CMVI C,77 ;STOP AFTER THE 77'TH ENTRY LHLD DENTP ;GET STARTING ENTRY FI$SCH$LP: LXI D,DTITLE ;ADVANCE TO TITLE STRING DA JNZ SYSRD ; SEE IF WE'RE DONE RET ; ; READ$RX: ;READ A PASCAL BLOCK DAD H ;THERE ARE 4 IBM SECTORS TO A PASCAL BL MVI C,0 CALL SELDSK CALL HOME ; ; ;INITIALIZE 8251 AND DIABLO PRINTER ; MVI A,0AAH OUT 3 MVI A,40H OUT 3 MV 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 ' ENDIF IF SOLOS ;IF PROC TECH SOLOS, DB 'SOLOS ' ENDIF IF VDM ;IF PROC TECH VDM, DB 'VDM ' ENDIF IODE TO SEND A MESSAGE TO CONOUT FI$FOUND: ;WE'VE GOT IT RET ; LENGTH EQU 12 ;TITLE LENGTH SYSTLE DB LENGTH,'SYSTEM.MID D LXI D,SYSTLE ;SET DE-REG TO COMPARISON STRING MVI B,LENGTH+1 ;COMPARISON LENGTH FI$CMP$LP: ;START COMPARING LDAX D 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 ADDRESI A,08AH ;1 STOP BIT, NO PARITY, 7 DATA BITS OUT 3 MVI A,37H OUT 3 MVI A,8FH OUT 0EAH ;RESET PRINTER (PORT EA) RETD D ;HL=LENGTH XCHG ;DE=LENGTH POP H ;HL=FIRST BLOCK , DE=LENGTH LXI B,INTERP$BASE ;AND SET IT LOAD POINT CALL SYSRD ;F DUBSID ;IF DOUBLE-SIDED, DB 'DOUBLE-SIDED ' ENDIF IF DUAL ;IF DUAL DRIVE, DB 'DUAL ' ENDIF IF PERSCI ;ICRO' ; ; READ$INTERP: ;PUT INTERP IN ITS PLACE LHLD DENTP ;GET STARTING BLOCK MOV E,M ; INTO HL-REG INX H MOV D, CMP M JNZ FI$CONT ;IT'S NOT THIS ONE INX D ;HEY, WE'VE STILL GOT A CHANCE INX H DCR B ;IS THIS THE END OF THE STRINS PUSH D PUSH H CALL SETDMA POP H ;NOW COMPUTE PHYSICAL TRACK-SECTOR PUSH H CALL MAP ;MAP CONVERTS LOGICAL SECTOR  ;THAT'S IT ; ; READ$DIR: ;READ DIRECTORY'S 4 BLOCKS TO BUFFER ;BUFFER ADDRESS IS ALREADY IN BC-REG MVI E,4 ;DIR THEN READ IT RET ; ; ; SYSRD: ;READ BLOCKS FROM PASCAL DISKETTE PUSH D ;SAVE BLOCK COUNT PUSH H ;AND BLOCK NUMBERF PERSCI DRIVE, DB 'PERSCI ' ENDIF DB 'VERSION.' DB 0DH,0AH,'HOW MANY DISKS? ',0 ; ; WRITE A CHARACTER ON LISTIM ; ; COMPUTE LENGTH OF INTERPETER PUSH D ;SAVE FIRST BLOCK ON STACK ;TAKE 2'S COMPLIMENT OF FIRST BLOCK MOV A,E CM8 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 J. SINGER ; THE PROGRAM RUNS AT 0H AND LOADS 20 SECTORS FROM THE DISK ; STARTING WITH SECTOR 2. (SECTORS 2 - 21) ; THE STARTI ; CLEAR TO END OF FIRST LINE LXI H,ROW ; POINT TO ROW INDEX MVI A,23 ; ROW LIMIT SUB M ; SUBTRACT ROW INDEX JZ EXIT JMP RBLK1 ; ; READ1: OUT SECT IN DSTAT RRC MVI A,1 JC RERR MVI; 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  OUT DDATA IN DSTAT RRC MVI A,1 JC ERROR MVI A,13H OUT DCOM 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 NG LOAD POINT IS 0D600H FOR A 55K SYSTEM. ; THE LOADER JUMPS TO 0D600H ON COMPLETION OF LOAD. ; ; MSIZE EQU 59 ;MEMORY SIZ0 ; EXIT IF ALREADY ON LAST ROW MOV B,A ; COUNT OF ROWS TO CLEAR MVI C,0DH ; CARRIAGE RET CALL CONOUT ; PRINT IT MOV A,88H JMP READE ; READ: OUT SECT IN DSTAT RRC MVI A,1 JC RERR 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 PO IN WAIT ORA A MVI A,1 JM ERROR IN DSTAT ANI 91H JNZ ERROR POP H INX H ;ADVANCE BLOCK COUNT DCR E ;THEN SEE IF WE CONTINUE JNZ RR$LP RET ;LEAVE, WHEN DONE ; ; DENTP DS 2 E IN DECIMAL KB. DCOM EQU 0F8H DSTAT EQU 0F8H TRACK EQU 0F9H SECT EQU 0FAH DDATA EQU 0FBH WAIT EQU 0F C,E ; SAVE COL INDEX IN C MVI E,0 ; SET COL TO ZERO CLRS2: PUSH B ; SAVE INDICES MVI C,0AH ; LINE FEED CALL CONOUT  MVI A,8CH READE: OUT DCOM RLOOP: IN WAIT ORA A JP RDONE IN DDATA MOV M,A P 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 ;  MOV A,C CALL READ RBLK1: JNZ ERROR DCR D HALT: JZ LOADP INR C MOV A,C ; ; MAP: ;TURN LSN INTO IBM TRACK-SECTOR ; ; NOTE: TRACK 00 IS NOT USED SO BLOCK 0 ; IS AT TRACK 01 SECTOR 1 ; ; ON ENCH BIOSSZ EQU 1536 ;12 SECTORS LOADP EQU MSIZE*1024-BIOSSZ-1024 NSECTS EQU 20 ;NUMBER OF SECTORS. ORG 0 BOOT; PASCAL BOOT LOADER ; ; THIS IS A MODIFICATION OF TARBELL'S CP/M COLD START LOADER ; FOR USE WITH PASCAL 1-AUG-1978 BY S.  INX H JMP RLOOP ; RDONE: IN DSTAT RERR: ANI 9DH RET ; ; ERROR: CMA OUT 0FFH  ; END IBASE  CPI 27 JC RBLK2 MVI C,1 INR B JMP RBLK ; RBLK2: MOV A,C CALL READ1TRY: HL-REG HAS LOGICAL SECTOR NO. ; ON EXIT: H-REG HAS PHYSICAL TRACK ; L-REG HAS PHYSICAL SECTOR ; ; PUSH B PUSH D : LXI SP,100H BOOT1: LXI B,2 MVI D,NSECTS LXI H,LOADP ;STARTING LOAD ADDR FOR PROGRAM RBLK MOV A,B 9  HLT ; ; ORG 7DH JMP 0 END SK NUMBER ACCORDING TO REGISTER C. ; SELDSK: MOV A,C ;GET NEW DISK NUMBER. ANI 3 ;ONLY LOOK AT 2 LSB'S. LXI H,DISKNO ;US. MOV D,A ;SAVE IN REGISTER D. ANI 4 ;LOOK AT BIT 2. JRZ HERR ;ERROR IF NOT TRK 0. MOV A,D ;GET STATUS BACK. A MVI C,0 ;GET NULL CHAR. DCR B ;DECREMENT COUNTER. JNZ LINUL1 ;DO NEXT NULL. POP B ;RESTORE B&C. MOV A,C ;RESTORESTORE IN ERROR CTR. MVI A,0D0H ;CLEAR ANY PENDING COMMAND. OUT DCOM LDA DISKNO ;GET DISK NUMBER. MOV E,A ;PUT IN D&E ENDIF LIST1: IF SPLER ;IF SPOOLER INSTALLED, CALL SPLT2 ;CALL IT. RC ENDIF IN LSTAT ;READ LISTER STATUS. LOWER CASE SWITCH XRI 20H STA ATOGL MVI A,1 ; RETURN A CONTROL A RET CONIN4: MOV C,A ; SAVE CHAR IN C CPI 61H ; LOWERGET ADR OF OLD DISK NO. CMP M ;NEW = OLD? RZ ;IF SO, RETURN. MOV A,M ;GET OLD DISK NUMBER. MOV E,A ;PUT OLD DISK NO0600 BIOSSZ 0000 BOOT 0003 BOOT1 00F8 DCOM 00FB DDATA 00F8 DSTAT 0077 ERROR 0031 HALT E200 LOADP 003B MSIZE 0014 NSECTS 000B R A. RET ;RETURN FROM LIST. ENDIF ; ; PUNCH PAPER TAPE. ; DEFAULT IS CONSOLE (TTY?). ; PUNCH: IF NOT VDM ;IF NOT PR. XRA A MOV D,A LXI H,TRTAB ;GET ADR OF TRK TABLE. DAD D ;ADD DISK NUMBER. MOV M,A ;PUT ZERO INTO TABLE. HOM ANI LRBIT ;LOOK AT READY BIT. IF RDYLO ;IF READY WHEN LOW, JNZ LIST1 ;LOOP TILL LOW. ENDIF IF RDYHI ;IF READY6 C9 RET ; ; 0077 2F ERROR: CMA 0078 D3FF OUT 0FFH . IN D&E. MVI D,0 LXI H,TRTAB ;GET ADDRESS OF TRACK TABLE. DAD D ;ADD DISK NO. TO ADDRESS. IN TRACK ;READ 1771 TRABLK 002D RBLK1 0041 RBLK2 0072 RDONE 0057 READ 0048 READ1 0063 READE 0074 RERR 0065 RLOOP 00FA SECT 00F9 TRACK 00FC WAIT OC TECH VDM, CALL CONOT ;SEND PUNCH TO CONSOLE. NOP!NOP!NOP!NOP ;SPACE FOR YOUR ROUTINE. NOP!NOP!NOP!NOP ENDIF RET E1: IN DSTAT ;READ DISK STATUS. RRC ;LOOK AT LSB. JRC HOME1 ;WAIT FOR NOT BUSY. MVI A,1 ;6 MS STEP RATE. OUT DCOM WHEN HIGH, JZ LIST1 ;LOOP TILL HIGH. ENDIF MOV A,C ;GET DATA BYTE. OUT LDATA ;PRINT IT. RET ;RETURN FROM LIST007A 76 HLT ; ; 007D ORG 7DH 007D C30000 JMP 0 0080 CK REGISTER. MOV M,A ;PUT INTO TABLE. MOV A,C ;GET NEW DISK NUMBER. MOV E,A ;PUT NEW DISK NO. IN D&E. LXI H,TRTAB ;GHEMSG ;PRINT "HOME ". MOV A,D ;MASK NON-ERROR BITS. ANI 91H MOV D,A JMP ERMSG ;DO COMMON ERROR MSGS. ; ; SELECT DI;RETURN FROM PUNCH. ; ; NORMALLY USED TO READ PAPER TAPE. ; SET UP TO READ FROM CONSOLE IN STANDARD SYSTEM. ; READER: IF ;ISSUE HOME COMMAND. IN WAIT ;WAIT FOR INTRQ. ORA A ;SET FLAGS. JM HERR ;ERROR IF DRQ. IN DSTAT ;READ DISK STAT. IF LNULL AND NOT VDM LINUL: PUSH B ;SAVE B&C. MVI B,LNULL+1 ;GET NULL COUNT. LINUL1: CALL LIST1 ;PRINT (CR FIRST).  END ET ADDRESS OF TRACK TABLE. DAD D ;ADD DISK NO. TO ADDRESS. MOV A,M ;GET NEW TRACK NUMBER. OUT TRACK ;PUT INTO 1771 TRA: :1000000031000101020016142100E278D3FBDBF875 :100010000F3E01DA77003E13D3F8DBFCB73E01FA5E :100020007700DBF8E691C2770079CD5700C27!ͷ’P͌Q!ͷªP}QxQ!ͷ͓G@Q! ͷ y͓Gþ!ͷ ͓Q!ͷi ͦYy7 ¦ 'K!-! DM 'K!3!A 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 ??= ÖSECT # ADDRESS. RET ;RETURN FROM SETSEC. ; ; SET DISK DMA ADDRESS. ; SETDMA: MOV H,B ;MOVE B&C TO H&L. O=!9 Ÿ!6q!2qC J R q!z z=naO $q$,!70000 :1000300015CA00E20C79FE1BDA41000E0104C30B65 :100040000079CD4800C32D00D3FADBF80F3E01DA6A :1000500074003E88C36300D3FADBF8͓Q͌Q!.ͷ6y#G͙Qà!2ͷQ͓͌Q!>ͷq eg͙Q:zJEË DM Pgen Version 1.0 $ Get Booter?(y/n)$ Reading Booter from drive A, type return $ Put Booter?(y/n)$ Writing BootäìEnQ_Ð"R*"!"!""2W2N2%2T!" "e""!1!++""P>28!"9:] MOV L,C SHLD DMAADD ;PUT AT DMA ADR ADDRESS. RET ;RETURN FROM SETDMA. ; ; READ A SECTOR WITHOUT LOADIN;,!Ù!;qz8O! !;,z;qyO! ͣͣW_͕qyO! ͣ͒qy0F3E01DA7404 :10006000003E8CD3F8DBFCB7F27200DBFB7723C3D6 :0B0070006500DBF8E69DC92FD3FF768A :03007D00C30000BD :0000000000 C–EQyQxQRQ** {zҷ*~#" <AOGƐ'@'OxƐ'@'ON# er to drive A, type return $ Again?(y/n)$ Rebooting CP/M, type return $1!x>w>>wwyWw yA yH->t>c>t>rw#e/vG HEAD FIRST. ; READ2: OUT SECTP ;SET SECTOR NUMBER INTO 1771. MVI A,88H ;GET CODE FOR READ W/O HLD. JR READE ;READ A SO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRECK (SEEK). ; SETTRK: MOV A,C ;GET NEW TRACK NUMBER. STA TRK ;UPDATE OLD WITH NEW. CALL SEEK ;MOVE TO NEW TRACK. RET ;z8O!B N#N ¾SP.* |} !9":q!"2!".">>@>>7>!ͷM* y#kÊ*19B]Æ*.*.*.*.!*.$*.'*.*   ͔ 2ͦͶ ^͔ rͦ T 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 ANRETURN FROM SETTRK ROUTINE. ; ; SET DISK SECTOR NUMBER. ; SETSEC: MOV A,C ;GET SECTOR NUMBER. STA SECT ;PUT AT @* ͡. ;ͣW!E# ¡ # ¬# ·@ʴʥzʖ=ʐ=|zJz?4)z z; " bÇ SYSTEM.MICRO*^#V{/_z/W#^#Vͷ#·))$LM!'! DM#:M}G> w#^!4:=!0z!;0z!F0z!X0z!]0z!h0!~0>Wgz>G{pʇ_>2y:2_y!G*w:v*xCCH*t:ywx ʊ_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={^'ŸKWgh>= ,a$ | :L*iͯ*e}¸|¸*e; ZQ{z| }Êx:z> 2*> :>ʱ>~#ó^!4:=•!0z@!n0z !w0'G> 2Oyxw}??ʽ#}??ʽ|½!@w#z§6#|±!~62y"t|gý!6#|!ý}oý@Ó6+ý*t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"Ç >!4:=!W$~O #0NOT READY RECORD NOT FOUND CRC LOST DATA BUSY PROTECT FAULT ER6}??#6#|*tý."w}2vC>2y>! !w# L>2u!0O 2:O>2!" /+* T+,T -Ty_xW!M6WT6!^6# ʖ,o>2^r ʖ#w6 R 1**!W~4ʼ #~#F#¼ x¼ ~#s#r#w>Qʅ = =Uͧᯕo>gͧ 'd ROR. RED WRITE BOOT ERROR SEEK HOME MOUNT TARBELL 59K CPM V1.4 OF 7-17-78 STANDARD VERSION. HOW MANY DISKS? !:=¢!02AO ~_!wy_!~y2/2:y2y2`i"> 2*> :>>ڔ *R>7* :%9!&~#~#V*z~==2%wo:LͰ* U/2 ʖ ^!XN!~ͤ ʿ÷!_^!^#Vxʹ>-~~>=!~Un>#! ^#V#0}o|g- xD y0K GW yW W GD  z { < >'{>'y Uͅ>:|E}Eҹ >.*g}o|/+- , 0 ^#V#*Ny< _9o!=Ͱ* *͐ * :F9*JMD*H:G7* U͢!"P 2%>**͖ \" m*"e  PASS !T~*U+"U| LSTAT ;CHECK LISTER STATUS. ANI LRBIT ;LOOK AT READY BIT. ENDIF IF RDYLO AND SPLER ;IF READY WHEN LOW, RNZ ;RETURNBD@@BI@$ $HBD!B HI$$$"$ D$"I $I$D$B" @@@D@"!B""D"C333E6C390E6C3EAE6C3F3E6C30AE7C34F :10E6100001EBC30CEBC318EBC3C7E8C37AE8C3C96B :10E62000E8C3D6E8C3DBE8C3E1E8C393E9C327E660 :1D40EFE73 :100EC0000DCAD40EFE21DAE110771C7BFE10D2E1B0 :100ED00010C3B60ED5E5EB2A0600235E2356E17259 :10 @!!BH @@ POP D ;RESTORE D&E. RET ;RETURN TO CALLING ROUTINE. ENDIF ;NOTE: AS THERE ARE ONLY NINE SECTORS ;AVAILABLE FOR CBIOˆw=2%~ !~##ʞ‘Z:"*#w2"*F#͋!Os!^#V  /``]]S`Ncc::^#V# IF BUSY. ENDIF IF RDYHI AND SPLER ;IF READY WHEN HIGH, RZ ;RETURN IF BUSY. ENDIF IF SPLER ;IF SPOOLER INSTALL@$D$$ HBH!@ DHDIHI!$"D!"D I$I "D @B$$@B$ $$0E63000C32AE63180002100EC2274E83EA0327942 :10E64000E83E1ACD21E7AF0E0A2184EA77230DC2F6 :10E650004CE63EF23292EACD75E6DB0121BAEACABH B! "BHI$$BI$BI $ HI D$HD$$ H B!$D$"$B$DA!ABI$H B$I $HIS ON THE SECOND SYSTEM TRACK (1), ;THE LAST ADDRESS BEFORE THIS POINT SHOULD BE NO ;GREATER THAN THE CBIOS STARTING ADDRESS + *^#V>ecx'g8_c*c:O?*###c>e><7*P|ʘ!ON*!ED, PUSH D ;SAVE D&E. MVI E,0 ;FROM CONSOLE SETTING. JMP SPTST ;SEE IF SPOOLER ACTIVE. SPLT1: PUSH D $$$I"I$! !$I@!B B"D$!D $I$READY YRDY EQU 20H ;PAPER FEED READY ; ; SPECIAL CHARACTERS ; NULL EQU 0 BS EQU 8 ;BACKSPACE TAB EQU 9 ;TAB LF EQU 0AH ;$H$! $I $I$I $H @@$"UUUUUU@H"H$I$IDBI$H!$HI$$DH=B:PBIOS59.HEX[V]PQRSLIST COM TUPIP COM7VWXYZ[\PBIOS59 ASMT\lmnʘ>#E> <:T!Mʮ<ڮ>=_~/w/w{<=YPõ"*##F+N+~;SAVE D&E. MVI E,3 ;FROM DISK I/O. JMP SPTST ;SEE IF SPOOLER ACTIVE. SPLT2: PUSH D ;SAVE D&E. MVI E,6 ;FROM LIST DEVI NOT VDM ;IF NOT PROC TECH VDM, CALL CONIN ;READ FROM COE. ENDIF RET ; IF SPLER ;IF SPOOLER INSTALLED, SPLT0: IN LINE FEED FF EQU 0CH ;FORM FEED CR EQU 0DH ;CARRIAGE RETURN ESC EQU 1BH ;ESCAPE CODE SPACE EQU 20H ; ; SPECIAL VALUES ; I$H D   "@DD"@ H " "BI$!$  @HHBI!$$ H  ! @AA@H@Hͼqw,/~w!T/~wN]Fp+qD[ !.HEXM. !. !// e:10E60000/o>g{z<339E5DAA093 :10EA00F20CB10E1CDAA10FE20DA850EC3A63F :100EB0000E2A060@1E002BCDAA10FE09CACE. SPTST: LDA SPIND ;GET SPOOLER IN/ACTIVE IND. CPI 0FFH ;COMPARE TO OFF SETTING. CNZ SPOOL ;CALL SPOOLER IF NOT OFF. = HIGHT EQU 8 ;HEIGHT OF CHARACTER PAGER EQU 480 ;HEIGHT OF PRINT REGION (60*HIGHT) PAGSZ EQU 528 ;HEIGHT OF WHOLE PAGE (66*HIGH;CODE FOR DISK SELECT LATCH. END ABLE - PRESENT POSITION OF ; HEADS FOR UP TO 4 DRIVES. ; TRTAB: DS 4 ; ; VDM SCRATCH AREA. ; IF VDM ;IF PROC TECH E62282EACDD6E8CDE1E8C2DEDC :10E6C000E615CAD2E60C79FE1BDAB5E60E0104C3E4 :10E6D000ACE63A91EA3284EACD75E6C36EE621965D :10E6E000EE. ; STARTZ: ;START OF ZEROED AREA. DISKNO: DS 1 ;CURRENT DISK NUMBER. DISKDR: DS 1 ;CURRENTLY LOGGED DISK. ; ; :10E60000C333E6C390E6C3EAE6C3F3E6C30AE7C34F :10E6100001EBC30CEBC318EBC3C7E8C37AE8C3C96B :10E62000E8C3D6E8C3DBE8C3E1E8C393E9C32T) LINSZ EQU 792 ;LENGTH OF LINE ; ; START OF PRINT ROUTINE ; DIABLO: JMP PRINT ;JUMP TO PRINT CONTENTS OF A ; ; INITIALROR COUNTS. THESE LOCATIONS KEEP TRACK OF THE ; NUMBER OF ERRRS THAT OCCUR DURING READ, WRITE, ; OR SEEK OPERATIONS. THEY ARVDM, CCP: DS 1 ;CURSOR POSITION. BOSL: DS 1 ;BEG. OF SCREEN LINE. BOTL: DS 1 ;BEG. OF TEXT LINE. ENDIF ENDZ: ;ACD30EACDF3E6C390E6DBECE6013E008E :10E6F000C02FC9DBECE601C2F3E6DBEDE67F328931 :10E70000EAFE5FC03E7F3289EAC979FE7FC83A8956 :10ERROR COUNTS. THESE LOCATIONS KEEP TRACK OF THE ; NUMBER OF ERRRS THAT OCCUR DURING READ, WRITE, ; OR SEEK OPERATIONS. THEY 7E660 :10E63000C32AE63180002100EC2274E83EA0327942 :10E64000E83E1ACD21E7AF0E0A2184EA77230DC2F6 :10E650004CE63EF23292EACD75E6DB047F (HEX). ;THIS WILL NORMALLY BE XE7F (HEX). ;OR XA7F (HEX) FOR SYSTEMS WITH SPOOLER INSTALLED. ; ; BIOS SCRATCH AREA. E INITIALIZED ONLY ; WHEN A COLD-START IS PERFORMED BY THE BOOOTSTRAP. ; RECNT: DS 1 ;READ ERROR COUNT. WECNT: DS 1 ;END OF ZEROED AREA. IF VDM ;IF PROC TECH VDM, CLN: DS 1 ;LINE NUMBER. ENDIF NODSKS: DS 1 ;NUMBER OF DISKS. ERE71000EAFE7FC21CE7AF3289EA0E5F79CD21E7BE :10E72000C9F5C5D5E5472A77E83A76E8B7C22AE8B9 :10E7300078FE1DCA1EE8FE07CA43E7FE00CA43E7ARE INITIALIZED ONLY ; WHEN A COLD-START IS PERFORMED BY THE BOOOTSTRAP. ; RECNT: DS 1 ;READ ERROR COUNT. WECNT: DS 1 0121BAEACD14 :10E6600030EACDF3E64FCD0AE7E607328EEA3A8488 :10E67000EA4FC300D13EC33200002103E62201006D :10E680003205002106D9220; ORG BEGIN + 480H ;SPOOLER KNOWS IT'S HERE. TRK: DS 1 ;CURRENT TRACK NUMBER. SECT: DS 1 ;CURRENT SECTOR NUMBER. DMWRITE ERROR COUNT. SECNT: DS 1 ;SEEK ERROR COUNT. LASTCHAR: DB 0 ;LAST CHAR INPUT FROM CONSOLE ; ; TRTAB - DISK TRACK TABCNT: DS 1 ;ERROR COUNT FOR RETRIES. SERCNT: DS 1 ;SEEK RETRY COUNTER. TEMP: DS 1 ;TEMPORARY STORAGE. LATCH: DS 1 8B :10E74000C348E7E1D1C1F1C92A74E83A79E877789A :10E75000FE08CAFAE7FE0ACAF1E7FE0DCAEAE7FEBA :10E760000BCACBE7FE0CCA8AE7FE1ECAE ;WRITE ERROR COUNT. SECNT: DS 1 ;SEEK ERROR COUNT. LASTCHAR: DB 0 ;LAST CHAR INPUT FROM CONSOLE ; ; TRTAB - DISK TRACK T6002180002282EAC933 :10E690003180003A84EA3291EA0E00CD7AE8CDC7A3 :10E6A000E8C2DEE6162A0102002100D1C548CDC924 :10E6B000E8C1C2DEAADD: DS 2 ;DISK TRANSFER ADDRESS. ; ; THE NEXT SEVERAL BYTES, BETWEEN STARTZ AND ; ENDZ, ARE SET TO ZERO AT COLD BOOT TIMLE - PRESENT POSITION OF ; HEADS FOR UP TO 4 DRIVES. ; TRTAB: DS 4 ; ; VDM SCRATCH AREA. ; IF VDM ;IF PROC TECH VD> 4E7FE1A14 :10E77000CAD8E7FE19CA0FE8FE1CCAFEE7FE5FCA48 :10E78000F8E7FE7FCAF8E7F680777DE63FFE3FCAEE :10E79000BDE7237DE63FFE3FCA97EB7 :10E9BA00D3FB23C3B3E9DBF8E6FDC8CD5EE92187C3 :10E9CA00EA343A8FEA3DC295E9218DEACD30EA7AF6 :10E9DA00E640216EEAC430EA7AE620F8DBFCB7F20EE9DBFB7708 :10E90A0023C301E9DBF8E69DC8CD5EE92186EA3436 :10E91A003A8FEA3DC2E3E82185EACD30EA7AE68019 :10E92A00213BE2177EAC430BA :10E9EA00EAC327E9C5473E0A3290EADBF94F79B80C :10E9FA0078C200EAC1C9D3FBDBF80FDA02EA3E1299 :10EA0A00F604D3F8DBFCDBF :10E8500000193DC251E8EB2100EC197CFEF0FA648E :10E86000E8C367E82274E82100002277E8AF327637 :04E87000E8C318E8F9 :03E876000000009EA9A00204552524F52000D0A5345454B20000D56 :10EAAA000A484F4D4520000D0A4D4F554E5420003F :10EABA000D0A54415242454C4C2035394B204350BDE77CFEF0C2BD7C :10E7A000E72100EC1140EC1A7713237AFEF0C2A7A0 :10E7B000E736A0237CFEF0C2B1E721C0EF7E36FF32 :10E7C0003279E82274E2177EAC430BA :10E9EA00EAC327E9C5473E0A3290EADBF94F79B80C :10E9FA0078C200EAC1C9D3FBDBF80FDA02EA3E119A :10EA0A00F604D3F8DBFCDBFAC430EA7AE6102146EAC430EA7AA0 :10E93A00E6082158EAC430EA7AE604215DEAC430DE :10E94A00EA7AE6012168EAC430EA217EEACD30EAB1 :10E95A8E691CAFEE9E52188D7 :10EA1A00EA34E13A8FEA3DC2F2E9C121A1EADBF820 :10EA2A00E69157C324E97EB7C84FCD0AE723C3301E :10EA3A00EA4E4F54F :10E87A0079E6033284EA2185EABEC8F53A8EEA3D92 :10E88A00C2A2E821B1EACD30EAF13285EAC6414FA7 :10E89A00CD0AE7CDF3E6AFC9F17E5F1600A3 :10EACA004D2056312E34204F4620372D31372D37E1 :10EADA00380D0A5354414E4441524420564552532C :10EAEA00494F4E2E0D0A484F57204D4148E1D1C1F1C911C0FF197CA6 :10E7D000E603F6EC67C3BDE72100EC36A0237CFE20 :10E7E000F0C2DBE72100ECC3BDE77DE6C06FC3BD2F :10E7F000E7118E691CAFEE9E52188D7 :10EA1A00EA34E13A8FEA3DC2F2E9C121A1EADBF820 :10EA2A00E69157C324E97EB7C84FCD0AE723C3301E :10EA3A00EA4E4F54003E01B7C957E610C267E97AB7C93EC4D3C0 :10E96A00F8DBFCDBFB47DBFCB7F27BE9DBFBC370C4 :10E97A00E9DBF8B7CA87E9CDC7E8C38AE978D3F9EA "MODEM PROGRAM AS OF 10/10/77 $ !9"p1pX:]SRʨCT3++INVALID OPTION ON MODEM COMMAND 218AEA19 :10E8AA0019DBF977795F218AEA197ED3F9793285FA :10E8BA00EA2F87878787F6023292EAAFC90E003AB3 :10E8CA0092EAD3FC793280EACDEE5920444A :10EAFA0049534B533F2000DB02E602C201EB79D3B4 :10EB0A0003C9CD0AE70000000000000000C9CDF3E8 :02EB1A00E6C94A :01EA89000400019C393E736A02BC3BDE72A7485 :10E80000E836A07DE63FFE3FCA18E823C301E8369C :10E81000A0237CFEF0C20FE82A74E8C3BDE72EFFF8 :10E8220524541445920005245434F13 :10EA4A005244204E4F5420464F554E4420004352C4 :10EA5A004320004C4F535420444154412000425516 :10EA6A005:10E98A003A80EACDEEE97AB7C93E0A328FEA2A829C :10E99A00EA3ED0D3F8E3E3DBF8E6203A81EAD3FA99 :10E9AA003EACCAB1E93EA8D3F8DBFCB7F2C0E- MUST BE ONE OF THE FOLLOWING: MODEM SEND FILENAME MODEM RECV FILENAME MODEM COMPUTER MODEM TERMINAL ABBREV. ALLOWED: EE9C9793281EA5B :10E8DA00C960692282EAC93E0A328FEA2A82EA3E7E :10E8EA00D0D3F8E3E3DBF8E6203A81EAD3FA3E8CA8 :10E8FA00CAFFE83E88D308C :0000000000 0002277E87D3276E8C343E73EFFBDC23CE88D :10E8300078D620E63F6F2277E8C343E7E52A74E8FD :10E840003A79E877E178D620E60FB7CA56E8114062 359200050524F544543542000464155B3 :10EA7A004C5420004552524F522E000D0A52454125 :10EA8A004420000D0A57524954452000424F4F5422 :10? S R C T$@@) xG@@3x3ʞ ii++TH TO OUT DCONT ;OLD CODE. XRA A ;MAKE GOOD RETURN. POP B ;RESTORE B&C. RET ENDIF IF NOT PERSCI ;IF NOT PERSC͐ ڙ0x\=2t>1͇:t<2t ڶNO ACK RECIEVED ON EOT$ FILE TE ',0 BTMSG: DB 'BOOT ERROR',0 SKMSG: DB 0DH,0AH,'SEEK ',0 HEMSG: DB 0DH,0AH,'HOME ',0 MNTMSG: DB 0DH,0AH,'MOUNT ',R $z2r!w,Q:rG:s<\:r2s>î++ERROR WRITING FILE $++BAD CKSUM ON SF IT'S ZERO, RZ ;RETURN. MOV C,A ;OTHERWISE, CALL CONOT ;PRINT IT. INX H ;INCREMENT IME OUT DETERMINING BAUD RATE$xګçBAUD RATE IS $110 $300 $!\lw#2|ͺ2t͞:s<2se:sI DRIVE, PUSH H ;SAVE H&L. LXI H,SECNT ;GET ADR OF SEEK ERR CTR. INR M ;ONE MORE SEEK ERROR. POP H ;RESTORE H&L. SENT, SENDING EOT'S $e++FILE READ ERROR$ TRANSFER COMPLETE$x>(x͇>)xTIMEOUT $\:t͇>0 SMSG: DB 0DH,0AH,'TARBELL ' DB MSIZE/10+'0',MSIZE MOD 10 + '0' DB 'K CPM V1.4 OF 7-17-78' DB 0DH,0AH IF STD ECTOR $>\<1++ERROR CLOSING FILE$\<WYq\++FILE EXISTS, TYPE Y TO ERASE:$\<H&L, JMP PMSG ;AND GET ANOTHER. ; ; CBIOS MESSAGES ; IF NOT VDM ;IF NOT PROC TECH VDM, NRMSG: DB 'NOT READY͇q>:s:s/!~#|yue:t<2t CAN'T SEND SECTOR - ABORTING $SENDING SECTOR $͇ LDA ERCNT ;GET ERROR COUNT. DCR A ;DECREMENT COUNT. JNZ SRETRY ;RETRY SEK. POP B ;RESTORE B&C. LXI H,SKMSG ;PRINP UNTIL C = 0. IN WAIT ;CLEAR 1771. IN DSTAT MOV A,B ;GET DEST. TRACK. OUT TRACK ;UPDATE TRACK REG. LDA LATCH ; ;IF STANDARD I/O, DB 'STANDARD ' ENDIF IF SPLER ;IF SPOOLER INSTALLED, DB 'SPOOLER ' ENDIF IF MSIO2 ;IF ++ERROR - CAN'T MAKE FILE ++DIRECTORY MUST BE FULL $\<CAN'T OPEN FILE$ *p@@7 ',0 RNMSG: DB 'RECORD NOT FOUND ',0 CRCMSG: DB 'CRC ',0 LDMSG: DB 'LOST DATA ',0 BSYMSG: DB 'BUSY ',0 WPMSG: DB 7H RECEIVED, NOT ACK $FILE OPEN $1w2t:s<͇qe>:t<2t ڲ++UNABLE TO GET VALID HT "SEEK ". IN DSTAT ;READ DISK STATUS. ANI 91H ;LOOK AT ERROR BITS. MOV D,A ;PUT IN REG D. JMP ERMSG ;DO COMMON ERGET LATCH CODE. ANI 72H ;MAKE COMMAND TO OUT DCONT ;SWITCH WAIT FOR IN WAIT ;SEEK COMPLETE. LDA LATCH ;RESTORE LATCMITS 2SIO, DB '2SIO ' ENDIF IF ISIO2 ;IF IMSAI SIO-2, DB 'SIO-2 ' ENDIF IF TUART ;IF TUART, DB 'TUART 'O4 #4O' x x x Mx>(x͇>)xTIMEOUT $\:t͇> x> _'PROTECT ',0 WFMSG: DB 'FAULT ',0 ENDIF ERRMSG: DB 'ERROR.',0 RDMSG: DB 0DH,0AH,'READ ',0 WTMSG: DB 0DH,0AH,'WRIEADER $WAITING FOR SECTOR #$Mʲ͇7H RECEIVED, NOT SOH $W/ʄl++BAD SECTOR # IN HDR MESSAGES. ENDIF ; ; PRINT THE MESSAGE AT H&L UNTIL A ZERO. ; PMSG: MOV A,M ;GET A CHARACTER. ORA A ;I@  ENDIF IF SOLOS ;IF PROC TECH SOLOS, DB 'SOLOS ' ENDIF IF VDM ;IF PROC TECH VDM, DB 'VDM ' ENDIF IF STAT ;CHECK LISTER STATUS. ANI LRBIT ;LOOK AT READY BIT. ENDIF IF RDYLO AND SPLER ;IF READY WHEN LOW, RNZ ;RETURN I. RET ;RETURN FROM LIST. ENDIF ; ; PUNCH PAPER TAPE. ; DEFAULT IS CONSOLE (TTY?). ; PUNCH: IF NOT VDM ;IF NOT PROCDD: DS 2 ;DISK TRANSFER ADDRESS. ; ; THE NEXT SEVERAL BYTES, BETWEEN STARTZ AND ; ENDZ, ARE SET TO ZERO AT COLD BOOT TIME.NI LRBIT ;LOOK AT READY BIT. IF RDYLO ;IF READY WHEN LOW, JNZ LIST1 ;LOOP TILL LOW. ENDIF IF RDYHI ;IF READY WOP D ;RESTORE D&E. RET ;RETURN TO CALLING ROUTINE. ENDIF ;NOTE: AS THERE ARE ONLY NINE SECTORS ;AVAILABLE FOR CBIOS  DUBSID ;IF DOUBLE-SIDED, DB 'DOUBLE-SIDED ' ENDIF IF DUAL ;IF DUAL DRIVE, DB 'DUAL ' ENDIF IF PERSCI ;IF F BUSY. ENDIF IF RDYHI AND SPLER ;IF READY WHEN HIGH, RZ ;RETURN IF BUSY. ENDIF IF SPLER ;IF SPOOLER INSTALLED TECH VDM, CALL CONOT ;SEND PUNCH TO CONSOLE. NOP!NOP!NOP!NOP ;SPACE FOR YOUR ROUTINE. NOP!NOP!NOP!NOP ENDIF RET ;R ; STARTZ: ;START OF ZEROED AREA. DISKNO: DS 1 ;CURRENT DISK NUMBER. DISKDR: DS 1 ;CURRENTLY LOGGED DISK. ; ; ERHEN HIGH, JZ LIST1 ;LOOP TILL HIGH. ENDIF MOV A,C ;GET DATA BYTE. OUT LDATA ;PRINT IT. RET ;RETURN FROM LIST. ON THE SECOND SYSTEM TRACK (1), ;THE LAST ADDRESS BEFORE THIS POINT SHOULD BE NO ;GREATER THAN THE CBIOS STARTING ADDRESS + 04PERSCI DRIVE, DB 'PERSCI ' ENDIF DB 'VERSION.' DB 0DH,0AH,'HOW MANY DISKS? ',0 ; ; WRITE A CHARACTER ON LISTING, PUSH D ;SAVE D&E. MVI E,0 ;FROM CONSOLE SETTING. JMP SPTST ;SEE IF SPOOLER ACTIVE. SPLT1: PUSH D ;SETURN FROM PUNCH. ; ; NORMALLY USED TO READ PAPER TAPE. ; SET UP TO READ FROM CONSOLE IN STANDARD SYSTEM. ; READER: IF NROR COUNTS. THESE LOCATIONS KEEP TRACK OF THE ; NUMBER OF ERRRS THAT OCCUR DURING READ, WRITE, ; OR SEEK OPERATIONS. THEY AR IF LNULL AND NOT VDM LINUL: PUSH B ;SAVE B&C. MVI B,LNULL+1 ;GET NULL COUNT. LINUL1: CALL LIST1 ;PRINT (CR FIRST). M7F (HEX). ;THIS WILL NORMALLY BE XE7F (HEX). ;OR XA7F (HEX) FOR SYSTEMS WITH SPOOLER INSTALLED. ; ; BIOS SCRATCH AREA. ;  DEVICE. ; LIST: IF LNULL AND NOT VDM MVI A,0DH ;IF IT'S A CR, CMP C ;THEN HOP OUT TO JZ LINUL ;NULL ROUTINE. EAVE D&E. MVI E,3 ;FROM DISK I/O. JMP SPTST ;SEE IF SPOOLER ACTIVE. SPLT2: PUSH D ;SAVE D&E. MVI E,6 ;FROM LIST DEVICEOT VDM ;IF NOT PROC TECH VDM, CALL CONIN ;READ FROM COE. ENDIF RET ; IF SPLER ;IF SPOOLER INSTALLED, SPLT0: IN LE INITIALIZED ONLY ; WHEN A COLD-START IS PERFORMED BY THE BOOOTSTRAP. ; RECNT: DS 1 ;READ ERROR COUNT. WECNT: DS 1 ;VI C,0 ;GET NULL CHAR. DCR B ;DECREMENT COUNTER. JNZ LINUL1 ;DO NEXT NULL. POP B ;RESTORE B&C. MOV A,C ;RESTORE A ORG BEGIN + 480H ;SPOOLER KNOWS IT'S HERE. TRK: DS 1 ;CURRENT TRACK NUMBER. SECT: DS 1 ;CURRENT SECTOR NUMBER. DMAANDIF LIST1: IF SPLER ;IF SPOOLER INSTALLED, CALL SPLT2 ;CALL IT. RC ENDIF IN LSTAT ;READ LISTER STATUS. A. SPTST: LDA SPIND ;GET SPOOLER IN/ACTIVE IND. CPI 0FFH ;COMPARE TO OFF SETTING. CNZ SPOOL ;CALL SPOOLER IF NOT OFF. PA WRITE ERROR COUNT. SECNT: DS 1 ;SEEK ERROR COUNT. LASTCHAR: DB 0 ;LAST CHAR INPUT FROM CONSOLE ; ; TRTAB - DISK TRACK TABTEM.PASCALI@D GOTOXY.TEXTTEXT DV CHASE.TEXT.TEXT SYSTEM.MISCINFOCHASE.TEXTy(S 0020 = YRDY EQU 20H ;PAPER FEED READY ; ; SPECIAL CHARACTERS ; 000 DSTAT 005B 0F RRC 005C 3E01 MVI A,1 005E DA7400 JC RERR 0061 3E8C ODE FOR DISK SELECT LATCH. END B00 JMP RBLK ; 0041 79 RBLK2: MOV A,C 0042 CD4800 CALL READ1 0045 C32D00 LE - PRESENT POSITION OF ; HEADS FOR UP TO 4 DRIVES. ; TRTAB: DS 4 ; ; VDM SCRATCH AREA. ; IF VDM ;IF PROC TECH VDO!b q!vz͒q.?*!9"8"͉Z*" +*'/7?v"*2:EI SPHLDI XCHGPCHLXTHLRESYSTERMg"F*p N#FTOM"n"l B"D!8"@ TOM80TOMYS MVI A,8CH 0063 D3F8 READE: OUT DCOM 0065 DBFC RLOOP: IN WAIT 0067 B7 ORA A 0068 F2720 READY 0040 = RBLFT EQU 40H ;RIBBON LIFT 00AF = CMASK EQU (-1-SELPR-RBLFT)AND 0FFH ;COMMAND MASK  JMP RBLK1 ; ; 0048 D3FA READ1: OUT SECT 004A DBF8 IN DSM, CCP: DS 1 ;CURSOR POSITION. BOSL: DS 1 ;BEG. OF SCREEN LINE. BOTL: DS 1 ;BEG. OF TEXT LINE. ENDIF ENDZ: ;ENT 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 ANTEM.CR8DPSYSTEM.COMPILTOM80L Z SYSTEM.MICRO8DPSYSTEM.COMPILERP\ SYSTE0 JP RDONE 006B DBFB IN DDATA 006D 77 MOV M,A 006E 23 INX H  ; AND 0FFH HAD TO BE ADDED FOR CP/M ASM. ; ; STATUS BITS ; 0002 = TAT 004C 0F RRC 004D 3E01 MVI A,1 004F DA7400 JC RERR 0052 3E88 MD OF ZEROED AREA. IF VDM ;IF PROC TECH VDM, CLN: DS 1 ;LINE NUMBER. ENDIF NODSKS: DS 1 ;NUMBER OF DISKS. ERCNA 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.SYNTAX8l\ SYSTEM.EDITORhb CHESS.TEXT.TEXT  GOTOXY.CODECODE  CHASE.CODE.CODE < SYS006F C36500 JMP RLOOP ; 0072 DBF8 RDONE: IN DSTAT 0074 E69D RERR: ANI 9DH 007 CHECKS EQU 2 ;CHECK STATUS 0008 = CHRDY EQU 8 ;CHARACTER READY 0010 = XRDY EQU 10H ;CARRIAGE READY VI A,88H 0054 C36300 JMP READE ; 0057 D3FA READ: OUT SECT 0059 DBF8 IN T: DS 1 ;ERROR COUNT FOR RETRIES. SERCNT: DS 1 ;SEEK RETRY COUNTER. TEMP: DS 1 ;TEMPORARY STORAGE. LATCH: DS 1 ;CäìEnQ_Ð"R*"!"!""2W2N2%2T!" "e""!1!++""P>28!"9:]B 6 C9 RET ; ; 0077 2F ERROR: CMA 0078 D3FF OUT 0FFH   'š 'S_Á#0 )DM)) O ä^*^#V#^))))o" s#r#!^4-BLK 002D RBLK1 0041 RBLK2 0072 RDONE 0057 READ 0048 READ1 0063 READE 0074 RERR 0065 RLOOP 00FA SECT 00F9 TRACK 00FC WAIT RAMETER BLOCK. DB 7FH ;DIRMAX. DB 04H ;BLKSHF. DB 0FH ;BLKMSK. 6}??#6#|*tý."w}2vC>2^r ʖROR. RED WRITE BOOT ERROR SEEK HOME MOUNT TARBELL 55K CPM V1.4 OF 7-17-78 STANDARD VERSION. HOW MANY DISKS?  ; ORG CPMB+1072H ;CP/M PATCH. CALL CPMB+0AF4H NOP!NOP!N!ھ:=¢!02AO ֯~_!wy_!~y2/2گ:y2y2`i"> 2*> :>> ENDIF C100 = CPMB EQU CBASE+2900H ;START OF CPM. C906 = BDOS EQU CBASE+3106H END  ʖ ^!XN!~ͤ ʿ÷!_^!^#Vxʹ>-~~>=!~y Uͅ>:|E}Eҹ >.*g}o|/+- , 0 ^#V#*NyOP MOV A,C LXI H,CPMB+14F8H ENDIF D600 ORw#^!4:=!0z!;0z!F0z!X0z!]0z!h0!~0>Wgz>G{pʇ ;START OF BDOS 1.4. 1500 = CPML EQU 1500H ;LENGTH OF CPM SYSTEM-BIOS. 002A = NSECTS EQU CPML/128 ;NUMBER _>2y:ׯ2_y!G*w:vط*xCCH*t:ywx ʊ_CATOR. D800 = SPOOL EQU MSIZE*1024-400H ;SPOOLER ENTRY LOCATION. IF SPLER ;IF S*k*m ! ;+;  ;4D#^#V"m"k~/o>g++!.@l^#V={^'ŸG CPMB+1500H ;START OF BIOS. ; ; I/O JUMP VECTOR ; THIS IS WHERE CPM CALLS 0600 BIOSSZ 0000 BOOT 0003 BOOT1 00F8 DCOM 00FB DDATA 00F8 DSTAT 0077 ERROR 0031 HALT D200 LOADP 0037 MSIZE 0014 NSECTS 000B ROF SECTORS IN IT. IF DUBSID ;IF DOUBLE-SIDED, ORG CPMB+083BH ;DISK PAw}??ʽ#}??ʽ|½!@w#z§6#|±!~62y"t|gý!6#|!ý}oý@Ó6+ý*tPOOLER INSTALLED, CBASE EQU (MSIZE-18)*1024 ;BASE FOR LATER CALCS. ENDIF C WHENEVER IT NEEDS ; TO DO ANY INPUT/OUTPUT OPERATION. ; USER PROGRAMS MAY USE THESE ENTRY POIN STA SPIND ENDIF IF INTRP ;IF INTERRUPTS ALLOWED,  JMP READN ;READ WITH NO HEAD LOAD. D630 C32AD6 JMP WRITEN ;WRITE WITH NO HEAD LOAD. ; : ;JUST SAY WHO WE ARE MVI C,WRBUF LXI D,HELLO$MSG CALL BDOS RET ; ; GET$BOOTER: ;MAYBE A BOOTER COMES IN MVI C D615 C318DB JMP READER ;READ READER CHAR. D618 C3C7D8 JMP HOME ;MOVE DISK TO TRACK ZERO. D61B C37AD8 JMP SE CALL SAY$TITLE CALL GET$BOOTER CALL PUT$BOOTER JMP REBOOT ; ; HOME: ;HOME DISK LHLD BOOT+1 MVI L,18H PCHL TS ; ALSO, BUT NOTE THAT THE LOCATION OF THIS ; VECTOR CHANGES WITH THE MEMORY SIZE. BIOSSZ EQU 1536 ; TPA EQU 100H ; ; ; PASCAL BOOT MAINTENCE PROGRAM ; ; BOOTER MAY BE READ IN FROM CURRENT PASCAL DISK AN ; BOOT ; THIS SECTION IS EXECUTED WHENEVER RESET AND RUN ; IS PUSHED, AFTER THE COLDSTART L,WRBUF LXI D,GET$MSG CALL BDOS CALL CK$YES RC ;THAT'S ALL FOR HERE MVI C,WRBUF LXI D,READ$MSG ;SAY HEY CALL BDOSLDSK ;SELECT DISK DRIVE. D61E C3C9D8 JMP SETTRK ;SEEK TO TRACK IN REG A. D621 C3D6D8 JMP SETSEC ;SET SECTOR NUMBER; SELDSK: ;SELECT DISK LHLD BOOT+1 MVI L,1BH PCHL ; SETTRK: ;SET TRACK LHLD BOOT+1 MVI L,1EH PCHL ; SETSE ; D600 C333D6 BEGIN: JMP BOOT ;FROM COLD START LOADER. D603 C390D6 WBOOTE: JMP WBOOT ;FROM WARM BOOT. D606D MOVED ; ONTO ANY NUMBER OF NEW DISKETTES ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC. ; ;OADER READS IN ; THE CPM SYSTEM. ; D633 318000 BOOT: LXI SP,80H ;SET STACK POINTER.  CALL WAIT$FOR$RET ;AND WAIT CALL DO$READ RET ;DONE ; ; PUT$BOOTER: ;DOES THE BOOTER GO OUT? MVI C,WRBUF ;ASK . D624 C3DBD8 JMP SETDMA ;SET DISK STARTING ADR. D627 C3E1D8 READN: JMP READ ;READ SELECTED SECTOR. D62A C393D9 C: ;SET SECTOR LHLD BOOT+1 MVI L,21H PCHL ; SETDMA: ;SET DMA ADDRESS LHLD BOOT+1 MVI L,24H PCHL ; READ:  C3EAD6 JMP CONST ;CHECK CONSOLE KB STATUS. D609 C3F3D6 JMP CONIN ;READ CONSOLE CHARACTER. D60C C30AD7 JMP CO BOOT EQU 0 BDOS EQU 5 RDCON EQU 1 WRBUF EQU 9 START EQU 900H ENDPT EQU START+128+256+768+BIOSSZ ;BOOT+PINIT+SPARE+BIOS N IF SPLER ;IF SPOOLER INSTALLED, MVI A,0FFH ;SET INITIAL SPOOL TO OFF. LXI D,PUT$MSG CALL BDOS CALL CK$YES ;IF THE ANSWER IS NOT YES RC ;LEAVE PUT$AGAIN: ;ELSE START TO PUT MVI C,WRBUF  WRITEN: JMP WRITE ;WRITE SELECTED SECTOR. ; THESE ENTRY POINTS ADDED BY TARBELL ELECTRONICS. D62D C327D6  ;READ A SECTOR LHLD BOOT+1 MVI L,27H PCHL ; WRITE: ;WRITE A SECTOR LHLD BOOT+1 MVI L,2AH PCHL ; ; SAY$TITLENOT ;WRITE CONSOLE CHARACTER. D60F C301DB JMP LIST ;WRITE LISTING CHAR. D612 C30CDB JMP PUNCH ;WRITE PUNCH CHAR. SECTS EQU (ENDPT-START)/128 FSTSCT EQU 1 ; CR EQU 0DH LF EQU 0AH EOM EQU '$' ; ; ; ORG TPA ; ; LXI SP,STACK MAIN:D  LXI D,WRITE$MSG CALL BDOS ;DO ANOTHER CONFIRM MSG CALL WAIT$FOR$RET ;AND HOLD UP CALL DO$WRITE ;NOW PUT IT OUT MVI C,,LF,LF,'Put Booter?(y/n)',eom WRITE$MSG: DB CR,LF,'Writing Booter to drive A, type return ',eom AGAIN$MSG: DB CR,LF,'Again?(y/THE BOOTER MVI C,0 ;SELECT THE DISK CALL SELDSK CALL HOME LXI B,START LXI D,NSECTS SHL 8 + FSTSCT DW$LOOP: ;ALL PA110A02 LXI D,HELLO$MSG 013E CD0500 CALL BDOS 0141 C9 RET ; ;  BOOT CPI CR ;LEAVE WHEN READY JNZ WAIT$FOR$RET RET ; ; DO$READ: ;READ IN THE BOOTER MVI C,0 ;SELECT DISK CALL OF LINE? FF6F D8 RC ;YES, ABORT FF70 2AA7FF LHLD XPOS ;GET CURRENT LOC FF73 EB XCHG ;INTO DE FF74 2WRBUF ;IS THIS A LOOP? LXI D,AGAIN$MSG CALL BDOS CALL CK$YES JNC PUT$AGAIN ;GUESS SO RET ;ALL DONE ; ; REBOOT: n)',eom REBOOT$MSG: DB CR,LF,LF,'Rebooting CP/M, type return ',eom ; ; DS 256 STACK EQU $ ; ; ; END TPA RAMS SET - RUN IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL WRITE POP D POP B LX GET$BOOTER: ;MAYBE A BOOTER COMES IN 0142 0E09 MVI C,WRBUF 0144 111F02 LXI D,GET$MSG 0147 CD0500 CALL SELDSK CALL HOME ;MAKE SURE IT'S INITIALIZED LXI B,START ;SET WHERE WE START IN RAM LXI D,NSECTS SHL 8 + FSTSCT ;SIZE AN2A7FF SHLD XPOS ;STORE NEW LOC FF77 0610 MVI B,XRDY ;GET BIT FOR WAIT LOOP FF79 0EAB MVI C,CMASK-XSTB ;MOVE  ;PULL BACK CP/M MVI C,WRBUF LXI D,REBOOT$MSG CALL BDOS CALL WAIT$FOR$RET JMP BOOT ; ; CK$YES: ;CHECK FOR A YESOVX - MOVES THE CARRIAGE. IF THE LOCATION IN NEWX ; IS PAST THE END OF THE LINE, CARRY IS SET I H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DW$LOOP RET ; ; ; HELLO$MSG: DB CR,LF,'Pgen Version 1.0',CR,LF,EBDOS 014A CD9401 CALL CK$YES 014D D8 RC ;THAT'S ALL FOR HERE 014E 0E09 MVI C,WRBUF 0150 113202 LD THE FIRST SECTOR DR$LOOP: ;THEN PUT IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL ; WRITE: ;WRITE A SECTOR 0133 2A0100 LHLD BOOT+1 0136 2E2A MVI L,2AH 0138 E9 PCH RESPONSE MVI C,RDCON CALL BDOS CPI 03H ;DON'T FORGET ^C JZ BOOT CPI 'Y' ;UPPER CASE RZ CPI 79H ;AND LOWER RZ; AND NO MOTION TAKES PLACE. ; ; MOVY - MOVES THE PAPER. ; FF67 2AA9FF MOM GET$MSG: DB CR,LF,'Get Booter?(y/n)',eom READ$MSG: DB CR,LF,'Reading Booter from drive A, type return ',eom PUT$MSG: DB CRXI D,READ$MSG ;SAY HEY 0153 CD0500 CALL BDOS 0156 CDA601 CALL WAIT$FOR$RET ;AND WAIT 0159 CDB601 CALL DO$READ  READ POP D POP B LXI H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DR$LOOP RET ; ; DO$WRITE: ;WRITE OUT L ; ; SAY$TITLE: ;JUST SAY WHO WE ARE 0139 0E09 MVI C,WRBUF 013B  STC ;NOT THERE RET ; ; WAIT$FOR$RET: ;HANG AROUND MVI C,RDCON CALL BDOS CPI 03H ;TEST FOR REBOOT REQUEST JZOVX: LHLD NEWX ;GET NEW LOC FF6A EB XCHG ;INTO DE FF6B 21E7FC LXI H,-1-LINSZ FF6E 19 DAD D ;PAST END E  015C C9 RET ;DONE ; ; PUT$BOOTER: ;DOES THE BOOTER GO OUT? 01R ;LEAVE WHEN READY 01B2 C2A601 JNZ WAIT$FOR$RET 01B5 C9 RET ; ; 6 CD0500 CALL BDOS 0199 FE03 CPI 03H ;DON'T FORGET ^C 019B CA0000 JZ BOOT 019E FE59 CPI 'Y' ;UPPER CRT 01EB 110115 LXI D,NSECTS SHL 8 + FSTSCT DW$LOOP: ;ALL PARAMS SET - RUN IT OUT 01EE C5 PUSHD,AGAIN$MSG 017C CD0500 CALL BDOS 017F CD9401 CALL CK$YES 0182 D26901 JNC PUT$AGAIN ;GUESS SO 0185 C9  CALL SETSEC 01CF CD2D01 CALL READ 01D2 D1 POP D 01D3 C1 POP B 01D4 218000 LXI H,128 01D7 09 5D 0E09 MVI C,WRBUF ;ASK 015F 115E02 LXI D,PUT$MSG 0162 CD0500 CALL BDOS 0165 CD9401 CALL CK$YES ;IF T DO$READ: ;READ IN THE BOOTER 01B6 0E00 MVI C,0 ;SELECT DISK 01B8 CD1501 CALL SELDSK 01BB CD0F01 CALLASE 01A0 C8 RZ 01A1 FE79 CPI 79H ;AND LOWER 01A3 C8 RZ 01A4 37 STC ;NOT THERE 01A5 C9 B 01EF D5 PUSH D 01F0 CD2701 CALL SETDMA 01F3 D1 POP D 01F4 4B MOV C,E 01F5 D5 PU RET ;ALL DONE ; ; REBOOT: ;PULL BACK CP/M 0186 0E09 MVI C,WRB DAD B 01D8 44 MOV B,H 01D9 4D MOV C,L 01DA 1C INR E 01DB 15 DCR D 01DC C2C401 HE ANSWER IS NOT YES 0168 D8 RC ;LEAVE PUT$AGAIN: ;ELSE START TO PUT 0169 0E09 MVI C,WRBU HOME ;MAKE SURE IT'S INITIALIZED 01BE 010009 LXI B,START ;SET WHERE WE START IN RAM 01C1 110115 LXI D,NSECTS SHL  RET ; ; WAIT$FOR$RET: ;HANG AROUND 01A6 0E01 MVI C,RDCON SH D 01F6 CD2101 CALL SETSEC 01F9 CD3301 CALL WRITE 01FC D1 POP D 01FD C1 POP B 01FE 218000 UF 0188 11AA02 LXI D,REBOOT$MSG 018B CD0500 CALL BDOS 018E CDA601 CALL WAIT$FOR$RET 0191 C30000 JMP BOOT JNZ DR$LOOP 01DF C9 RET ; ; DO$WRITE: ;WRITE OUT THE BOOTER F 016B 117202 LXI D,WRITE$MSG 016E CD0500 CALL BDOS ;DO ANOTHER CONFIRM MSG 0171 CDA601 CALL WAIT$FOR$RET ;AN8 + FSTSCT ;SIZE AND THE FIRST SECTOR DR$LOOP: ;THEN PUT IT OUT 01C4 C5 PUSH B 01C5 D5 P 01A8 CD0500 CALL BDOS 01AB FE03 CPI 03H ;TEST FOR REBOOT REQUEST 01AD CA0000 JZ BOOT 01B0 FE0D CPI C LXI H,128 0201 09 DAD B 0202 44 MOV B,H 0203 4D MOV C,L 0204 1C INR E 0205 15  ; ; CK$YES: ;CHECK FOR A YES RESPONSE 0194 0E01 MVI C,RDCON 019 01E0 0E00 MVI C,0 ;SELECT THE DISK 01E2 CD1501 CALL SELDSK 01E5 CD0F01 CALL HOME 01E8 010009 LXI B,STAD HOLD UP 0174 CDE001 CALL DO$WRITE ;NOW PUT IT OUT 0177 0E09 MVI C,WRBUF ;IS THIS A LOOP? 0179 119C02 LXI USH D 01C6 CD2701 CALL SETDMA 01C9 D1 POP D 01CA 4B MOV C,E 01CB D5 PUSH D 01CC CD2101 F :1001000031CA03CD3901CD4201CD5D01C386012A3B :1001100001002E18E92A01002E1BE92A01002E1EDB :10012000E92A01002E21E92A01002E24E92A002CA DS 256 03CA = STACK EQU $ ; ; ; 03CA E506765HELLO$MSG: DB CR,LF,'Pgen Version 1.0',CR,LF,EOM 021F 0D0A476574GET$MSG: DB CR,LF,'Get Booter?(y/n)',EOM 0232 0D0A526559 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0E00CD1501CD0F01010009110115C5D576 :1001F000CD2701D14BD5CD2101CD3301D1C12180F6 :100200000009444D1C15C2EE01C90D0A5067656E08 :10OOTER 025E PUTMSG 0001 RDCON 012D READ 0232 READMSG 0186 REBOOT 02AA REBOOTMSG 0139 SAYTITLE 0115 SELDSK 0127 SETDMA 0121 SETS100F2 :100130002E27E92A01002E2AE90E09110A02CD050F :1001400000C90E09111F02CD0500CD9401D80E097A :10015000113202CD0500CDA601CDB6ND TPA 61READ$MSG: DB CR,LF,'Reading Booter from drive A, type return ',EOM 025E 0D0A0A5075PUT$MSG: DB CR,LF,LF,'Put Booter?(y/n)',EO*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*0210002056657273696F6E20312E300D0A240DE1 :100220000A47657420426F6F7465723F28792F6E9C :1002300029240D0A52656164696E6720426F6F74EC 011B SETTRK 03CA STACK 0900 START 0100 TPA 01A6 WAITFORRET 0009 WRBUF 0133 WRITE 0272 WRITEMSG 01C90E09119F :100160005E02CD0500CD9401D80E09117202CD05B5 :1001700000CDA601CDE0010E09119C02CD0500CDF8 :100180009401D26901C90E0 END M 0272 0D0A577269WRITE$MSG: DB CR,LF,'Writing Booter to drive A, type return ',EOM 029C 0D0A416761AGAIN$MSG: DB CR,LF,'Again8792F6E43 :1002700029240D0A57726974696E6720426F6F7482 :10028000657220746F20647269766520412C207439 :10029000797065207265747572EC :1002400065722066726F6D20647269766520412C3C :1002500020747970652072657475726E20240D0AA1 :100260000A50757420426F6F7465723F259 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0911AA02CD0500CDA6BC :1001900001C300000E01CD0500FE03CA0000FE5998 :1001A000C8FE79C837C90E01CD0500FE03CA00009C :1001B000FE0DC2A6029C AGAINMSG 0005 BDOS 0600 BIOSSZ 0000 BOOT 0194 CKYES 000D CR 01B6 DOREAD 01E0 DOWRITE 01C4 DRLOOP 01EE DWLOOP 1380 ENDPT ?(y/n)',EOM 02AA 0D0A0A5265REBOOT$MSG: DB CR,LF,LF,'Rebooting CP/M, type return ',EOM ; ; 6E20240D0A41674D :1002A00061696E3F28792F6E29240D0A0A52656212 :1002B0006F6F74696E672043502F4D2C20747970D6 :0A02C00065207265747 DCR D 0206 C2EE01 JNZ DW$LOOP 0209 C9 RET ; ; ; 020A 0D0A*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*01C90E00CD1501CD0F01010033 :1001C00009110115C5D5CD2701D14BD5CD2101CDC3 :1001D0002D01D1C121800009444D1C15C2C401C9A3 :1001E00000024 EOM 0001 FSTSCT 0142 GETBOOTER 021F GETMSG 020A HELLOMSG 010F HOME 000A LF 0103 MAIN 0015 NSECTS 0169 PUTAGAIN 015D PUTBG 5726E2024CB :00010000FF  MVI A,37H OUT CCOM ENDIF DRESS D639 2274D8 SHLD CURS ;STORE IT D63C 3EA0 MVI A,PSPACE ;POLY SPACE D63E 3279D8 STA UND D641 3E1A ,A ;PASS TO CCP IN C. D672 C300C1 JMP CPMB ;JUMP TO CCP. ; ; SET UP JUMPS INTO CP/M IN *""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*;SET LATCH CODE = F2. D654 3292DA STA LATCH D657 CD75D6 CALL SETUP ;SET UP JUMPS. D65A DB01 IN CDATA ;CLE*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%* IF SOLOS ;IF PROC TECH SOLOS, CALL CLRSCR ;CLEAR SCREEN. ENDIF D64 MVI A,'Z'-40H ;CLEAR SCREEN SYM. D643 CD21D7 CALL DRIVE ENDIF LOWER MEMORY. ; D675 3EC3 SETUP: MVI A,0C3H ;PUT JMP TO WBOOT D677 320000 STA 0 ;ADR AT ZERO.  EI ;ENABLE THEM HERE. ENDIF IF VDM ;IF PROC TECH VDM, AR CONSOLE STATUS. D65C 21BADA LXI H,SMSG ;PRINT OPENING MESSAGE. D65F CD30DA CALL PMSG D662 CDF3D6 CALL CONI59 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V06 AF XRA A ;CLEAR SCRATCH AREA. D647 0E0A MVI C,ENDZ-STARTZ ;GET LENGTH OF ZERO AREA. D649 2184DA LX IF ISIO2 ;IF IMSAI SIO2, MVI A,0AAH ;INITIALIZE SIO 2-2. OUT CCOM  D67A 2103D6 LXI H,WBOOTE D67D 220100 SHLD 1 D680 320500 STA 5 D683 2106C9 LXI H,BDOS ;PUT JUMP TO BD CALL CLR ;CLEAR VDM SCREEN. ENDIF IF STD ;IF STANDARD I/O, N ;READ # OF DISKS. D665 4F MOV C,A ;ECHO THE CHAR. D666 CD0AD7 CALL CONOT D669 E607 ANI 7 ;LOOK AT 3*""J͊!/6 !/͒%:^0ʏ>2.͡%ͱ*K0*T0&*M0*T0&\ ͍!/w#õH USE FACTOR !/͒%*I H,STARTZ ;GET SCRATCH ADDRESS. D64C 77 BOOTL: MOV M,A ;PUT ZERO IN MEMORY. D64D 23 INX H ;INCREMENT POI MVI A,40H OUT CCOM MVI A,0CEH OUT CCOM OS D686 220600 SHLD 6 ;AT ADR 5,6,7. D689 218000 LXI H,80H ;SET DEFAULT DMA ADR. D68C 2282DA SHLD DMAADD D ; ;INITIALIZE POLY DRIVER ROUTINE ; D636 2100DC INITP: LXI H,VADD ;VIDEO AD LSB'S. D66B 328EDA STA NODSKS ;SAVE IT. D66E 3A84DA GOCPM: LDA DISKNO ;GET DISK NUMBER TO D671 4F MOV C59 v;:0 : 0 v-!v !v-ʹ {ozg:.7ͮ2Z0!O0~4l!"*|>"V0NTER. D64E 0D DCR C ;DECREMENT COUNTER. D64F C24CD6 JNZ BOOTL ;LOOP TILL DONE. D652 3EF2 MVI A,0F2H H 68F C9 RET ;RETURN FROM SETUP. IF TUART ;IF CROMEMCO TUART, BAUDC5 0C INR C ;INCREMENT SECTOR NUMBER. D6C6 79 MOV A,C ;IF SECTOR NUMBER D6C7 FE1B CPI 27 ;IS NOT  RDBLK: PUSH B ;SAVE B&C. D6AD 48 MOV C,B ;GO TO TRACK IN B. D6AE CDC9D8 CALL SETTRK D6B1 C1 P BOOT EQU 0 BDOS EQU 5 RDCON EQU 1 WRBUF EQU 9 START EQU 900H ENDPT EQU START+128+256+768+BIOSSZ ;BOOT+PINIT+SPARE+BIOS N D699 0E00 MVI C,0 ;SELECT DISK ZERO. D69B CD7AD8 CALL SELDSK D69E CDC7D8 CALL HOME ;MOVE TO TRACK ZERO. D66DB C36ED6 JMP GOCPM ;GO BACK TO CPM. ; D6DE 2196DA RDERR: LXI H,BTMSG ;GET ADDRESS ORS: DB 94H,0CEH,0A2H,92H,88H,84H,82H,1 ENDIF ; ; WARM-BO27, D6C9 DAB5D6 JC RBLK1 ;KEEP READING ON THIS TRACK. D6CC 0E01 MVI C,1 ;OTHERWISE, RESET SECTOR=1, D6CE 04 OP B ;RESTORE B&C. D6B2 C2DED6 JNZ RDERR ;IF ERROR, PRINT MESSAGE. D6B5 2282DA RBLK1: SHLD DMAADD ;SET STARTING ADSECTS EQU (ENDPT-START)/128 FSTSCT EQU 1 ; CR EQU 0DH LF EQU 0AH EOM EQU '$' ; ; ; ORG TPA ; ; LXI SP,STACK MAIN:A1 C2DED6 JNZ RDERR ;IF ERROR, PRINT MESSAGE. D6A4 162A MVI D,NSECTS ;GET # SECTORS FOR CPM READ. D6A6 010200 F "BOOT ERROR". D6E1 CD30DA CALL PMSG ;PRINT IT. D6E4 CDF3D6 CALL CONIN ;READ A CHAR FROM CONSOLE. D6E7 C390D6 OT: READ ALL OF CPM BACK IN ; EXCEPT BIOS, THEN JUMP TO CCP. ; D690 318000 WBOOT: LXI S INR B ;INCREMENT TRACK NUMBER, D6CF C3ACD6 JMP RDBLK ;AND READ NEXT TRACK. D6D2 3A91DA ALDON: LDA TEMP ;REDRESS. D6B8 CDD6D8 CALL SETSEC ;READ STARTING AT SECTOR IN C. D6BB CDE1D8 CALL READ2 D6BE C2DED6 JNZ RDERR ;I CALL SAY$TITLE CALL GET$BOOTER CALL PUT$BOOTER JMP REBOOT ; ; HOME: ;HOME DISK LHLD BOOT+1 MVI L,18H PCHL  LXI B,2 ;TRACK (B)=0, SECTOR (C)=2. D6A9 2100C1 LXI H,CPMB ;GET STARTING ADDRESS. BIOSSZ EQU 1536 ; TPA EQU 100H ; ; ; PASCAL BOOT MAINTENCE PROGRAM ; ; BOOTER MAY BE READ IN FROM CURRENT PASCAL DISK ANP,80H ;SET STACK POINTER. IF INTRP ;IF INTERRUPTS ALLOWED, EI ;ALLOW THESTORE DISK NUMBER. IF INTRP ;IF INTERRUPTS ALLOWED, EI ;ALLOW THEM AGAIF ERROR, PRINT MESSAGE. D6C1 15 DCR D ;DECREMENT SECTOR COUNT. D6C2 CAD2D6 JZ ALDON ;ALL DONE WHEN D=0. D6; SELDSK: ;SELECT DISK LHLD BOOT+1 MVI L,1BH PCHL ; SETTRK: ;SET TRACK LHLD BOOT+1 MVI L,1EH PCHL ; SETSEIF INTRP ;IF INTERRUPTS ALLOWED, DI ;DISABLE THEM HERE. ENDIF D6AC C5 D MOVED ; ONTO ANY NUMBER OF NEW DISKETTES ; ; THIS PROGRAM PROVIDED COURTESY OF NORTHWEST MICROCOMPUTER SYSTEMS, INC. ; ;M HERE. ENDIF D693 3A84DA LDA DISKNO ;SAVE DISK NUMBER. D696 3291DA STA TEMP N HERE. ENDIF D6D5 3284DA STA DISKNO D6D8 CD75D6 CALL SETUP ;SET UP JUMPS. DI C: ;SET SECTOR LHLD BOOT+1 MVI L,21H PCHL ; SETDMA: ;SET DMA ADDRESS LHLD BOOT+1 MVI L,24H PCHL ; READ: D THE FIRST SECTOR DR$LOOP: ;THEN PUT IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL RESPONSE MVI C,RDCON CALL BDOS CPI 03H ;DON'T FORGET ^C JZ BOOT CPI 'Y' ;UPPER CASE RZ CPI 79H ;AND LOWER RZLXI D,PUT$MSG CALL BDOS CALL CK$YES ;IF THE ANSWER IS NOT YES RC ;LEAVE PUT$AGAIN: ;ELSE START TO PUT MVI C,WRBUF OM GET$MSG: DB CR,LF,'Get Booter?(y/n)',eom READ$MSG: DB CR,LF,'Reading Booter from drive A, type return ',eom PUT$MSG: DB CR ;READ A SECTOR LHLD BOOT+1 MVI L,27H PCHL ; WRITE: ;WRITE A SECTOR LHLD BOOT+1 MVI L,2AH PCHL ; ; SAY$TITLE READ POP D POP B LXI H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DR$LOOP RET ; ; DO$WRITE: ;WRITE OUT  STC ;NOT THERE RET ; ; WAIT$FOR$RET: ;HANG AROUND MVI C,RDCON CALL BDOS CPI 03H ;TEST FOR REBOOT REQUEST JZ LXI D,WRITE$MSG CALL BDOS ;DO ANOTHER CONFIRM MSG CALL WAIT$FOR$RET ;AND HOLD UP CALL DO$WRITE ;NOW PUT IT OUT MVI C,,LF,LF,'Put Booter?(y/n)',eom WRITE$MSG: DB CR,LF,'Writing Booter to drive A, type return ',eom AGAIN$MSG: DB CR,LF,'Again?(y/: ;JUST SAY WHO WE ARE MVI C,WRBUF LXI D,HELLO$MSG CALL BDOS RET ; ; GET$BOOTER: ;MAYBE A BOOTER COMES IN MVI CTHE BOOTER MVI C,0 ;SELECT THE DISK CALL SELDSK CALL HOME LXI B,START LXI D,NSECTS SHL 8 + FSTSCT DW$LOOP: ;ALL PA BOOT CPI CR ;LEAVE WHEN READY JNZ WAIT$FOR$RET RET ; ; DO$READ: ;READ IN THE BOOTER MVI C,0 ;SELECT DISK CALL WRBUF ;IS THIS A LOOP? LXI D,AGAIN$MSG CALL BDOS CALL CK$YES JNC PUT$AGAIN ;GUESS SO RET ;ALL DONE ; ; REBOOT: n)',eom REBOOT$MSG: DB CR,LF,LF,'Rebooting CP/M, type return ',eom ; ; DS 256 STACK EQU $ ; ; ; END TPA ,WRBUF LXI D,GET$MSG CALL BDOS CALL CK$YES RC ;THAT'S ALL FOR HERE MVI C,WRBUF LXI D,READ$MSG ;SAY HEY CALL BDOSRAMS SET - RUN IT OUT PUSH B PUSH D CALL SETDMA POP D MOV C,E PUSH D CALL SETSEC CALL WRITE POP D POP B LXSELDSK CALL HOME ;MAKE SURE IT'S INITIALIZED LXI B,START ;SET WHERE WE START IN RAM LXI D,NSECTS SHL 8 + FSTSCT ;SIZE AN ;PULL BACK CP/M MVI C,WRBUF LXI D,REBOOT$MSG CALL BDOS CALL WAIT$FOR$RET JMP BOOT ; ; CK$YES: ;CHECK FOR A YES CALL WAIT$FOR$RET ;AND WAIT CALL DO$READ RET ;DONE ; ; PUT$BOOTER: ;DOES THE BOOTER GO OUT? MVI C,WRBUF ;ASK I H,128 DAD B MOV B,H MOV C,L INR E DCR D JNZ DW$LOOP RET ; ; ; HELLO$MSG: DB CR,LF,'Pgen Version 1.0',CR,LF,EJ  JMP WBOOT ;DO A WARM BOOT. ; ; CHECK CONSOLE INPUT STATUS. ;  CONOTA ;NOT SET, SO PRINT. D716 AF XRA A ;RESET THE FLAG D717 3289DA STA LASTCHAR ;TO ZERO. D71A 0E5F OT. D704 3E7F MVI A,7FH ;RESTORE RUBOUT D706 3289DA STA LASTCHAR D709 C9 RET ;RETURN FROM CONIN. D71000DAFE7FC21CD7AF3289DA0E5F79CD21D70E :10D72000C9F5C5D5E5472A77D83A76D8B7C22AD8F9 :10D7300078FE1DCA1ED8FE07CA43D7FE00CA43D7M CONSOLE. ; CINSPL: IF SPLER ;IF SPOOLER INSTALLED, CAL0121BADACD64 :10D6600030DACDF3D64FCD0AD7E607328EDA3A84D8 :10D67000DA4FC300C13EC33200002103D6220100AD :10D680003205002106C9220 CONST: IF SPLER ;IF SPOOLER INSTALLED, CALL SPLT0 ;CHECK SPOOLER STA MVI C,5FH ;ANOTHER BACKSPACE. CONOTA: D71C 79 MOV A,C ;GET OUTPUT CHAR D71D CD21D7 CALL DRI ; WRITE A CHARACTER TO THE CONSOLE DEVICE. ; CONOT: CB :10D74000C348D7E1D1C1F1C92A74D83A79D87778DA :10D75000FE08CAFAD7FE0ACAF1D7FE0DCAEAD7FEFA :10D760000BCACBD7FE0CCA8AD7FE1ECAEL SPLT0 ;CHECK LIST READY BIT. ENDIF CONIN: D6F3 DBDC IN PSTAT ;REA6002180002282DAC963 :10D690003180003A84DA3291DA0E00CD7AD8CDC7E3 :10D6A000D8C2DED6162A0102002100C1C548CDC964 :10D6B000D8C1C2DETUS. ENDIF D6EA DBDC IN PSTAT ;READ CONSOLE STATUS. D6EC E601 ANI PMASK ;LOOK AT KB READY BVE ;TO POLY DRIVER D720 C9 RET ;**** DRIVE ;POLY DRIVER WITH X-Y C D70A 79 MOV A,C ;GET CHARACTER. D70B FE7F CPI 7FH ;IS IT A RUBOUT? D70D C8 RZ ;IF SO, DON'T URSOR ADDRESSING. ;CURSOR ADDRESSING IS DONE WITH THE SEQUENCE: ; 1DH,Y-BYTE,X-BYTE (1DH,HORID STATUS D6F5 E601 ANI PMASK D6F7 C2F3D6 JNZ CONIN D6FA DBDD IN PDATA ;READ DATA D6FC E67F ANI 7FHD62282DACDD6D8CDE1D8C2DE3C :10D6C000D615CAD2D60C79FE1BDAB5D60E0104C324 :10D6D000ACD63A91DA3284DACD75D6C36ED62196BD :10D6E000DIT. D6EE 3E00 MVI A,0 ;SET A=0 FOR RETURN. D6F0 C0 RNZ ;NOT READY WHEN NOT 0. D6F1 2F CMA ;IF REA:10D60000C333D6C390D6C3EAD6C3F3D6C30AD7C3AF :10D6100001DBC30CDBC318DBC3C7D8C37AD8C3C9CB :10D62000D8C3D6D8C3DBD8C3E1D8C393D9C32PRINT IT. D70E 3A89DA LDA LASTCHAR ;GET NO PRINT FLAG. D711 FE7F CPI 7FH ;IS IT A RUBOUT D713 C21CD7 JNZ Z,VERT). ; D721 F5 DRIVE: PUSH PSW ;SAVE REGISTERS D722 C5 PUSH B D723 D5 PUSH D  ;REMOVE PARITY BIT D6FE 3289DA STA LASTCHAR D701 FE5F CPI 5FH ;IS IT A RUBOUT D703 C0 RNZ ;RETURN IF NACD30DACDF3D6C390D6DBDCE6013E00EE :10D6F000C02FC9DBDCE601C2F3D6DBDDE67F328971 :10D70000DAFE5FC03E7F3289DAC979FE7FC83A8986 :10DY A=FF. D6F2 C9 RET ;RETURN FROM CONST. ; ; READ A CHARACTER FRO7D6D0 :10D63000C32AD63180002100DC2274D83EA0327982 :10D64000D83E1ACD21D7AF0E0A2184DA77230DC236 :10D650004CD63EF23292DACD75D6DBK  D724 E5 PUSH H D725 47 MOV B,A D726 2A77D8 LHLD XYADD ;TESTS H,L IN GOT1 & GOT2 D729 3A76D8 LDA X D782 FE7F CPI RUB2 ;7FH RUB D784 CAF8D7 JZ BSERA D787 F680 ORI BIT7 ;ALL OTHER CHARS ARE PRINTABLE D789 CPI VT ;CURSOR UP,CTRL-K D761 CACBD7 JZ UP D764 FE0C CPI FS ;CURSOR RIGHT,CTRL-L D766 CA8AD7 JZ FOW EE0 CPI HADD+4 D7B7 C2B1D7 JNZ LASTL D7BA 21C0DF LXI H,VADD+400H-40H ;BEGINNING BOTTOM LINE. D7BD 7E L EXIT. D744 D1 POP D D745 C1 POP B D746 F1 POP PSW D747 C9 RET D748 2A74D8 GOGO: L,VADD ;OTHERWISE D7A4 1140DC LXI D,VADD+64 ;SET FOR SCROLL D7A7 1A SCROLL: LDAX D ;GET CHAR D7A8 77 MOVYFLAG ;GET X-Y SEQ FLAG D72C B7 ORA A ;HAS IT BEEN SET D72D C22AD8 JNZ GOT2 ;X-Y SEQ HAS STARTED. D730 78  77 MOV M,A ;PUT IT ON T.V. D78A 7D FOW: MOV A,L ;TEST FOR R.H.SIDE OF SCREEN D78B E63F ANI 3FH D78D  D769 FE1E CPI HOM ;CURSOR HOME,CTRL-^ D76B CAE4D7 JZ HOMER D76E FE1A CPI SYN ;CLEAR SCREEN,CTRL-V D770 CAFINI: MOV A,M ;WRAP IT UP D7BE 36FF MVI M,CURSYM ;CURSOR TO SCREEN D7C0 3279D8 STA UND ;STORE CHAR UNDER CURSOR HLD CURS ;GET CURSOR ADDRESS. D74B 3A79D8 LDA UND ;AND SYMBOL UNDER IT. D74E 77 MOV M,A ;RESTORE SYMBOL D74F 7 M,A ;AND MOVE IT UP 64 LOCATIONS D7A9 13 INX D ;INCR D,E D7AA 23 INX H ;AND H,L D7AB 7A MOV A,D ; MOV A,B ;GET BACK ACCUM. D731 FE1D CPI SSEQ ;CHECK FOR FIRST GOTXY REQUEST. D733 CA1ED8 JZ GOT1 ;YEP, IT STARFE3F CPI 3FH ;END OF LINE? D78F CABDD7 JZ FINI ;DONT WRITE PAST IT D792 23 INX H D793 7D DONE: MOD8D7 JZ CLEAR D773 FE19 CPI CES ;CLEAR TO END OF SCREEN,CTRL-Z D775 CA0FD8 JZ CLESCR D778 FE1C CPI CE D7C3 2274D8 SHLD CURS ;AND THE CURSOR ADDRESS D7C6 E1 POP H D7C7 D1 POP D ;POP ALL REG. D7C8 C1 8 MOV A,B ;GET BACK INCOMING CHAR. D750 FE08 CPI BS ;BACKSPACE,CTRL-H D752 CAFAD7 JZ BACK D755 FE0A CHECK POINTER D7AC FEE0 CPI HADD+4 ;WITH END OF SCREEN+1 D7AE C2A7D7 JNZ SCROLL ;KEEP GOING IF NOT THERE. D7B1 3TED. D736 FE07 CPI BEL ;IF YOU AINT GOT A DINGER, D738 CA43D7 JZ GOBACK ;GET OUT D73B FE00 CPI NULLIT ;NV A,L D794 E63F ANI 3FH ;CHECK R.H.SIDE D796 FE3F CPI 3FH D798 CABDD7 JZ FINI ;DONT GO PAST E.O.L. D79B L ;CLEAR TO END OF LINE,CTRL-BACKSLASH D77A CAFED7 JZ CLINE D77D FE5F CPI RUB1 ;5FH RUB D77F CAF8D7 JZ BSERA POP B D7C9 F1 POP PSW ;ALL REGISTERS RESTORED D7CA C9 RET ;DONE!! D7CB 11C0FF UP: LXI D,-64 ;UP CPI LF ;LINE FEED. D757 CAF1D7 JZ LINF D75A FE0D CPI CR ;CARRIAGE RETURN. D75C CAEAD7 JZ CURET D75F FE0B6A0 LASTL: MVI M,PSPACE ;BLANK BOTTOM LINE D7B3 23 INX H D7B4 7C MOV A,H ;CHECK H,L OFF-SCREEN D7B5 FULL SYM D73D CA43D7 JZ GOBACK D740 C348D7 JMP GOGO ;ELSE DO YOUR THING. D743 E1 GOBACK: POP H ;DO A GRACEFU7C MOV A,H D79C FEE0 CPI HADD+4 ;OFF-SCREEN D79E C2BDD7 JNZ FINI ;WRAP IT UP IF OK D7A1 2100DC LXI HL  ONE LINE D7CE 19 DAD D ;SUBTRACT 64 FROM H,L D7CF 7C FIX: MOV A,H ;DONT GO OFF TOP D7D0 E603 ANI 3 BDD77CFEE0C2BDBC :10D7A000D72100DC1140DC1A7713237AFEE0C2A7F0 :10D7B000D736A0237CFEE0C2B1D721C0DF7E36FF82 :10D7C0003279D82274D4 E63F ANI 3FH D806 FE3F CPI 3FH ;IS IT THERE? D808 CA18D8 JZ RESTOR ;DONT MOVE CURSOR D80B 23 ID7EB E6C0 ANI 0C0H ;TO BEGINNING OF LINE D7ED 6F MOV L,A D7EE C3BDD7 JMP FINI ;DONE D7F1 114000 LINCHK ;CHECK FOR SEEK ERROR. LXI H,RECNT ;GET RD ERR COUNT ADDR. INR M ;ONE MORE ERROR. LDA ERCNT ;GET ERROR COUNT. DC D7D2 F6DC ORI HADD D7D4 67 MOV H,A D7D5 C3BDD7 JMP FINI D7D8 2100DC CLEAR: LXI H,VADD ;CLEAR SCREEN8E1D1C1F1C911C0FF197CD6 :10D7D000E603F6DC67C3BDD72100DC36A0237CFE60 :10D7E000E0C2DBD72100DCC3BDD77DE6C06FC3BD7F :10D7F000D711NX H ;KEEP GOING TO EOL. D80C C301D8 JMP CLIN1 D80F 36A0 CLESCR: MVI M,PSPACE ;START WRITING SPACES D811 23 F: LXI D,64 ;LINE-FEED, DOWN ONE LINE D7F4 19 DAD D D7F5 C393D7 JMP DONE ;TEST IF SCROLL NECESSARY D7F8 36A0R A ;DECREMENT COUNT. JNZ RRETRY ;TRY TO READ AGAIN. LXI H,RDMSG ;PRINT "READ ". ERMSG: CALL PMSG ;PRINT ORIGIN MESSAGE D7DB 36A0 CLOOP: MVI M,PSPACE ;AND HOME CURSOR D7DD 23 INX H ;AND PRINT SPACES D7DE 7C MOV A,H D7400019C393D736A02BC3BDD72A74C5 :10D80000D836A07DE63FFE3FCA18D823C301D836DC :10D81000A0237CFEE0C20FD82A74D8C3BDD72EFF48 :10D82 INX H D812 7C MOV A,H D813 FEE0 CPI HADD+4 ;END OF SCREEN? D815 C20FD8 JNZ CLESCR D818 2A74D8  BSERA: MVI M,PSPACE ;SPACE FOR ERASE D7FA 2B BACK: DCX H ;THEN BACK UP D7FB C3BDD7 JMP FINI D7FE 2A74D8 DF FEE0 CPI HADD+4 ;CHECK END OF SCREEN D7E1 C2DBD7 JNZ CLOOP ;KEEP GOING OTHERWISE D7E4 2100DC HOMER: LXI HMEMORY. INX H ;INCREMENT MEMORY POINTER. JMP RLOOP ;KEEP READING. RDDONE: IN DSTAT ;READ DISK STATUS. IF INTRP ;4D7FE1A54 :10D77000CAD8D7FE19CA0FD8FE1CCAFED7FE5FCA88 :10D78000F8D7FE7FCAF8D7F680777DE63FFE3FCA1E :10D79000BDD7237DE63FFE3FCA CLINE: LHLD CURS ;GET CURRENT LOC. D801 36A0 CLIN1: MVI M,PSPACE ;SPACES D803 7D MOV A,L ;CHECK EOL. D80,VADD ;BEGINNING ADDRESS NATCH D7E7 C3BDD7 JMP FINI ;DONE WITH HOME D7EA 7D CURET: MOV A,L ;CR SENDS CURSOR IF INTERRUPTS ALLOWED, EI ;ALLOW AGAIN HERE. ENDIF ANI 9DH ;LOOK AT ERROR BITS. RZ ;RETURN IF NONE. CHECK: CALL ER