; ROUTINE (LOGIN) WHICH ENTERS AT LOGER2. 0354 F5 LOGERR: PUSH PSW ;SAVE ERROR CODE 0355 00 GRAB5: DB TRAP ;CONDITIONAL RST 7 0356 C5 PUSH B ;SAVE DRIVE NUMBER IN B 0357 11BB07 LXI D,DRVMSG ;DRIVE MESSAGE 035A 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 035C CD0500 CALL BDOS 035F C1 POP B ;GET DRIVE NUMBER 0360 78 MOV A,B ;MOVE IT 0361 CDA406 CALL BCDOUT ;SEND IT 0364 F1 POP PSW ;RECOVER ERROR CODE 0365 CD6F06 LOGER2: CALL ERRFND ;LOADS DE TO ERR MSG 0368 13 INX D ;SKIP CRS & LF 0369 13 INX D 036A 13 INX D 036B 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 036D CD0500 CALL BDOS 0370 C9 RET ;==================================================================== ;BEGIN READ AND WRITE TEST ; 1) WRDRV AND RDDRV RETURN CARRY CLEAR FOR NO ERROR 0371 116907 RDWRTS: LXI D,READNG ;ADDRESS OF READ/WRITE MESSAGE 0374 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 0376 CD0500 CALL BDOS 0379 CD8906 CALL DRTYPE ;TRACK AND DRIVE NUMBER 037C 97 SUB A ;ZERO A 037D 324107 STA PASS ;CLEAR PASS COUNTER 0380 CD3906 CALL CLRTBL ;CLEARS COMMAND TABLE 0383 CDA803 CALL TRKSZR ;PUTS SIZE OF TRACK AT TBYTES 0386 00 NOP 0387 21ED06 TSTDAT: LXI H,WRTRAK ;WRITE TRACK COMMAND ADDRESS 038A 225100 SHLD VECTOR ;TO GUIDE CONTROLLER 038D CDC803 CALL WRDRV ;WRITES ALL TRACKS 0390 D8 RC ;IF ERROR = TRUE THEN RETURN 0391 21F906 LXI H,RDTRAK ;READ TRACK COMMAND ADDRESS 0394 225100 SHLD VECTOR ;GUIDE CONTROLLER 0397 CD7E04 CALL RDDRV ;READS AND COMPARES ALL 039A D8 RC ;IF ERROR = TRUE THEN RETURN 039B 3A4107 LDA PASS ;GET PASS COUNTER 039E 3C INR A ;INCREMENT IT 039F 324107 STA PASS ;PUT IT BACK 03A2 FE04 04D5 CD4506 MOD255: CALL ERROR ;REPORT AND CONTINUE 04D8 C5 OKAY: PUSH B ;SAVE BC 04D9 CD6205 CALL CKTBL ;CHECK SECTOR RESULTS TABLE 04DC C1 POP B ;RESTORE BC 04DD CDDB05 CALL NEWPAT ;GET TEST PATTERN 04E0 CD1005 CALL VERIFY ;READ AND COMPARE DATA 04E3 2A4207 NXTRK: LHLD LOGPNT ;GET LOG POINTER 04E6 23 INX H ;ADVANCE TO SIDE BYTE 04E7 7E MOV A,M ;LOAD IT 04E8 E680 ANI 80H ;CHECK SIDES BIT 04EA CA0705 JZ IGNOR ;IF SINGLE-SIDED, FORGET IT 04ED 3AFB06 LDA RDTKSD ;LOAD COMMAND SIDE BYTE 04F0 E680 ANI 80H ;CHECK SIDE BIT 04F2 C20005 JNZ RESET2 ;ALREADY DONE 04F5 3E80 MVI A,80H ;SET IT 04F7 32FB06 STA RDTKSD ;STORE IN COMMAND 04FA 324007 STA SIDE ;SAVE RECORD 04FD C3A904 JMP RD ;DO OTHER SIDE 0500 97 RESET2: SUB A ;RESET SIDE BIT FOR NEXT TRACK 0501 32FB06 STA RDTKSD ;STORE IN COMMAND 0504 324007 STA SIDE ;SAVE RECORD 0507 E1 IGNOR: POP H ;RESTORE POINTER 0508 C1 POP B ;RECOVER COUNTER 0509 05 DCR B ;COUNT DOWN TRACKS 050A C29E04 JNZ TRKLP2 ;DO NEXT TRACK 050D 37 STC 050E 3F CMC ;ERROR = NO (CRY=CLEARED) 050F C9 RET ;FINISH ;-------------------------------------------------------------------- ;VERIFY THAT DATA WAS CORRECTLY READ ; 1) THIS ROUTINE IS ONLY USED BY THE READ A TRACK ROUTINE ; (RDDRV). 0510 110000 VERIFY: LXI D,0 ;ZERO DE 0513 D5 PUSH D ;SAVE DE 0514 2A3D07 LHLD TBYTES ;LOAD TRACK SIZE 0517 EB XCHG ;MOVE TO DE 0518 21890B LXI H,DSKBUF ;SET M TO DISK BUFFER 051B 7E VERLP: MOV A,M ;PICK UP MEMORY 051C B8 CMP B ;WHAT IT SHOULD BE 051D CA2305 JZ CNTINU ;IF CORRECT 0520 E3 XTHL ;SAVE HL & GET ERROR COUNT 0521 23 INX H ;INCREMENT ERROR COUNT 0522 E3 XTHL ;RESTORE & SAVE 0523 23 CNTINU: INX H ;INCREMENT M 0524 1B DCX D ;DECREMENT SIZE COUNTER 0525 7B MOV A,E ;CHECK FOR ZERO 0526 B2 ORA D 0527 C21B05 JNZ VERLP ;CONTINUE IF NOT 052A E1 POP H ;GET ERROR COUNT 052B 7D MOV A,L ;PUT L IN A 052C B4 ORA H ;ZERO? 052D C8 RZ 052E E5 PUSH H ;OR REPORT 052F 119B07 LXI D,CRLF ;CARRIAGE RETURN & LINE FEED 0532 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 0534 CD0500 CALL BDOS 0537 E1 POP H ;GET ERROR COUNT 0538 E5 PUSH H 0539 7C MOV A,H 053A CDA406 CALL BCDOUT ;PRINT THE HI-BYTE ERROR COUNT 053D E1 POP H 053E 7D MOV A,L 053F CDA406 CALL BCDOUT ;PRINT THE LO-BYTE ERROR COUNT 0542 119F07 LXI D,CMPERR ;COMPARE ERROR MSG 0545 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 0547 CD0500 CALL BDOS 054A 3AFA06 LDA RDTKTK ;GET TRACK NUMBER 054D CDA406 CALL BCDOUT ;SEND IT 0550 11FF09 LXI D,SDMS ;SIDE MSG 0553 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 0555 CD0500 CALL BDOS 0558 3AFB06 LDA RDTKSD ;LOAD SIDE BIT 055B E680 ANI SD2BIT ;GET SIDE BIT 055D 07 RLC ;PUT IT IN LOWEST BIT 055E CDA406 CALL BCDOUT ;SEND IT 0561 C9 RET ;-------------------------------------------------------------------- ;CHECK SECTOR TABLE ; 1) THIS ROUINE IS USED BY BOTH THE READ AND THE WRITE A TRACK ; ROUTINES(WRTDRV,RDDRV). 0562 CD7905 CKTBL: CALL GETSCS ;RETURNS # OF SECTORS IN C 0565 41 MOV B,C ;SAVE # IN B 0566 210D07 LXI H,TRKTBL ;TRACK R/W RESULT TABLE 0569 7E CKLP: MOV A,M ;LOAD M 056A FE40 CPI GOOD ;NORMAL COMPLETION 056C C4A105 CNZ SECERR ;REPORT ERROR 056F 23 INX H ;ADVANCE 0570 0D DCR C ;DECREMENT COUNTER 0571 C26905 JNZ CKLP ;REPEAT TILL DONE 0574 97 SUB A ;ZERO A FOR CLRTBL 0575 CD3906 CALL CLRTBL ;CLEAR TABLE AND RETURN 0578 C9 RET ;-------------------------------------------------------------------- ;RETURN NUMBER OF SECTORS ON DISK IN REGISTER C ; 1) THIS ROUTINE IS ONLY REFERENCED BY THE CHECK THE SECTOR ; TABLE ROUTINE (CKTBL). 0579 2A4207 GETSCS: LHLD LOGPNT ;GET DRIVE LOG POINTER 057C 7E MOV A,M ;GET # OF TRACKS 057D FE4D CPI 77 ;IF 8 INCH 057F CA8505 JZ NOT5 ;SKIP 5 INCH 0582 0E0A MVI C,0AH ;10 SECTORS FOR FIVE INCH 0584 C9 RET 0585 3A3F07 NOT5: LDA TRACK ;LOAD CURRENT TRACK 0588 FE00 CPI 0 ;SEE IF ITS TRACK 0 058A C29005 JNZ NOT0 ;SKIP IF ITS NOT 058D 0E1A MVI C,26 ;ELSE ITS 26 SECTORS 058F C9 RET 0590 23 NOT0: INX H ;ADVANCE TO SECTOR SIZE 0591 7E MOV A,M ;LOAD SECTOR SIZE BYTE 0592 E607 ANI 7 ;LOW BITS ONLY 0594 47 MOV B,A ;SAVE IN B 0595 213907 LXI H,SCTRS ;POINT M AT TABLE 0598 7D MOV A,L ;ADJUST M BY B 0599 80 ADD B 059A D29E05 JNC NOTOVR ;IN CASE OF CARRY 059D 24 INR H 059E 6F NOTOVR: MOV L,A ;M NOW ADJUSTED 059F 4E MOV C,M ;PUT NUMBER OF SECTORS IN C 05A0 C9 RET ;-------------------------------------------------------------------- ;REPORT SECTOR ERROR ; 1) THIS ROUTINE IS ONLY USED BY THE CHECK SECTOR TABLE ; ROUTINE (CKTBL). 05A1 E5 SECERR: PUSH H ;SAVE HL 05A2 00 GRAB6: DB TRAP ;CONDITIONAL RST 7 05A3 C5 PUSH B ;AND BC 05A4 CD6F06 CALL ERRFND ;LOADS DE WITH ERR MSG 05A7 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 05A9 CD0500 CALL BDOS 05AC 118307 LXI D,TRKMSG ;TRACK MESSAGE 05AF 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 05B1 CD0500 CALL BDOS 05B4 3A3F07 LDA TRACK ;GET TRACK NUMBER 05B7 CDA406 CALL BCDOUT ;SEND IT 05BA 118B07 LXI D,SIDEMS ;SIDE MSG 05BD 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 05BF CD0500 CALL BDOS 05C2 3A4007 LDA SIDE ;GET CURRENT SIDE 05C5 07 RLC ;MOVE SIDE BIT TO DATA 0 05C6 CDA406 CALL BCDOUT ;SEND IT 05C9 119207 LXI D,SECMSG ;SECTOR MESSAGE 05CC 0E09 MVI C,WRSTRN ;CPM_FUNCTION:=WRITE_STRING 05CE CD0500 CALL BDOS 05D1 C1 POP B ;RECOVER BC 05D2 C5 PUSH B ;AND RE-SAVE 05D3 78 MOV A,B ;NUMBER OF SECTORS 05D4 91 SUB C ;COUNTER 05D5 CDA406 CALL BCDOUT ;SEND IT AND RETURN 05D8 C1 POP B ;RESTORE BC 05D9 E1 POP H ;RESTORE HL 05DA C9 RET ;-------------------------------------------------------------------- ;GET A NEW TEST PATTERN 05DB E5 NEWPAT: PUSH H ;SAVE HL 05DC 212707 LXI H,PATBLE ;SET M TO TEST PATTERNS 05DF 3A4107 LDA PASS ;LOAD PASS COUNTER 05E2 85 ADD L ;ADJUST LOW BYTE OF ADDRESS 05E3 D2E705 JNC NOCARY ;COVER OVERFLOW POSSIBILITY 05E6 24 INR H 05E7 6F NOCARY: MOV L,A ;BRINGS M TO CURRENT PATTERN 05E8 3A3F07 LDA TRACK ;GET CURRENT TRACK NUMBER 05EB 1F RAR ;CHECK FOR EVEN OR ODD 05EC 7E MOV A,M ;LOAD TEST PATTERN 05ED D2F105 JNC EVEN ;SKIP ON ALTERNATE TRACKS 05F0 2F CMA ;COMPLEMENT TEST PATTERN 05F1 E1 EVEN: POP H ;RESTORE HL 05F2 47 MOV B,A ;SAVE IN B 05F3 C9 RET ;-------------------------------------------------------------------- ;WAIT FOR CONTROLLER TO FINISH ITS OPERATION 05F4 D5 WAIT1: PUSH D ;SAVE DE 05F5 1100A0 LXI D,0A000H ;LOAD AS TIMER-COUNTER 05F8 1B WTLOOP: DCX D ;START COUNTDOWN 05F9 7A MOV A,D 05FA B3 ORA E ; 06FF 00 DB 0 0700 00 RTRSLT: DB 0 0701 26 DB BRNCH ;BRANCH COMMAND 0702 0B07 DW COMHLT 0704 00 DB 0 ;EXTENDED ADDRESS 0705 28 RETRYS: DB STRTRY ;COMMAND TO SET # OF RETRIES 0706 05 DB RETRIES ;NUMBER OF RETRIES 0707 26 DB BRNCH ;BRANCH COMMAND 0708 0B07 DW COMHLT ;STANDARD HALT 070A 00 DB 0 070B 25 COMHLT: DB CONHLT ;UNIVERSAL HALT COMMAND 070C 00 HLTED: DB 0 ;RESULT BYTE ;-------------------------------------------------------------------- ;VARIABLE STORAGE 070D TRKTBL: DS TBLSZ ;TABLE USED BY WRITE TRACK COMMAND 0727 00 PATBLE: DB 0 ;TEST PATTERNS 0728 FF DB 0FFH 0729 AA DB 0AAH 072A 55 DB 55H 072B 0000 TKSIZ5: DW 0 ;NO EQUIVALENT ON 5 IN 072D 000A DW 2560 ;5 INCH SINGLE DENSITY 072F 0014 DW 5120 ;5 INCH DOUBLE DENSITY 0731 000D TKSIZ8: DW 3328 ;8 INCH SINGLE DENSITY 0733 001A DW 6656 ;8 INCH 256 BYTE SECTORS 0735 001E DW 7680 ;DITTO 512 0737 0020 DW 8192 ;DITTO 1024 0739 1A SCTRS: DB 26 ;SINGLE DENSITY 8 INCH 073A 1A DB 26 ;DOUBLE DENSITY 256 BYTE SECTORS 073B 0F DB 15 ;512 BYTE SECTORS 073C 08 DB 8 ;1024 BYTE SECTORS 073D 0000 TBYTES: DW 0 ;CURRENT TRACK SIZE 073F 00 TRACK: DB 0 ;CURRENT TRACK 0740 00 SIDE: DB 0 ;CURRENT SIDE 0741 00 PASS: DB 0 ;CURRENT PASS 0742 4407 LOGPNT: DW DRVLOG ;POINTER TO DRVLOG 0744 DRVLOG: DS 16 ;DRIVE LOG (TRKS, SIDES & SECTOR SIZES) ;-------------------------------------------------------------------- ;MESSAGE STRINGS 0754 0A0A0D0D SEEKNG: DB LF,LF,CR,CR 0758 5445535449 DB 'TESTING SEEKS ON$' 0769 0A0D0D READNG: DB LF,CR,CR 076C 5445535449 DB 'TESTING READ/WRITES ON$' 0783 2054524143TRKMSG: DB ' TRACK $' 078B 2053494445SIDEMS: DB ' SIDE $' 0792 2053454354SECMSG: DB ' SECTOR $' 079B 0A0D0D CRLF: DB LF,CR,CR 079E 24 DB '$' 079F 20434F4D50CMPERR: DB ' COMPARE ERROR(S) ON TRACK $' 07BB 0A0D0D DRVMSG: DB LF,CR,CR 07BE 5048595349 DB 'PHYSICAL $' 07C8 203520494EFIVEMS: DB ' 5 INCH PHYSICAL $' 07DA 203820494EEIGHMS: DB ' 8 INCH PHYSICAL $' 07EC 2057524954WRPRMS: DB ' WRITE PROTECTED$' 07FD 20444F5542DBLMSG: DB ' DOUBLE-SIDED DRIVE$' 0811 0A0D0D NODRVS: DB LF,CR,CR 0814 4E4F204452 DB 'NO DRIVES ARE READY$' 0828 3A20484F57SIDESQ: DB ': HOW MANY SIDES ON THIS DRIVE? $' 0849 0A0D0D ZERO: DB LF,CR,CR 084C 20494D5052 DB ' IMPROPER COMMAND CODE$' 0863 0A0D0D ONE: DB LF,CR,CR 0866 20494D5052 DB ' IMPROPER DISK DRIVE VALUE$' 0881 0A0D0D TWO: DB LF,CR,CR 0884 204449534B DB ' DISK DRIVE NOT READY$' 089A 0A0D0D THREE: DB LF,CR,CR 089D 20494D5052 DB ' IMPROPER TRACK VALUE$' 08B3 0A0D0D FOUR: DB LF,CR,CR 08B6 20554E5245 DB ' UNREADABLE MEDIA$' 08C8 0A0D0D FIVE: DB LF,CR,CR 08CB 20494D5052 DB ' IMPROPER SECTOR HEADER - NO SYNC BYTE(S)$' 08F5 0A0D0D SIX: DB LF,CR,CR 08F8 2043524320 DB ' CRC ERROR IN SECTOR HEADER SCAN$' 0919 0A0D0D SEVEN: DB LF,CR,CR 091C 205345454B DB ' SEEK ERROR$' 0928 0A0D0D EIGHT: DB LF,CR,CR 092B 20434F4D50 DB ' COMPARE ERROR IN SECTOR HEADER SCAN$' 0950 0A0D0D FOURTN: DB LF,CR,CR 0953 2043524320 DB ' CRC ERROR IN DATA FIELD$' 096C 0A0D0D FIFTN: DB LF,CR,CR 096F 20494D5052 DB ' IMPROPER SECTOR VALUE$' 0986 0A0D0D SIXTN: DB LF,CR,CR 0989 204D454449 DB ' MEDIA WRITE PROTECTED$' 09A0 0A0D0D SEVNTN: DB LF,CR,CR 09A3 204C4F5354 DB ' LOST DATA - DMA CHANNEL DID NOT RESPOND$' 09CC 0A0D0D EIGHTN: DB LF,CR,CR 09CF 204C4F5354 DB ' LOST COMMAND - CHANNEL DID NOT RESPOND$' 09F7 2054524143TKMSG: DB ' TRACK $' 09FF 2053494445SDMS: DB ' SIDE $' 0A06 2053494445SD1MS: DB ' SIDE ONE$' 0A10 2053494445SD2MS: DB ' SIDE TWO$' 0A1A 0A0D0D WRTMSG: DB LF,CR,CR 0A1D 5752495449 DB 'WRITING ALL TRACKS PASS $' 0A36 0A0D0D RDNMSG: DB LF,CR,CR 0A39 5645524946 DB 'VERIFYING ALL TRACKS WRITTEN ON PASS $' 0A5F 0A0A0D0D ONMS: DB LF,LF,CR,CR 0A63 544F204142 DB 'TO ABORT TEST HIT "ESC". TYPE G100 FOR RE-RUN.' 0A92 0A0A0D0D24 DB LF,LF,CR,CR,'$' ;-------------------------------------------------------------------- ;MISC RESERVES 0A97 4908630881ERRTBL: DW ZERO,ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT 0AA9 2809280928 DW EIGHT,EIGHT,EIGHT,EIGHT,EIGHT,FOURTN 0AB5 6C098609A0 DW FIFTN,SIXTN,SEVNTN,EIGHTN 0ABD DS 50 0AEF = STACK EQU $ 0AEF 0000 MAPPNT: DW 0 ;POINTER TO BADMAP 0AF1 BADMAP: DS 152 ;76 TRKS TIMES 2 SIDES 0B89 DSKBUF: DS 8192 ;8K DISK BUFFER 2B89 END :1001000031EF0A115F0A0E09CD0500214407224292 :10011000073E2632500021E5062251009732530057 :10012000320C07D3EFCDF405210507225100973299 :100130000C07D3EFCDF405CD4001CD4602C300013D :100140000E0821DB062251003E089147C532DC062D :100150009732E006320C07D3EFCDF4053AE006CD36 :100160006801C10DC24801C9FE40CA7F01FE82C4B8 :1001700054032A4207360023360023224207C9C50A :1001800011BB070E09CD0500C178CDA4063ADF06E4 :10019000E640CA9D013E90CD6503C372013ADD067B :1001A000E604CAC1012A4207362823CDE101060030 :1001B000FE31CAB70106803ADE0680772322420765 :1001C000C92A4207364D233ADE06FE00CC250247F7 :1001D0003ADF06E604CADA013E808077232242072E :1001E000C9E5C51128080E09CD0500110000D50E7E :1001F0000BCD0500D13DCA0B021B7BB2C2EE011E26 :10020000320E02CD05003E32C310020E01CD0500B4 :10021000C1E1FE0DCA0001FE31C8FAE101FE32C2A1 :10022000E1013E80C9E521F9062251003E0132FA82 :1002300006D3EFCDF40521DB06225100D3EFCDF438 :10024000053ADE06E1C90E082144077EFE00C258C9 :100250000223230DC24B02C92242073E089132F00D :100260000632FC06E5C5CD7502CD7103C1E123233D :100270000DC24B02C91154070E09CD0500CD8906E8 :1002800021F9062251003E80CD39062A4207561533 :100290001E00CDA3022A42075615CDC8021600CD76 :1002A000F002C97ACD1603D87BCD1603D815FAB65D :1002B000021CBEC2A302147ABEC8CD1603D81DF814 :1002C0007BCD1603D8C3B6027A1F575F7ACD1603CB :1002D000D81DFADF027BCD1603D814BEC2CC021C97 :1002E0007BCD1603D8157ABBF8CD1603D8C3DF0231 :1002F0007ACD1603D87AC602BECA0403CD1603D837 :1003000014C3F0023DCD1603D87ADE02F8CD1603F1 :10031000D8157AC3050332FA06323F07D5E54F2ACE :100320004207237E2BE680CA2F033AFB06EE80327B :10033000FB0632400747C597320007D3EFCDF405DF :10034000C13A0007FE40E1D1C24E03373FC900CD9C :10035000450637C9F500C511BB070E09CD0500C11B :1003600078CDA406F1CD6F061313130E09CD050049 :10037000C91169070E09CD0500CD890697324107DD :10038000CD3906CDA8030021ED06225100CDC803CA :10039000D821F906225100CD7E04D83A41073C32DB :1003A0004107FE04C28703C92A420706007EFE4DAC :1003B000C2B5030603237EE60780212B07CD7B060B :1003C0005E2356EB223D07C9111A0A0E09CD05001E :1003D0003A4107CDA406CDHL{X GƐ'@'OxƐ'@'ON#5 z80O,z8UO! N#Ny ,!}ä(C)3ͱ,USPS* |} !9":!"<<2* ͞ !~5 * ͡S ͉ͤW! !/ a #   # ʶʭ # 2@m R zI =C =: zzʶʭʕz Ÿ zO=! 3U ! 3! 3UW͒H! 3ü! 3\, ! 3\! zl z=1  3 !+ ͤ͵ ͵ !. ͤ!  ! O 3͍A,,A3͍! ́Á ! L ! ́z8O! 3~ ~ >v ! 3Uʹ,zʹzHږ 8O!n 3 C( )(͍)! 30> >z ͥ ,,ͥ ͉͉W_͕yO! 3 $% ,% !+ ͤO͉͒y !W {A !\ ͤ: ͒H)(IX+(IY+yO 3zʉ W! W3\,% ! 3! ͤAF,AF'! z> z ʽ ! ><3͈͐! 3 ͵ Z͉W{ ͇ z – z!  ! a # zB) zO!f 3>͈C~ GK ! 3z! E ! 3@ z¾ z! u ! 3w,ͱ́r! 3z ͥ # ͍ z¯ ͉2 ͉W͇ 5 z'!k # µ !3{͒z͒S?*!9"͡"͉*" *'/7?v"*2:DEFMV^goRET EI DI EXX HALTCCF SCF CPL DAA RRA RLA RRCARLCANOP !"#)*+4569FNV^fnpqrstuw~CP OR XOR AND IN OUT JR DJNZADD ADC SUB SBC AND XOR OR CP INC DEC LD RST AF POP PUSHJP CALLRET EX I,A A,I RLD RRD IM 2IM 1RETIIM 0RETNNEG LDI CPI INI OUTILDD CPD IND OUTDLDIRCPIRINIROTIRLDDRCPDRINDROTDRSBC ADC RLC RRC RL RR SLA SRA SRL BIT RES SET LD IM NZZ NCC POPEP M B C D E H L (HL A BC DE HL SP IX IY AF (IX+(IY+(BC (DE (C (SP ??= xKàï÷ZhÐyg Æ}!"Q!*"!"!""!2V!2M!2#!2S!!" "d!"!"!!1!!++"!"O!>28!"9:] !÷1!į>#yh͐ !J!6-B5͐A]]_!Y^#V]8]03]]]]]!]]j]]ů2[\ͯ>2M!!""!]:J!͠=]g" ]g" =g"=]> 2]]g=!1g=-1g!WgG"d!=Wg=]b*d!}o_"f!*d!"h!#>:y:K!ʞw^#V##:ڲ …òw~#:ڲ}ž"d!:J!*h!w+:K!!L!~/www*d!}|*d!:e]ggg{z|]}$2D!2E!gg"F!g"H!DM\!D!6xf"!=x=xYP!$!~ʲ#^#V:D!ʫ*!{«z«"!!~62 !ò#w6 }1!1!*!*!!V!~4#~#F#x~#s#r#w>ʿg===]g#wᯕo>g#'d w>#y!3^#V#0}o|gg Zx~y0ʅyGÑyyÑ‘G~Sz{ <w>'y{y>'y*!##V+^+N+y#w ~+yxÐ. *  w#  *,?r# ,:J!]m!!Ow #w Eq!\ S:o@w#tG6#.ʏÃ6# ‘S6 w#ä!ex#y#*!}|"!:M!!]qg!=:J!]g!!|]"!!$!~=#~#V;z;:!w :!]!$!~e:!w#s#r R]!$!~ʛ:J!ʈ6Û~w#^#V v!ʷ=]g"!!l!~# :]?ʀ͍]>HXEͱ*!\ͯ€w# &]:Wr_rrO {Bx!<i`"!Àrrw#Er]&Z&Z\GтWx!ڐ:M!̠>ULTͱ!!\~# ¡2|:] >!v͍͆<]&>!_\_*!& & *+&  !]w{]*#^#Vr+s+6]*"s#s#rT!J*!*"!!͆*!#w*!#w*+# SYMBOLS NEXT PC END =]g#w:K!ʹ^#V#ý~wh͐ .:m!>."͜ ʜw#=]g:K! s#r#Ü]}w#:K!ʜ#Ü>#>2S!!"O!#P@g}]=O=]g"O!"T!2E!U # `͐ xG͐ …xÔ']͐ ]x/!*5]ʬ!:E]]͐ ]cwh=]gx|]}]#gA>Ag}|]E~!!!!pLs#r:[F_!~X![4Y\ͯX2[17>?y l!ͯ!n!"j!> _ͯ~y#Æ͜a_!m!~> ʰ5*j!~#"j! Ҽ0y7yͲò> y> y ͯ#:J! w>.y^+~y:J! >:y|}5 y>.y*f!}o|/+- ,) 0 ]^#V#͐*!Ny]*j!*l! Eʠ ʺ+º͐Ë ºHʳ͐#^#V"l!"j!~/o>g++u!.n@n^#V=n^'͜ ]'͜H']S_#B͐H@0 ])DM)) O #^Y*!^#V#͐^KZ))))o͐HB"!s#r#!]!4-ˆî+•*!Ý+«͐ Ø-͐y_xWØ͐!K!6W6͐!]!6# ,>2]!}m ͐}m ͐}m ]]!]!JXN~!:!~# IA_^!!L^#Vx}>ѷ>-y~y/y~y>=Ñ/y>'y¨~!!!!~[#wc#x ڹwù5!*ͱE!:ͱw *!" !6c#~O+"f!*!~~#:cwJ^#Vy6DzS_c~*!~c#^+*!~Gzx&ç@—xv&ʳx80&óx6ʳ4ʧ5¹>=y*!~*!x*!*!:J!& &&x*!~&ó&*!~9&4&&#^xCZMEIABDHSPXY!"T!2S!"!+"!!91!!91!*!~: !2D!!@!~ʨ#^#V#~ ›!V!~6=G#^#V#~xú#"!!N#FO*Q!>7U:#!”!$!~Q