SYSGEN BAKEX COME CLS MACSURVEY MACw !"#$%&'()*+,-NF EQU 15 ;DISK OPEN FUNCTION DREADF EQU 20 ;DISK READ FUNCTION ; MAXTRY EQU 10 ;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITESYSGEN SYMRATING SYSTEM TRACKS NDISKS EQU 4 ;NUMBER OF DISK DRIVES SECSIZ EQU 128 ;SIZE OF EACH SECTOR LOG2SEC EQU 3 ;LOG 2 SECSIZ SKEEX MAC3456789:; &e1p\. p\. p\$kцC`B{ *A !|5m% &00000000000065FC8DFA60E1 :20FA4000FEE5FC73FA00000000000065FC8DFA70FE04FD73FA00000000000065FC8DFA802E :20FA6000FE23FD73FA000000  $@HlH D$OVE. ; OST: DB NTRKS ;OPERATING SYSTEM TRACKS SPT: DB NSECTS ;SECTORS PER TRACK (CAN BE PATCHED) TRAN: ;BASE OF TRANSLATE JW0 Ĝ$GĀ 5+|. p\. p\. p\$kB)myHH`C30C0006 :00000001FF e1`\. p\. p\$kD`x\i4KЮ X5 &e1\. p\00000065FC8DFA90FE42FD01070D1319050B111703090F159D :20FA800002080E141A060C1218040A10161A00030700F2003F00C00010000200ACFA0000E3 2.=Y+2.=@ >2.=Y+}+>}+:@/o:22<(2 {=ʝҝ<22.=Y+}+>}+:@/o:22<(2 {=ʝҝ<2@G!>0w#w!4~:60+4~u!N#F! x, # ; GET OR PUT CP/M (RW=0 FOR READ, 1 FOR WRITE) ; DISK IS ALREADY SELECTED ; LXI H,LOADP ;LOAD POINT IN RAM FOR CP/M DURING SD :20FBE00016010CCD45FCC3BAFB3EC33200002103FA2201003205002106EC220600018000F5 :20FC0000CD53FCFB3A04004FC300E4DB00C9DB01C979D30C5D5E5F606162636465666768696A6B6C6D6E6F707172737455 :20FB200075767778797A7B7C7D7E7F808000040F00F707FF03FFFF0000000036344B20435E=!v"z!w6!u#+w+wz >ZxG}o|g"|! :m c p!"xp ~#c*|!:m YSGEN SHLD DMADDR ; ; CLEAR TRACK TO 00 MVI A,-1 ;START WITH TRACK EQUAL -1 STA TRACK ; RWTRK: ;READ OR WRITE NEXT TRA1C979D303C9DB02C979D305C962 :20FC2000DB05C90E00C345FC21000079FE04300CD30A6F292929291133FA19C9FE08C0D388 :20FC40000A219CFAC979D :20FB4000502F4D20566572732E20322E3220284342494F532056312E3120666F72205A3862 :20FB60003053494D2C20436F707972696768742031393838 xä SYNCRONIZATION ERROR$ {°~#o}oҼüÅ*zZ# :m m! ~ #* DM! x  wCK LXI H,TRACK INR M ;TRACK = TRACK + 1 LDA OST ;NUMBER OF OPERATING SYSTEM TRACKS CMP M ;= TRACK NUMBER ? JZ ENDRW ;E30BC979D30CC9EB096E2600C979D30F78D310C9AFC360FC3E01FC :05FC6000D30DDB0EC90D :00000001FF 718191A1B1C1D1E1F20212223242526272822D323030362062792055646F35 :20FB8000204D756E6B290D0A00318000213BFB7EB7CA9CFB4FCD11FC23C38FFBAF3203004F :20FBA000320400C3E9FB31#!N#F! D!_>0w#w1!`4~:60+4*"e@u READY FOR "SYSGEN" OR "SAVE 33 CPM64.COM"$*|  ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1] ʑ?ʑ! __0 r))) O @|r}r.g))å{u INVi"j=HL ; DREAD: ;DISK READ FUNCTION MVI C,DREADF JMP BDOS ; OPEN: ;FILE OPEN FUNCTION MVI C,OPENF ! JMP BDOS ; GETPUT: 80000E00CD28FCCD23FC062C0E0016022100E4C5D5E54ACD4990 :20FBC000FCC1C5CD53FCCD5AFCFE00C2A6FBE111800019D1C105CAE9FB147AFE1BDABAFBFCONSTRUCTING 64k CP/M vers 2.2$j ͢ØÆ^ BRͧ9!5‚#~Y‚#"T<ÆALL (Y/N)?^ Tʧ͘!6!~ڇ#~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 321y_͸2y2ͽ:!Yadd ix,..........$ Q> Qq0! 凇!2:2a{_:ʖ:>Ľʖ:=2–!B!6#5ʖ:eSwitched to Z80 processor. $Switched to 8080 processor. $>0[>2 522=sV*A 5! w4!Y~ʆ͌†t=ʆf ^ T 2o&)|+!<ͧ1͘A͌>>͌92^ :¥.!_~#fow]!v"!çREAD ERRORçNO FILE^:_(add iy,..........$@<~gzma[) f8Hy`aluop a,nn.................Ľ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!®~#ʏ+DÂ:ʜ 5:N$D$Dd$D  d $ D $Dd$D2!> x y }| #v19 y  ÆNO SPACE^ :Ty!B*O=?_s#"^sG!~Ypsp2mÆÆf ͧ ! ~ 3#0 Wx x G ~ # 3x~#B!Y~ɯ2:=!ý:=!:ý^T!...$׀>:WML f;?Caluop a,..$݄nϬG("58K# 9#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@dDd$d$B,O+9~cӉ^F8!󐉠 hl,.\X COPYRIGHT (C) 1979, DIGITAL RESEARCH q.*   !q*&!p+q*2FILE EXISTS _: É: :ʉ=2)ͽÉ T!@k!}|q~  6?#ˆ:`O> K{͘A͒>:͒͢>:͒͢xK > K > ͒x mZaluop a,.....$݆2n@En 8G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" ...$ &PXfɛ0!eadd hl,..........$ ݔ[c3vj h60!p+q*_͌> ͒> Ò> Ò͘~#͌ì _2<2=qf^!~2>`~22\!!B!~> >#0~O#Cx2͘1)ͽÂf zͧÆBAD LOIgnaluop a,(+1)...........$SFu +1).............$4V| >~X\7: (hl)................$3o4iѶޔvS[u e...................$$+&(} h...................$"rwSr?d-5`Gld (nnnn),hl..................$sZVگlD ?_h"d b...................$ͫDɍIM*!˺ iyl.................$KYohنKMEld ,(nnnn).............$S@>zazP$?S{Ubit n,....$Ǵr0!]' sp..................$4n(,WP3o( ...$#åmO*W! mJ hl..................$#<  X_ld (nnnn),sp..................$"l i Ү; bc..................$ 5 ['ҕ`„UL c...................$*c0xw `_$ld hl,(nnnn)..................${Wa!ʅ'` Bcpd........................$HMJkqNj| Xp (+1).........$$8l1>XYBoF6b ixh..............!M1 ix..................$#zc1Z鲴m!*kld (nnnn),.............$\F-x`tF009ild ,nnnn.........$꠺_e8C\E# d...................$.4( g.:TzΡld sp,(nnnn)..................$*L$އ¼cL ޳Vcpi........................$'A! `Y[y)Ku.............$,M`tv2 ixl.................$$6(oa˂sP]Q iy..................$,1 VC <>V l...................$! SrQ "}%ld ,nnnn...............$ *BƱ!, de..................$/` L$ 2%Ymld ,(nnnn).............$CM]a?dld (nnnn),.............$<J՘+CDZ0ш a...................$#-CazZX-l iyh.................$,b9p~>"5ld a,<(bc),(de)>..............$ĝ=9UtS U8q:́shf/rot (+1)...........$J]0Cx=?W`MXshf/rot (1)....................$Jnˆ-G 6#!i~<G8x66#w# ...$@r$aǂq?tKld ,........$@ż/; ?zLOld (),a................$~#fo~2#AͰ(iͰ!i6,ڵVld ,nn....$6EaĽ &G~ld (+1),nn..........>..$ˀ,9KѲjS'8W n,.....$D h2^g xYldi (2)....................$D8k_4WBFCZ j<;neg........................s1{s1{*"!~w!>~#Gkld ,........$2hDCSO 5*:vʠ:vđ<>2 5 5!> 5##>2W2{!A"X!i"| ...$F`B9J ld ,(+1)......$fRI c n,(+1).......$p ':{p ...$gˑb y@[&.....................$Cm S @~# ('0_5Z80 instruction exerciser Undefined status bits NOT taken into&-ld a,(nnnn) / ld (nnnn),a.....$Rhfh 'ildd (1)................. É# N~5>ZO$~P>~OAy*XF!W~Ows*X#"Xx>*Mld ,(+1)..........$~МC bjld (+1),......$tdf j1ld (+1),.......%0...........$#...$.*GZ~ldd (2)....................$0X``&*|F!{~Ow—*|#"|x>6T] (͟^{yO#¿zo&zw!A4~dld a,(+1)..............$&S<@Fyw] $肋ld ,nn.......$wgOD׼P_ ̾Zld (+1),a..............$; l!o&))!BFw# !>>w#4w0a, Qmpjc5dۈ2yܸو L+~|-"C{2!"E9"1A22!ty)K!G_^#V*C~E ,dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE\u ϫ"*}:*)=":O:o"*C *C!ͮ~2~2ͦ:2ͮ:O:w:w |g}o*# DhibW]egl6qnkv+zZgJoC`֣ѓ~8ORѻgWg?H6K +گ L6JAz``ègU1nFix: ! 2 ͤ! 5™#wO~x½p Hy<< ʑ :!qMD#dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE\u ϫ&-AGMS!!ô!ô!Bdos Err On : $Bad Sector$Select$File R/O$:BA2!~6=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m=-dlc ):BO!yoxg*:BO}!N#F "*#*s#r^ ~!J! J*:o$*C~i6iw*yaf%oҠRh6 w G"U&/ź; (+Z\j1,ٞ[ޮd°c&ujm 6?rgWJz{+ 8Ҏվ | 2E>):[ͱ!N5!6ñ:5!6#6>!ڰ!! ^#V w#P:BO|^#V#"##"##"##"!=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m=-dlc O͐  :E B 2>: b# : y! 4 5~yy5 6y\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3 L_ *{#zr+s{ozg**͕** ,w͜͸Ͳ!!N#F$**O!~#nwۮjJZ@ f7;𩼮S޻G0O*!O*|!6ʝ6>*w#w*w#w'û*! J*""!N#F*^#V*~#foyx*{_zW+*\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3 L_ Ґ^H@Oy H H: –ͬ  #H: !  Hù H H $O͐: 2 *CN# ADCOMf^: ! Â*~2*#"$$$ SUBm!6m!6m!6 m2m"**#"͕: 2Þy<_WyOxOxG* ~V5dw^ :ʈ齽ʺŠS0$6TW)#gfz.aJ]h*o+ 7 Z- x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻G0yx#*DM*s#r*s#ryOxG*0MD!!N: EG>O: \S*C :qn& ^#V>O^|Pq<'A  Wh% of a^)ɘИ"רY=. \;l  tҚG9w&sc d; mj>zjZ '}x: 2 p&x~+é72 H! >w_: ! 5ͤNkͱ¦ͱxʊ#NNÎ N#Fyʝ*}|\#u*#DM*6# x±**s#r͡*6#6^>:A#~$=2Ek͌rs to load ; ; we aren't using a stack, so use as scratch register ; to hold the load address increment ; LD SP,128 ve A OUT (DRIVE),A ; ; load the next sector ; LSECT: LD A,B ; set track OUT (TRACK),A LD A,C ; set sector OUT (SECì 4~ʶ¬:<ʶ$ʶïZͻx>2>2ͻ:!Z2:Eẅ́͊Ͳ>TS EQU SIZE/128 ; # of sectors to load ; ; I/O ports ; DRIVE EQU 10 ; fdc-port: # of drive TRACK EQU 11 ; fdc-port: #S:2E!~Яw>T D^6k-äPYy 5*{zBK52!q*C"͡ʔ*JҔ^:Oyʃ?|x | s-|N-# ; 128 bytes per sector ADD HL,SP ; = + 128 ; INC C ; sector = sector + 1 LD A,C CP 27 ; last sector of traTOR),A LD A,L ; set dma address low OUT (DMAL),A LD A,H ; set dma adress high OUT (DMAH),A XOR A ; read sector OU2>2T*CGͻ:ẅ́n>2;O ^DM;}H>"*C ::ddslO s#r:E͊:==» of track SECTOR EQU 12 ; fdc-port: # of sector FDCOP EQU 13 ; fdc-port: command FDCST EQU 14 ; fdc-port: status DMA *C ^OT *C~wD -'  -@ͦ~^*C Ox! N!Fwy; CP/M 2.2 boot-loader for Z80-Simulator ; ; Copyright (C) 1988 by Udo Munk ; ORG 0 ; mem base of boot ; MSIZE EQU 64 ;ck ? JP C,LSECT ; no, go read another ; ; end of track, increment to next track ; LD C,1 ; sector = 1 INC B ; track T (FDCOP),A IN A,(FDCST) ; get status of fdc CP 0 ; read successful ? JP Z,CONT ; yes, continue HALT ; no, halt cpu y==»*Ww#*"͸*:G#š"͸:!w4 iw:Z!E~=26L EQU 15 ; dma-port: dma address low DMAH EQU 16 ; dma-port: dma address high ; ; begin the load operation ; COLD: xʋ>ڋ>*Cw~#+w#w+ɯ2E22i^ *C :~w~͔͔# # mem size in kbytes ; BIAS EQU (MSIZE-20)*1024 ; offset from 20k system CCP EQU 3400H+BIAS ; base of the ccp BIOS EQU CCP+16= track + 1 JP LSECT ; for another group END ; of boot loader  CONT: ; go to next sector if load is incomplete DEC D ; sects=sects-1 JP Z,BOOT ; head for the bios ; ; more secto2*C!!~~#~O~G#n,-.‹! w! yG!x͢.:E<ʄ! q!pQ:E<. ʄ$.:E<ʄLD BC,2 ; b=track 0, c=sector 2 LD D,SECTS ; d=# sectors to load LD HL,CCP ; base transfer address LD A,0 ; select dri w ~>2!E5T*C!"C"C!w# F! w͌x2͢*C ~<wʃG:!ʎ00H ; base of the bios BIOSL EQU 0300H ; length of the bios BOOT EQU BIOS SIZE EQU BIOS+BIOSL-CCP ; size of cp/m system SECi6}2ExN! ~态O>G~G!~G} *C!r#r#r ^ͥ_y#x#{Çä !&CGQX\Ksc^scnsc~!sc@   X:OyyyH!y? o))))3 !y y o&yxɯe> >2!"2!"G:ʐ:wÖx2p0ʹ#*©6?ëw˜0ï#6 ¹.0#*6?w0#6 #6" Éè "%*HLX_cPsjesju sj(sjG   s+p+q-*C ͥ!!q#p#w*:BOYG}*MD "ã:!Bw!>2*C~=2u:B2~2wE:A*Cw>"  ?c,_  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTX:OyyyH!y? o))))3 !y y o&yxɯe> #~?  xDIR ERA TYPESAVEREN USER!yO#< Ty#O 321y_͸2y2ͽ:  ?j,f  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRST!""2B!"!rQQQâ~?ͦ~?rQ*"CQ-Q͜QüQrQ$Q*UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~64K CP/M Vers. 2.2 (CBIOS V1.1 for Z80SIM, Copyright 1988-2006 by Udo$@B B HH II$@DI ABI$"$H$H@$$I! H!9"j1  *** System Survey (June 82) *** !P Drive>A_" :\o` }‡*.<~2r##n&"UVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~64K CP/M Vers. 2.2 (CBIOS V1.1 for Z80SIM, Copyright 1988-2006 by UdoĽ!ͬʧ )!F#xʺ~0wëw!" !~6ͽ:ý(!):B"*)*)Q;*"E:;:A2AQÓQÜQ*C}/_|/*W}_*"}o|g":ʑ*C6xsub b: a:z80asm boot/h a:z80asm bios/h a: ddt movcpm.com s234 0 0 0 . s2cb 0 0 0 . i64 * g save 33 b:cpm64.co:ʑw:2E**E}DQ>2s ù>?2J##~2r###~#fo"s#|g}o¤E:sʹ~ #½' K bytes inJ!ƀ_ Munk) 1!;ʞO#Ï221*%,!JLX_¨zڼ Hü>2!"2!"#͘*~ ""͌#>?͌͘ =_.:;<> Oo$>!Y2*O"ʉ@:ʑw:2E**E}DQ>2.   8 m^am b: a:ddt cpm64.com iboot.hex r900 ibios.hex r2580 g0 a: save 33 b:cpm64.com ; now use sysgen b:cpm64.com #J  files with*s'|/g}/o# K bytes remaining $-<  Memory map: 0 8 16 24 32 40 48 56 64 expcrc <0ffh,082h,03eh,077h>,<095h,05bh,0a3h,026h>,<0,0,0,0> ; expected crc tmsg '' ; (6144 cyask ; flag mask tstr <0edh,044h>,038a2h,05f6bh,0d934h,057e4h,0d2d6h,04642h,043h,05ah,009cch tstr 0,0,0,0,0,0,0,0d7h,-1,0 ; ;24/Jun/80 - Removed MACLIB statement, included required macros ; in source. Bruce R. Ratoff ; .Z80 ASEG+|€!zG2ʺʺzʭ  z_z}#     Ports active *j  |{0__ equate ; Bill Bolton - Software Tools, Australia ; ;01/Jun/82 - Tidied up and fixed port display, added display ; of | | | | | | | | | !l6#6#6 !?2p2q~G/wp!l4#42p>:q2q!n4#4#¶:p#%;***************************************; ; ; ; S U R V E Y ; ; ; ;***************************************; ; (16,384 cycles) tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) expcrc <0d6h,038h,0ddh,06ah>,<06ah,03ch,03bh,0bdh>,<0,0,0,0> ; expe ;*******************************; ; SYSTEM MACROS ; ;*******************************; ;Increments 16 bit memory loc~W_"#> :r3k&@{o0G)D???????????{0__contents of low memory. David Bennett - Alfred ; Hospital, Australia ; ;29/Jun/80 - Added version number test and calcula: 5: 5 5:q1 5  ¬  T=TPA C=CPM B=BIOS or unassigned R=ROM or bad BIOS atÔ;By Michael Friese 9/22/79 ;* Lists Kbytes used and remaining plus number of files ; on all logged disks (up to 8) ;* cted crc tmsg 'neg' ; (7168 cycles) rld: db flgmask ; flag mask tstr <0edh,067h>,091cbh,0c48bh,0fa62h,msbt,0eation X INXI MACRO X LOCAL JUST8 PUSH HL LD HL,X INC (HL) JP NZ,JUST8 INC HL INC (HL) JUST8: POP HL ,msbt,2,014h,02dh,0a39fh tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,-1,0,0,0,0,0,0d7h,0,0 ; (22 cycles) expcrctions for CP/M ; version 2 compatibility. This program should now work ; properly on all versions 1.4 and later. BRR ͆Ɛ'@'_:}:}  iobyte:}  drive:}  BDOS at:}:}  *l  Bytes RAM *n  Prints Memory map and synopsis of all machine memory ;* Lists all active I/O Ports ;* Uses disk allocation block for all 720h,0b479h,040h,006h,08ae2h tstr <0,8>,0ffh,0,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,-1,0 ; (14 cycles) ENDM ;.............................................................. ; ; SAVE MACRO SAVE SPECIFIED REGISTERS ; ; SA <0e9h,0eah,0d0h,0aeh>,<0ebh,059h,089h,01bh>,<0,0,0,0> ; expected crc tmsg 'ldi (2)' ; neg (16,384 cycles) neg: db flgm; ;28/Jun/80 - Added IMS400 equate (prevents Industrial Micro Systems ; controller from hanging up during port scan). BRR Bytes ROM *  Bytes in TPA |/g}/o  Bytes Empty   Total Active Bytes *jActive I/O ports!disk calculations ; ;VERSION LIST - Most recent version first. ; ;06/Jul/82 - Added Godbout DISK 1 equate and added SKIPVE R1,R2,R3,R4 ; ; R1-R4 MAY BE B,D,H OR PSW SAVED IN ORDER SPECIFIED ; IF REGS ARE OMITTED SAVE B,D AND H ; SAVE MA,H OR L ;;TEST FOR ZERO CALL NZ,@DECOUT ;;RECURSIVE CALL LD A,E ADD A,'0' ;;CONVERT FROM BCD TO HEX LD E,A ;;CONVERT A POSITIVE INTEGER TO DECIMAL AND OUTPUT ; TO THE CONSOLE. ; ; DECOUT ADDR ; ; IF ADDR OMITTED, NUMBER ASSU*******************; TRUE EQU -1 FALSE EQU NOT TRUE TARBEL EQU FALSE ; Tarbell FDC dmb 31-may-82 IMS400 EQU FALSE ;2>,,> IF NUL R EXITM ENDIF POP R ENDM ELSE POP HL POP DE POP BC ENDIF ENDM ; ;..RCA RRCA RRCA RRCA ;;SHIFT RIGHT 4 CALL OUTCHR RESTORE PSW OUTCHR: AND 0FH ;;MASK 4 BITS ADD A,90H ACRO R1,R2,R3,R4 IF NOT NUL R1&R2&R3&R4 IRP R,<,,,> IF NUL R EXITM ENDIF PUSH R ENDM ELSTO E FOR OUTPUT CHAROUT ;;CONSOLE OUTPUT RESTORE ;;POP STACK RET ENDDEC: DECOUT MACRO ?ADDR IF NOT NUL ?ADMED TO BE IN HL, ELSE LOADED TO HL ; LEADING ZEROS SUPRESSED. MAXIMUM NUMBER 65,767 ; DECOUT MACRO ADDR LOCAL ENDDEC,D Industrial Micro Systems FDC GODBOUT EQU FALSE ; Godbout Disk 1 FDC SKIP EQU TARBEL OR IMS400 OR GODBOUT ; Will be true............................................................ ; ; CHAROUT MACRO CONSOLE OUTPUT FROM A ; ; CHAROUT ADDR ;;ADD OFFSET DAA ;;DEC ADJUST ADC A,40H ;;ADD OFFSET DAA ;;DEC ADJUST LD E,A ;;TO E FOR OUTPUT LD C,coE PUSH BC PUSH DE PUSH HL ENDIF ENDM ; ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; ; RDR LD HL,(?ADDR) ENDIF CALL @DECOUT ;;CALL THE SUBROUTINE ENDM DECOUT ADDR ENDM ; ; ;...............X JP ENDDEC @DECOUT: SAVE ;;PUSH STACK LD BC,-10 ;;RADIX FOR CONVERSION LD DE,-1 ;;THIS BECOMES NO DIVIDED BY ; if any skip needed IF TARBEL TARBAS EQU 0F8H ; Base of Tarbell SKIPORT EQU TARBAS+4 ; Port # to skip if Tarbe; CHAROUT MACRO ADDR IF NOT NUL ADDR LD A,(ADDR) ENDIF LD C,consoleOutputCmd ;;CONOUT LD E,A ;;CHAR TO E CnsoleOutputCmd ;;CONOUT JP BDOS ;;CALL BDOS HEXEND: HEXOUT MACRO ?ADDR IF NOT NUL ?ADDR LD A,(?ADDR) ENDIF ESTORE MACRO RESTORE REGISTERS (INVERSE OF SAVE) ; ; RESTORE R1,R2,R3,R4 ; ; R1-R4 MAY BE B,D,H OR PSW RESTORED IN OR............................................... ; ; HEXOUT MACRO CONVERT BINARY NO AND OUTPUT TO CONSOLE ; ; HEXOUT ADDRRADIX DX: ADD HL,BC ;;SUBTRACT 10 INC DE JP C,DX LD BC,10 ADD HL,BC ;;ADD RADIX BACK IN ONCE EX DE,HL LD ll FDC ENDIF IF IMS400 SKIPORT EQU 08FH ; Port # to skip if IMS FDC ENDIF IF GODBOUT GODBAS EQU 0C0H ; Base ALL BDOS ;;CALL BDOS ENDM ; ; ;............................................................. ; ; DECOUT MACRO CALL HEXPRN ENDM HEXOUT ADDR ENDM ; ; ;*******************************; ; SYSTEM EQUATES ; ;************DER SPECIFIED ; IF REGS OMITTED RESTORE H,D AND B ; RESTORE MACRO R1,R2,R3,R4 IF NOT NUL R1&R2&R3&R4 IRP R,<, 0: needs switch dec ally on a real Z80. ; A test case is defined by a descriptor which consists of: ; a flag mask byte, ; the base case, ; the tect differences between ; implementations and is not ideal for diagnosing the causes of any ; discrepancies. However, provid2 ; For the purposes of this test program, the machine state consists of: ; a 2 byte memory operand, followed by ; the regist case that are to be successively inverted. ; Thus the shift vector 'causes' a number of test cases equal to the ; number of ; parity even shows that we are running on an 8080 if isz80 jp po,start1 ; correct CPU detected call swz80 e ;(16 cycles) dw ld167 ;(16 cycles) dw ld168 ;(64 cycles) dw ld16im ;(64 cycles) dw ld16ix ;(32 cycles) dw ld8bd dw incde ;(1536 cycles) dw ince ;(3072 cycles) dw inch ;(3072 cycles) dw inchl ;(1536 cycles) dw incix ;(1536 cycl cycles) dw incm ;(3072 cycles) dw incsp ;(1536 cycles) dw ld162 ;(16 cycles) dw ld166 ;(16 cycles) dw ld16im ;(6isZ80 dw adc16 ;(38,912 cycles) dw add16 ;(19,456 cycles) dw add16x ;(19,456 cycles) dw add16y ;(19,456 cycles) dw dw srzx ;(1792 cycles) dw st8ix1 ;(1024 cycles) dw st8ix2 ;(256 cycles) dw st8ix3 ;(64 cycles) dw stabd ;(96 cyclelse jp pe,start1 call sw8080 endif start1: ld hl,(bdosO+1) ld sp,hl ld de,msg1 ld c,printst call bdos ld;(44 cycles) dw ld8im ;(64 cycles) dw ld8imx ;(32 cycles) dw ld8ix1 ;(512 cycles) dw ld8ix2 ;(256 cycles) dw ld8ixes) dw inciy ;(1536 cycles) dw incl ;(3072 cycles) dw incm ;(3072 cycles) dw incsp ;(1536 cycles) dw incx ;(6144 4 cycles) dw ld8bd ;(44 cycles) dw ld8im ;(64 cycles) dw ld8rr ;(3456 cycles) dw lda ;(44 cycles) dw rot8080 ;(61 alu8i ;(28,672 cycles) dw alu8r ;(753,664 cycles) ; dw alu8rx ;(376,832 cycles) dw alu8x ;(229,376 cycles) dw bitx s) else dw add16 ;(19,456 cycles) dw alu8i ;(28,672 cycles) dw alu8r ;(753,664 cycles) dw daa ;(65,536 cycles hl,tests ; first test case loop: ld a,(hl) ; end of list ? inc hl or (hl) jp z,done dec hl call stt jp loop do3 ;(128 cycles) ; dw ld8ixy ;(32 cycles) dw ld8rr ;(3456 cycles) ; dw ld8rrx ;(6912 cycles) dw lda ;(44 cycles) dw cycles) ; dw incxh ;(3072 cycles) ; dw incxl ;(3072 cycles) ; dw incyh ;(3072 cycles) ; dw incyl ;(3072 cycles) dw ld144 cycles) dw stabd ;(96 cycles) endif dw 0 tstr macro insn,memop,iy,ix,hl,de,bc,flags,acc,sp local lab lab: d;(2048 cycles) dw bitz80 ;(49,152 cycles) dw cpd1 ;(6144 cycles) dw cpi1 ;(6144 cycles) dw daa ;(65,536 cycles) dw) dw inca ;(3072 cycles) dw incb ;(3072 cycles) dw incbc ;(1536 cycles) dw incc ;(3072 cycles) dw incd ;(3072 cycne: ld a,(erfnd) or a ld de,allok jp z,noerr ld de,erfndt noerr: ld c,printst call bdos ld a,(nsw) or a jp z,wbldd1 ;(44 cycles) dw ldd2 ;(44 cycles) dw ldi1 ;(44 cycles) dw ldi2 ;(44 cycles) dw neg ;(16,384 cycles) dw rld 61 ;(32 cycles) dw ld162 ;(16 cycles) dw ld163 ;(16 cycles) dw ld164 ;(32 cycles) dw ld165 ;(64 cycles) dw ld166 b insn ds lab+4-$,0 dw memop,iy,ix,hl,de,bc db flags db acc dw sp if $-lab ne 20 error 'missing parameter' inca ;(3072 cycles) dw incb ;(3072 cycles) dw incbc ;(1536 cycles) dw incc ;(3072 cycles) dw incd ;(3072 cycles) les) dw incde ;(1536 cycles) dw ince ;(3072 cycles) dw inch ;(3072 cycles) dw inchl ;(1536 cycles) dw incl ;(3072oot if isz80 call sw8080 else call swz80 endif jp wboot ; warm boot tests: if ;(7168 cycles) dw rot8080 ;(6144 cycles) ; dw rotxy ;(416 cycles) ; dw rotz80 ;(6784 cycles) dw srz80 ;(7936 cycles) endif endm tmsg macro m local lab lab: db m if $ ge lab+30 error 'message too long' else ds lab+30fh,092h,01eh,071eah tstr <0,030h>,0,0f821h,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,-1,0,0,-1,-1,0d7h,0,-1 ; (38 cycles) edd hl,' ; add ix, (19,456 cycles) add16x: db flgmask ; flag mask tstr <0ddh,9>,0ddach,0c294h,06 handlers ; ; console status, return 0ffh if character ready, 00h if not ; CONST: IN A,(CONSTA) ;get console status RET ; ; concycles) tstr 0,0,0,0,-1,-1,-1,0d7h,0,-1 ; (38 cycles) expcrc <0d4h,08ah,0d5h,019h>,<0f3h,090h,089h,0a0h>,<0,0,0,0> ; expectlgmask ; flag mask tstr 080h,0c53eh,0573ah,04c4dh,msbt,0e309h,0a666h,0d0h,03bh,0adbbh tstr 03fh,0,0,0,0,0,0,0,-1,0 ; (16,0-$,'.' endif db '$' endm if isz80 eq 0 flgmask equ 0d7h expcrc macro crc1,crc2,crc3 db crc3 endm xpcrc <039h,0c8h,058h,09bh>,<05fh,0c8h,028h,0e9h>,<0,0,0,0> ; expected crc tmsg 'add iy,' ; aluop a,nn (28,67235bh,033d3h,06a76h,0fa20h,094h,068h,036f5h tstr <0,030h>,0,0,0f821h,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,-1,0,-1,-1,0d7h,0sole character into register a ; CONIN: IN A,(CONDAT) ;get character from console RET ; ; console character output from registeed crc tmsg ' hl,' ; add hl, (19,456 cycles) add16: db flgmask ; flag mask tstr 9,0c384 cycles) tstr 0,0ffh,0,0,0,-1,-1,0d7h,0,0 ; (46 cycles) expcrc <006h,0c7h,0aah,08eh>,<0feh,043h,0b0h,016h>,<0b8h,05bh,0e else if genz80 flgmask equ 0d7h expcrc macro crc1,crc2 db crc2 endm else flgmask equ 0ffh expcrc macro cycles) alu8i: db flgmask ; flag mask tstr 0c6h,09140h,07e3ch,07a67h,0df6dh,05b61h,00b29h,010h,066h,085b2h tstr 038h,0,0,,-1 ; (38 cycles) expcrc <0b1h,0dfh,08eh,0c0h>,<0c3h,059h,0f7h,0a2h>,<0,0,0,0> ; expected crc tmsg 'add ix,' r c ; CONOUT: LD A,C ;get to accumulator OUT (CONDAT),A ;send character to console RET ; ; list character from register c ; L4a5h,0c4c7h,0d226h,0a050h,058eah,08566h,0c6h,0deh,09bc9h tstr 030h,0,0,0,0f821h,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,-1,-1L ;address field of jump at 5 to bdos ; LD BC,80H ;default dma address is 80h CALL SETDMA ; EI ;enable the interrupt systcrc1 db crc1 endm endif endif ; hl, (38,912 cycles) adc16: db flgmask ; flag mas0,0,0,0,0,-1,0 ; (2048 cycles) tstr <0,-1>,0,0,0,0,0,0,0d7h,0,0 ; (14 cycles) expcrc <051h,0c1h,09ch,02eh>,<048h,079h,093 ; add iy, (19,456 cycles) add16y: db flgmask ; flag mask tstr <0fdh,9>,0c7c2h,0f407h,051c1h,03e96h,00bf4h,051IST: LD A,C ;character to register a OUT (PRTDAT),A RET ; ; return list status (0 if not ready, 0xff if ready) ; LISTST: IN A,-1,0d7h,0,-1 ; (38 cycles) expcrc <0d9h,0a4h,0cah,005h>,<011h,065h,0fch,090h>,<026h,015h,08bh,0ebh> ; expected crc tmsg 'aem LD A,(CDISK) ;get current disk number LD C,A ;send to the ccp JP CCP ;go to cp/m for further processing ; ; ; simple i/ok tstr <0edh,042h>,0832ch,04f88h,0f22bh,0b339h,07e1fh,01563h,0d3h,089h,0465eh tstr <0,038h>,0,0,0,0f821h,0,0,0,0,0 ; (1024 h,060h>,<03fh,092h,0a2h,073h> ; expected crc tmsg 'aluop a,nn' ; aluop a, (753,664 cycles) alu8r: db f,(PRTSTA) RET ; ; punch character from register c ; PUNCH: LD A,C ;character to register a OUT (AUXDAT),A RET ; ; read chara,1 ;write command -> A ; ; enter here from read and write to perform the actual i/o ; operation. return a 00h in register a ifate the sector given by BC using the ; translate table given by DE ; SECTRAN: EX DE,HL ;HL=.trans ADD HL,BC ;HL=.trans(secto;check vector harddisk ; ENDDAT EQU $ ;end of data area DATSIZ EQU $-BEGDAT ;size of data area END ;of BIOS arameter header address OUT (FDCD),A ;selekt disk drive LD L,A ;L=disk number 0,1,2,3 ADD HL,HL ;*2 ADD HL,HL ;*4 ADD HLust be available, ; however, between "begdat" and "enddat"). ; ; scratch ram area for BDOS use ; BEGDAT EQU $ ;beginning of datcter into register a from reader device ; READER: IN A,(AUXDAT) RET ; ; ; i/o drivers for the disk follow ; ; move to the track the operation completes ; properly, and 01h if an error occurs during the read or write ; ; in this case, we have saved the disr) LD L,(HL) ;L = trans(sector) LD H,0 ;HL= trans(sector) RET ;with value in HL ; ; set dma address given by registers b ,HL ;*8 ADD HL,HL ;*16 (size of each header) LD DE,DPBASE ADD HL,DE ;HL=.dpbase(diskno*16) RET SELHD: CP 8 ;select the ha area DIRBF: DEFS 128 ;scratch directory area ALL00: DEFS 31 ;allocation vector 0 ALL01: DEFS 31 ;allocation vector 1 ALL02: 00 position of current drive ; translate this call into a settrk call with parameter 00 ; HOME: LD C,0 ;select track 0 JP SETk number in 'diskno' (0-3) ; the track number in 'track' (0-76) ; the sector number in 'sector' (1-26) ; the dma address iand c ; SETDMA: LD A,C ;low order address OUT (DMAL),A LD A,B ;high order address OUT (DMAH),A ;in dma RET ; ; perform reaarddisk? RET NZ ;no, error OUT (FDCD),A ;select disk drive LD HL,HDBASE ;HL=hdbase for harddisk RET ; ; set track given by DEFS 31 ;allocation vector 2 ALL03: DEFS 31 ;allocation vector 3 ALLHD: DEFS 255 ;allocation vector harddisk CHK00: DEFS 16 TRK ;we will move to 00 on first read/write ; ; select disk given by register C ; SELDSK: LD HL,0000H ;error return code LD A,n 'dmaad' (0-65535) ; WAITIO: OUT (FDCOP),A ;start i/o operation IN A,(FDCST) ;status of i/o operation -> A RET ; ; the remaind operation ; READ: XOR A ;read command -> A JP WAITIO ;to perform the actual i/o ; ; perform a write operation ; WRITE: LD Aregister c ; SETTRK: LD A,C OUT (FDCT),A RET ; ; set sector given by register c ; SETSEC: LD A,C OUT (FDCS),A RET ; ; transl ;check vector 0 CHK01: DEFS 16 ;check vector 1 CHK02: DEFS 16 ;check vector 2 CHK03: DEFS 16 ;check vector 3 CHKHD: DEFS 0 C CP 4 ;must be between 0 and 3 JR NC,SELHD ;no carry if 4,5,... ; disk number is in the proper range ; compute proper disk pder of the CBIOS is reserved uninitialized ; data area, and does not need to be a part of the ; system memory image (the space m; CBIOS for Z80-Simulator ; ; Copyright (C) 1988-2006 by Udo Munk ; MSIZE EQU 64 ;cp/m version memory size in kilobytes ; header for disk 00 DPBASE: DEFW TRANS,0000H DEFW 0000H,0000H DEFW DIRBF,DPBLK DEFW CHK00,ALL00 ; disk parameter header character in JP CONOUT ;console character out JP LIST ;list character out JP PUNCH ;punch character out JP READER ;r00H DEFW 0000H,0000H DEFW DIRBF,HDBLK DEFW CHKHD,ALLHD ; ; sector translate vector for the hardisk ; HDTRA: DEFB 1,2,3 data port FDCD EQU 10 ;fdc-port: # of drive FDCT EQU 11 ;fdc-port: # of track FDCS EQU 12 ;fdc-port: # of sector FDCOP E15,16 DEFB 20,26,6,12 ;sectors 17,18,19,20 DEFB 18,24,4,10 ;sectors 21,22,23,24 DEFB 16,22 ;sectors 25,26 ; ; disk para ; "bias" is address offset from 3400H for memory systems ; than 16K (referred to as "b" throughout the text). ; BIAS EQU (MSfor disk 01 DEFW TRANS,0000H DEFW 0000H,0000H DEFW DIRBF,DPBLK DEFW CHK01,ALL01 ; disk parameter header for disk 02 Deader character out JP HOME ;move head to home position JP SELDSK ;select disk JP SETTRK ;set track number JP SETSEC ,4,5,6,7,8,9,10 DEFB 11,12,13,14,15,16,17,18,19,20 DEFB 21,22,23,24,25,26,27,28,29,30 DEFB 31,32,33,34,35,36,37,38,39,40 QU 13 ;fdc-port: command FDCST EQU 14 ;fdc-port: status DMAL EQU 15 ;dma-port: dma address low DMAH EQU 16 ;dma-port: dmameter block, common to all IBM 8" disks ; DPBLK: DEFW 26 ;sectors per track DEFB 3 ;block shift factor DEFB 7 ;block mIZE-20)*1024 CCP EQU 3400H+BIAS ;base of ccp BDOS EQU CCP+806H ;base of bdos BIOS EQU CCP+1600H ;base of bios CDISK EQU 0004EFW TRANS,0000H DEFW 0000H,0000H DEFW DIRBF,DPBLK DEFW CHK02,ALL02 ; disk parameter header for disk 03 DEFW TRANS,0000H ;set sector number JP SETDMA ;set dma address JP READ ;read disk JP WRITE ;write disk JP LISTST ;return list status DEFB 41,42,43,44,45,46,47,48,49,50 DEFB 51,52,53,54,55,56,57,58,59,60 DEFB 61,62,63,64,65,66,67,68,69,70 DEFB 71,72,73,74 address high ; ORG BIOS ;origin of this program NSECTS EQU (BIOS-CCP)/128 ;warm start sector count ; ; jump vector for iask DEFB 0 ;extent mask DEFW 242 ;disk size-1 DEFW 63 ;directory max DEFB 192 ;alloc 0 DEFB 0 ;alloc 1 DEFW 16 H ;current disk number 0=A,...,15=P IOBYTE EQU 0003H ;intel i/o byte ; ; I/O ports ; CONSTA EQU 0 ;console status port DEFW 0000H,0000H DEFW DIRBF,DPBLK DEFW CHK03,ALL03 ; ; sector translate vector for the IBM 8" disks ; TRANS: DEFB 1,7 JP SECTRAN ;sector translate ; ; fixed data tables for four-drive standard ; IBM-compatible 8" disks ; ; disk parameter,75,76,77,78,79,80 DEFB 81,82,83,84,85,86,87,88,89,90 DEFB 91,92,93,94,95,96,97,98,99,100 DEFB 101,102,103,104,105,106,107ndividual subroutines ; JP BOOT ;cold start WBOOTE: JP WBOOT ;warm start JP CONST ;console status JP CONIN ;console ;check size DEFW 2 ;track offset ; ; fixed data tables for 4MB harddisk ; ; disk parameter header HDBASE: DEFW HDTRA,00CONDAT EQU 1 ;console data port PRTSTA EQU 2 ;printer status port PRTDAT EQU 3 ;printer data port AUXDAT EQU 5 ;auxiliary,13,19 ;sectors 1,2,3,4 DEFB 25,5,11,17 ;sectors 5,6,7,8 DEFB 23,3,9,15 ;sectors 9,10,11,12 DEFB 21,2,8,14 ;sectors 13,14,,108,109,110 DEFB 111,112,113,114,115,116,117,118,119,120 DEFB 121,122,123,124,125,126,127,128 ; ; disk parameter bl address LD C,D ;get sector address to register c CALL SETSEC ;set sector address from register c POP BC ;recall dma ad C,0 ;select disk 0 CALL SELDSK CALL HOME ;go to track 00 ; LD B,NSECTS ;b counts # of sectors to load LD C,0 ;c has A,0C3H ;c3 is a jmp instruction LD (0),A ;for jmp to wboot LD HL,WBOOTE ;wboot entry point LD (1),HL ;set address fiel each function ; simplest case is to just perform parameter initialization ; BOOT: LD SP,80H ;use space below buffer for sPM ;transfer to cp/m if all have been loaded ; more sectors remain to load, check for track change INC D LD A,D ;sector=2ock for harddisk ; HDBLK: DEFW 128 ;sectors per track DEFB 4 ;block shift factor DEFB 15 ;block mask DEFB dress to b,c PUSH BC ;replace on stack for later recall CALL SETDMA ;set dma address from b,c ; drive set to 0, track set the current track number LD D,2 ;d has the next sector to read ; note that we begin by reading track 0, sector 2 since sectd for jmp at 0 ; LD (5),A ;for jmp to bdos LD HL,BDOS ;bdos entry point LD (6),HL ;address field of jump at 5 to bdos tack LD HL,SIGNON ;print message BOOTL: LD A,(HL) OR A JP Z,BOOTC LD C,A CALL CONOUT INC HL JP BOOTL BOOTC: XO7?, if so, change tracks CP 27 JP C,LOAD1 ;carry generated if sector<27 ; end of current track, go to next track LD D,1 0 ;extent mask DEFW 2039 ;disk size-1 DEFW 1023 ;directory max DEFB 255 ;alloc 0 DEFB 255 ;alloc 1 , sector set, dma address set CALL READ CP 00H ;any errors? JP NZ,WBOOT ;retry the entire boot if an error occurs ; no eor 1 ; contains the cold start loader, which is skipped in a warm start LD HL,CCP ;base of cp/m (initial load point) LOAD1: ; LD BC,80H ;default dma address is 80h CALL SETDMA ; EI ;enable the interrupt system LD A,(CDISK) ;get current disR A ;zero in the accum LD (IOBYTE),A ;clear the iobyte LD (CDISK),A ;select disk zero JP GOCPM ;initialize and go to cp/ ;begin with first sector of next track INC C ;track=track+1 ; save register state, and change tracks CALL SETTRK ;track DEFW 0 ;check size DEFW 0 ;track offset ; ; signon message ; SIGNON: DEFM '64K CP/M Vers. 2.2 (CBIOS V1.1 for Z80Srror, move to next sector POP HL ;recall dma address LD DE,128 ;dma=dma+128 ADD HL,DE ;new dma address is in h,l POP ;load one more sector PUSH BC ;save sector count, current track PUSH DE ;save next sector to read PUSH HL ;save dmak number LD C,A ;send to the ccp JP CCP ;go to cp/m for further processing ; ; ; simple i/o handlers ; ; console statm ; ; simplest case is to read the disk until all sectors loaded ; WBOOT: LD SP,80H ;use space below buffer for stack LDaddress set from register c JP LOAD1 ;for another sector ; end of load operation, set parameters and go to cp/m GOCPM: LDIM, ' DEFM 'Copyright 1988-2006 by Udo Munk)' DEFB 13,10,0 ; ; end of fixed tables ; ; individual subroutines to performDE ;recall sector address POP BC ;recall number of sectors remaining, and current trk DEC B ;sectors=sectors-1 JP Z,GOCus, return 0ffh if character ready, 00h if not ; CONST: IN A,(CONSTA) ;get console status RET ; ; console character into rr c ; SETSEC: LD A,C OUT (FDCS),A RET ; ; translate the sector given by BC using the ; translate table given by DE ; nge ; compute proper disk parameter header address OUT (FDCD),A ;selekt disk drive LD L,A ;L=disk number 0,1,2,3 ADD HL,nitialized ; data area, and does not need to be a part of the ; system memory image (the space must be available, ; however, d character into register a from reader device ; READER: IN A,(AUXDAT) RET ; ; ; i/o drivers for the disk follow ; ; moead and write to perform the actual i/o ; operation. return a 00h in register a if the operation completes ; properly, and 01egister a ; CONIN: IN A,(CONDAT) ;get character from console RET ; ; console character output from register c ; CONOUT: SECTRAN: EX DE,HL ;HL=.trans ADD HL,BC ;HL=.trans(sector) LD L,(HL) ;L = trans(sector) LD H,0 ;HL= trans(sector) RHL ;*2 ADD HL,HL ;*4 ADD HL,HL ;*8 ADD HL,HL ;*16 (size of each header) LD DE,DPBASE ADD HL,DE ;HL=.dpbase(disknobetween "begdat" and "enddat"). ; ; scratch ram area for BDOS use ; BEGDAT EQU $ ;beginning of data area DIRBF: DEFS 128 ve to the track 00 position of current drive ; translate this call into a settrk call with parameter 00 ; HOME: LD C,0 ;seleh if an error occurs during the read or write ; ; in this case, we have saved the disk number in 'diskno' (0-3) ; the trackLD A,C ;get to accumulator OUT (CONDAT),A ;send character to console RET ; ; list character from register c ; LIST: LD ET ;with value in HL ; ; set dma address given by registers b and c ; SETDMA: LD A,C ;low order address OUT (DMAL),A *16) RET SELHD: CP 8 ;select the harddisk? RET NZ ;no, error OUT (FDCD),A ;select disk drive LD HL,HDBASE ;HL=hdbase ;scratch directory area ALL00: DEFS 31 ;allocation vector 0 ALL01: DEFS 31 ;allocation vector 1 ALL02: DEFS 31 ;allocationct track 0 JP SETTRK ;we will move to 00 on first read/write ; ; select disk given by register C ; SELDSK: LD HL,0000H ;e number in 'track' (0-76) ; the sector number in 'sector' (1-26) ; the dma address in 'dmaad' (0-65535) ; WAITIO: OUT (FA,C ;character to register a OUT (PRTDAT),A RET ; ; return list status (0 if not ready, 0xff if ready) ; LISTST: IN A,(LD A,B ;high order address OUT (DMAH),A ;in dma RET ; ; perform read operation ; READ: XOR A ;read command -> A JP Wfor harddisk RET ; ; set track given by register c ; SETTRK: LD A,C OUT (FDCT),A RET ; ; set sector given by registe vector 2 ALL03: DEFS 31 ;allocation vector 3 ALLHD: DEFS 255 ;allocation vector harddisk CHK00: DEFS 16 ;check vector 0 rror return code LD A,C CP 4 ;must be between 0 and 3 JR NC,SELHD ;no carry if 4,5,... ; disk number is in the proper raDCOP),A ;start i/o operation IN A,(FDCST) ;status of i/o operation -> A RET ; ; the remainder of the CBIOS is reserved uniPRTSTA) RET ; ; punch character from register c ; PUNCH: LD A,C ;character to register a OUT (AUXDAT),A RET ; ; reaAITIO ;to perform the actual i/o ; ; perform a write operation ; WRITE: LD A,1 ;write command -> A ; ; enter here from rCHK01: DEFS 16 ;check vector 1 CHK02: DEFS 16 ;check vector 2 CHK03: DEFS 16 ;check vector 3 CHKHD: DEFS 0 ;check vector CR EQU 0DH ;CARRIAGE RETURN 000A = LF EQU 0AH ;LINE FEED 0010 = STACKSIZE EQU 16 ;SIZE OF LOCAL STACKP EQU 900H ;LOAD POINT FOR SYSTEM DURING LOAD/STORE 0005 = BDOS EQU 5H ;DOS ENTRY POINT 0000 = BOOT EQU 0 ;JRANSIENT PROGRAM AREA LOADP EQU 900H ;LOAD POINT FOR SYSTEM DURING LOAD/STORE BDOS EQU 5H ;DOS ENTRY POINT BOOT EQU 0 ;JMP TO NSECTS EQU 26 ;NO. OF SECTORS PER TRACK 0002 = NTRKS EQU 2 ;NO. OF OPERATING SYSTEM TRACKS 0004 = NDISK TITLE 'SYSGEN - SYSTEM GENERATION PROGRAM 8/79' ; SYSTEM GENERATION PROGRAM, VERSION FOR Z80SIM VERS EQU 20 ;X.X ; ; COPYRIharddisk ; ENDDAT EQU $ ;end of data area DATSIZ EQU $-BEGDAT ;size of data area END ;of BIOS  ; 0001 = WBOOT EQU 1 ;ADDRESS OF WARM BOOT (OTHER PATCH ENTRY ; POINTS ARE COMPUTxsub b: a:z80asm boot/h a:z80asm bios/h a: ddt movcpm.com s234 0 0 0 . s2cb 0 0 0 . i64 * g save 34 b:cpm64.co 'BOOT' TO REBOOT SYSTEM CONI EQU 1 ;CONSOLE INPUT FUNCTION CONO EQU 2 ;CONSOLE OUTPUT FUNCTION SELF EQU 14 ;SELECT DISK OPES EQU 4 ;NUMBER OF DISK DRIVES 0080 = SECSIZ EQU 128 ;SIZE OF EACH SECTOR 0003 = LOG2SEC EQU 3 ;LOG 2 SECSIZGHT (C) DIGITAL RESEARCH ; 1976, 1977, 1978, 1979 ; NSECTS EQU 26 ;NO. OF SECTORS PER TRACK NTRKS EQU 2 ;NO. OF OPExsub b: a:z80asm boot/h a:z80asm bios/h a: ddt movcpm.com s234 0 0 0 . s2cb 0 0 0 . i64 * g save 34 b:cpm64.coED RELATIVE TO WBOOT) 0018 = SELDSK EQU 24 ;WBOOT+24 FOR DISK SELECT 001B = SETTRK EQU 27 ;WBOOT+27 FOR SET m b: a:ddt cpm64.com iboot.hex r900 ibios.hex r2580 g0 a: save 34 b:cpm64.com sysgen b:cpm64.com NF EQU 15 ;DISK OPEN FUNCTION DREADF EQU 20 ;DISK READ FUNCTION ; MAXTRY EQU 10 ;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITE 0006 = SKEW EQU 6 ;SECTOR SKEW FACTOR ; 005C = FCB EQU 005CH ;DEFAULT FCB LOCATION 007C RATING SYSTEM TRACKS NDISKS EQU 4 ;NUMBER OF DISK DRIVES SECSIZ EQU 128 ;SIZE OF EACH SECTOR LOG2SEC EQU 3 ;LOG 2 SECSIZ SKEm b: a:ddt cpm64.com iboot.hex r900 ibios.hex r2580 g0 a: save 34 cpm64.com sysgen cpm64.com TRACK FUNCTION 001E = SETSEC EQU 30 ;WBOOT+30 FOR SET SECTOR FUNCTION 0021 = SETDMA EQU 33 ;WBOOT+33 FOR SET0 ;DISK READ FUNCTION ; 000A = MAXTRY EQU 10 ;MAXIMUM NUMBER OF RETRIES ON EACH READ/WRITE 000D = CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED STACKSIZE EQU 16 ;SIZE OF LOCAL STACK ; WBOOT EQU 1 ;ADDRESS OF WARM BOO= FCBCR EQU FCB+32 ;CURRENT RECORD LOCATION 0100 = TPA EQU 0100H ;TRANSIENT PROGRAM AREA 0900 = LOADW EQU 6 ;SECTOR SKEW FACTOR ; FCB EQU 005CH ;DEFAULT FCB LOCATION FCBCR EQU FCB+32 ;CURRENT RECORD LOCATION TPA EQU 0100H ;T ; COPYRIGHT (C) DIGITAL RESEARCH ; 1976, 1977, 1978, 1979 ; 001A = DMA ADDRESS 0024 = READF EQU 36 ;WBOOT+36 FOR READ FUNCTION 0027 = WRITF EQU 39 ;WBOOT+39 FOR WRITE FUNCTIOxsub b: a:z80asm boot/h a:z80asm bios/h a: ddt movcpm.com s234 0 0 0 q s2cb 0 0 0 q i64 * g save 34 b:cpm64.coOVE. ; OST: DB NTRKS ;OPERATING SYSTEM TRACKS SPT: DB NSECTS ;SECTORS PER TRACK (CAN BE PATCHED) TRAN: ;BASE OF TRANSLATE 27 FOR SET TRACK FUNCTION SETSEC EQU 30 ;WBOOT+30 FOR SET SECTOR FUNCTION SETDMA EQU 33 ;WBOOT+33 FOR SET DMA ADDRESS READF ERET ; CRMSG: ;PRINT MESSAGE ADDRESSED BY H,L TIL ZERO ;WITH LEADING CRLF PUSH H! CALL CRLF! POP H ;DROP THRU TO OUTMSG0 OwZs b...................$ͫDɍIM*! LOG2SEC ;LOG 2 OF SECTOR SIZE DAD H ENDM RET ;WITH HL = SECTOR * SECTOR SIZE ; GETCHAR: ; READ CONSOLE CHARACTER TO REm b: a:ddt cpm64.com iboot.hex r900 ibios.hex r2580 g0 a: sysgen TABLE TRELT SET 1 ;FIRST/NEXT TRAN ELEMENT TRBASE SET 1 ;BASE FOR WRAPAROUND REPT NSECTS ;ONCE FOR EACH SECTOR ON A TRACK QU 36 ;WBOOT+36 FOR READ FUNCTION WRITF EQU 39 ;WBOOT+39 FOR WRITE FUNCTION ; ORG TPA ;TRANSIENT PROGRAM AREA JMP START UTMSG: MOV A,M! ORA A! RZ ; MESSAGE NOT YET COMPLETED PUSH H! CALL PUTCHAR! POP H! INX H JMP OUTMSG ; SEL: ; SELECT DIҮ; bc..................$ 5 ['ҕ` c................GISTER A MVI C,CONI! CALL BDOS! ; CONVERT TO UPPER CASE BEFORE RETURN CPI 'A' OR 20H ! RC ;RETURN IF BELOW LOWER CASE A CA:XSUB$ 64 *$OM$* save 34 cpm64.com DB TRELT ;GENERATE FIRST/NEXT SECTOR TRELT SET TRELT+SKEW IF TRELT GT NSECTS TRBASE SET TRBASE+1 TRELT SET TRBASE ENDIF DB 'COPYRIGHT (C) 1978, DIGITAL RESEARCH ' ; ; TRANSLATE TABLE - SECTOR NUMBERS ARE TRANSLATED ; HERE TO DECREASE THE SYSGEN SK GIVEN BY REGISTER A MOV C,A! LHLD WBOOT! LXI D,SELDSK! DAD D! PCHL ; TRK: ;SET UP TRACK LHLD WBOOT ;ADDRESS OF BOOT ENT...$꠺_e8C\FQ d...................$.4( g.:TPI ('Z' OR 20H) + 1 RNC ;RETURN IF ABOVE LOWER CASE Z ANI 5FH! RET ; PUTCHAR: ; WRITE CHARACTER FROM A TO CONSOLE MOV E--cpi........................$'A! `Y[y)m-.......... ENDM ; ; NOW LEAVE SPACE FOR EXTENSIONS TO TRANSLATE TABLE IF NSECTS LT 64 REPT 64-NSECTS DB 0 ENDM ; ; ; ; ; UTTIME FOR MISSED SECTORS ; WHEN SLOW CONTROLLERS ARE INVOLVED. TRANSLATION TAKES ; PLACE ACCORDING TO THE "SKEW" FACTOR SET ABRY LXI D,SETTRK ;OFFSET FOR SETTRK ENTRY DAD D PCHL ;GONE TO SETTRK ; SEC: ;SET UP SECTOR NUMBER LHLD WBOOT LXI D,ST (OTHER PATCH ENTRY ; POINTS ARE COMPUTED RELATIVE TO WBOOT) SELDSK EQU 24 ;WBOOT+24 FOR DISK SELECT SETTRK EQU 27 ;WBOOT+,A! MVI C,CONO! CALL BDOS! RET ; CRLF: ;SEND CARRIAGE RETURN, LINE FEED MVI A,CR CALL PUTCHAR MVI A,LF CALL PUTCHAR ...$<J՘+CDZ0 a...................$#-CazZXILITY SUBROUTINES MULTSEC: ;MULTIPLY THE SECTOR NUMBER IN A BY THE SECTOR SIZE MOV L,A! MVI H,0 ;SECTOR NUMBER IN HL REPTETSEC DAD D PCHL ; DMA: ;SET DMA ADDRESS TO VALUE OF B,C LHLD WBOOT LXI D,SETDMA DAD D PCHL ; READ: ;PERFORM REALL DMA ;DMA ADDRESS SET FROM B,C ; DMA ADDRESS SET, CLEAR RETRY COUNT XRA A STA RETRY ;SET TO ZERO RETRIES ; TRYSEC: ;TRY TO OR FROM CURRENT DMA ADDR LXI H,SECTOR MOV E,M ;SECTOR NUMBER MVI D,0 ;TO DE LXI H,TRAN MOV B,M ;TRAN(0) IN B DADP TO GET SYSTEM MESSAGE IF BLANK LXI D,FCB ;TRY TO OPEN IT CALL OPEN ; INR A ;255 BECOMES 00 JNZ RDOK ;OK TO READ IF NOTCK LXI H,TRACK INR M ;TRACK = TRACK + 1 LDA OST ;NUMBER OF OPERATING SYSTEM TRACKS CMP M ;= TRACK NUMBER ? JZ ENDRW ;E; ERROR, RETRY OPERATION JMP TRYSEC ; ; END OF TRACK ENDTRK: LDA SPT ;SECTORS PER TRACK CALL MULTSEC ;*SECSIZ XCHG ;D OPERATION LHLD WBOOT LXI D,READF DAD D PCHL ; WRITE: ;PERFORM WRITE OPERATON LHLD WBOOT LXI D,WRITF DAD D PC TO READ OR WRITE CURRENT SECTOR LDA RETRY CPI MAXTRY ;TOO MANY RETRIES? JC TRYOK ; ; PAST MAXTRIES, MESSAGE AND IGNORE D ;SECTOR TRANSLATED MOV C,M ;VALUE TO C READY FOR SELECT PUSH B ;SAVE TRAN(0),TRAN(SECTOR) CALL SEC ;SET UP SECTOR NUMBE 255 ; ; FILE NOT PRESENT, ERROR AND REBOOT ; LXI H,NOFILE CALL CRMSG JMP REBOOT ; ; FILE PRESENT ; READ TO LOAD PND OF READ OR WRITE ; ; OTHERWISE NOTDONE, GO TO NEXT TRACK MOV C,M ;TRACK NUMBER CALL TRK ;TO SET TRACK MVI A,-1 ;COUNTTO DE LHLD DMADDR ;BASE DMA FOR THIS TRACK DAD D ;+SPT*SECSIZ SHLD DMADDR ;READY FOR NEXT TRACK JMP RWTRK ;FOR ANOTHER THL ; DREAD: ;DISK READ FUNCTION MVI C,DREADF JMP BDOS ; OPEN: ;FILE OPEN FUNCTION MVI C,OPENF ! JMP BDOS ; GETPUT: LXI H,ERRMSG CALL OUTMSG CALL GETCHAR CPI CR JNZ REBOOT ; ; TYPED A CR, OK TO IGNORE CALL CRLF JMP RWSEC ; TRYR POP B ;RECALL TRAN(0),TRAN(SECTOR) MOV A,C ;TRAN(SECTOR) SUB B ;-TRAN(0) CALL MULTSEC ;*SECTOR SIZE XCHG ;TO DE LOINT ; RDOK: XRA A STA FCBCR ;CURRENT RECORD = 0 ; ; PRE-READ AREA FROM TPA TO LOADP ; MVI C,(LOADP-TPA)/SECSIZ ; PRS 0, 1, 2, . . . 25 STA SECTOR ;SECTOR INCREMENTED BEFORE READ OR WRITE ; RWSEC: ;READ OR WRITE SECTOR LDA SPT ;SECTORS PERACK ; ENDRW: ;END OF READ OR WRITE, RETURN TO CALLER RET ; ; START: ; LXI SP,STACK ;SET LOCAL STACK POINTER LXI H,S; GET OR PUT CP/M (RW=0 FOR READ, 1 FOR WRITE) ; DISK IS ALREADY SELECTED ; LXI H,LOADP ;LOAD POINT IN RAM FOR CP/M DURING SOK: ; OK TO TRY READ OR WRITE INR A STA RETRY ;RETRY=RETRY+1 LDA RW ;READ OR WRITE? ORA A JZ TRYREAD ; ; MUST BE WRHLD DMADDR ;BASE DMA ADDRESS FOR THIS TRACK DAD D ;+(TRAN(SECTOR)-TRAN(0))*SECSIZ MOV B,H MOV C,L ;TO BC FOR SEC CALL CAE-READ FILE PRERD: PUSH B ;SAVE COUNT LXI D,FCB ;INPUT FILE CONTROL COUNT CALL DREAD ;ASSUME SET TO DEFAULT BUFFER POP R TRACK LXI H,SECTOR INR M ;TO NEXT SECTOR CMP M ;A=26 AND M=0 1 2...25 (USUALLY) JZ ENDTRK ; ; ; READ OR WRITE SECTORIGNON CALL OUTMSG ; ; CHECK FOR DEFAULT FILE LOAD INSTEAD OF GET ; LDA FCB+1 ;BLANK IF NO FILE CPI ' ' JZ GETSYS ;SKIYSGEN SHLD DMADDR ; ; CLEAR TRACK TO 00 MVI A,-1 ;START WITH TRACK EQUAL -1 STA TRACK ; RWTRK: ;READ OR WRITE NEXT TRAITE CALL WRITE JMP CHKRW ;CHECK FOR ERROR RETURNS TRYREAD: CALL READ CHKRW: ORA A JZ RWSEC ;ZERO FLAG IF R/W OK ; B ;RESTORE COUNT ORA A JNZ BADRD ;CANNOT ENCOUNTER END-OF FILE DCR C ;COUNT DOWN JNZ PRERD ;FOR ANOTHER SECTOR ; ; SEC JMP PUTSYS ;FOR ANOTHER PUT OPERATION ; REBOOT: MVI A,0 CALL SEL CALL CRLF JMP BOOT BADDISK: ;BAD DISK NAME LXIMSG ; ; PUT SYSTEM PUTSYS: LXI H,ASKPUT CALL CRMSG CALL GETCHAR CPI CR JZ REBOOT SUI 'A' CPI NDISKS JC PUTC f%oҠRh6 w G"U&/ź; (+Z\j1,ٞ[ޮd°c&ujm 6?rgWJz{+ 8Ҏվ | !Z PUTSYS ;SKIP IF CR ONLY ; SUI 'A' ;NORMALIZE DRIVE NUMBER CPI NDISKS ;VALID DRIVE? JC GETC ;SKIP TO GETC IF SO ; ;N COMPLETE',0 QDISK: DB 'INVALID DRIVE NAME (USE A, B, C, OR D)',0 NOFILE: DB 'NO SOURCE FILE ON DISK',0 BADFILE: DB 'SOURCTORS SKIPPED AT BEGINNING OF FILE ; LXI H,LOADP RDINP: PUSH H MOV B,H MOV C,L ;READY FOR DMA CALL DMA ;DMA ADDRESS S H,QDISK CALL CRMSG RET ; ; ; ; DATA AREAS ; MESSAGES SIGNON: DB 'SYSGEN VER ' DB VERS/10+'0','.',VERS MOD 10+'0' ; ; INVALID DRIVE NAME CALL BADDISK JMP PUTSYS ;TO TRY AGAIN ; PUTC: ; SET DISK FROM REGISTER C ADI 'A' STA PDISK ;MBhݳڃn&[owGwZjpf; \ebiaklE x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻G0齽 INVALID DRIVE NUMBER CALL BADDISK JMP GETSYS ;TO TRY AGAIN ; GETC: ; SELECT DISK GIVEN BY REGISTER A ADI 'A' STA GDE FILE INCOMPLETE',0 ; ; VARIABLES SDISK: DS 1 ;SELECTED DISK FOR CURRENT OPERATION TRACK: DS 1 ;CURRENT TRACK SECTOR: DS 1ET LXI D,FCB ;READY FOR READ CALL DREAD ; POP H ;RECALL DMA ADDRESS ORA A ;00 IF READ OK JNZ PUTSYS ;ASSUME EOF IF NOTDB 0 ASKGET: DB 'SOURCE DRIVE NAME (OR RETURN TO SKIP)',0 GETMSG: DB 'SOURCE ON ' GDISK: DS 1 ;FILLED IN AT GET FUNCTION DBESSAGE SET SUI 'A' CALL SEL ;SELECT DEST DRIVE ; PUT SYSTEM, SET RW TO WRITE LXI H,PUTMSG CALL CRMSG CALL GETCHAR CʺŠS0$6TW)#gfz.aJ]h*o+ 7 Z- x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻G0齽ISK ;TO SET MESSAGE SUI 'A' CALL SEL ;TO SELECT THE DRIVE ; GETSYS, SET RW TO READ AND GET THE SYSTEM CALL CRLF LXI H ;CURRENT SECTOR RW: DS 1 ;READ IF 0, WRITE IF 1 DMADDR: DS 2 ;CURRENT DMA ADDRESS RETRY: DS 1 ;NUMBER OF TRIES ON THIS SECTO. ; MORE TO READ, CONTINUE LXI D,SECSIZ DAD D ;HL IS NEW LOAD ADDRESS JMP RDINP ; BADRD: ;EOF ENCOUNTERED IN INPUT FILE ', THEN TYPE RETURN',0 ASKPUT: DB 'DESTINATION DRIVE NAME (OR RETURN TO REBOOT)',0 PUTMSG: DB 'DESTINATION ON ' PDISK: DS 1 PI CR JNZ REBOOT CALL CRLF ; LXI H,RW MVI M,1 CALL GETPUT ;TO PUT SYSTEM BACK ON DISKETTE LXI H,DONE CALL OUTMSG -dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE\u,GETMSG CALL OUTMSG CALL GETCHAR CPI CR JNZ REBOOT CALL CRLF ; XRA A STA RW CALL GETPUT LXI H,DONE CALL OUTR DS STACKSIZE*2 STACK: END LXI H,BADFILE CALL CRMSG JMP REBOOT ; ; GETSYS: LXI H,ASKGET ;GET SYSTEM? CALL CRMSG CALL GETCHAR CPI CR J;FILLED IN AT PUT FUNCTION DB ', THEN TYPE RETURN',0 ERRMSG: DB 'PERMANENT ERROR, TYPE RETURN TO IGNORE',0 DONE: DB 'FUNCTIO ϫ=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m=-dif tstr <0cbh,040h>,03ef1h,09dfch,07acch,msbt,0be61h,07a86h,050h,024h,01998h tstr <0,03fh>,0,0,0,0,0,0,053h,0,0 ; (1024 cyc db 0ffh ; flag mask endif tstr <0ddh,0cbh,1,046h>,02075h,msbt-1,msbt-1,03cfch,0a79ah,03d74h,051h,027h,0ca14h tstr < tstr 027h,02141h,009fah,01d60h,0a559h,08d5bh,09079h,004h,08eh,0299dh tstr 018h,0,0,0,0,0,0,0d7h,-1,0 ; (65,536 cycles) tst,0,0> ; expected crc tmsg 'aluop a,' ; aluop a,(+1) (229,376 cycles) alu8x: db flgmask ; flag mas0,0 ; (6 cycles) expcrc <0dah,057h,0c6h,079h>,<0d2h,012h,0a8h,042h>,<0,0,0,0> ; expected crc tmsg 'cpd' ; cpi (1)lc\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3 les) tstr 0,0ffh,0,0,0,-1,-1,0,-1,0 ; (48 cycles) if genz80 db 07bh,055h,0e6h,0c8h ; expected crc else db020h,0,0,038h>,0,0,0,0,0,0,053h,0,0 ; (256 cycles) tstr 0,0ffh,0,0,0,0,0,0,0,0 ; (8 cycles) if genz80 db 0a8h,0eeh,r 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) expcrc <06dh,02dh,0d2h,013h>,<09bh,04bh,0a6h,075h>,<090h,0d1h,064h,07fh> ; expected crc k tstr <0ddh,086h,1>,090b7h,msbt-1,msbt-1,032fdh,0406eh,0c1dch,045h,06eh,0e5fah tstr <020h,038h>,0,1,1,0,0,0,0,-1,0 ; (16,3 (6144 cycles) cpi1: db flgmask ; flag mask tstr <0edh,0a1h>,04d48h,0af4ah,0906bh,msbt,04e71h,1,093h,06ah,0907ch tstr <0,07h,04bh> ; expected crc tmsg 'aluop a,' ; aluop a, (376,832 cycles) alu8rx: db flgmas 05eh,002h,00eh,098h ; expected crc endif tmsg 'bit n,' ; note that the CRC changes if some of008h,067h ; expected crc else db 083h,053h,04eh,0e1h ; expected crc endif tmsg 'bit n,(+1)' ; bitmsg '' ; a (3072 cycles) inca: db flgmask ; flag mask tstr 03ch,04adfh,0d5d8h,0e598h,08a2bh,084 cycles) tstr 0,0ffh,0,0,0,0,0,0d7h,0,0 ; (14 cycles) expcrc <0d3h,0f2h,0d7h,04ah>,<0e8h,049h,067h,06eh>,<0,0,0,0> ; expe10h>,0,0,0,0,0,010,0,-1,0 ; (1024 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <02dh,0a4h,02dh,019h>,<006h,0dek ; flag mask tstr <0ddh,084h>,0d6f7h,0c76eh,0accfh,02847h,022ddh,0c035h,0c5h,038h,0234bh tstr <020h,039h>,0,0,0,0,0,0,0,-1 the code following the test area changes! ; cpd (1) (6144 cycles) cpd1: db flgmask ; flag mask tstr <0edh,0a9h>,0c7b6h,t n, (49,152 cycles) bitz80: if genz80 db 053h ; flag mask else db 0ffh ; flag mask enda7b0h,0431bh,044h,05ah,0d030h tstr 001h,0,0,0,0,0,0,0,-1,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcted crc tmsg 'aluop a,(+1)' ; bit n,(+1) (2048 cycles) bitx: if genz80 db 053h ; flag mask else h,0b3h,056h>,<0,0,0,0> ; expected crc tmsg 'cpi' ; (1) (65,536 cycles) daa: db flgmask ; flag mask ,0 ; (8,192 cycles) tstr 0,0ffh,0,0,0,-1,-1,0d7h,0,0 ; (46 cycles) expcrc <0a8h,086h,0cch,044h>,<0a4h,002h,06dh,05ah>,<0,0072b4h,018f6h,msbt+17,08dbdh,1,0c0h,030h,094a3h tstr <0,010h>,0,0,0,0,0,010,0,-1,0 ; (1024 cycles) tstr 0,0,0,0,0,0,0,0d7h,crc <081h,0fah,081h,000h>,<0d1h,088h,015h,0a4h>,<037h,0b6h,01dh,0f1h> ; expected crc tmsg ' a' ; b (30720,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <0aeh,0c6h,0d4h,02ch>,<0aeh,0c6h,0d4h,02ch>,<0abh,0a9h,064h,0b1h> ; expected crc tmcles) incd: db flgmask ; flag mask tstr 014h,0a0eah,05fbah,065fbh,0981ch,038cch,0debch,043h,05ch,003bdh tstr 001h,0,0,0,0,' hl' ; ix (1536 cycles) incix: db flgmask ; flag mask tstr <0ddh,023h>,0bc3ch,00d9bh,0e081h,0adfdh,09,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <0d2h,0aeh,03bh,0ech>,<0d2h,0aeh,03bh,0ech>,<0aeh,08fh,0abh,065h> ; expected crc h,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <056h,00fh,095h,05eh>,<01ch,0edh,084h,07dh>,<0 cycles) incb: db flgmask ; flag mask tstr 004h,0d623h,0432dh,07a61h,08180h,05a86h,01e85h,086h,058h,09bbbh tstr 001h,0,0,0sg ' de' ; e (3072 cycles) ince: db flgmask ; flag mask tstr 01ch,0602fh,04c0dh,02402h,0e2f5h,0a0f4h,00ff00h,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <0d1h,046h,0bfh,051h>,<045h,023h,0deh,010h>a7fh,096e5h,013h,085h,00be2h tstr <0,8>,0,0,0f821h,0,0,0,0,0,0 ; (256 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) tmsg ' bc' ; c (3072 cycles) incc: db flgmask ; flag mask tstr 00ch,0d789h,00935h,0055bh,09f85h,08b2797h,0bbh,07dh,04eh> ; expected crc tmsg ' h' ; hl (1536 cycles) inchl: db flgmask ; flag mask tstr 0,0,0,0ff00h,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <077h,0f3h,05ah,073h>,<05fh,068h,022h,06a10ah,013h,032h,05925h tstr 001h,0,0,0,0,0ffh,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <0,<0b9h,078h,0deh,006h> ; expected crc tmsg ' d' ; de (1536 cycles) incde: db flgmask ; flag mask tstexpcrc <0a5h,04dh,0beh,031h>,<0a5h,04dh,0beh,031h>,<0,0,0,0> ; expected crc tmsg ' ix' ; iy (1536 cyclesh,0d208h,095h,005h,00660h tstr 001h,0,0,0,0,0,0ffh,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc23h,0c3f4h,007a5h,01b6dh,04f04h,0e2c2h,0822ah,057h,0e0h,0c3e1h tstr 008h,0,0,0,0f821h,0,0,0,0,0 ; (256 cycles) tstr 0,0,0,04h>,<028h,063h,050h,047h> ; expected crc tmsg ' b' ; bc (1536 cycles) incbc: db flgmask ; flag mask cah,08ch,06ah,0c2h>,<0e1h,075h,0afh,0cch>,<0b5h,0fbh,083h,0abh> ; expected crc tmsg ' e' ; h (3072 cycler 013h,0342eh,0131dh,028c9h,00acah,09967h,03a2eh,092h,0f6h,09d54h tstr 008h,0,0,0,0,0f821h,0,0,0,0 ; (256 cycles) tstr 0,0,) inciy: db flgmask ; flag mask tstr <0fdh,023h>,09402h,0637ah,03182h,0c65ah,0b2e9h,0abb4h,016h,0f2h,06d05h tstr <0,8>,0,0 <01ah,0f6h,012h,0a7h>,<0c2h,084h,055h,04ch>,<02ah,069h,06eh,04bh> ; expected crc tmsg ' c' ; d (3072 cy,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <0fch,00dh,06dh,04ah>,<0fch,00dh,06dh,04ah>,<089h,0b6h,06dh,0c8h> ; expected crc tmsg tstr 003h,0cd97h,044abh,08dc9h,0e3e3h,011cch,0e8a4h,002h,049h,02a4dh tstr 008h,0,0,0,0,0,0f821h,0,0,0 ; (256 cycles) tstr 0s) inch: db flgmask ; flag mask tstr 024h,01506h,0f2ebh,0e8ddh,0262bh,011a6h,0bc1ah,017h,006h,02818h tstr 001h,0,0,0,0ff00f821h,0,0,0,0,0,0,0 ; (256 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <050h,05dh,051h,0a3h>,<050h,05dh,051h,6d4h,03e01h,08358h,015b4h,081h,0deh,04259h tstr <0,1>,0,0ff00h,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ;97h,03bh,09ch> ; expected crc tmsg ' sp' ; (+1) (6144 cycles) incx: db flgmask ; flag mask tsycles) expcrc <036h,0c1h,01eh,075h>,<0fbh,0cbh,0bah,095h>,<0,0,0,0> ; expected crc tmsg ' iyl' ; ld ,(nnn,05ch,01f37h tstr 001h,0ffh,0,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <028h,029h,0mask tstr <0ddh,024h>,02836h,09f6fh,09116h,061b9h,082cbh,0e219h,092h,073h,0a98ch tstr <0,1>,0ff00h,0,0,0,0,0,0,0,0 ; (512 c0a3h>,<0,0,0,0> ; expected crc tmsg ' iy' ; l (3072 cycles) incl: db flgmask ; flag mask tstr 02ch,0 (6 cycles) expcrc <06fh,046h,036h,062h>,<06fh,046h,036h,062h>,<0,0,0,0> ; expected crc tmsg ' ixh' ; tr <0ddh,034h,1>,0fa6eh,msbt-1,msbt-1,02c28h,08894h,05057h,016h,033h,0286fh tstr <020h,1>,0ffh,0,0,0,0,0,0,0,0 ; (1024 cyclesn) (32 cycles) ld161: db flgmask ; flag mask tstr <0edh,04bh,low msbt,high msbt>,0f9a8h,0f559h,093a4h,0f5edh,06f96h,0d968h,05eh,0ceh>,<0b8h,03ah,0dch,0efh>,<092h,0ech,0d8h,0d4h> ; expected crc tmsg ' (hl)' ; sp (1536 cycles) inycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <02dh,096h,06ch,0f3h>,<02dh,096h,06ch,0f3h>,<0,0,0,0> ; expected cr8031h,0a520h,04356h,0b409h,0f4c1h,0dfa2h,0d1h,03ch,03ea2h tstr 001h,0,0,0,0ffh,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,ixl (3072 cycles) incxl: db flgmask ; flag mask tstr <0ddh,02ch>,04d14h,07460h,076d4h,006e7h,032a2h,0213ch,0d6h,0d7h,099a5h ) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <00bh,095h,0a8h,0eah>,<020h,058h,014h,070h>,<0,0,0,0> ; expected crc t86h,0e6h,04bd8h tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <04dh,045h,csp: db flgmask ; flag mask tstr 033h,0346fh,0d482h,0d169h,0deb6h,0a494h,0f476h,053h,002h,0855bh tstr 008h,0,0,0,0,0,0,0,0,c tmsg ' iyh' ; iyl (3072 cycles) incyl: db flgmask ; flag mask tstr <0ddh,02ch>,0d7c6h,062d5h,0a09e0d7h,0,0 ; (6 cycles) expcrc <0a0h,0a1h,0b4h,09fh>,<056h,0cdh,006h,0f3h>,<082h,04dh,035h,04dh> ; expected crc tmsg ',0,0ffh,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <002h,07bh,0efh,02ch>,<0msg ' (+1)' ; ixh (3072 cycles) incxh: db flgmask ; flag mask tstr <0ddh,024h>,0b838h,0316ch,0c0a9h,0ach>,<04dh,045h,0a9h,0ach>,<0,0,0,0> ; expected crc tmsg 'ld ,(nnnn)' ; ld hl,(nnnn) (16 cycles) ld162: db fl0f821h ; (256 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <05dh,0ach,0d5h,027h>,<05dh,0ach,0d5h,027h>,<053h,0h,07039h,03e7eh,09f12h,090h,0d9h,0220fh tstr <0,1>,0ffh,0,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cec> l' ; (hl) (3072 cycles) incm: db flgmask ; flag mask tstr 034h,0b856h,00c7ch,0e53eh,msbt,0877eh,0da58h,015h02h,07bh,0efh,02ch>,<0,0,0,0> ; expected crc tmsg ' ixl' ; iyh (3072 cycles) incyh: db flgmask ; flag gmask ; flag mask tstr <02ah,low msbt,high msbt>,09863h,07830h,02077h,0b1feh,0b9fah,0abb8h,004h,006h,06015h tstr 0,0,0,0,0,,<0eeh,02fh,081h,04eh> ; expected crc tmsg 'ld (nnnn),hl' ; ld (nnnn),sp (16 cycles) ld167: db flgmask ; flag mask tstr8f61h,080h,03fh,0c7bfh tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,0,0,0,0,-1,-1,0,0,0 ; (32 cycles) expcrc <06es) ld16ix: db flgmask ; flag mask tstr <0ddh,021h>,087e8h,02006h,0bd12h,0b69bh,07253h,0a1e5h,051h,013h,0f1bdh tstr 020h,0d sp,(nnnn)' ; ld ,(nnnn) (32 cycles) ld164: db flgmask ; flag mask tstr <0ddh,02ah,low msbt,high msbt>,0ded7h,0a60 ; (32 cycles) expcrc <0bah,010h,02ah,06bh>,<0bah,010h,02ah,06bh>,<0,0,0,0> ; expected crc tmsg 'ld (nnnn),' ; 0,0,0,0,0 ; (1 cycle) tstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <05fh,097h,024h,087h>,<05fh,097h,024h,087h>,<032h,0 <0edh,073h,low msbt,high msbt>,0c0dch,0d1d6h,0ed5ah,0f356h,0afdah,06ca7h,044h,09fh,03f0ah tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cyc4h,01eh,087h,015h>,<064h,01eh,087h,015h>,<0,0,0,0> ; expected crc tmsg 'ld (nnnn),' ; ld (nnnn),hl (16 cycles) ld16,0,0,0,0,0,0,0,0 ; (2 cycles) tstr <0,0,0ffh,0ffh>,0,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <022h,07dh,0d5h,025h>,<022h,07dhfah,0f780h,0244ch,087deh,0bcc2h,016h,063h,04c96h tstr 020h,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,-1,0,0,0,0,0,0,0,0 ; (1ld ,nnnn (64 cycles) ld16im: db flgmask ; flag mask tstr 1,05c1ch,02d46h,08eb9h,06078h,074b1h,0b30eh,046h,0d1h,c9h,06eh,011h> ; expected crc tmsg 'ld hl,(nnnn)' ; ld sp,(nnnn) (16 cycles) ld163: db flgmask ; flag mask tstr <0edh,0le) tstr 0,0,0,0,0,0,0,0,0,-1 ; (16 cycles) expcrc <016h,058h,05fh,0d7h>,<016h,058h,05fh,0d7h>,<0,0,0,0> ; expected crc 6: db flgmask ; flag mask tstr <022h,low msbt,high msbt>,0d003h,07772h,07f53h,03f72h,064eah,0e180h,010h,02dh,035e9h tstr 0,,0d5h,025h>,<0,0,0,0> ; expected crc tmsg 'ld ,nnnn' ; ld a,<(bc),(de)> (44 cycles) ld8bd: db flgmask ; flag mask 6 cycles) expcrc <085h,08bh,0f1h,06dh>,<085h,08bh,0f1h,06dh>,<0,0,0,0> ; expected crc tmsg 'ld ,(nnnn)' ; ld (nnnn030cch tstr 030h,0,0,0,0,0,0,0,0,0 ; (4 cycles) tstr <0,0ffh,0ffh>,0,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <0deh,039h,017bh,low msbt,high msbt>,08dfch,057d7h,02161h,0ca18h,0c185h,027dah,083h,01eh,0f460h tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycles) ttmsg 'ld (nnnn),sp' ; ld (nnnn), (64 cycles) ld168: db flgmask ; flag mask tstr <0ddh,022h,low msbt,high msbt>,06c0,0,0,0,0,0,0,0,0 ; (1 cycle) tstr 0,0,0,0,-1,0,0,0,0,0 ; (16 cycles) expcrc <0a3h,060h,08bh,047h>,<0a3h,060h,08bh,047h> tstr 00ah,0b3a8h,01d2ah,07f8eh,042ach,msbt,msbt,0c6h,0b1h,0ef8eh tstr 010h,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,0ffh,0,), (64 cycles) ld165: db flgmask ; flag mask tstr <0edh,043h,low msbt,high msbt>,01f98h,0844dh,0e8ach,0c9edh,0c95dh,09h,069h>,<0deh,039h,019h,069h>,<0d4h,016h,002h,072h> ; expected crc tmsg 'ld ,nnnn' ; ld ,nnnn (32 cyclstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <07ah,0ceh,0a1h,01bh>,<07ah,0ceh,0a1h,01bh>,<0,0,0,0> ; expected crc tmsg 'lc3h,00d91h,06900h,08ef8h,0e3d6h,0c3f7h,0c6h,0d9h,0c2dfh tstr 020h,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,0,-1,-1,0,0,0,0,0,0,0,0,0,0d7h,-1,0 ; (22 cycles) expcrc <0b0h,081h,089h,035h>,<0b0h,081h,089h,035h>,<026h,09fh,0d4h,028h> ; expected crc tms>,0d8b6h,msbt-1,msbt-1,0c612h,0df07h,09cd0h,043h,0a6h,0a0e5h tstr 020h,0,1,1,0,0,0,0,0,0 ; (8 cycles) tstr 0,-1,0,0,0,0,0,06h,0a8h>,<0,0,0,0> ; expected crc tmsg 'ld ,(+1)' ; ld ,(+1) (256 cycles) ld8ix2: db flgmask h,03fh>,0,0,0,0,0,0,0,0,0 ; (128 cycles) tstr 0,0ffh,0,0,0,-1,-1,0d7h,-1,0 ; (54 cycles) expcrc <047h,08bh,0a3h,06bh>,<0470h,085h,0cd16h tstr 020h,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr <0,0,0,-1>,0,0,0,0,0,0,0,-1,0 ; (16 cycles) expcrc <026h,0,h,l,a> (3456 cycles) ld8rr: db flgmask ; flag mask tstr 040h,072a4h,0a024h,061ach,msbt,082c7h,0718fh,097h,08fh,0ef8eh tstg 'ld a,<(bc),(de)>' ; ld ,nn (64 cycles) ld8im: db flgmask ; flag mask tstr 6,0c407h,0f49dh,0d13dh,00,0,0 ; (16 cycles) expcrc <0a5h,0e9h,0ach,064h>,<0a5h,0e9h,0ach,064h>,<0,0,0,0> ; expected crc tmsg 'ld a,(+1)' ; flag mask tstr <0ddh,066h,1>,084e0h,msbt-1,msbt-1,09c52h,0a799h,049b6h,093h,000h,0eeadh tstr <020h,008h>,0,1,1,0,0,0,0,0,h,08bh,0a3h,06bh>,<0,0,0,0> ; expected crc tmsg 'ld ,' ; ld a,(nnnn) / ld (nnnn),a (44 cycles) lda: db fdbh,047h,07eh>,<026h,0dbh,047h,07eh>,<0,0,0,0> ; expected crc tmsg 'ld (+1),nn' ; ld ,(+1) (512 cyclr 03fh,0,0,0,0,0,0,0,0,0 ; (64 cycles) tstr 0,0ffh,0,0,0,-1,-1,0d7h,-1,0 ; (54 cycles) expcrc <074h,04bh,001h,018h>,<074h0339h,0de89h,07455h,053h,0c0h,05509h tstr 038h,0,0,0,0,0,0,0,0,0 ; (8 cycles) tstr 0,0,0,0,0,0,0,0,-1,0 ; (8 cycles) e ; ld ,nn (32 cycles) ld8ixy: db flgmask ; flag mask tstr <0ddh,026h>,03c53h,04640h,0e179h,07711h,0c107h,010 ; (16 cycles) tstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <0fah,02ah,04dh,003h>,<0fah,02ah,04dh,003h>,<0,0,0,0> ; exlgmask ; flag mask tstr <032h,low msbt,high msbt>,0fd68h,0f4ech,044a0h,0b543h,00653h,0cdbah,0d2h,04fh,01fd8h tstr 008h,0,0,es) ld8ix1: db flgmask ; flag mask tstr <0ddh,046h,1>,0d016h,msbt-1,msbt-1,04260h,07f39h,00404h,097h,04ah,0d085h tstr <020,04bh,001h,018h>,<06eh,0ech,0a2h,036h> ; expected crc tmsg 'ld ,' ; ld , (6xpcrc <0f1h,0dah,0b5h,056h>,<0f1h,0dah,0b5h,056h>,<0d1h,055h,074h,01bh> ; expected crc tmsg 'ld ,nn' ; afah,081h,0adh,05d9bh tstr <020h,8>,0,0,0,0,0,0,0,0,0 ; (4 cycles) tstr 0,0,0,0,0,0,0,0,-1,0 ; (8 cycles) expcrc <024h,pected crc tmsg 'ld ,(+1)' ; ld a,(+1) (128 cycles) ld8ix3: db flgmask ; flag mask tstr <0ddh,07eh,10,0,0,0,0,0,0 ; (2 cycle) tstr 0,0ffh,0,0,0,0,0,0d7h,-1,0 ; (22 cycles) expcrc <0c9h,026h,02dh,0e5h>,<0c9h,026h,02dh,0e5hh,018h>,0,1,1,0,0,0,0,0,0 ; (32 cycles) tstr 0,-1,0,0,0,0,0,0,0,0 ; (16 cycles) expcrc <0cch,011h,006h,0a8h>,<0cch,011h,0912 cycles) ld8rrx: db flgmask ; flag mask tstr <0ddh,040h>,0bcc5h,msbt,msbt,msbt,02fc2h,098c0h,083h,01fh,03bcdh tstr <020ld (+1),nn (32 cycles) ld8imx: db flgmask ; flag mask tstr <0ddh,036h,1>,01b45h,msbt-1,msbt-1,0d5c1h,061c7h,0bdc4h,0c0e8h,082h,08bh>,<024h,0e8h,082h,08bh>,<0,0,0,0> ; expected crc tmsg 'ld ,nn' ; ld ,,<012h,02fh,0d8h,062h> ; expected crc tmsg 'ld a,(nnnn) / ld (nnnn),a' ; ldd (1) (44 cycles) ldd1: db flgmask ; flag cted crc tmsg 'neg' ; (7168 cycles) rld: db flgmask ; flag mask tstr <0edh,067h>,091cbh,0c48bh,0fa62h,msbt,0e,msbt,2,014h,02dh,0a39fh tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,-1,0,0,0,0,0,0d7h,0,0 ; (22 cycles) expcrclag mask tstr 0cbh,0ccebh,05d4ah,0e007h,msbt,01395h,030eeh,043h,078h,03dadh tstr <0,03fh>,0,0,0,0,0,0,080h,0,0 ; (128 cycle,0ddh,03dh,0e1h>,<05ah,090h,07eh,0d4h>,<0,0,0,0> ; expected crc tmsg 'ldd (2)' ; ldi (1) (44 cycles) ldi1: db flgmas05bh,041h,0e3h,034h> ; expected crc tmsg '' ; shift/rotate (+1) (416 cycles) rotxy: db flgmask mask tstr <0edh,0a8h>,09852h,068fah,066a1h,msbt+3,msbt+1,1,0c1h,068h,020b7h tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) 720h,0b479h,040h,006h,08ae2h tstr <0,8>,0ffh,0,0,0,0,0,0,0,0 ; (512 cycles) tstr 0,0,0,0,0,0,0,0d7h,-1,0 ; (14 cycles) <0e9h,0eah,0d0h,0aeh>,<0ebh,059h,089h,01bh>,<0,0,0,0> ; expected crc tmsg 'ldi (2)' ; neg (16,384 cycles) neg: db flgms) tstr 0,0ffh,0,0,0,-1,-1,057h,-1,0 ; (53 cycles) expcrc <0a4h,025h,058h,033h>,<0ebh,060h,04dh,058h>,<0,0,0,0> ; expected k ; flag mask tstr <0edh,0a0h>,0fe30h,003cdh,06058h,msbt+2,msbt,1,004h,060h,02688h tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cy; flag mask tstr <0ddh,0cbh,1,6>,0ddafh,msbt-1,msbt-1,0ff3ch,0dbf6h,094f4h,082h,080h,061d9h tstr <020h,0,0,038h>,0,0,0,0,0,0tstr 0,-1,0,0,0,0,0,0d7h,0,0 ; (22 cycles) expcrc <094h,0f4h,027h,069h>,<094h,0f4h,027h,069h>,<0,0,0,0> ; expected crc tmsexpcrc <0ffh,082h,03eh,077h>,<095h,05bh,0a3h,026h>,<0,0,0,0> ; expected crc tmsg '' ; (6144 cyask ; flag mask tstr <0edh,044h>,038a2h,05f6bh,0d934h,057e4h,0d2d6h,04642h,043h,05ah,009cch tstr 0,0,0,0,0,0,0,0d7h,-1,0 crc tmsg 'shf/rot ' ; n, (7936 cycles) srz80: db flgmask ; flag mask cles) tstr 0,-1,0,0,0,0,0,0d7h,0,0 ; (22 cycles) expcrc <0f7h,082h,0b0h,0d1h>,<09ah,0bdh,0f6h,0b5h>,<0,0,0,0> ; expected c,080h,0,0 ; (32 cycles) tstr 0,0ffh,0,0,0,0,0,057h,0,0 ; (13 cycles) expcrc <071h,000h,034h,0cbh>,<071h,03ah,0cdh,081h>,<0,g 'ldd (1)' ; ldd (2) (44 cycles) ldd2: db flgmask ; flag mask tstr <0edh,0a8h>,0f12eh,0eb2ah,0d5bah,msbt+3,msbt+1,cles) rot8080: db flgmask ; flag mask tstr 7,0cb92h,06d43h,00a90h,0c284h,00c53h,0f50eh,091h,0ebh,040fch tstr 018h,0,0,0,0,; (16,384 cycles) tstr 0,0,0,0,0,0,0,0,0,0 ; (1 cycle) expcrc <0d6h,038h,0ddh,06ah>,<06ah,03ch,03bh,0bdh>,<0,0,0,0> ; expetstr <0cbh,080h>,02cd5h,097abh,039ffh,msbt,0d14bh,06ab2h,053h,027h,0b538h tstr <0,07fh>,0,0,0,0,0,0,0,0,0 ; (128 cycles) tsrc tmsg 'ldi (1)' ; ldi (2) (44 cycles) ldi2: db flgmask ; flag mask tstr <0edh,0a0h>,04aceh,0c26eh,0b188h,msbt+20,0,0> ; expected crc tmsg 'shf/rot (+1)' ; shift/rotate (6784 cycles) rotz80: db flgmask ; f2,047h,0ffh,0fbe4h tstr <0,010h>,0,0,0,0,0,0,0,0,0 ; (2 cycles) tstr 0,-1,0,0,0,0,0,0d7h,0,0 ; (22 cycles) expcrc <039h0,0,0,-1,0 ; (1024 cycles) tstr 0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles) expcrc <09bh,0a3h,080h,07ch>,<025h,013h,030h,0aeh>,,<08bh,057h,0f0h,008h>,<0,0,0,0> ; expected crc t 2,00c3bh,0b592h,06cffh,0959eh,msbt,msbt+1,0c1h,021h,0bde7h tstr 018h,0,0,0,0,0,0,0,0,0 ; (4 cycles) tstr 0,-1,0,0,0,0,0,0crc <06ah,01ah,088h,031h>,<06ah,01ah,088h,031h>,<0,0,0,0> ; expected crc tmsg 'ld (+1),' ; ld (+1),a (64 call initcrc ; initialise crc ; test loop tlp: ld a,(iut) cp 076h ; pragmatically avoid halt intructions jp z,tlp2 anbt-1,msbt-1,0b73ah,0887bh,099eeh,086h,070h,0ca07h tstr <020h,003h>,0,1,1,0,0,0,0,0,0 ; (32 cycles) tstr 0,0,0,0,0,-1,-1,0,0sk+1),a inc hl push hl ld de,20 add hl,de ; point to incmask ld de,counter call initmask pop hl push hl ld demsg ' n,' ; n,(+1) (1792 cycles) srzx: db flgmask ; flag mask tstr <0ddh,0cbh,1,08,-1,0 ; (24 cycles) expcrc <07ah,04ch,011h,04fh>,<07ah,04ch,011h,04fh>,<008h,0d8h,0e7h,03eh> ; expected crc tmsg 'ld (,067afh,msbt-1,msbt-1,04f13h,00644h,0bcd7h,050h,0ach,05fafh tstrd 0dfh cp 0ddh jp nz,tlp1 ld a,(iut+1) cp 076h tlp1: call nz,test ; execute the test instruction tlp2: call count ; ,0 ; (32 cycles) expcrc <004h,062h,06ah,0bfh>,<004h,062h,06ah,0bfh>,<0,0,0,0> ; expected crc tmsg 'ld (+1),,0fb44h,msbt-1,msbt-1,0ba09h,068beh,032d8h,010h,05eh,0a867h tstr <020h,0,0,078h>,0,0,0,0,0,0,0,0,0 ; (128 cycles) tstr 0,de>),a' ;destination pointer in de, origin pointer in HL, number of bytes in bc ldirX macro local again if isZ80 020h,0,1,1,0,0,0,0,0,0 ; (8 cycles) tstr 0,0,0,0,0,0,0,0,-1,0 ; (8 cycles) expcrc <0cch,0beh,05ah,096h>,<0cch,0beh,05ahincrement the counter call nz,shift ; shift the scan bit pop hl ; pointer to test case jp z,tlp3 ; done if shift returne>' ; ld (+1), (256 cycles) st8ix2: db flgmask ; flag mask tstr <0ddh,074h,1>,0b664h,msbt-1,msbt-1,0e8ach,0b5f hl ld de,iut ; copy initial instruction under test ld bc,4 ldirX ld de,msbt ; copy initial machine state ld bc,16 0ffh,0,0,0,0,0,0d7h,0,0 ;(14 cycles) expcrc <0cch,063h,0f9h,08ah>,<0cch,063h,0f9h,08ah>,<0,0,0,0> ; expected crc tmsg ',<0,0,0,0> ; expected crc tmsg 'ld (+1),a' ; ld (),a (96 cycles) stabd: db flgmask ; flag mask tstrd NZ ld de,20+20+20 add hl,de ; point to expected crc call cmpcrc ld de,okmsg jp z,tlpok ld a,1 ; set error flag 5h,0aafeh,012h,010h,09566h tstr <020h,001h>,0,1,1,0,0,0,0,0,0 ; (16 cycles) tstr 0,0,0,0,-1,0,0,0,0,0 ; (32 cycles) exp ldirX ld de,20+20+4 ; skip incmask, scanmask and expcrc add hl,de ex de,hl ld c,printst call bdos ; show test name ,res> n,(+1)' ; ld (+1), (1024 cycles) st8ix1: db flgmask ; flag mask tstr <0ddh,070h,1>,0270dh,msed to by (hl) stt: push hl ld a,(hl) ; get pointer to test inc hl ld h,(hl) ld l,a ld a,(hl) ; flag mask ld (flgm ld (erfnd),a ld de,ermsg1 ld c,printst call bdos call phex8 ld de,ermsg2 ld c,printst call bdos ld hl,crcval a rlca ld (hl),a cp 1 jp nz,ncb1 ld hl,(cntbyt) inc hl ld (cntbyt),hl ncb1: ld a,b and c pop hl pop bc re shift mask ld a,(hl) cp 0 jp z,substr ld b,8 ; 8 bits sbshf1: rrca push af ld a,0 call c,nxtsbit ; get next shi(get byte offset) ld l,a ld h,0 ld a,d and 7 ; bit offset inc a ld b,a ld a,080h imlp3: rlca dec b jp nz,imlof bytes ; hl = pointer to base case ; de = destination setup: call subyte inc hl dec b jp nz,setup ret subyte: pu ; initialise counter or shifter ; de = pointer to work area for counter or shifter ; hl = pointer to mask initmask: push dcall phex8 ld de,crlf tlpok: ld c,printst call bdos pop hl inc hl inc hl ret tlp3: push hl ld a,1 ; initialist z ld a,1 ret ; get next shifter bit in low bit of a shfbit: ds 1 shfbyt: ds 2 nxtsbit: push bc push hl ld hl,(fter bit if mask bit was set xor c ; flip bit if shifter bit was set rrca ld c,a pop af dec b jp nz,sbshf1 substr:p3 pop de add hl,de ld de,20 add hl,de ld (hl),a ret ; multi-byte counter count: push bc push de push hl lsh bc push de push hl ld c,(hl) ; get base byte ld de,20 add hl,de ; point to incmask ld a,(hl) cp 0 jp z,subse ex de,hl ld bc,20+20 call clrmem ; clear work area ex de,hl ld b,20 ; byte counter ld c,1 ; first bit ld d,0 e count and shift scanners ld (cntbit),a ld (shfbit),a ld hl,counter ld (cntbyt),hl ld hl,shifter ld (shfbyt),hl shfbyt) ld b,(hl) ld hl,shfbit ld a,(hl) ld c,a rlca ld (hl),a cp 1 jp nz,nsb1 ld hl,(shfbyt) inc hl ld (s pop hl pop de ld a,c ld (de),a ; mangled byte to destination inc de pop bc ret ; get next counter bit in low bid hl,counter ; 20 byte counter starts here ld de,20 ; somewhere in here is the stop bit ex de,hl add hl,de ex de,hl cnhf ld b,8 ; 8 bits subclp: rrca push af ld a,0 call c,nxtcbit ; get next counter bit if mask bit was set xor c ; fl ; bit counter imlp: ld e,(hl) imlp1: ld a,e and c jp z,imlp2 inc d imlp2: ld a,c rlca ld c,a cp 1 jp nz,imlp1 ld b,4 ; bytes in iut field pop hl ; pointer to test case push hl ld de,iut call setup ; setup iut ld b,16 ; bytehfbyt),hl nsb1: ld a,b and c pop hl pop bc ret z ld a,1 ret ; clear memory at hl, bc bytes clrmem: push af t of a cntbit: ds 1 cntbyt: ds 2 nxtcbit: push bc push hl ld hl,(cntbyt) ld b,(hl) ld hl,cntbit ld a,(hl) ld c,tlp: inc (hl) ld a,(hl) cp 0 jp z,cntlp1 ; overflow to next byte ld b,a ld a,(de) and b ; test for terminal value ip bit if counter bit was set rrca ld c,a pop af dec b jp nz,subclp ld b,8 subshf: ld de,20 add hl,de ; point to inc hl dec b jp nz,imlp ; got number of 1-bits in mask in reg d ld a,d and 0f8h rrca rrca rrca ; divide by 8 s in machine state ld de,msbt call setup ; setup machine state jp tlp ; setup a field of the test case ; b = number push bc push de push hl ld (hl),0 ld d,h ld e,l inc de dec bc ldirX pop hl pop de pop bc pop af ret jp z,cntend ld (hl),0 ; reset to zero cntend: pop bc pop de pop hl ret cntlp1: inc hl inc de jp cntlp ; mpsav ; save stack pointer ld sp,msbt+2 ; point to test-case machine state popiy ; and load all regs popix pop hl po push ix else ld (temphl),hl ld hl,0 push hl ld hl,(temphl) endif endm pushiy macro if isz80ds 2 ; saved stack pointer if isZ80 eq 0 temphl: ds 2 endif ; display hex string (pointer in hl, byte count in if isz80 ld sp,(nn) else ld (temphl),hl ld hl,(nn) ld sp,hl ld hl,(temphl) endif endm ldnnsp macro nt ld hl,crcval tcrc: ld a,(de) inc de call updcrc ; accumulate crc of this test case dec b jp nz,tcrc if traculti-byte shifter shift: push bc push de push hl ld hl,shifter ; 20 byte shift register starts here ld de,20 ; somewhep de pop bc pop af ldspnn spbt iut: ds 4 ; max 4 byte instruction under test ldnnsp spat ; save stack pointer ld sp push iy else ld (temphl),hl ld hl,0 push hl ld hl,(temphl) endif endm ; test harness test b) hexstr: ld a,(hl) call phex2 inc hl dec b jp nz,hexstr ret ; display hex ; display the big-endian 32-bit valun if isz80 ld (nn),sp ; save stack pointer else ld (temphl),hl ld hl,0 add hl,sp ld (nn),hl ; save stack pe ld e,' ' ld c,conout call bdos ld hl,crcval call phex8 ld de,crlf ld c,printst call bdos ld hl,msat ld b,1re in here is the stop bit ex de,hl add hl,de ex de,hl shflp: ld a,(hl) or a jp z,shflp1 ld b,a ld a,(de) and b,spat push af ; save other registers push bc push de push hl pushix pushiy ldspnn spsav ; restore stack pointer : push af push bc push de push hl if trace ld de,crlf ld c,printst call bdos ld hl,iut ld b,4 call hexse pointed to by hl phex8: push af push bc push hl ld b,4 ph8lp: ld a,(hl) call phex2 inc hl dec b jp nz,ph8lp ointer ld hl,(temphl) endif endm popix macro if isz80 pop ix else pop hl endif en6 call hexstr ld de,crlf ld c,printst call bdos endif pop hl pop de pop bc pop af ret ; machine stat jp nz,shlpe ld a,b rlca cp 1 jp nz,shflp2 ld (hl),0 inc hl inc de shflp2: ld (hl),a xor a ; set Z shlpe: p ei ; enable interrupts ld hl,(msbt) ; copy memory operand ld (msat),hl ld hl,flgsat ; flags after test ld a,(hl) fltr ld e,' ' ld c,conout call bdos ld b,16 ld hl,msbt call hexstr endif di ; disable interrupts ldnnsp spop hl pop bc pop af ret ; display byte in a phex2: push af rrca rrca rrca rrca call phex1 pop af ; fall dm popiy macro if isz80 pop iy else pop hl endif endm pushix macro if isz80 e after test msat: ds 14 ; memop,iy,ix,hl,de,bc,af spat: ds 2 ; stack pointer after test flgsat equ spat-2 ; flags spsav: op hl pop de pop bc ret shflp1: inc hl inc de jp shflp counter: ds 2*20 shifter: ds 2*20 ldspnn macro nn gmsk: and 0d7h ; mask-out irrelevant bits (self-modified code!) ld (hl),a ld b,16 ; total of 16 bytes of state ld de,msathrough ; display low nibble in a phex1: push af push bc push de push hl and 0fh cp 10 jp c,ph11 add a,'a'-'9'rclp if 0 ld hl,crcval call phex8 ld de,crlf ld c,printst call bdos endif pop hl pop de pop bc pains next byte, hl points to crc ; exit: crc updated updcrc: push af push bc push de push hl push hl ld de,3 add b 04ch,069h,010h,05eh db 0d5h,060h,041h,0e4h db 0a2h,067h,071h,072h db 03ch,003h,0e4h,0d1h db 04bh,004h,0d4h,047h db 0,lf,'$' ermsg1: db ' ERROR **** crc expected:$' ermsg2: db ' found:$' crlf: db cr,lf,'$' erfnd: db 0 ; set to 1 if error f4ch,02bh db 07eh,0b1h,07ch,0bdh db 0e7h,0b8h,02dh,007h db 090h,0bfh,01dh,091h db 01dh,0b7h,010h,064h db 06ah,0b0h,020h-1 ph11: add a,'0' ld e,a ld c,conout call bdos pop hl pop de pop bc pop af ret bdos: push af push bc puop af ret initcrc:push af push bc push hl ld hl,crcval ld a,0ffh ld b,4 icrclp: ld (hl),a inc hl dec b jp hl,de ; point to low byte of old crc xor (hl) ; xor with new byte ld l,a ld h,0 add hl,hl ; use result as index into tabd2h,00dh,085h,0fdh db 0a5h,00ah,0b5h,06bh db 035h,0b5h,0a8h,0fah db 042h,0b2h,098h,06ch db 0dbh,0bbh,0c9h,0d6h db 0achound nsw: db 0 allok: db 'All tests successful.',cr,lf,'$' erfndt: db 'Some failure detected.',cr,lf,'$' ; compare crc ; ,0f2h db 0f3h,0b9h,071h,048h db 084h,0beh,041h,0deh db 01ah,0dah,0d4h,07dh db 06dh,0ddh,0e4h,0ebh db 0f4h,0d4h,0b5h,05sh de push hl call bdosO pop hl pop de pop bc pop af ret if isz80 msg1: db 'Z80 instruction exerciser',cnz,icrclp pop hl pop bc pop af ret crcval: ds 4 crctab: db 000h,000h,000h,000h db 077h,007h,030h,096h db 0eeh,le of 4 byte entries add hl,hl ex de,hl ld hl,crctab add hl,de ; point to selected entry in crctab ex de,hl pop hl ,0bch,0f9h,040h db 032h,0d8h,06ch,0e3h db 045h,0dfh,05ch,075h db 0dch,0d6h,00dh,0cfh db 0abh,0d1h,03dh,059h db 026h,0dhl points to value to compare to crcval cmpcrc: push bc push de push hl ld de,crcval ld b,4 cclp: ld a,(de) cp (hl) 1h db 083h,0d3h,085h,0c7h db 013h,06ch,098h,056h db 064h,06bh,0a8h,0c0h db 0fdh,062h,0f9h,07ah db 08ah,065h,0c9h,0ech r,lf if genz80 db 'Undefined status bits NOT taken into account' else db 'Undefined status bits taken into acc00eh,061h,02ch db 099h,009h,051h,0bah db 007h,06dh,0c4h,019h db 070h,06ah,0f4h,08fh db 0e9h,063h,0a5h,035h db 09eh,064 ld bc,4 ; c = byte count, b = accumulator crclp: ld a,(de) xor b ld b,(hl) ld (hl),a inc de inc hl dec c jp nz,c9h,030h,0ach db 051h,0deh,000h,03ah db 0c8h,0d7h,051h,080h db 0bfh,0d0h,061h,016h db 021h,0b4h,0f4h,0b5h db 056h,0b3h, jp nz,cce inc hl inc de dec b jp nz,cclp cce: pop hl pop de pop bc ret ; 32-bit crc routine ; entry: a cont db 014h,001h,05ch,04fh db 063h,006h,06ch,0d9h db 0fah,00fh,03dh,063h db 08dh,008h,00dh,0f5h db 03bh,06eh,020h,0c8h dount' endif db cr,lf,'$' else msg1: db '8080 instruction exerciser',cr,lf,'$' endif okmsg: db ' OK',crh,095h,0a3h db 00eh,0dbh,088h,032h db 079h,0dch,0b8h,0a4h db 0e0h,0d5h,0e9h,01eh db 097h,0d2h,0d9h,088h db 009h,0b6h,00c4h,023h db 0cfh,0bah,095h,099h db 0b8h,0bdh,0a5h,00fh db 028h,002h,0b8h,09eh db 05fh,005h,088h,008h db 0c6h,00ch,0d9 05eh,0deh,0f9h,00eh db 029h,0d9h,0c9h,098h db 0b0h,0d0h,098h,022h db 0c7h,0d7h,0a8h,0b4h db 059h,0b3h,03dh,017h db 020h,0e2h db 04ah,0dfh,0a5h,041h db 03dh,0d8h,095h,0d7h db 0a4h,0d1h,0c4h,06dh db 0d3h,0d6h,0f4h,0fbh db 043h,069h,0e9h,3fh,0b5h,006h,0ddh db 048h,0b2h,036h,04bh db 0d8h,00dh,02bh,0dah db 0afh,00ah,01bh,04ch db 036h,003h,04ah,0f6h db 041h0e6h,063h,05ch,001h db 06bh,06bh,051h,0f4h db 01ch,06ch,061h,062h db 085h,065h,030h,0d8h db 0f2h,062h,000h,04eh db 06c,0d2h db 01eh,001h,0f2h,068h db 069h,006h,0c2h,0feh db 0f7h,062h,057h,05dh db 080h,065h,067h,0cbh db 019h,06ch,036h,07h,0b2h db 0b1h,00bh,0e9h,024h db 02fh,06fh,07ch,087h db 058h,068h,04ch,011h db 0c1h,061h,01dh,0abh db 0b6h,066h,02dh,0eh,0b4h,00dh,081h db 0b7h,0bdh,05ch,03bh db 0c0h,0bah,06ch,0adh db 0edh,0b8h,083h,020h db 09ah,0bfh,0b3h,0b6h db 003h,06ah db 034h,06eh,0d9h,0fch db 0adh,067h,088h,046h db 0dah,060h,0b8h,0d0h db 044h,004h,02dh,073h db 033h,003h,01dh,0e5,004h,07ah,060h db 0dfh,060h,0efh,0c3h db 0a8h,067h,0dfh,055h db 031h,06eh,08eh,0efh db 046h,069h,0beh,079h db 0cbh,06h,006h,095h,0edh db 01bh,001h,0a5h,07bh db 082h,008h,0f4h,0c1h db 0f5h,00fh,0c4h,057h db 065h,0b0h,0d9h,0c6h db 012h,01h db 06eh,06bh,006h,0e7h db 0feh,0d4h,01bh,076h db 089h,0d3h,02bh,0e0h db 010h,0dah,07ah,05ah db 067h,0ddh,04ah,0cch 3dh db 076h,0dch,041h,090h db 001h,0dbh,071h,006h db 098h,0d2h,020h,0bch db 0efh,0d5h,010h,02ah db 071h,0b1h,085h,089h0b6h,0e2h,00ch db 074h,0b1h,0d2h,09ah db 0eah,0d5h,047h,039h db 09dh,0d2h,077h,0afh db 004h,0dbh,026h,015h db 073h,0dch db 0aah,00ah,04ch,05fh db 0ddh,00dh,07ch,0c9h db 050h,005h,071h,03ch db 027h,002h,041h,0aah db 0beh,00bh,010h,010h 1h,0b3h,08ch db 0bch,066h,083h,01ah db 025h,06fh,0d2h,0a0h db 052h,068h,0e2h,036h db 0cch,00ch,077h,095h db 0bbh,00bh,b7h,0e9h,050h db 08bh,0beh,0b8h,0eah db 0fch,0b9h,088h,07ch db 062h,0ddh,01dh,0dfh db 015h,0dah,02dh,049h db 08ch,0d3h db 0f9h,0b9h,0dfh,06fh db 08eh,0beh,0efh,0f9h db 017h,0b7h,0beh,043h db 060h,0b0h,08eh,0d5h db 0d6h,0d6h,0a3h,0e8h d db 006h,0b6h,0b5h,01fh db 09fh,0bfh,0e4h,0a5h db 0e8h,0b8h,0d4h,033h db 078h,007h,0c9h,0a2h db 00fh,000h,0f9h,034h h,016h,083h db 0e3h,063h,00bh,012h db 094h,064h,03bh,084h db 00dh,06dh,06ah,03eh db 07ah,06ah,05ah,0a8h db 0e4h,00eh,0 db 0c9h,00ch,020h,086h db 057h,068h,0b5h,025h db 020h,06fh,085h,0b3h db 0b9h,066h,0d4h,009h db 0ceh,061h,0e4h,09fh db047h,003h db 022h,002h,016h,0b9h db 055h,005h,026h,02fh db 0c5h,0bah,03bh,0beh db 0b2h,0bdh,00bh,028h db 02bh,0b4h,05a,07ch,0f3h db 0fbh,0d4h,04ch,065h db 04dh,0b2h,061h,058h db 03ah,0b5h,051h,0ceh db 0a3h,0bch,000h,074h db 0d4h,0bbh,03b 0a1h,0d1h,093h,07eh db 038h,0d8h,0c2h,0c4h db 04fh,0dfh,0f2h,052h db 0d1h,0bbh,067h,0f1h db 0a6h,0bch,057h,067h db 0db 096h,009h,0a8h,08eh db 0e1h,00eh,098h,018h db 07fh,06ah,00dh,0bbh db 008h,06dh,03dh,02dh db 091h,064h,06ch,097h db cfh,00bh db 093h,009h,0ffh,09dh db 00ah,000h,0aeh,027h db 07dh,007h,09eh,0b1h db 0f0h,00fh,093h,044h db 087h,008h,0a3hh,092h db 05ch,0b3h,06ah,004h db 0c2h,0d7h,0ffh,0a7h db 0b5h,0d0h,0cfh,031h db 02ch,0d9h,09eh,08bh db 05bh,0deh,0aeh,03h,00ch,08eh,0a1h db 05ah,005h,0dfh,01bh db 02dh,002h,0efh,08dh end 04ah db 0d9h,0d6h,05ah,0dch db 040h,0dfh,00bh,066h db 037h,0d8h,03bh,0f0h db 0a9h,0bch,0aeh,053h db 0deh,0bbh,09eh,0c5 ; HERE TO DECREASE THE SYSGEN TIME FOR MISSED SECTORS ; WHEN SLOW CONTROLLERS ARE INVOLVED. TRANSLATIONh,0beh,016h,0cdh db 0f6h,0b9h,026h,05bh db 06fh,0b0h,077h,0e1h db 018h,0b7h,047h,077h db 088h,008h,05ah,0e6h db 0ffh,0; (8 cycles) expcrc <0f1h,0dah,0b5h,056h>,<0f1h,0dah,0b5h,056h>,<0d1h,055h,074h,01bh> ; expected crc tmsg 'ld ,nn' ; ld (+1),nn (32 cycles) ld8imx: db flgmask ; flag mask tstr <0ddh,036h,1>,01b45h,msbt-1,msbt-1,0 db 0ebh,00eh,036h,03fh db 072h,007h,067h,085h db 005h,000h,057h,013h db 095h,0bfh,04ah,082h db 0e2h,0b8h,07ah,014h ,0ffh,0,0,0,0,0,0d7h,-1,0 ; (22 cycles) expcrc <0b0h,081h,089h,035h>,<0b0h,081h,089h,035h>,<026h,09fh,0d4h,028h> ; expected db 024h,0b4h,0a3h,0a6h db 0bah,0d0h,036h,005h db 0cdh,0d7h,006h,093h db 054h,0deh,057h,029h db 023h,0d9h,067h,0bfh dbRATING SYSTEM TRACKS 0129 1A SPT: DB NSECTS ;SECTORS PER TRACK (CAN BE PATCHED) TRAN: ;BASE OF TRANS,0ffh,0d3h db 016h,06ch,0cfh,045h db 0a0h,00ah,0e2h,078h db 0d7h,00dh,0d2h,0eeh db 04eh,004h,083h,054h db 039h,003h,0bN ; 0100 ORG TPA ;TRANSIENT PROGRAM AREA 0100 C37402 JMP START 0103 434F505952 DB 'COPYRIGdb 07bh,0b1h,02bh,0aeh db 00ch,0b6h,01bh,038h db 092h,0d2h,08eh,09bh db 0e5h,0d5h,0beh,00dh db 07ch,0dch,0efh,0b7h db crc tmsg 'ld a,<(bc),(de)>' ; ld ,nn (64 cycles) ld8im: db flgmask ; flag mask tstr 6,0c407h,0 0b3h,066h,07ah,02eh db 0c4h,061h,04ah,0b8h db 05dh,068h,01bh,002h db 02ah,06fh,02bh,094h db 0b4h,00bh,0beh,037h db 0cLATE TABLE 0001 # TRELT SET 1 ;FIRST/NEXT TRAN ELEMENT 0001 # TRBASE SET 1 ;BASE FOR WRAPAROUND 3h,0c2h db 0a7h,067h,026h,061h db 0d0h,060h,016h,0f7h db 049h,069h,047h,04dh db 03eh,06eh,077h,0dbh db 0aeh,0d1h,06ah,HT (C) 1978, DIGITAL RESEARCH ' ; ; TRANSLATE TABLE - SECTOR NUMBERS ARE TRANSLATED 00bh,0dbh,0dfh,021h db 086h,0d3h,0d2h,0d4h db 0f1h,0d4h,0e2h,042h db 068h,0ddh,0b3h,0f8h db 01fh,0dah,083h,06eh db 081f49dh,0d13dh,00339h,0de89h,07455h,053h,0c0h,05509h tstr 038h,0,0,0,0,0,0,0,0,0 ; (8 cycles) tstr 0,0,0,0,0,0,0,0,-1,0 REPT NSECTS ;ONCE FOR EACH SECTOR ON A TRACK DB TRELT ;GENERATE FIRST/NEXT SECTOR CP/M MACRO ASSEM 2.0ERATE FIRST/NEXT SECTOR 0142+12 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0143+18 DB TRELT ;GENERATE FIRST/NEXT S DB TRELT ;GENERATE FIRST/NEXT SECTOR 0139+0A DB TRELT ;GENERATE FIRST/NEXT SECTOR 013A+10 DB TRELT ;GENE DB 0 0165+00 DB 0 0166+00 DB 0 0167+00 DB 0 0168+00 DB 0 0169+00 DB 0 OR 012F+02 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0130+08 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0131+0E +00 DB 0 0152+00 DB 0 0153+00 DB 0 0154+00 DB 0 0155+00 DB 0 CP/M MACRO ASSEM #002 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 TRELT SET TRELT+SKEW IF TRELT GT NSECTS ECTOR ; ; NOW LEAVE SPACE FOR EXTENSIONS TO TRANSLATE TABLE IF NSECTS LT 64 RATE FIRST/NEXT SECTOR 013B+16 DB TRELT ;GENERATE FIRST/NEXT SECTOR 013C+05 DB TRELT ;GENERATE FIRST/NEXT SE ; ; ; ; ; UTILITY SUBROUTINES DB TRELT ;GENERATE FIRST/NEXT SECTOR 0132+14 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0133+1A DB TRELT ;GENER2.0 #003 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 0156+00 DB 0 0157+00 DB 0 0158+00 DB 0 0159+00 TRBASE SET TRBASE+1 TRELT SET TRBASE ENDIF ENDM 012A+01 REPT 64-NSECTS DB 0 ENDM 0144+00 DB 0 0145+00 DB 0 0CTOR 013D+0B DB TRELT ;GENERATE FIRST/NEXT SECTOR 013E+11 DB TRELT ;GENERATE FIRST/NEXT SECTOR 013F+17 MULTSEC: ;MULTIPLY THE SECTOR NUMBER IN A BY THE SECTOR SIZE 016A 6F2600 MOV L,A! MVI H,0 ;SECTOR NUMBATE FIRST/NEXT SECTOR 0134+03 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0135+09 DB TRELT ;GENERATE FIRST/NEXT SEC DB 0 015A+00 DB 0 015B+00 DB 0 015C+00 DB 0 015D+00 DB 0 015E+00 DB 0 DB TRELT ;GENERATE FIRST/NEXT SECTOR 012B+07 DB TRELT ;GENERATE FIRST/NEXT SECTOR 012C+0D DB TRELT ;GENERA146+00 DB 0 0147+00 DB 0 0148+00 DB 0 0149+00 DB 0 014A+00 DB 0 014B+00 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0140+06 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0141+0C DB TRELT ;GENER IN HL REPT LOG2SEC ;LOG 2 OF SECTOR SIZE DAD H ENDM 016D+29 DTOR 0136+0F DB TRELT ;GENERATE FIRST/NEXT SECTOR 0137+15 DB TRELT ;GENERATE FIRST/NEXT SECTOR 0138+04 015F+00 DB 0 0160+00 DB 0 0161+00 DB 0 0162+00 DB 0 0163+00 DB 0 0164+00 TE FIRST/NEXT SECTOR 012D+13 DB TRELT ;GENERATE FIRST/NEXT SECTOR 012E+19 DB TRELT ;GENERATE FIRST/NEXT SECT DB 0 014C+00 DB 0 014D+00 DB 0 014E+00 DB 0 014F+00 DB 0 0150+00 DB 0 0151AD H 016E+29 DAD H 016F+29 DAD H 0170 C9 RET ;WITH HL = SECTOR * SECTOR SIZE ; PCHL ;GONE TO SETTRK ; SEC: ;SET UP SECTOR NUMBER 01B3 2A0100 LHLD WBOOT 01B6 111E00 MOV A,M! ORA A! RZ ; MESSAGE NOT YET COMPLETED 0199 E5CD7F01E1 PUSH H! CALL PUTCHAR! POP H! INX H 019FINT IN RAM FOR CP/M DURING SYSGEN 01E0 22A604 SHLD DMADDR CP/M MACRO ASSEM 2.0 #005 SYSGEN - SYSTEM GENERATION PROGRAM 8! RET ; CRLF: ;SEND CARRIAGE RETURN, LINE FEED 0186 3E0D MVI A,CR 0188 CD7F01 CAT 01CE 112700 LXI D,WRITF 01D1 19 DAD D 01D2 E9 PCHL ; DREAD: ;DISK GETCHAR: ; READ CONSOLE CHARACTER TO REGISTER A 0171 0E01CD0500 MVI C,CONI! CALL BDOS! LXI D,SETSEC 01B9 19 DAD D 01BA E9 PCHL ; DMA: ;SET DMA ADDRESS TO VA C39601 JMP OUTMSG ; SEL: ; SELECT DISK GIVEN BY REGISTER A 01A2 4F2A01/79 ; ; CLEAR TRACK TO 00 01E3 3EFF MVI A,-1 ;START WITH TRACK EQUAL -1 01E5 32A304LL PUTCHAR 018B 3E0A MVI A,LF 018D CD7F01 CALL PUTCHAR 0190 C9 RET ; CP/M MACRO ASSEMREAD FUNCTION 01D3 0E14 MVI C,DREADF 01D5 C30500 JMP BDOS ; OPEN: ;FILE OPEN FUN ; CONVERT TO UPPER CASE BEFORE RETURN 0176 FE61D8 CPI 'A' OR 20H ! RC ;RETURN IF BELOW LOWER CASE A 0179 FE7B LUE OF B,C 01BB 2A0100 LHLD WBOOT 01BE 112100 LXI D,SETDMA 01C1 19 DAD D 01C2 E9 PCHL 0011 MOV C,A! LHLD WBOOT! LXI D,SELDSK! DAD D! PCHL ; TRK: ;SET UP TRACK 01AB 2A0100 LHL STA TRACK ; RWTRK: ;READ OR WRITE NEXT TRACK 01E8 21A304 LXI H,TRACK 01EB 34 2.0 #004 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 CRMSG: ;PRINT MESSAGE ADDRESSED BY H,L TIL ZERO CTION 01D8 0E0FC30500 MVI C,OPENF ! JMP BDOS ; GETPUT: ; GET OR PUT CP/M (R CPI ('Z' OR 20H) + 1 017B D0 RNC ;RETURN IF ABOVE LOWER CASE Z 017C E65FC9 ANI 5FH! RET ; ; READ: ;PERFORM READ OPERATION 01C3 2A0100 LHLD WBOOT 01C6 112400 LXI D,READF 01C9 19 D WBOOT ;ADDRESS OF BOOT ENTRY 01AE 111B00 LXI D,SETTRK ;OFFSET FOR SETTRK ENTRY 01B1 19 DAD D 01B2 E9 INR M ;TRACK = TRACK + 1 01EC 3A2801 LDA OST ;NUMBER OF OPERATING SYSTEM TRACKS 01EF BE CMP M ;= TRACK NUMBE ;WITH LEADING CRLF 0191 E5CD8601E1 PUSH H! CALL CRLF! POP H ;DROP THRU TO OUTMSG0 OUTMSG: 0196 7EB7C8W=0 FOR READ, 1 FOR WRITE) ; DISK IS ALREADY SELECTED ; 01DD 210009 LXI H,LOADP ;LOAD PO PUTCHAR: ; WRITE CHARACTER FROM A TO CONSOLE 017F 5F0E02CD05 MOV E,A! MVI C,CONO! CALL BDOS DAD D 01CA E9 PCHL ; WRITE: ;PERFORM WRITE OPERATON 01CB 2A0100 LHLD WBOOR ? 01F0 CA7302 JZ ENDRW ;END OF READ OR WRITE ; ; OTHERWISE NOTDONE, GO TO NEXT TRACK 93 :1002400003CD8601C3FC013C32A8043AA504B7CA19 :100250005802CDCB01C35B02CDC301B7CAFC01C3B9 :100260002B023A2901CD6A01EB2AA6041DCD7F013E0ACD7F0197 :10019000C9E5CD8601E17EB7C8E5CD7F01E123C386 :1001A00096014F2A010011180019E92A0100111BBC :1001B0000019E92A0230 DA4702 JC TRYOK ; ; PAST MAXTRIES, MESSAGE AND IGNORE 0233 211404 LXI H,ERRMSG D OR WRITE SECTOR TO OR FROM CURRENT DMA ADDR 0207 21A404 LXI H,SECTOR 020A 5E MOV E,M ;SECTOR NUMBER 020B 160LHLD DMADDR ;BASE DMA ADDRESS FOR THIS TRACK 0221 19 DAD D ;+(TRAN(SECTOR)-TRAN(0))*SECSIZ 0222 44 MOV B,H 01F3 4E MOV C,M ;TRACK NUMBER 01F4 CDAB01 CALL TRK ;TO SET TRACK 01F7 3EFF MVI A,-1 ;COUNTS 0, 1, 2, . . 0 MVI D,0 ;TO DE 020D 212A01 LXI H,TRAN 0210 46 MOV B,M ;TRAN(0) IN B 0211 19 DAD D ;SECTOR TRAN0100111E0019E92A0100112184 :1001C0000019E92A010011240019E92A0100112768 :1001D0000019E90E14C305000E0FC3050021000924 :1001E0002 CP/M MACRO ASSEM 2.0 #006 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 0236 CD9601 CALL OUTMSG 0239 CD7101 CALL GETCHA:10010000C37402434F505952494748542028432949 :1001100020313937382C204449474954414C20522A :100120004553454152434820021A01070D131 0223 4D MOV C,L ;TO BC FOR SEC CALL 0224 CDBB01 CALL DMA ;DMA ADDRESS SET FROM B,C ; DMA ADDRESS. 25 01F9 32A404 STA SECTOR ;SECTOR INCREMENTED BEFORE READ OR WRITE ; RWSEC: ;READ OR WSLATED 0212 4E MOV C,M ;VALUE TO C READY FOR SELECT 0213 C5 PUSH B ;SAVE TRAN(0),TRAN(SECTOR) 0214 CDB301 2A6043EFF32A30421A304343A2801BE10 :1001F000CA73024ECDAB013EFF32A4043A2901215D :10020000A40434BECA620221A4045E1600212A019D :10R 023C FE0D CPI CR 023E C25F03 JNZ REBOOT ; ; TYPED A CR, OK TO IGNORE 0241 CD90255 :10013000080E141A03090F15040A1016050B1117DF :10014000060C121800000000000000000000000073 :100150000000000000000000000000 SET, CLEAR RETRY COUNT 0227 AF XRA A 0228 32A804 STA RETRY ;SET TO ZERO RETRIES ; RITE SECTOR 01FC 3A2901 LDA SPT ;SECTORS PER TRACK 01FF 21A404 LXI H,SECTOR 0202 34 INR M ;TO NEXT SECTOR CALL SEC ;SET UP SECTOR NUMBER 0217 C1 POP B ;RECALL TRAN(0),TRAN(SECTOR) 0218 79 MOV A,C ;TRAN(SECTOR) 02100046194EC5CDB301C17990CD6A01EB2AA62E :100220000419444DCDBB01AF32A8043AA804FE0A1C :10023000DA4702211404CD9601CD7101FE0DC25F8601 CALL CRLF 0244 C3FC01 JMP RWSEC ; TRYOK: ; OK TO TRY READ OR W00000000009F :10016000000000000000000000006F26002929297F :10017000C90E01CD0500FE61D8FE7BD0E65FC95FE8 :100180000E02CD0500C93E0 TRYSEC: ;TRY TO READ OR WRITE CURRENT SECTOR 022B 3AA804 LDA RETRY 022E FE0A CPI MAXTRY ;TOO MANY RETRIES? 0203 BE CMP M ;A=26 AND M=0 1 2...25 (USUALLY) 0204 CA6202 JZ ENDTRK ; ; ; REA 0219 90 SUB B ;-TRAN(0) 021A CD6A01 CALL MULTSEC ;*SECTOR SIZE 021D EB XCHG ;TO DE 021E 2AA604 RITE 0247 3C INR A 0248 32A804 STA RETRY ;RETRY=RETRY+1 024B 3AA504 LDA RW ;READ OR WRITE? 024E B7 JNZ RDOK ;OK TO READ IF NOT 255 ; ; FILE NOT PRESENT, ERROR AND REBOOT ; 02TACK POINTER 0277 217103 LXI H,SIGNON 027A CD9601 CALL OUTMSG ; ; CHECK FOR DEFAUL MOV B,H 02B3 4D MOV C,L ;READY FOR DMA 02B4 CDBB01 CALL DMA ;DMA ADDRESS SET 02B7 115C00 LXI D,FCB ;READYT ;SECTORS PER TRACK 0265 CD6A01 CALL MULTSEC ;*SECSIZ 0268 EB XCHG ;TO DE 0269 2AA604 LHLD DMADDR ;BASE UNT 029F 115C00 LXI D,FCB ;INPUT FILE CONTROL COUNT 02A2 CDD301 CALL DREAD ;ASSUME SET TO DEFAULT BUFFER 02A5 C1 ORA A 024F CA5802 JZ TRYREAD ; ; MUST BE WRITE 0252 CDCB01 CALL WRITE 0255 C38F 217404 LXI H,NOFILE 0292 CD9101 CALL CRMSG 0295 C35F03 JMP REBOOT ; ; FILE T FILE LOAD INSTEAD OF GET ; 027D 3A5D00 LDA FCB+1 ;BLANK IF NO FILE 0280 FE20 CPI ' ' 0282 CAD FOR READ 02BA CDD301 CALL DREAD ; 02BD E1 POP H ;RECALL DMA ADDRESS 02BE B7 ORA A ;00 IF READ OK 02DMA FOR THIS TRACK 026C 19 DAD D ;+SPT*SECSIZ 026D 22A604 SHLD DMADDR ;READY FOR NEXT TRACK 0270 C3E801 JM POP B ;RESTORE COUNT 02A6 B7 ORA A 02A7 C2C902 JNZ BADRD ;CANNOT ENCOUNTER END-OF FILE 02AA 0D 5B02 JMP CHKRW ;CHECK FOR ERROR RETURNS TRYREAD: 0258 CDC301 CALL READ CHKRW: 025BPRESENT ; READ TO LOAD POINT ; RDOK: 0298 AF XRA A 0299 327C00 202 JZ GETSYS ;SKIP TO GET SYSTEM MESSAGE IF BLANK 0285 115C00 LXI D,FCB ;TRY TO OPEN IT 0288 CDD801 CALL OPEN ;BF C21803 JNZ PUTSYS ;ASSUME EOF IF NOT. ; MORE TO READ, CONTINUE 02C2 118000 LXI D,SECSIZ 02C5 19 P RWTRK ;FOR ANOTHER TRACK ; ENDRW: ;END OF READ OR WRITE, RETURN TO CALLER 0273 C9 DCR C ;COUNT DOWN 02AB C29E02 JNZ PRERD ;FOR ANOTHER SECTOR ; ; SECTORS SKIPPED AT BEGIN B7 ORA A 025C CAFC01 JZ RWSEC ;ZERO FLAG IF R/W OK ; ; ERROR, RETRY OPERATION STA FCBCR ;CURRENT RECORD = 0 ; ; PRE-READ AREA FROM TPA TO LOADP ; 029 CP/M MACRO ASSEM 2.0 #007 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 028B 3C INR A ;255 BECOMES 00 028C C29802 DAD D ;HL IS NEW LOAD ADDRESS 02C6 C3B102 JMP RDINP ; BADRD: ;EOF ENCOUNTERED INRET ; ; START: ; 0274 31C904 LXI SP,STACK ;SET LOCAL SNING OF FILE ; 02AE 210009 LXI H,LOADP RDINP: 02B1 E5 PUSH H 02B2 44 025F C32B02 JMP TRYSEC ; ; END OF TRACK ENDTRK: 0262 3A2901 LDA SPC 0E10 MVI C,(LOADP-TPA)/SECSIZ ; PRE-READ FILE PRERD: 029E C5 PUSH B ;SAVE CO INPUT FILE 02C9 218B04 LXI H,BADFILE 02CC CD9101 CALL CRMSG 02CF C35F03 JMP REBOOT D641CDA201CD860121A603CD960142 :10030000CD7101FE0DC25F03CD8601AF32A504CDD4 :10031000DD01213B04CD960121C403CD9101CD71B6 :10032 CPI CR 0305 C25F03 JNZ REBOOT 0308 CD8601 CALL CRLF ; 030B AF XRA A 030C 32A504 SYS ;TO TRY AGAIN ; PUTC: ; SET DISK FROM REGISTER C 0333 C641 ADI 'AUMBER 02E7 CD6A03 CALL BADDISK 02EA C3D202 JMP GETSYS ;TO TRY AGAIN ; GETC: STA RW 030F CDDD01 CALL GETPUT 0312 213B04 LXI H,DONE 0315 CD9601 CALL OUTMSG ; ; ; GETSYS: CP/M MACRO ASSEM 2.0 #008 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 0200001FE0DCA5F03D641FE04DA3303CD6A0332 :10033000C31803C641320004D641CDA20121F10306 :10034000CD9101CD7101FE0DC25F03CD860121A5C6 922A60421 :10027000C3E801C931C904217103CD96013A5D007B :10028000FE20CAD202115C00CDD8013CC2980221E6 :100290007404CD9101C35F03AF' 0335 320004 STA PDISK ;MESSAGE SET 0338 D641 SUI 'A' 033A CDA201 CALL SEL ;SELECT DEST DRIVE CP/M MACRO ; SELECT DISK GIVEN BY REGISTER A 02ED C641 ADI 'A' 02EF 32B003 STA GDISK ;TO SET MESSAGE 02F2 D641 ; PUT SYSTEM PUTSYS: 0318 21C403 LXI H,ASKPUT 031B CD9101 CALL CRMSG 031E CD7101 CALLD2 218003 LXI H,ASKGET ;GET SYSTEM? 02D5 CD9101 CALL CRMSG 02D8 CD7101 CALL GETCHAR 02DB FE0D CPI CR 0 :10035000043601CDDD01213B04CD9601C318033ED7 :1003600000CDA201CD8601C30000214D04CD910135 :10037000C953595347454E2056455220322E327C000E10C51111 :1002A0005C00CDD301C1B7C2C9020DC29E022100BC :1002B00009E5444DCDBB01115C00CDD301E1B7C2CE :1002C00018031180001ASSEM 2.0 #009 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 ; PUT SYSTEM, SET RW TO WRITE 033D 21F103 LXI H,P SUI 'A' 02F4 CDA201 CALL SEL ;TO SELECT THE DRIVE ; GETSYS, SET RW TO READ AND GET THE SYSTEM 0 GETCHAR 0321 FE0D CPI CR 0323 CA5F03 JZ REBOOT 0326 D641 SUI 'A' 0328 FE04 CPI NDISKS 032A DA332DD CA1803 JZ PUTSYS ;SKIP IF CR ONLY ; 02E0 D641 SUI 'A' ;NORMALIZE DRIVE NUMBER 02E2 FE04 30001E :10038000534F55524345204452495645204E414D06 :100390004520284F522052455455524E20544F204C :1003A000534B49502900534F555249C3B102218B04CD9101C321 :1002D0005F03218003CD9101CD7101FE0DCA18038A :1002E000D641FE04DAED02CD6A03C3D202C6413222 :1002F000B003UTMSG 0340 CD9101 CALL CRMSG 0343 CD7101 CALL GETCHAR 0346 FE0D CPI CR 0348 C25F03 JNZ REBOOT 034B C2F7 CD8601 CALL CRLF 02FA 21A603 LXI H,GETMSG 02FD CD9601 CALL OUTMSG 0300 CD7101 CALL GETCHAR 0303 FE0D03 JC PUTC ; ; INVALID DRIVE NAME 032D CD6A03 CALL BADDISK 0330 C31803 JMP PUT CPI NDISKS ;VALID DRIVE? 02E4 DAED02 JC GETC ;SKIP TO GETC IF SO ; ; INVALID DRIVE N345204F4E203F :1003B1002C205448454E20545950452052455455FF :1003C100524E0044455354494E4154494F4E2044E6 :1003D10052495645204E41D8601 CALL CRLF ; 034E 21A504 LXI H,RW 0351 3601 MVI M,1 0353 CDDD01 CALL GETPUT ;TO PUARIABLES 0462 SDISK: DS 1 ;SELECTED DISK FOR CURRENT OPERATION 0463 TRACK: DS 1 ;CURRENT TRACK 0464 54E20545950452052455455AE :10041100524E005045524D414E454E542045525288 :100421004F522C20545950452052455455524E207C :1004310054E IF 1 04A6 DMADDR: DS 2 ;CURRENT DMA ADDRESS 04A8 RETRY: DS 1 ;NUMBER OF TRIES ON THIS SECTOR 04A9 A AREAS ; MESSAGES 0371 5359534745SIGNON: DB 'SYSGEN VER ' 037C 322E30 DB VERS/10+'0','.',VERS MOD 10+'ETURN TO IGNORE',0 043B 46554E4354DONE: DB 'FUNCTION COMPLETE',0 044D 494E56414CQDISK: DB 'INVALID DRIVE NAME (USE A, B, C, T SYSTEM BACK ON DISKETTE 0356 213B04 LXI H,DONE 0359 CD9601 CALL OUTMSG 035C C31803 JMP PUTSYS ;FOR ANOTHER P SECTOR: DS 1 ;CURRENT SECTOR 0465 RW: DS 1 ;READ IF 0, WRITE IF 1 0466 DMADDR: DS 2 ;CURRENT DMA4F2049474E4F52450046554E4354496B :100441004F4E20434F4D504C45544500494E564167 :100451004C4944204452495645204E414D4520289F :100 DS STACKSIZE*2 CP/M MACRO ASSEM 2.0 #010 SYSGEN - SYSTEM GENERATION PROGRAM 8/79 STACK: B04C9 0' 037F 00 DB 0 0380 534F555243ASKGET: DB 'SOURCE DRIVE NAME (OR RETURN TO SKIP)',0 03A6 534F555243GETMSG: DB 'SOUOR D)',0 0474 4E4F20534FNOFILE: DB 'NO SOURCE FILE ON DISK',0 BADFILE: 048B 534F555243 DB 'SOURCE FILE INCOUT OPERATION ; REBOOT: 035F 3E00 MVI A,0 0361 CDA201 CALL SEL 0364 CD8601 ADDRESS 0468 RETRY: DS 1 ;NUMBER OF TRIES ON THIS SECTOR 0469 DS STACKSIZE*2 STACK: 4610055534520412C20422C20432C204F522013 :100471004429004E4F20534F555243452046494C85 :1004810045204F4E204449534B00534F555243454 END RCE ON ' 03B0 GDISK: DS 1 ;FILLED IN AT GET FUNCTION 03B1 2C20544845 DB ', THEN TYPE RETURN',0 03C4 4445535449ASMPLETE',0 ; ; VARIABLES 04A2 SDISK: DS 1 ;SELECTED DISK FOR CURRENT OPERATION 04CALL CRLF 0367 C30000 JMP BOOT BADDISK: ;BAD DISK NAME 036A 214D04 LXI H,QDISK KPUT: DB 'DESTINATION DRIVE NAME (OR RETURN TO REBOOT)',0 03F1 4445535449PUTMSG: DB 'DESTINATION ON ' 0400 PDISK: D :100491002046494C4520494E434F4D504C4554450B :0104A100005A :0000000000 02ah db 071h,0b1h,085h,089h db 006h,0b6h,0b5h,01fh db 09fh,0bfh,0e4h,0a5h db 0e8h,0b8h,0d4h,033h db 078h,007h,0c94D4520284F5220524505 :1003E1005455524E20544F205245424F4F542900EC :0F03F10044455354494E4154494F4E204F4E20DE :100401002C2054484A3 TRACK: DS 1 ;CURRENT TRACK 04A4 SECTOR: DS 1 ;CURRENT SECTOR 04A5 RW: DS 1 ;READ IF 0, WRIT036D CD9101 CALL CRMSG 0370 C9 RET ; ; ; ; DATDS 1 ;FILLED IN AT PUT FUNCTION 0401 2C20544845 DB ', THEN TYPE RETURN',0 0414 5045524D41ERRMSG: DB 'PERMANENT ERROR, TYPE Rh,0a2h db 00fh,000h,0f9h,034h db 096h,009h,0a8h,08eh db 0e1h,00eh,098h,018h db 07fh,06ah,00dh,0bbh db 008h,06dh,0EAD 022B TRYSEC 0014 VERS 0001 WBOOT 01CB WRITE 0027 WRITF 0004 NDISKS 0474 NOFILE 001A NSECTS 0002 NTRKS 01D8 OPEN 000F OPENF 0128 OST 0196 OUTMSG 0400 PDISK 029E PRERD 017F PUTCHAR 0 db 0bbh,00bh,047h,003h db 022h,002h,016h,0b9h db 055h,005h,026h,02fh db 0c5h,0bah,03bh,0beh db 0b2h,0bdh,00bh,028hh,0b5h,051h,0ceh db 0a3h,0bch,000h,074h db 0d4h,0bbh,030h,0e2h db 04ah,0dfh,0a5h,041h db 03dh,0d8h,095h,0d7h db 0h,0d1h,093h,07eh db 038h,0d8h,0c2h,0c4h db 04fh,0dfh,0f2h,052h db 0d1h,0bbh,067h,0f1h db 0a6h,0bch,057h,067h db 03dh,02dh db 091h,064h,06ch,097h db 0e6h,063h,05ch,001h db 06bh,06bh,051h,0f4h db 01ch,06ch,061h,062h db 085h,065hffh,09dh db 00ah,000h,0aeh,027h db 07dh,007h,09eh,0b1h db 0f0h,00fh,093h,044h db 087h,008h,0a3h,0d2h db 01eh,001h333 PUTC 03F1 PUTMSG 0318 PUTSYS 044D QDISK 02B1 RDINP 0298 RDOK 0024 READF 01C3 READ 035F REBOOT 04A8 RETRY 04A5 RW 01FC RWS db 02bh,0b4h,05ah,092h db 05ch,0b3h,06ah,004h db 0c2h,0d7h,0ffh,0a7h db 0b5h,0d0h,0cfh,031h db 02ch,0d9h,09eh,080380 ASKGET 03C4 ASKPUT 036A BADDISK 048B BADFILE 02C9 BADRD 0005 BDOS 0000 BOOT 025B CHKRW 0001 CONI 0002 CONO 000D CR 0186 3fh,0b5h,006h,0ddh db 048h,0b2h,036h,04bh db 0d8h,00dh,02bh,0dah db 0afh,00ah,01bh,04ch db 036h,003h,04ah,0f6h db,030h,0d8h db 0f2h,062h,000h,04eh db 06ch,006h,095h,0edh db 01bh,001h,0a5h,07bh db 082h,008h,0f4h,0c1h db 0f5h,00,0f2h,068h db 069h,006h,0c2h,0feh db 0f7h,062h,057h,05dh db 080h,065h,067h,0cbh db 019h,06ch,036h,071h db 06eh,06EC 01E8 RWTRK 04A2 SDISK 01B3 SEC 0080 SECSIZ 04A4 SECTOR 0018 SELDSK 000E SELF 01A2 SEL 0021 SETDMA 001E SETSEC 001B SETTRK 0bh db 05bh,0deh,0aeh,01dh db 09bh,064h,0c2h,0b0h db 0ech,063h,0f2h,026h db 075h,06ah,0a3h,09ch db 002h,06dh,093h,CRLF 0191 CRMSG 01BB DMA 04A6 DMADDR 043B DONE 0014 DREADF 01D3 DREAD 0273 ENDRW 0262 ENDTRK 0414 ERRMSG 005C FCB 007C FCBCR 0 041h,004h,07ah,060h db 0dfh,060h,0efh,0c3h db 0a8h,067h,0dfh,055h db 031h,06eh,08eh,0efh db 046h,069h,0beh,079h fh,0c4h,057h db 065h,0b0h,0d9h,0c6h db 012h,0b7h,0e9h,050h db 08bh,0beh,0b8h,0eah db 0fch,0b9h,088h,07ch db 062h,bh,006h,0e7h db 0feh,0d4h,01bh,076h db 089h,0d3h,02bh,0e0h db 010h,0dah,07ah,05ah db 067h,0ddh,04ah,0cch db 0f9h,371 SIGNON 0006 SKEW 0129 SPT 04C9 STACK 0010 STACKSIZE 0274 START 0100 TPA 04A3 TRACK 012A TRAN 01AB TRK 0247 TRYOK 0258 TRYR00ah db 09ch,009h,006h,0a9h db 0ebh,00eh,036h,03fh db 072h,007h,067h,085h db 005h,000h,057h,013h db 095h,0bfh,04a3B0 GDISK 02ED GETC 0171 GETCHAR 03A6 GETMSG 01DD GETPUT 02D2 GETSYS 000A LF 0900 LOADP 0003 LOG2SEC 000A MAXTRY 016A MULTSEC db 0cbh,061h,0b3h,08ch db 0bch,066h,083h,01ah db 025h,06fh,0d2h,0a0h db 052h,068h,0e2h,036h db 0cch,00ch,077h,095h 0ddh,01dh,0dfh db 015h,0dah,02dh,049h db 08ch,0d3h,07ch,0f3h db 0fbh,0d4h,04ch,065h db 04dh,0b2h,061h,058h db 03a0b9h,0dfh,06fh db 08eh,0beh,0efh,0f9h db 017h,0b7h,0beh,043h db 060h,0b0h,08eh,0d5h db 0d6h,0d6h,0a3h,0e8h db 0a1h,082h db 0e2h,0b8h,07ah,014h db 07bh,0b1h,02bh,0aeh db 00ch,0b6h,01bh,038h db 092h,0d2h,08eh,09bh db 0e5h,0d5h,0Lɂ`iX*!Hx fCp#[2[4a#ynaIEY[i8$` &Հ0`QW`Vs`` VA db 0cdh,0d7h,006h,093h db 054h,0deh,057h,029h db 023h,0d9h,067h,0bfh db 0b3h,066h,07ah,02eh db 0c4h,061h,04ah,0b8h3'AX(OI|+Ep\. p\$)|N@0 |=~Ld'AX<1 bh,00dh,0d2h,0eeh db 04eh,004h,083h,054h db 039h,003h,0b3h,0c2h db 0a7h,067h,026h,061h db 0d0h,060h,016h,0f7h db 0g\. p\$k" &e1p\. p\. p\$kцC`B{ *A !|5p\. p\$kH`0 `>MB+IuaG8 < An7 EXd2p\. p\$k`e1#\. p\. p\$k%5Ti%@05 U& &e11p\. p|O ?5햺J &e1ɰ\. p\. p\$kI`0 YznתXhl͂X !|5uX &e13\. p\. p\$kF"bQW(f@?qn p\. p\$kf* (x@5 x(1"A) p\. pm% &e1`\. p\. p\$kD`x\i4KЮ X5 &e1\ r;!Ȁp# An7 E`\. p\. p\$kN`0 qhgi^6\. p\$k@/̡0poˋ5F &e1Ap\. p\. p\$kh4V ,2GAn7 Ep\. p\$k`00<rUS58 &e1,4G±\. p\$kDpla [Œ561 &e\$kzZ#%U:Ŵ+ XcQaXl H>p\$kF6,. p\. p\$kD` (z1%3dU@Sh5@QQ &e1ȸ\. p\. p\$kX_k An7 E3\. p\. p\$kD@0 ؑ /sYa- E Q2.$D _5 &e1C(\. p\. p\$k &W@ PBR}.$C AX(7H\. p\. p\$kO`0 +D!R霡 ^fhG? @xO#XR,7p\. p\$kHY&%HV0t@ayt y "p\. p\$kJ.0 T& ~M,ayt. p\. p\$kT8na" P  5 |  "p\. p\. p\$kQR8FÇxR8#! Y/V+U6 0[`h^,(3TX(څ r{d`V8zs>yL=98aƈd" 0 ^L ؀~5 d2&xb1 Ʉ|. p\$k`z(5L f 1|ZK @xO#XR,0p\. p\$kZ͉ D.u`'0"T XcQP<4V1p\$kL%$eN$ p B,2 `Ph6 E\$kTXK 0 -5ㅨ,fSe9`c2MA)0Hpk/.BYB#LH]x;^qp\. p\. p\. p\$kL-"b@0yZN+U!$B!@2P\:G (A0hY"0 b\t":.ݔDJ:x,!tl Eb5$L-r Pn7‘@l2q)Ep\$kUI04(L`0M q @c H. p\. p\$rfcydܡ2$Y!uN!ѰC ڰ ڰX8 bJۙnTM Xl IXia7xFa? ,%yb\`{v03G EdXW+4 pX/Ii ~j A|  "p\. p\. p\$kT P  0 5izZ |  E"p\D6`VL8b\P?? p G8 V8Be`@=>7H<! D Y a |8~' 18xPX,n p\$k$P+ 0 8xЖ  d2 xb1 a|. p\$kHx4 @xO#XR,\. p\$kN!2y ^hp0M3c:Me9'3) *S1e2gC s'CO*Y 4c7M@h(H `P@ "DT* 3@e< 3: 7F2000CC5B7CE1CDAA85E8E521597DE5CD567EC9CDAA850CC2107FDC597FC3A47ECD905F :207F400085F1E521597DE521EE7DE5F5C3107FB7CD597FCD9085Cu6da,7jQFԘ)8 *]`3@M*% KP`$G&ܭU4wm i5-GY 3^ˑ1lް;C r9-9Q YqeSwitched to Z80 processor. $Switched to 8080 processor. $>0[>2 =22=sV*I =!"d6%2k( e6F 8JC`)z0^!\ʰlKwIA\:A­i%> hl,K$dd68ȭոmdL+ -07FC000CD977C37D2E07F017494110024CD4A7DF2DD7FCD8B7DF1CDF37FC3B87FCDA77C4A :207FE000CD267DCDCA7DF1CD5B7DCDA77CCDE07CC3B87FCD647DFE21CA507FFE64CAF97EFE44C2107FB7CD597FCD9085F3 :207F0000CDBB85CD9085DAFE7F14C2107FAF935FE57B905FF4687FFC787FC2147FE1F1E5EC :20,hl,sp>....$ &PXfɛ0!eadd hl,..........$ ݔ[c3vj hI3T¹~7I !- 0l%= Cс`wvTbnG;ƕaYdhJoi( F٘ ;W`8 D .JQ0KXV-$3P֭xXO"mp02B36247BE604C02B70C932577C21317C3620C9CD647DEBEF :2080E0002A5694E52A5894E5EBF5AF322F7CF1F5CD878106450E00E57EB8CA2881FE3AD274 (XBz-J6 JW (!`Eaah -0/PB@e}>r)] d, T# `jCD5B7DC1D1C33E7D7BFE78 :208000000AD20D800707830786D6305FFA1E7FC3037FB7C34780F1E5215C94CDAA85E2276B :20802000803A6694C3288079AE60!Yadd ix,..........$ Q> Qq0!u e...................$$+&(} h........_h"d b...................$ͫDɍIM*!˺ iyl.................$KYohنKMEld ,(nnnn).............$S@>zazP$?S{Ubit n,....$Ǵr0!]' sp..................$4n(,WP3o( _(add iy,..........$@<~gzma[) f8Hy`aluop a,nn....................$#åmO*W! mJ hl..................$#< Ү; bc..................$ 5 ['ҕ`„UL c...................$*c0xw `_$ld hl,(nnnn)..................${Wa!ʅ'` Bcpd........................$HMJkqNj| Xp (+1).........$$8l1>XYBoF6b ixh.................$׀>:WML f;?Caluop a,..$݄nϬG("58K !M1 ix..................$#zc1Z鲴m!...........$꠺_e8C\E# d...................$.4( g.:TzΡld sp,(nnnn)..................$*L$އ¼cL ޳Vcpi........................$'A! `Y[y)Ku.............$,M`tv2 ixl.................$$6(oa˂s# 9mZaluop a,.....$݆2n@En 8P]Q iy..................$,1 VC <>V l........!, de..................$/` L$ 2%Ymld ,(nnnn).............$CM]a?dld (nnnn),.............$<J՘+CDZ0ш a...................$#-CazZX-l iyh.................$,b9p~>"Ignaluop a,(+1)...........$SFu +1).............$4V| >~X\7: (hl)................$3o4iѶޔvS[...........$"rwSr?d-5`Gld (nnnn),hl..................$sZVگlD &ldi (1)....................$Jnˆ->,nn.......$@r$aǂq?tKld ,........$@ż/ͽzLOld (),a................$~#fo~2#I͸(q͸!q6ڵVld ,nn....$6EaĽ &G~ld (+1),nn..l,(hl),a>..$ˀ,9KѲjS'8W n,.....$D h2^g?X_ld (nnnn),sp..................$"l i Yldi (2)....................$D8k_4WBFCZ j<;neg................; ?Gkld ,........$2hDCSO, =2:vʨ¥:vę<>2 = =!F =##>2_2!I"`!q"...........$F`B9J ld ,(+1)......$fRI xc n,(+1).......$p ':{p *kld (nnnn),.............$\F-x`tF009ild ,nn...........$gˑb y@[&.....................$Cm S &-ld a,(nnnn) / ld (nnnn),a.....$Rhfh 'ildd (1).........Ñ#N~=>bO,~X>܆OIy*`F!_~Ow{*`#"`x *Mld ,(+1)..........$~МC bjld (+1),......$tdf j1ld (+1),,nnnn...............$ *BƱ@%0...........$ (2)....................$0X``>*F!~OwŸ*#"x>6T] (ͧ^{yO#zo&zw!Idld a,(+1)..............$&S<@Fyw] $肋ld ..........$wgOD׼P_ ̾Zld (+1),a..............$; l!5ld a,<(bc),(de)>..............$ĝ=9UtS U8Wq:́shf/rot (+1)...........$J]0Cx=?W`MXshf/rot 6#w#(1638FE5C5E521260009CD :208F6000C38788E1D1C1C9C57E1223130B78B1C2688FC1C9F1D5C5F5444DCDD08FCA7790D3 :208F8000CDC58F21B1000919F17 '}DhibW]egl6qnkv+zZgJoC`֣ѓ~8ORѻgWg?H6K +گ L6JAz``èg15CCB391CAB590FE08C25260 :209140009105CAB590CDB0913E20CDB0913E08C3DC90FE18C25C913E23C3E390FE12C275D8 :2091600091C5D5E53600CDAD|-dj qHA}mԵQӅlVdkbze\Ocl=c ;n Li^`Agqr<KG k5Blۻ֬@2lE20906000E1C93E36013E34013E3F013E3D013E3A013E37013E35013E32013E33013E40019F :209080003E43013E05CDF66D6F2600C3B86AE5D5C521000022Es1{s1{*"!~w!F ~7F521280009563600FE0DCA9D8FC6E07ACE0077F1C1D198 :208FA000E1C9D5CDCE8FCA7790CDC58F21B10009197EB7D1E1C1C921A900C3C08F21B00004 :2U1nFiyaf%oҠRh6 w G"U&/ź; (+Z\j1,ٞ[ޮd°c&ujm 6?rgWJz{+ 8Ҏ9121A66ECDC591E1D1C1C3F790FE20DAF790783C3E07CA85C2 :209180009179712304CDB091D60AC2F7903E0DCDB091CDDB91B7CA9291FE0DCAF790C3FAA7 \u ϫ=Y&0Q:Qa!V#Ϻ(_ ٲ $/o|XhLaf-=vAq *q3xɢ4 j m36921A66E22A66FCDA490E6 :2090A000C1D1E1C93A5F6EE602C2B590CD1B7C3FA0C3B59070CDDB91C3E9903AAC91B73EE2 :2090C0005C32AC91C2CF9005C#~# # 0'0_=Z80 instruction exerciser Undefined status bits NOT ta08FC000095E2356C91321B00009732372C9444DCDBD8FD5CDB78FEBD1CD5090C9C5D57D4F :208FE000CD168DCA6590FE01CAF08FFE03C26290606922E36921 | !Bhݳڃn&[owGwZjpf; \ebiaklE x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻ :2091A000903A5F6EE601CCAD91AF77C900C3E26DC37792F53E5ECDB091F1F5F640CDB09191 :2091C000CDAD91F1C97EA7C8FE0AC2D491F53E0DCDB091F1C=-dlc\kkQlabe0bNl{WeP|b-I|LeMaX:QΣtԻ0JߥA=ؕפmCij4ngF`D-s3AB490CDB09104052BCAE3907ECDB091C3F790052BCDB091FE :2090E000C2F790CDB091CDAD9121A66E0601F5AF32AC91F1C3FA90CDDB914FFE7FCABB9067 ken into account $ OK $ ERROR **** crc expected:$ found:$ $All tests successful. $Some failure detected. $F009022EC69D1C1C32D90D4 :20900000CDA589D0CDF66D213E00C3B86ACDEC6D7CB2C2AD6A2CCA27902D3AE969B7CA6598 :2090200090E52AEA69E3C92105G0齽ʺŠS0$6TW)#gfz.aJ]h*o+ 7 Z- x NT9§g&a`IiGM>nwۮjJZ@ f7;𩼮S޻DB09123C3C591CD0569E67F85 :2091E000C9C37CE52A0B6AFE0DCAFA91F5237E2B3CCAF9913D96DC8B92F1F5FE0DCC6292B5 :20920000FE08CC6592FE20D L_ |Pq<'A  Wh% of a^)ɘИ"רY=. \;l  tҚG9w&sc d; mj>zjZ :209100003AAC91B7CA10913E5CCDB091AF32AC9179FE07CA7A91FE03CCB39137C8FE0DCAB8 :20912000A191FE09CA7A91FE0AC2349105CAB59004C37A91FE#o&))!JFw# #!F>w#<w0a, Qmpjc5dۈ2yܸو L+~6922EC69C5D57BCD337AE5662425CA4B90D5E5214490E530 :209040002AEC69E9E1D11213C33690E1D1C1C9007C92C07D93C9E521000022E369E1C9F156 :A0B92342B7E233CCA3A923DC25E92F1FE09CA6992E1CD0E694D :20922000FE0AC0F5C53A136A470405CA3792AFC5CD0E69C1C32A92C1F1C93AE869A7C25358597C :2094C00098CD6E95216094CD9798CA2D953A5D94B7CA0A9E3A67942F3C473A66944FCDAA52 :2094E0009B34CD0E982196937141118F93216094CD660000C5F53E01322D7CF1EB01FF006068CC4D7EEB7EFE26CA00006E :20940000FE2DF5CAA47EFE2BCAA47E2BCD1B75DA8B7FFE2ECA317FFE65CAB67EFE45C2E00000AF :2096A0000000007F000000000000808260DEF933F30435817ACFD1F71772317F7BCFD1F7B6 :2096C00017723180C06821A2DA0F4982CD9798CA04CD2993E1C95E235623E521569B :2093200094CD2693E1C9CD29931A7713231A7713231A7713231A771323C9237EFE20CA3A38 :2093400093FE09CA3A93C370233DC2C295EBE9215694C3E495E1228E93CDB695CDA595CD919527 :2095E0002A8E93E9CD9798CAC19D3A5D94B7CAC19D2166944E2346CDAA9BCD0E9871 :20924000923C32E869E52AE56922E19121959222E569E1F1FE09CA6992CD1569E1C92AFF58 :2092600069E93601C935C034C93E20CDE3917E3DE607C269971A993FDA0495118F93216094CDA2 :209500005997AFDA12043A5C943C3D1FFA2B97172156940E07CDCA97218F93CDC89778B73B :20952000C2EA94215D0D3 :209420007EE5CDA57EFE6CCACE7EFE4CCACE7EFE71CACE7EFE51E1CADF7E3A547CFE08CA43 :20944000F97E3E00C3F97E7EFE25CA3E7FFE23CA4F7FFA9E79EE804F326694C3E296CD9798CAE0 :2096E0000A9E3A5D94B7CA6E9590D2F4962F3CF5CD6E95F1FE39D20A9EF53A66944FCDB957 :209700009C47AF39856FD024C9A7C8C5471A77132305C25093C1C97BADC07AACC915 :20936000CDCA7D212A85CDC47DCDE07CCD907CC30D7ECD447D3A7B7DB7F5E67F320E7E3A130628 :20960000071A13B7D5CA21960E08C51F47DC5397CD519878C10DC20A96D105C20196C38C26 :2096200097215C94CD2D98C31996B26AF6F4A2300992E1C9E52A0B6AE5210E6A22D8 :209280000B6ACDE391E1220B6AE1C93E0DCDE3913E0AC3E3913E0DCD15693E0ACD15692A98 :2092A000E191E9C50103009435C2EA94C36E96CDDE7189215C944E2346CDB99CAE2B36B8F5FC56 :209540006395215C943EB890CD2598F1FC3F97AF3255943A5694F5CD8C97CD0A9EC17E21CA507FFE64CAF97EFE44C210CD :209460007FB7CD597FCDBB7E360023D601D26894C9CD97981167941AB7CAA394CD0A9E1BDA :209480001A4FCAA894225F94F1216694CD25983A5F94325594782160941156940E07B7F2739764 :20972000CD5C97D22B97EB34CD51983A5594B7FC3F97215E947EE6802B2BAE77C3E2 :20938000157EFE90D20000CD917D3A187EB7C22E7EF1EBC3337EF1EBF2397E7C2F677D2F77 :2093A0006FC34D7E211D7EE53A237EFE90D2567ECD917D7F5465C242D7B35D81C26821A2DA0F23 :2096400049812E9B6BC1910A06800000000000000081E5CD8B95E1CDDA9DCD6298C368962A :20966000E5CD8B95C3AE92C501070009EB0947CDC792A0C1E1CAC2927E23666FC3B7 :2092C000C4922323D1E3C9CDD1923E04D80FC80FC91AA7C2DE927EA7C82B7E173FC97EA7A8F0BE :209560002F3CC92156947E35B723CA6695C911569421609406084E1A777912132305C27696 :2095800095C30A9E115694EBC39A98215694C3979821129EE5215C94AE79F8132306081A96C2A0941B2B05C29394C1C9CF :2094A0001FA9C9CD0A9E3FC9C3129EE5CD8B95E1CDDA9DCD6298C3C194E5CD8B95E1CD0A9E2156 :209740005694060734C02305C2449734CA6E962B3680C92160941156940E07AF1A8E12130C :20976000230DC25C97C9AF0E071A9E1213230DC2EBD122F27D3E0232547CC901804C :2093C00090110000CD4A7DC0616AC34C7E0000000000002084CDCCCCCCCCCC4C7DCD847C3D :2093E000CDAA7CF6AF01E1CD5998216094C3E495CDDE7117215D940EFF71237EE680F67F2B2B93 :209680007706062B7105C28396C30A9E000000000000008015444E6E83F9227E000F :2092E000C2E992F6011B1A17C91B2B1AAE1A132317F8D2F692EB1A96C01B2B0DF2F692AF87 :20930000C9EB260029292911E80B19C95E235623E5215A916094C3AE98CD4C99214C99E3E92130 :2095A0006794C3A895215D943E04D1462B4E2BC53DC2AB95EBE9216094C3BF952156943E54 :2095C00004D1C17126997C9CD6997D28C97131A2F12215594A5 :209780000608AF4F799E772305C28497AF473A5C94B7C2B5972155940E0856777A230DC2EC :2097A0009A9778C1D1C3589BEBCDCE9CEB7EF523CDDA9DF1C1D13DC8D5C5F5E578B1CD559BE19A :209A4000CDFB9DE5CD579AE1C3319ACD449CC3549ACDFB9DCA0A9E3A5D94B47EB7C82B3E80AE77C30A9E0100815159C3C4 :20996000E39DF1FA759CC30A9E3A5D94FE88D2A099FE68DA9899CDCE9CCDCA9BC681C1D191 :20998000CAA0D82F3CC978B1CA0A9E21129EE5CD0A9E792FC8215C94AE7EF0CD1F9C1FA9C92399 :209C20007EB8C02B7EB9C02B7EBAC02B7E93C0E1E1C94C550600582921C3B498CDE7 :20988000AE98CDB99C21599446235E2356234EC3A19DCDB4987DC911609406087E12132368 :2098A00005C29C98B7472B2B4EC879C3129E119B783C3DFA459B7B175F7A17577817472979172A :209B40004F9FEBE3E91F4847E1C3A19DCD449CC3559BCDFB9DCAE69DCD0A9EC8CDAA9B79F6 :209B6000D608FEC0C28D97C3C19D05215594CDC897B7F2AD9778B7CA2B97215D9468 :2097C0008677D2C19DC32B970E087E1777230DC2CA97C9E5CD8B95E1CDDA9DCD67CAE39D90D2CC :209A6000679A2F3CCD959CFE19D20A9EF5CDB99C67F1E5CD4E9EF1B7215A94F2999A7E8301 :209A80005F237E8A57237E894FD2A19D233099F5CD959CCDB99A21A999CD269AC11100004AC35C9B0100815159C3E39D7C :2099A000CD0A9EFAC19DC3909D077C885974E0972677C41D1E7A5E50637C1A9080225D94DC8199 :209C40009CC3E39CEBCDCE9CEBCD329CC1D1CD959CC9EB7AB3CA759C7AB742FC799C7CA88A :209C6000477CB5C87CB7EBFC799CC5CD5694C39A98215A94CDDA9D3E90B8CAEB9841 :2098C000D2C998CDDE7114068FCD039ECDF998CDF19DEBC8EB215E943680CDC69C673E9896 :2098E00090CD0E00C50E082B46C52B46C52B46C5770100006068E37CB7CAA29B1F6779E3D286C3 :209B80009B193A5A94891F4F7C1F677D1F6F781F47E32D7CC27A9BE1E37298C3E92F :2097E00097E5CD8B95E1CD5998216094C3DC96E5CD8B95E1CDDA9DCD6298C30598E5CD8BBC :2098000095E1CD5998CD6E95216094C3CC967934CA909D2E01CD649EC3A19DAF90477E9B5F23EE :209AA0007E9A57237E994FDC819CC3E39CCD449CC3B69ACDFB9DCA0A9E3E80A94FC3579A72 :209AC000CFE757E187263 :2099C000318000000081CDE39DE2D099CDDE718A3E80325D94A8F521ED99CD269AF1CDCED9 :2099E0009C6F179F67CD329CC1D1C3579A091A9EF1B7FC799CEBC9CDDE7189AF4F935F799A57BF :209C8000C9215E947E2F77AF6F90477D9B5F7D9A577D994FC9CDCE9CCDE69DC1D1C97CB5A9 :209CA04E9E7C17D4879CEBC93E80A9B2B3C2C398616BC9CDDA9DC8F5FC4C99CDCAEA :209900009BF1FA4C99C30A9ECDFB9DCA5A99F5CD0A9ECA6299E1CDCE9CF22A9DB7C2759BD1C346 :209BA000E39CE1456C614FC3749B215D947E80471FA878F2C29BC680CAC09D77CDB99C77B0 :209BC0002BC9B7E1FA909DC3C19DCDF1926694215C941195930100077E12711B2BCC :2098200005C21B98C971E5D608DA3C98E1E51100084E73592B15C23198C32798C60957AFE8 :20984000E115CD449CC3C99ACDFB9DCA759CCD0A9EC8AF9047CDAA9BEB224394EB793245944605 :209AE000AF6FCD8C9CCD959C21000044E52A5A943A5C9419894FD2069B11D8EE9482A9AA7D847D99BF867BE528878A71C0 :209A0000C0876E951487B21EA086AD7A0285099D8D83EBCDCE9CD5CDF19DCD589BE1CD2621 :209A20009A00C8EB7CB5C8444D2100003E1029EB29EBD2B49C093DC2AC9CC9215C947E07371FA9 :209CC000773F1F2323777907371F4F1FAEC92A5A94E3E52A5C94E3E9E9C5D5CDCD1F :209920009BD1C1F5CD049CE17C1FCDE69DC1D1D23699214C99E5CC4799CDCE9CCDC699C1DE :20994000D1CD589BC369993E7FA14FC9215D9D78FE987BD2E69D215E943680CDC69C7767FAE8C0 :209BE0009B7AB3C2E79B0D1B3E9890CD4E9E7C17D4B39D06007BF53E98325D94CDE39CF1AF :209C0008E51E087E1F772B1DC24698C33F98215C941601C34398CD329CC36298CDBE :20986000DA9D0604AF215694772305C26898C30A9ECD79987DC9CDAE98CD82985D94EB34EBD188 :209B0000CA909DC31E9BD1CD2E9B672E00E52A43943A459419894FD17A8BD1D2079BCD2ED6 :209B20009B672EFFE52A5A943A5C94C3141E3225C94E1E322B5 :209CE0005A94C9616A5358CD2A9D1415CAC19D4A535C45215D9496D2C19D2F3C77C3A19D59 :209D00000600213D947EB7C21D9D78D#^#Vz>a>0ͳ&xGxʬ%^#V#O"/yk+F(6s#r#s#r#&¡%k%ü%>¾%¼%s#rw+>a/a..*>(G}|v'!"(!("**"*}|ڄ'"6# x…'* ">a:y|ʽ'z+ï'*yr,]T}_|))).&">4W*/y=*/#~+)*x *xG>k+x8*>k+xG F*>k+x#~+E0009DE1C9CD039EEB225A94EB6069225C94C92A5A94EB2A5C94444DC95E2356234E65 :209E000023462378B7C879C3129E3A5D94B7C83A5C94179FB737C0C##~>'> ͳ&s#r w+.>2 (#w+>3ͳ&s#rw+ͳ&xDM"/(*(s#r#(! C(>2ͷ&@(ͳ&(&~#638C2129D47C9C640471608CD889DC3029DFA289D15 :209D2000CD759D04B7F21D9D78C906007CB7C2579DB5C23E9DB2C2479DB3C2509DC9656A09 :209D4%2.#6+>1ͳ&s#r>w+a.)a.>#V>Æ(&F(F('O&3%`& `& &%?A#$ $]Tx2$(#6~+%5HA$.%a."/>k+>Xͳ&s#r+&W!x*G^#V#~ì*3 < E N !3> ì*!<> ì*!W> ì*!`> ì*!i> ì*O?'yG !T+GF601C97C2F477D2F4F1E :209E2000032100003E11F5B7C3359EF5E509D2349EF1373EE17B175F7A17577D176F7C1730 :209E400067F13DC22B9E7CB71F677Z(#~+Z(~+x ͳ&s#rw+ɯ2(x_Oͷ&Ô(2(x_Oͳ&9w#w+xʭ(+r+s=¤(w>#w+&~7^#V00053580608C3579DEB1100000610C3579D636811000006187CB7FA6C9D7B175F7A2F :209D600017577D176F7C176704C3589D223894EB22369478C9E52136"$"a.]&7#yͿ*.&X{&&>a*6#~ž&3&s#r>#+6#6#6#6@="#wɧø&7?'w##&4##p##!9"$ v$v$+~#G#P$+GO>#ͳ&`iGí$*$ ʢ$.&""$/@$#~+$!"k+.*x2j+*(+#N+.*N+x +#~++k+ +yk+ (w!~#fo#~#w:j+,+6~+;+~ ;+6 H+~H+6ͤ/PD1F6FC90600D608DA5D9E435A510E00C3509EC6096FB1 :209E6000AF2DC8791F4F7A1F577B1F5F781F47C3609E5A94EB2A5C94444DC95E2356234E3A :000((!~ѧ7.&.~7!~#fo~)7)#~+~w}D#wx#a.&G!)!9*?941E08B77E177723DA :209D80001DC27C9DE1C91604CD759D15C2889DC911A99DD5CDDE711311FFFF4A215D94712C :209DA000C978215D94B7FCB39D4623.2b ** "|& } +++:~?'4'`':,X/~2,?'**s#r"*##s#r:/*}o|g"s#r#&$$/$/"%͜*s#r#"%/!]>#ͳ&q#p!w+~F%a./~GO+ɀ @ PPPPPP X#ʌ+̏+~̏++(w#w+*R#~6+´+&6#s#r>6###s#r#6@"R=#w00001FF >a:c)2>2:o) L))K:)!uLҘ)͑M!)bM)*xʸ)ͳML)͇M!8L͇L)@7EE680A94FC3E39D1CC014C00CC00E8034C0C3949DD3 :209DC000E1AF676F225A94225C94C9E5CDF19DE173237223712370C3039ECDFB9DE5CDE681 :209D*>(G}|v'!"(!("**"*}|ڄ'"6# x…'* ">a:y|ʽ'z+ï'*yr,:G+!<,####~#+F#N#~#fo~#fo,CH+##~>O3)6#p#6 ####yGS)+w~~ !N#F# }25! F+N+p+q 1s#r ~ ʉ2 22^#V#~#fo7(2"2!N#F#~#fo(2"2!q#p!!>*/ćI#r+s++0*/>ͦ0!~#fo~~Z̫9 ' ͳ& >G>G!N#F*9~#fo##^#VX!~#fo"1+ " H"16 " H"ty " H H" "=====~=w2_.~#fo&~#!y.H~aX[&#~+>>2e .>2e &|½.!T~#.~#fo H"+0 " H"ns " H H H" "===========!_,H~͞.>a"n-:ʗ,ͤ/͔*ͤ/>Ϳ*.&v,ʪ,w-`i)9^#V!~)y~-#~#fo##A:Åh:cwq#p>1>1>*d02e0&12e0~q199>1&121L1x?1:=================== ====================== =========H=============="  " ..##~#~#..Ô+.„*&""> 2q"/y2/2/O&#s#r+++++~5/ }|x]/!^#Vz<=====H==========H================== ========H====================="! " & H -ͤ/x>Ŀ* ,^#V#F(ͤ/> Ϳ*,#~U,o&">2+F(ͤ/> Ϳ*"3-xGO>$ͳ&H"-s#r# (-H +V+^F(s#r#!bͰv!bͰv!"T!"V!"X!"Z!"\!"^!"`!"b!"d!"f 35 1000,5%* " e0=e1h1q141̀22N2q142~Ҕ1¾1^#V>ʾ1>þ19ڠ1>þ1#~ʛ1ʛ1####^#VҾ1>###w~2 H"KP " H"ã "* g ̕/z̝/͚Hĕ/DM!/55/xʌ/~U,! ܕ/=w/DM͒'+r+s:/OÕ!*s#r#"#~+*++" H | |"sx " H Easy Street"ö " =-U,w*-w+ͤ/yOn-n-n-**}_|WҚ-\H7I Bytes Free ͞.-::g .>a~ V $"hm " H"ë " Hʐ99GB2N#^#V#~#fo (B2(1F6Fx B2~B2O!~#fo(A2"J2"L2~#F!E2w#p+6! s#r`iF H *" "===============================================================================" !9"/!/"h 0W1*"!"(""h !("*2,?'"/!(~#fo_0"9##~#fo9990 111'0~YA0=f0 8: H H" " =========H==========H========= =======================">a:-###^#V*{z-">?W*/>?W*:b *c ;2b "c **5H +V+^"&D.J.F(N.' H" " =========H==================================================" " 45 750,8di " $"ø " H $$$$$ H"" "==========H=== H"  "============== | H"\!a! " n ^ H"ô!! "*  " | H"(- " H | & |"qv " s ======================H============================== ==========="Û " t & H"  " H |V =H==============H"uz " H H H" " H"[` " Long Island | g * | * H"ó "============================== ^^^ H *" "" "===================================================================== . . H"À "====H===================== ====== ================ ====================== " & H" " H"  " | H H V| H"di "====H======================= ========================= ====================== "rw " H"À " H" H & H H"%* " ============== ==== = ====== ================================================="ü 35 900,5 " V V ==========""" 36!"&" 800,5o"t" " V V"x"}" """" " Î " H"ó " H |"  " H | . . H"l q " T ==================H=================H===================H======="ü " o  " H & | . . H",1 "========================== ====== == = ==== =====H===== H"} " G ^^^ ^^^^^ ^^^^ ^^^^ ^^^ ^^^ $" V $"mr " $$$" " g H H H | H"## "=====H=====--======H========================== ===--- H"_d "========================= ======== ============== ==================H== "ó " H H" !! " w ================= ===================H== "À " H" " h |"" " o | H -====H==========="[#`# " H H |&& H"ã## " H H H")) " H H . H"!*&* "===H==============-----------========= * * *H *H" (( "=======================================================================1.6. " HHH HHH"p.u. " H >mmmmmmmmþ.. " H=====H =============="%% " H & H"#&(& " H H H"×,, " H & H ================== H"## " H H tunnel H H"?$D$ " H ===H==== H"o*t* " H H H"** " H ========"(( 35($( 750,72(7( " $"y(~( " H V"Ì(( "========== ==================== H"// " H |===== \ / V | H"k&p& "====---==== H | H"ó&& "| | & H",, " ==========-------------------------=======----------===================",, ""K-P- "^^^* =======---===----=================H= H H"Ó$$ " H | vision H =====H=============="+ + " H H H"(( " HHHHHHHHHHHHH .HHHHHHHHHHHHHH H g"7)<) " & =====H=========="d/i/ " H \/ H"ò// " H ================---===---=================== H" '' "| === | H ^^^^^^^^^^^^^^^^^^^^^^^^^* *^^^^^^^^^^*Point of No Return*^^^^"ã-- "============================================== H H"$$ " H =========---& -----============H H H";%@% " H H H"I+N+ " H &..^^^.....^..^ . ^^ H==--------- H"Û++ " H ============================H & V H ==H=========="Å)) " H | $ H"00 " H H | H H" H g"a'f' "| $ | H ===H======="ò'' "|* $$$ *| * ================================="ì-- 37ø-- 700,6.. " Bug City HHHHHHHH V" H | H H"Ó%% " H H=========----===----================ H H"++ " H === === === H ---------=================H======"E,J, " H N0S0 " H ====H======= g |&H H H"Ü00 " H H ===============================H===========H===== & H" 77 " H H H | & H | [] |_| | & . H"55 "===========H | |_| | H === o!!I|/g}/o|P;!ɇ!b̈́Ϳq!cgpͿq!cgpͿq!zbgpͿq!Sbgp͐j!ɇͿq!cgpͿq!-bgp!#b)i#!"vʹs"&# H"22 " H========== ===== = ============"33 " }i{ | $ ^ &"q9v9 " |^^^^^^^^^^^^^^ $ ^ ======"99 "* ========H ======"00 " H H &| H H"D1I1 " H && H"]7b7 " H H H | &&&&& H"ð77 " H ===================H"k5p5 " V H ============= H====== H"þ55 " H *&Tv(Ͱv!#!"vʹs"&#*&Tv+Ͱv!#!"vʹs"&#*&Tv.Ͱv!#!"vʹs"&# H"g3l3 "* H *"ÿ33 "================== . & ^ H*^ ^ ^ ^^^^^^^^^^^^"!:&: "================================================ H &| H H }{ =====H===="Ö11 "===H===& H =====================H H H H | =============H"78 " =====------================= H | $ $" H & H"66 " H H | *&Tv1Ͱv!#!"vʹs"&#*&Tv4Ͱv!#!"vʹs"&#*&Tv7Ͱv!#!"v:Ͱv#!============================================================="33 3233 0,6"4'4 " =Gang Land= ==============================="*:9c -1:o&"!bͰv*"!e:*!n&͊wCrͰv*!#"!*!*z|y:}|H:h H"11 " H H H H":2?2 " H O8T8 " | H | $$$ $$$"à88 "====------=== | | H"d6i6 " H H ^^^&&^^^ & ^ ^^^ H H | =============H"÷66 " H======H ======Tv=Ͱv#!Tvr"@#!Tvr"B#!Tvʹs"D!#!"vFͰvF!7vF!"vCrFͰv!À=* V ."r4w4 " == _ == ."44 " g!b͉b! ͱ!ͬo#! o!!I|/g}/o|n;!ɇ!b̈́Ϳq!cgpͿq!cgpͿq!bgp!b͉b! ͱ!ͬo#! H & H"Ì22 " ======H=== ======= H <> & H | $$$$$ $$$$$"88 " | = | ============= ============"0959 " !#!"vʹs"&*&|C=*!)s#r*!cx bv|=#bkTvr*!)s#r*!cx#*&Tvv*!#pͿq!\gpͿq!Q\gpͿq!cgpͿq!\gpͿq!cgpͿq![gpͿq!cgpͿq![gpͿq!cgpͿq![Cp! fͰv! ͊w!f͍uC>*8_Cp!("Y! "[[!Y@dͿq!#_Cp0*͊wCp!nu&c!Z͝s;u"cw"]*"_ͧX!"[!"Y[!Y@dͿq!_Cp!aRc*a|V*!)^#V|5H*!#"!*!*z|.H}|HzH*)^#V*!)"hs#r^#V*~s#r*#"*!)s#r*"pͿq!cgpͿq!cgpͿq!p`gpͿq!Q`gpͿq!8`gpͿq!cgpͿq!cgpͿq!(`gpͿq!`gpͿq!_gpͿq!_gpͿq!_gp!("Y! "[[!Y*s#r*!s#r*#"**z|/F}|ҌE*!#"!*!*z|KF}|9E*w#"w!nF*!) s#r*!#"!*!|~F)\"!*!|ڐ=)! ͒uHF!+s"RI*|H*"RI*cxQ*)@dͿq!_Cp!Cp!("Y! "[[!Y@dͿq!_Cp!(Cp!("Y! "[[!Y@dͿq!_CpF!"vCp!_CpF!TvCpͿq!_CpFF*"!ïF*!cx s#rs#r*!#"!*!*z|F}|ҍF*"*"*"*"*""!"!"*"!G+s"!*!|>?go"N*!|)>!"PC> *!!Tvtw"P!b+s"!*!|Z>?go*N|g}o"N*!||>* "RÖ>*AD*w*qzzD{zڪD*q#"q*u##"uAD*u*y}o|g"y*y"{!}t!t*svEDDEE*}cxwucw"}E*}͞w"}BͿq!^Cp͐jf!^nuf!^nu|g}o| Df!^nuf!^nu|g}o|:f!^nuf!^nu|g}o| Cf!^nuf!^nu|^#V|go"|I)?go*|g}o|RI*"!"*|II)RI!"*)^#V|mL*)h^#V"~^#V!TvCp!_CpF!TvCp! "[[!Y@dͿq!f_Cp!("Y!"[[!Y@dͿq!X_Cp!=A*[#"[[!Y@dͿq0*!͊wCp!S_*!)s#r*!#"!*!*z|&G}|G!""*"*{"y!"!@dͿq![Cp!i}cͿq![Cp!k}cͿq![Cp!}cͿq!8!!Tvtw"R!a+s"!*!|ڭ>?go*N|g}o"N*!|>!"T> *!!Tvtv.cw"TͿq!7Cp!EwVE*}wucw"}E!"}!"Ϳq!7Cp*"!7F!#-tͿq!#gp!jE*!cxQ*) s#r*#"*|zE)NE!#g}o|CAͿq!7CpͿq!cgpͿq!\^gpͿq!^gpͿq!^gpͿq!cgpͿq!]gpͿq!]gpͿq!@]gpͿq!)]gpͿq!cgpͿq!\gpͿq!\g"*"*"*cxQ*) ^#V|I*)s#r*+"!@dͿq!w[CpmL*cxQ*) ^#V|LJ!nCp*!)^#V)9A*!)}cͿq!L_Cp*!cxCp*!#"!*!|MA)@*|څAʅA*[##"[[!Y@dͿq!=_Cp!}cͿq!_Cp!<"!@dͿq![Cp!y}cͿq!8_CpͧXc!{[Ͱv͹X**zzG{zzH!nw*wu!Z͝s;u*cw"*"!HͰvͿq!VCpͿq!agpͿq!VCpͿq!agpͿq!VCpͿq!^agpͿq!VCpͿq!&agpͿq!VCpͿq!`gpͿq!VCpͿq!`gpͿq!VCpͿq!`gͪs"!F#*!Tv+s+"*|·E*"*!"*|E!"*!cxQ*) *s#r*|F*#"*)uc!Z͝sw"*#vJ;JJ*)^#V)^^#Vs#rÍJ*)s#rÍJ*cxQ*)^#V|go"|xJ)?go*go"|go*|g}o|¦PõP!"*"þP*""!@dͿq*cxQ*) ^#V#!TvCp!@dͿq*##r!@dͿq!cCp*)T^#V*"*cxQ*) ^#V|go"|go*|g}o|¾P*"þP*"*|UͿq!ZgpPU*|U)+UͿq!tZgpPU*|8U)GUͿq!ZZgpPUͿq!3ZgpͿq!cgpͿq!ZCpͧX!c`n!f̓nf!"vfͰL}|ҌHUX sw"!*+"*|ڨLL*y+"y?X*y|R*y|L)LͿq!ICp*"*"*"*|N*"*"*cxQq*!!TvCp~X*!#"!*!*z|,S}|R!@dͿq!ICp*cxQ*) ^#V#!TvCp*"!S*!)^#V|g}o|;J*)^#VvJJKK*#"*cxQ*) ^#V|go"|J)?go*|g}o|–K!n͞v!Z͝s;u!TvCp*"*"*cxQ*) ^#V"*|eQ**y"W*cxQ*) s#rQ*|QR*|R*O)O!"*)T^#V*"*#"FW*cxQ*) ^#V|dO*#"**z|]O}|dOFW*|oOW*vOOOOOv!fͪs|•U*"@V*|V*"!U*)^#V"*s#r*cx"*v*+"**zzU{z*) ^#V|^M*cxQ*)^#V|go"|@M)?go*|g}o|^M!"M*#vPpMMCNCN*+"*cxQ|S*!)~"h*@dͿq*!)~^#VcxQ"h^#V*) ^#V#!TvCp*!#"!*!*z|S}|rS*i+"icw*)s#rÊK*)^#V)T^#V*"*cxQ*) ^#V|go"|\K)?go*|g}o|–K*)^#V)|Q!nuc!Z͝sw"*#vQQQ*)^^#V"Q*"!"*"!6R*!)^#V|2R*!)h^#V*}oO*+"ÓO*#"*cxQ*) ^#V#v?P?PO?PO?PO?P*""!"*|O)O!"þP*"*"RP*"*"ҭU*)*s#r*cxfv@V*#"*|=V)T*|/g}/o|>Ϳq!cgpͿq!cgpͿq!cgpͿq!cgpͿq!cgpͿq!*) ^#V|ڙM)?go"|go*|g}o|¾P*"**}o|ʾP*"^M*#"*cxQ*) ^#V|g*i| TF*"!-V*)^#V*z|0T}|)V*N|/g}/o|QTc!H[Ͱv͹X@V*"Ϳq!7gpͿq!cgpͿq!cgpͿq!cgpͿq!^^#Vs#r*"*"!@dͿq*cxQ*) ^#V#!TvCp!@dͿq!s[Cp*)h*s#r~*s#r**}|go"~^#V*}o|go*|g}o|R*!#"!*!*z|JR}|QúGͿq!ICp*y|RR*y"!ûR*y+"y*#"*|go*|go|g}o|RP*)^^#V"*"þP*+"*|RP¾P*|/g}/o|µP*cxQ*)^#V|Zgp!b͉b! ͱ!ͬo#! o!W*!cxͪs͊w*!)^#VsCr"*CrfͰv#!f͖r*!*o"|go*|g}o"|+N)?go*|g}o|¾PýM*#"*cxQ*) ^#V|”N*cxQ*) scgpͿq!cgpͿq! [gpͿq!cgp*w|ڬT)ڻTͿq!ZgpPU*;|T)TͿq!ZgpPU*|T)TͿq!ZgpPU* |U)o|go**}o|go|g}o|R*|/g}/o|mL*+"ͫW*cxQ*) ^#V|mL*+"*)mLͫW*#"**z|W?X!"!@d*!}o|g|«R~X÷Rc!j[ͰvX*!#"!*!*z|R}|rR*k#"kJDͿq!ICp!ͪs"!S!@dͿ!#"!*!|W)ګV!ɇ!b͉b! ͱ!ͬo#! o!ɇ>*"!ÒW*)h^#V*}o|ŽW*)~^#V*}o|ŽW]typing SPACE. But beware of the falling rocks called Der rocks.>]You control Lad by typing the direction buttons and jumpingt ready! [Bonus time [ Score [ Level[Lads$[Type RETURN to return to main menu: [Good luck Lad.![Type an ESCapOREbPRO MEN bPRO LEVELbbY#b&bLADCONF#0bLinking to configuration program...$VbLadder configuration program missing}bUna!@dc!YͰvͿq!cCp! fͰv!͊w!f͒u>! ͊w!f͍uY!@dͿq!cͪsEwCp͐jYType RETURN to continue Ladder `L = Change level of difficulty +`P = Play game;`Los Angeles, Ca 90024T`10970 Ashton Ave. Suite 312s`(c) 1982, 198*##"*"*#"**z|W}|RW**}o|ʼW**}o|W*##"*"!$"!@d!}cͿq!ICp**o by^treasures and riches.>^dark corridors never before seen by human eyes and find hidden@_^You are a Lad trapped in a maze. e to pause the game.:\Remember, there is more than one way to skin a cat. (Chum)/T\that are left when you have finished the levble to link to LADCONF.COM bLADCONF.COMbLadder not configured bLADDER.DATbRb bpbdqPbdbPpo-_bgpbqp b -=$|VH*^.& bg-=: ZZUpdating high scores..."ZEnter your name: $6ZYou really don't deserve this but...]ZNot bad for a young LadwZAmazing! 3 Yahoo Software/`LLLLLLLL aaa aa ddd dd ddd dd eeee rr/`LL aa aa dd dd dd dd ee rr/`LL zz X{zX*m#"m*mcxd"o*i#"i!"!@d!i}c!G"!@d!y}c*}"!eX*#"**z|yX}|aX* Your mission is to explore the^l^L^i^I^c^C^p^P ^Exiting...^e^E^You eat quiche!^Come on, we don't have el.=\statues (shown as &). You will receive the bonus time points.\Extra points are awarded for touching the gold2\A new Lad$|VH*^.& c c1.30c@PCzףp= #z͐j(c)1982 Yahoo Softwareafc{fc w#w |xc=w#w^#V You rate!!ZLooks like we have a Lad-Der hereZYeah! Now you are a Lad-Wiz!ZWow! You are now a Lad-Guru!ZYou are a true La aa aa dd dd dd dd eeeeee rr5)aLL aa aa dd dd dd dd ee ee rr rr4aaLL aaaa ddddd dd"!ÎX*#"**z|X}|ҊX!Rc*|¶XçX!"X!"4Y*"!X!aRc*a|Y~X*#"**z|Y}|all day! _Enter one of the above: &_Difficulty level: ;_00 @_Last Score: O_00 V_) [_High Scoresi_Jump = Space Stop = O will be awarded for every 10,000 points.,]bonus time runs out.0_:cc{0c c>2cc*c]>0_ ~2HedG#^#V!Iew#d-Master!!!:[ YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO! YAHOO!K[YOU CHEATED!!! You don't rate.m[Hooka!v[oz[* ~[Geddd eeee rrrrrrr:aLL dd dd tm"aLL dd dd aPRO SCX*_|Y!"Y*"!@dͿq!cͪsEwCp*L|/g}/o|CY*_|TY!"ZY*"!"!@dͿq!cCp!ZͰv!"ther _ Right = _ Left = _ Down = _Up = _Terminal: _Version : _E = Exit Ladder_I = Instructions_C = Configurec~2HfG#^#V!Ifw#d~2HgG#^#V!Igw#*d~2Hh2Ih 2Jh~G:Ih2LhG:Jh2Kh:He`d!IeGd:Hhʍdʄd{d:KhdÓd:Lh{| STOYmÐjm*i.. . ........Ͷz*i|—j:ik*i|kl*  s#r*  {w#6"i*i*i>2i<ÒhÒh=#DM*"x* |##"xj>2h2h*^#V"h##^#V"h 2h!h!!""h!j" j6#6P>2j>2j>2j͉C!f`B! ZB!f=C>*#"ÅA*"_*R"i!"k*T"!"m!d"o*P"q*"s!"u!"w!y*y|cK;W;!-b];!#b#!"&#*&(_:! ;#!u;x;"&#*&͇;+͍;!͖;#!͟;͢;"&#*&m~#~m+^#V###l###l|(m~#fo!0m| Internal Error - No Line Number &i*~#m| at linelwmm>ͫm!k!\> L\AL.iʇD!"q*s##"s*s|wD)ڀD!"sAD*wm}eb! ~#fo"o! "om|­j*o}o|gw"o*o"o,{#s#r++ͱ;.ͷ;!;#!;;"&#*&;1;!;#!;;"&#*&<4 <!<#!< <"&#*&/ڐmͤmzmͫm<ڐm0wͤmҌm}_|W!mG~#fo>| at address|r}rm> w> w!9"i*i>0Oxey0e;e!|%e ex/ey5e>0;e>0;e_*:9c -1:o&"!b͎*"!e:*!n&on CalOverfloOut of Memor Subscript Out of Rang Division By ZerOut of String SpacString Formula Too CompleRESUME witiot|i!#&\ѷ!>/ *OUT OF MEMORY* $?go*N|g}o"N*!|>!"T> *!smppQqm{pQqm͆pQqmFpQqmppnqm{pnqm͆pnqmp|qmpp!qm{p!qm͆p!qmp!qZÑpV<75<!><#!G<:_<#!Y<=w<#!̓<"@#!͕<͘<"B#!͎ͧ>.c͑>"T!9"i** ,j!6#},j|,j6!i6#z?j*|`j> j6#s#r#=Uj>2i>2i>2i2i"i!&i"iͫhƔÑp"ZÚpH~# ’px2T|:jHqqpJ͌z<͈q~p#÷pJ~p #p>2T|:jHqF#~#foxq̈qqq~#F!F!Input Past En?Bad Record Numbe@Bad File NamCToo Many FileUnprintable Erro!9N#F*~#~m~+pqìzq>"G: jxqʋ* j+~ qwmíjm|­j!9>͛z^#V#mͿwmRmʹw^#Væw^#Z)2mxmxÔu>Ôu>Ôu>Ôu>{xʣu~#fo## ^#V#mQíu^#óu ^#V#mRu^#u^+6+6xxr~w#=|!|~w#!|PP*"*"*PQ*) ^#V"*ͪ||*Z}/o|/g#"Z|ͭ|2||!\~4 is2*sͬzͬz**s&ڝʛ~ͬzo&~ʭj#^#V++ͬzo&I*>"s!ss>s>mÛzmͳt͉|Z>$tmzxzDMy~#zyYP+++"x6@###{_zW+r+sɷhz*x|Fzmçjx^#V+"xw#s#r+++r+s##!oztz*|{z* >,W* j#^ ̫qʥq+=ڥq͋z{ڽq{_ïq!j" j!"i2jq! j~6#w~!q rNqmi&øj !nQʛô!mܖ1y^#V#m;xm;xmzUx|Ux|Ry^#V#x^#V#sx͞#V#mu^#vm|­jBK\vPYm|­jBK Mv o_0vmz­jzdv jv_pvo _ W}͛zwɯ2]ͪ|͂ͭ|*Zͭ|2ͪ|b>>R~~i#ò|iK|!`|>!`V2|# |!`ܖ!`ͷ}t>>|>|}tu~t͠|V>$tmͳt}Z>Lmͼt~,"At#"~XtXt# Dtmíj"^t#ty͛zͳv*^#V#{t!i"|?Ҋz}|~# zyG3zxLuz,{v{*|* |Zzͯ{z,{v{###üz{| during G.C. &i{| &G~#r# r++%r0:0rw|­j}ڭj!jwmڭj3zdrdrͬzͬz~#~#foLږr#N#GNʧxyʧx#~#fo~#fo°x#ʦx –x yʰxy<.ںx)ʺx)ͬzͬz|xxxxgxoxx*x"x*xxxoxxPxͬzDM :]ʗv2]#êj:]ʪv2]#êjmuzv~##++,{>L+V+^+v+r+sv{mͳv~#^#VÛz!v>2+!m~}͹+6!\>%2U!i~ƚ!e~!`~_#~W#~OT!.QR}ɇ<o&ͭ|2*Z*\͂}"Z`i"\!i"i>2intN#F#*i~=ʮt}|ҮttÙtͼt|~t:int*i;~=mðj;~,t#"iɧt*i"i+V+^"imöjm~<ʭi| Internal Error - String Space Corrup#N#F*xyxq{*xyxq{++`i+V+^Zz##6+6+~6  >@++*x"xsfiͽr~#N#fiLìzFOҤrG#~#fo#~#foxLyͽrìz6 #ýr~ڭj#~#fo~#foͬzZ>rV>=s#~#foLͬz_!x4y5*x"x~#N#F#Oy)y Gyyx4y y+++6@#yw#xw+++6###!x~6`yuyyͿy*x#~#~ymäj!*x"v|:w+})N#6w~#fo :v)w!9"i!i4 ~G#íjm hw~ʭj#~#fon&ͬzmz„w}3z~ځws#wZ^#V#N#F#!i~Rx{!^6Ɯwg>N û}:T|Gw#»}}}!`}ZͪVͪ}*Z||<ͪ*Z ~}!*j3z~#~#foL6+͐u~͠|ͬzìz>Hu>Hu>Hu>Hu>Hu>^#V#!Zã>pu>pu>pu>pu>pu>{x!+>Ôu>#r+Ϳy*x#~_#~Wҟ{mójr+s##6"x###!x~#fo{Z³{<*x"x*x}o|g6@#s#r#6"x* |*|"x}w>#w##Z{+íj2]Ϳy*x#V#NX!"]4sx­jű?s y<2*sF~ډsډs#~#foyGO #~#foxʍs}s#lsÍs!*sx~#^#V#ڼyyGÂy|§yÂy++~_w#~Ww#Âyuy*xDM~#^#V#zyy+zz+{z##{z~#q#p_yy}|͐| ~D}:\2\:]҇͑}:].~3~9~|/g}/oM~!:]V~͑}"Z>2T|J}ajL~ L}̈́|ͪ|r#=c!Vq}ßD}>͑}t}?/}/{_#zW#yO++ҳ2}#t}p#ڥ>>/N#F#*Z/}o|g"J+6%J}ͮ}}_xC/_yv̂x΂{_xꂒy3OGOC ~!) ͌V~#!*i~ʢ( ~K+~#5O ~+~W]-7>*iT]% N#F+q#p###6 u͔:ۄ!1|F :W|_ ʠx* { Aq͐ED0ʠ,ʠ.À+60{̀+6${+p2W|!1|6 d}*V*X2/|͇E~(:m}eb!' ~ʄ ʄ#~y`i`Z>O >2-|`hM~~&Ņ-ʤ~+ʤ~+͐ڋ.1eʶ~E~͐l~L~q~Q~:T|~>~~%>#O!Pd~DY͐Zp#=/w1_cƤ~@zZrN vH Tʚ;@B*U|=P͗|ѯͮ}7}yvOzWOx>w+w!(+7?*i' 6#67~}#^#fk_݉N#~:++@}y@}} #2~.0 #~>DG"V`i"X#~+o-F0OxGo#~-`xEdy >2/|t|\"V`i"X#~goPY!' ůw͔:hZʀ=z=¸ѯk<ʀ!% ^#Vr+sm}!"@} PY!`i>\!' ~ͻ͐_{_hx[|ͪ!Y}V~ͪ Yä~͐!Y}!}Y͐̉|Ġ|ͪ}&}=ͪ䠆''d #~: ʐ ʐ ʐ0?<=:T|ҷ7-++͐MOօHօ+M~H#mêjM!}ͪ⡃:]ҡ!`ͷ},} ÆӃͪ궃COJ}ü|σiäxӃͪt#J}"|ǃ=60#/ 7#2)ͬzz }}> > 7m L:! ƒt}#W}:/|ìҰ60̉}C+~0ʿ.ĉ}ͪ>"w#6+6-/</ :#p#w#6!1|#zrď͔ʹm}e!&+! ~+ngm}e! n&*i~_tDM'~̌4N#V pʀzw }}}{0?)))صoM!)'}M0? ?? ))))صo)a{ }ͪ:]:\>}:-|2.|2-|60#={ //>|l>|p~b#N#F++ͬz OˊIˊRb*@|ˊ!"@}_ފʹ{qz "i#> Lzۄ{}=̓'p#6!0|#:U|~ ,*,+@͐-+$0j#͐j++w`-j6%ʎ2| w+s#r#6#6DM:hʫ!" s#r#6! {zVw<<ʀ!! {w:O`!! 0_G!\ͪ':f(yG:^C:\G:^/GÇӀU6+}g6-[|#60:W|W:T|܀mêjmêj66͔~*<ʀ? Ͱۑʒ :_ṋwmw>^Ͱ@Ͱͭ~ ԑ> ͰͰ#ői|* j #~+<=܋ bŏ! w!( V6 ʝzwΏwŏ! ~!! ^#V! s#rDMͽͷP}eb`i"i!"i-!GSQx Ì!\-j0 TeB׳]h!I.k ͋ڝbh͋Y!`q!]q#~+++*Gs#r! DMä*@ DMͅ{s#r# 6# x§ !iT]~#foex¿y¿~#~+*i"is#r*@|-ʤ~+ʤ~+uڋ.1eʶ~E~ͥ~l~L~q~Q~:T|~>~~%>#O!Pd~DYͻ~6#h͗gʣ m<tm!6# Rҋm2)!N!&Nte 4+~#<:=^ ii :jG7i*:iS<2i*i"!"i ii*i654> ~=i* j!j"ͥm!>øjm|­j,'-:ie*i!i"i{3zf$%K!D*i6|}!"i>6>4>?>=>:>7>5>2>3>@w+qƒ DNn"~`35zr1{r1h!I͗ yO2f͗ :]n/!)x)#y))҇Oʨ!!\y# +“ ?͋ڝb͋Yn!`͗-:] :g/.Ͱ :j W:j:> ͰͰܭ~*6?# RO!!4r#4r#4y"‡ʀ j" j> > > i> i*î Gǒ’~#foĒ##ђ>ޒ~+~?~+#+ >C>mo&øj!"i!n"oͤ:_nµ|?õpۑ:>\2ϐʴͰ+~Ͱ+ͰͰͭ!n2ۑOʻG2_!f%:_2Ux!`Vs\+4Q:U?!^~++w !V4#D4n+6!`V# \ɯ# iiҌ/!U ҆#=n}_}la)ڃҞ#xƒ"! "!) "!}o|gP͎bk:P0DM**g"PY/}o|gY:\<=+!Vʗ!ȗx!]5nq!\N#F͹+6c!\>%?2U:V͌ x/<">>2i!ݏ"i:i<2i*i"B!Ռ"im"@͒*i|ӌ##nчŒ.̇*Bmm2D"Em&))) ^#V#!Z)^#V#!V&)w#w#w#w##~ : :Ʌo$ɧGw#P{z}!*}|͐| ~D}:{}2~::>\Ͱ2yz̳7 ʡ z 4ʵz̳ʵRʵͰ> Ͱ>ܐ\>#u6ͭ!nő x<>ʅOyw#„G:\µ!UVwz# šx!Uȗx+!]w+~w# ʗ͋ڝb͋Y!`ܖ͋ڝb͋*#"°0DM**g"PY2O*! ~#foPs#rV:Oc!c!& Ç~# xhDMЏw VÚ!V×!`îL!L!gè!]>F+N+=«!`ÿ!V>q#p#=•!V"Ͷͥ͑*͗:]!fN#Fͪqm2D"Ee2T|J}ajL~ L}̈́|ͪ|>2-|`hM~~&Yn!`̖y2f!\~q+q<NsY+1' W~w+F?!\C2bڝ!Vw#h y}ͮ͂ô!^~/woG}_}W}OΜ||DM!>))Ҵ =¬!\~7w?##wy7O*Z*\"\"ZajSX*JS\E!]/OWDɚu ȯGͪ"Cy2EFo͕͌!D*Z:\O]4官͹!YF#^#V#Náʹ}`~#œG++NyVÚ!Zڝ>ɘq!^6Ɯg>N|ԇ>ØakڝL!=~x8G@G͈(ux|W>GPejSXWWch|l{_zW}o|gX"8"6x!6~w#ʐ.g.*C:EOz.g.*Z:\x<=E{_zWxG)yOHGáDU ͪy+F+F+Fw`h|ʢgy҆L Z bΜ*͛|6!LGΜƙXi>O!]~+>w QYu :]ҠhژΜʛƁ|uˆqJ!]qx!]F#~怩O 4Ôgo"Z"\s#r#q#p"Z`i"\*Z*\DM^#V#N:ZO|g}oxG-|z}uElaOt!]~Gx›ƀw͹w+ɷx{!^6Ɯwgz >N|Գ{>2]ʠ͕͹!&J\QY Ð|Yt&wz^Pc|u~r1Йq>2]!&Μog2W }}{(q#F#xy:]:\7|/G}/O!>5 47>{_zW}o|g=+|g}o]CZQP o-yOzW{_xG`Z*\DM^#V#N/