GET.NSC.TIME Disassembly listing with machine code of No Slot Clock util by Saint John Morrison produced on Merlin using Printfiler. 1 2 POINTER = $42 3 ZP_TIME = $44 4 5 CLK_JMP = $BF06 6 PRO_DATE = $BF90 7 PRO_TIME = $BF92 8 MACHID = $BF98 9 10 PRBYTE = $FDDA 11 COUT = $FDED 12 CROUT = $FD8E 13 14 ORG $2000 15 16 * First, find out if we have a Zip Chip. If so, 17 * save its status. 2000: 20 2B 20 18 START JSR HAS_ZIP? 2003: D0 03 19 BNE :NOZIP 2005: 8E 5A C0 20 STX $C05A ; scramble it 21 * make sure we have a NSC somewhere 2008: 20 56 20 22 :NOZIP JSR HAS_NSC? 200B: D0 06 23 BNE :NOTHING 200D: 20 12 21 24 JSR CLOCK ; yes! 2010: 4C 20 20 25 JMP RESET 26 * Nope! 2013: A2 00 27 :NOTHING LDX #$00 2015: BD 3E 22 28 :TLP LDA FAIL_TXT,X 2018: F0 06 29 BEQ RESET 201A: 20 ED FD 30 JSR COUT 201D: E8 31 INX 201E: D0 F5 32 BNE :TLP 33 * Reset Zip to previous parameters and exit 2020: 20 2B 20 34 RESET JSR HAS_ZIP? ; unlock again 2023: D0 05 35 BNE :RTS 2025: A9 A5 36 LDA #$A5 ; lock the chip 2027: 8D 5A C0 37 STA $C05A 202A: 60 38 :RTS RTS 39 40 * Returns EQ for yes, NE for no 202B: A9 5A 41 HAS_ZIP? LDA #$5A 202D: A2 03 42 LDX #$03 202F: 8D 5A C0 43 :LP STA $C05A 2032: CA 44 DEX 2033: 10 FA 45 BPL :LP 2035: 8D 5B C0 46 STA $C05B 47 * cache code 2038: A2 00 48 LDX #$00 203A: BD 00 20 49 :CACHE LDA START,X 203D: E8 50 INX 203E: D0 FA 51 BNE :CACHE 52 * Is there a chip here? 2040: AD 5C C0 53 LDA $C05C 2043: 49 FF 54 EOR #$FF 2045: 8D 5C C0 55 STA $C05C 2048: CD 5C C0 56 CMP $C05C 204B: D0 08 57 BNE :NOPE 204D: 49 FF 58 EOR #$FF 204F: 8D 5C C0 59 STA $C05C 2052: CD 5C C0 60 CMP $C05C 2055: 60 61 :NOPE RTS 62 63 * From here doesn't have to be cached 64 * Returns EQ for yes, NE for no (X=slot number -1) 2056: A2 08 65 HAS_NSC? LDX #$08 2058: 8E DB 20 66 :LP STX :X+1 ; slot being tested 205B: 20 6A 20 67 JSR :NSCTEST ; returns carry set for 205E: B0 07 68 BCS :OK ; found one! 2060: AE DB 20 69 LDX :X+1 2063: CA 70 DEX 2064: 10 F2 71 BPL :LP 2066: 60 72 RTS ; with "NE" set 2067: A9 00 73 :OK LDA #$00 2069: 60 74 RTS ; with "EQ" set 75 * Set up parameters 206A: BD DC 20 76 :NSCTEST LDA :READ0_L,X 206D: 8D D8 21 77 STA READ0+1 2070: BD E5 20 78 LDA :READ0_H,X 2073: 8D D9 21 79 STA READ0+2 2076: BD EE 20 80 LDA :READ1_L,X 2079: 8D DC 21 81 STA READ1+1 207C: BD F7 20 82 LDA :READ1_H,X 207F: 8D DD 21 83 STA READ1+2 2082: BD 00 21 84 LDA :READ2_L,X 2085: 8D 2A 22 85 STA READ2+1 2088: BD 09 21 86 LDA :READ2_H,X 208B: 8D 2B 22 87 STA READ2+2 208E: A9 00 88 LDA #$00 ; comparison counts 2090: 8D D8 20 89 STA :CMP0 2093: 8D D9 20 90 STA :CMP0+1 2096: 20 D5 21 91 JSR READ_NSC 2099: AD 36 22 92 LDA BCD_TIME ; years 209C: 8D D6 20 93 STA :TEMP0 209F: AD 3D 22 94 LDA BCD_TIME+7 ; centiseconds 20A2: 8D D7 20 95 STA :TEMP0+1 20A5: A2 63 96 LDX #$63 ; do 100 times 20A7: 8E DA 20 97 :LP0 STX :X 20AA: 20 D5 21 98 JSR READ_NSC 20AD: AD 36 22 99 LDA BCD_TIME ; years 20B0: CD D6 20 100 CMP :TEMP0 20B3: F0 03 101 BEQ *+5 20B5: EE D8 20 102 INC :CMP0 20B8: AD 3D 22 103 LDA BCD_TIME+7 ; centiseconds 20BB: CD D7 20 104 CMP :TEMP0+1 20BE: F0 03 105 BEQ *+5 20C0: EE D9 20 106 INC :CMP0+1 20C3: AE DA 20 107 LDX :X 20C6: CA 108 DEX 20C7: 10 DE 109 BPL :LP0 110 * Now, the YEAR should have 0 differences, the 111 * CENTISECONDS should have at least one. 20C9: 18 112 CLC 20CA: AD D8 20 113 LDA :CMP0 20CD: D0 06 114 BNE :RTS 20CF: AD D9 20 115 LDA :CMP0+1 20D2: F0 01 116 BEQ :RTS 20D4: 38 117 SEC ; found! 20D5: 60 118 :RTS RTS 119 120 * Variables and tables used 20D6: 00 00 121 :TEMP0 DS 2 20D8: 00 00 122 :CMP0 DS 2 20DA: 00 00 123 :X DS 2 20DC: FF FF FF 124 :READ0_L HEX FFFFFFFFFFFFFF2121 20DF: FF FF FF FF 20E3: 21 21 20E5: CF CF CF 125 :READ0_H HEX CFCFCFCFCFCFCFC0C0 20E8: CF CF CF CF 20EC: C0 C0 20EE: 00 00 00 126 :READ1_L HEX 000000000000000707 20F1: 00 00 00 00 20F5: 07 07 20F7: C1 C2 C3 127 :READ1_H HEX C1C2C3C4C5C6C7C0C0 20FA: C4 C5 C6 C7 20FE: C0 C0 2100: FF FF FF 128 :READ2_L HEX FFFFFFFFFFFFFF0606 2103: FF FF FF FF 2107: 06 06 2109: CF CF CF 129 :READ2_H HEX CFCFCFCFCFCFCFC0C0 210C: CF CF CF CF 2110: C0 C0 130 131 * Do the time setting for ProDOS, and print the time. 2112: A2 00 132 CLOCK LDX #$00 2114: BD 4E 22 133 :CLP LDA OK_TXT,X 2117: F0 06 134 BEQ :CX 2119: 20 ED FD 135 JSR COUT 211C: E8 136 INX 211D: D0 F5 137 BNE :CLP 211F: AD 3A 22 138 :CX LDA BCD_TIME+4 ; hours 2122: 20 DA FD 139 JSR PRBYTE 2125: A9 BA 140 LDA #":" 2127: 20 ED FD 141 JSR COUT 212A: AD 3B 22 142 LDA BCD_TIME+5 ; minutes 212D: 20 DA FD 143 JSR PRBYTE 2130: A9 A0 144 LDA #" " 2132: 20 ED FD 145 JSR COUT 2135: AD 38 22 146 LDA BCD_TIME+2 ; date 2138: 20 DA FD 147 JSR PRBYTE 213B: A9 A0 148 LDA #" " 213D: 20 ED FD 149 JSR COUT 2140: AD 37 22 150 LDA BCD_TIME+1 ; month 2143: 20 C0 21 151 JSR NORMALIZ 2146: 38 152 SEC 2147: E9 01 153 SBC #$01 2149: 0A 154 ASL ; *4 214A: 0A 155 ASL 214B: AA 156 TAX 214C: A0 00 157 LDY #$00 214E: BD 55 22 158 :MLP LDA MONTH,X 2151: 20 ED FD 159 JSR COUT 2154: E8 160 INX 2155: C8 161 INY 2156: C0 04 162 CPY #$04 2158: 90 F4 163 BLT :MLP 215A: AD 36 22 164 LDA BCD_TIME ; year 215D: 20 DA FD 165 JSR PRBYTE 2160: 20 8E FD 166 JSR CROUT 167 168 * Store in global page 2163: AD 38 22 169 LDA BCD_TIME+2 ; date 2166: 20 C0 21 170 JSR NORMALIZ 2169: 8D 90 BF 171 STA PRO_DATE 172 216C: AD 37 22 173 LDA BCD_TIME+1 ; month 216F: 20 C0 21 174 JSR NORMALIZ 2172: 0A 175 ASL ; *32 2173: 0A 176 ASL 2174: 0A 177 ASL 2175: 0A 178 ASL 2176: 0A 179 ASL 2177: 08 180 PHP ; carry goes into year 2178: 0D 90 BF 181 ORA PRO_DATE 217B: 8D 90 BF 182 STA PRO_DATE 217E: AD 36 22 183 LDA BCD_TIME ; year 2181: 20 C0 21 184 JSR NORMALIZ 2184: 28 185 PLP 2185: 2A 186 ROL 2186: 8D 91 BF 187 STA PRO_DATE+1 2189: AD 3A 22 188 LDA BCD_TIME+4 ; hours 218C: 10 0F 189 BPL :AM ; in 24-hour mode 218E: 29 7F 190 AND #$7F ; get rid of 12/24 bit 2190: AA 191 TAX 2191: 29 20 192 AND #$20 ; find AM/PM 2193: 08 193 PHP 2194: 8A 194 TXA 2195: 29 1F 195 AND #$1F 2197: 28 196 PLP 2198: F0 03 197 BEQ :AM 219A: 18 198 CLC 219B: 69 12 199 ADC #$12 ; add 12 219D: 20 C0 21 200 :AM JSR NORMALIZ 21A0: 8D 93 BF 201 STA PRO_TIME+1 21A3: AD 3B 22 202 LDA BCD_TIME+5 ; minutes 21A6: 20 C0 21 203 JSR NORMALIZ 21A9: C9 3C 204 CMP #$3C ; =60? 21AB: 90 02 205 BLT :MIN 21AD: A9 3B 206 LDA #$3B ; set to 59 21AF: 8D 92 BF 207 :MIN STA PRO_TIME 208 21B2: A9 60 209 LDA #$60 ; RTS 21B4: 8D 06 BF 210 STA CLK_JMP 21B7: AD 98 BF 211 LDA MACHID 21BA: 09 01 212 ORA #$01 ; set "has a clock" bit 21BC: 8D 98 BF 213 STA MACHID 21BF: 60 214 RTS ; all done! 215 21C0: 48 216 NORMALIZ PHA 21C1: 29 0F 217 AND #$0F 21C3: AA 218 TAX 21C4: 68 219 PLA 21C5: 4A 221 LSR 21C6: 4A 221 LSR 21C7: 4A 221 LSR 21C8: 4A 221 LSR 21C9: A8 223 TAY 21CA: 8A 224 TXA 21CB: 88 225 :LP DEY 21CC: 10 01 226 BPL :C 21CE: 60 227 RTS 21CF: 18 228 :C CLC 21D0: 69 0A 229 ADC #$0A 21D2: 4C CB 21 230 JMP :LP 231 232 * Swiped liberally from a disassembled CLOCKREAD 233 * Count on 100 clock cycles (more like 200) 21D5: 08 234 READ_NSC PHP 21D6: 78 235 SEI 21D7: AD FF CF 236 READ0 LDA $CFFF ; reset ROM space 21DA: 48 237 PHA ; and save status 21DB: 8D 00 C1 238 READ1 STA $C100 ; select card ROM 21DE: AD 04 C8 239 LDA $C804 240 241 * Save ten bytes from POINTER on 21E1: A2 0A 242 LDX #$0A 21E3: B5 41 243 :LP LDA POINTER-1,X 21E5: 48 244 PHA 21E6: CA 245 DEX 21E7: D0 FA 246 BNE :LP 247 21E9: A9 2E 248 LDA #IDBYTES 21EF: 85 43 251 STA POINTER+1 ; hi byte 252 253 * I'm assuming that this is a mysterious sequence 254 * that must be followed verbatim if anything is to 255 * be accomplished 21F1: A0 07 256 LDY #$07 21F3: B1 42 257 :LP0 LDA (POINTER),Y 21F5: 38 258 SEC 21F6: 6A 259 ROR 21F7: 48 260 :LP1 PHA 21F8: A9 00 261 LDA #$00 21FA: 2A 262 ROL 21FB: AA 263 TAX 21FC: BD 00 C8 264 LDA $C800,X 21FF: 68 265 PLA 2200: 4A 266 LSR 2201: D0 F4 267 BNE :LP1 2203: 88 268 DEY 2204: 10 ED 269 BPL :LP0 270 271 * Get the time from the registers 2206: A2 07 272 LDX #$07 ; byte counter 2208: A0 07 273 :T_LP0 LDY #$07 ; bit counter 220A: AD 04 C8 274 :T_LP1 LDA $C804 220D: 6A 275 ROR 220E: 76 44 276 ROR ZP_TIME,X 2210: 88 277 DEY 2211: 10 F7 278 BPL :T_LP1 2213: B5 44 279 LDA ZP_TIME,X 2215: 9D 36 22 280 STA BCD_TIME,X 2218: CA 281 DEX 2219: 10 ED 282 BPL :T_LP0 283 284 * Restore saved ZP area 221B: A2 00 285 LDX #$00 221D: 68 286 :RESTORE PLA 221E: 95 42 287 STA POINTER,X 2220: E8 288 INX 2221: E0 0A 289 CPX #$0A 2223: 90 F8 290 BLT :RESTORE 291 292 * Reset $C800 space if we were using a slot-based chip 2225: 68 293 PLA 2226: 2A 294 ROL 2227: B0 03 295 BCS *+5 2229: 8D FF CF 296 READ2 STA $CFFF 222C: 28 297 PLP 222D: 60 298 RTS 299 300 ******************************** 301 * Data * 302 ******************************** 303 304 * ID bytes for NSC 222E: 5C A3 3A 305 IDBYTES HEX 5C,A3,3A,C5,5C,A3,3A,C5 2231: C5 5C A3 3A 2235: C5 306 2236: 00 00 00 307 BCD_TIME DS 8 2239: 00 00 00 00 223D: 00 308 223E: 8D 309 FAIL_TXT HEX 8D 223F: CE EF A0 310 ASC "No NSC found.",8D00 2242: CE D3 C3 A0 2246: E6 EF F5 EE 224A: E4 AE 8D 00 311 224E: 8D 312 OK_TXT HEX 8D 224F: C9 F4 A7 313 ASC "It's ",00 2252: F3 A0 00 314 2255: CA E1 EE 315 MONTH ASC "Jan Feb Mar Apr May Jun " 2258: A0 C6 E5 E2 225C: A0 CD E1 F2 2260: A0 C1 F0 F2 2264: A0 CD E1 F9 2268: A0 CA F5 EE 226C: A0 226D: CA F5 EC 316 ASC "Jul Aug Sep Oct Nov Dec " 2270: A0 C1 F5 E7 2274: A0 D3 E5 F0 2278: A0 CF E3 F4 227C: A0 CE EF F6 2280: A0 C4 E5 E3 2284: A0 --End assembly, 645 bytes, Errors: 0 Symbol table - alphabetical order: BCD_TIME=$2236 CLK_JMP =$BF06 CLOCK =$2112 COUT =$FDED CROUT =$FD8E FAIL_TXT=$223E HAS_NSC?=$2056 HAS_ZIP?=$202B IDBYTES =$222E MACHID =$BF98 MONTH =$2255 NORMALIZ=$21C0 OK_TXT =$224E POINTER =$42 PRBYTE =$FDDA PRO_DATE=$BF90 PRO_TIME=$BF92 READ0 =$21D7 READ1 =$21DB READ2 =$2229 READ_NSC=$21D5 RESET =$2020 START =$2000 ZP_TIME =$44 Symbol table - numerical order: POINTER =$42 ZP_TIME =$44 START =$2000 RESET =$2020 HAS_ZIP?=$202B HAS_NSC?=$2056 CLOCK =$2112 NORMALIZ=$21C0 READ_NSC=$21D5 READ0 =$21D7 READ1 =$21DB READ2 =$2229 IDBYTES =$222E BCD_TIME=$2236 FAIL_TXT=$223E OK_TXT =$224E MONTH =$2255 CLK_JMP =$BF06 PRO_DATE=$BF90 PRO_TIME=$BF92 MACHID =$BF98 CROUT =$FD8E PRBYTE =$FDDA COUT =$FDED