MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 1 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00001 ; 00002 ; gbread21.asm GB Serial Reader V1.1 00003 ; for Microchip PIC16C74A-20 00004 ; Copyright(C)1998 By H.Kashima 00005 ; 00006 ; 98/05/22 Ver1.0 FirstRelease 00007 ; 98/06/29 Ver1.0a SecondRelease, 00008 ; changed 1) Info-table proccess routine 00009 ; not kill when info-table is invalid. 00010 ; 98/08/28 Ver1.0b ThardRelease, 00011 ; added 1) 'ir' command, print infomation with 00012 ; table re-reload 00013 ; 98/09/28 Ver1.0c 4th Release, 00014 ; changed 1) 'dl xxxx xxxx' comannd is not work 00015 ; on unknown ROM type cartridges. 00016 ; changed to free accessable. 00017 ; 98/10/05 Ver1.1 5th 00018 ; added 1) support MBC5 bank method 00019 ; changed 1-1) extend register for GBBANK, CUBANKs for MBC5 00020 ; changed 1-2) information tables extract method(PRINTPB) 00021 ; added 2) information of ROM type 16Mbit, 32Mbit, 64Mbit. 00022 ; added 3) print software type: GBColor, SuperGB, Standard 00023 ; changed 4) unknown cartridge is set to MBC1+ROM+SRAM+BATT. 00024 ; added 5) filename generator identify '/', '\' 00025 ; 00026 ; 00027 ; PIN I/O 00028 ; 00029 ; RA0: a8 out 00030 ; 1: a9 out 00031 ; 2: a10 out 00032 ; 3: a11 out 00033 ; 4: LED out 00034 ; 5: a12 out 00035 ; RB0: d0 in/out 00036 ; 1: d1 in/out 00037 ; 2: d2 in/out 00038 ; 3: d3 in/out 00039 ; 4: d4 in/out 00040 ; 5: d5 in/out 00041 ; 6: d6 in/out 00042 ; 7: d7 in/out 00043 ; RC0: /we out 00044 ; 1: /rd out 00045 ; 2: clk out(PWM1), (/reset testver.) 00046 ; 3: /mreq out 00047 ; 4: DTE.CTS out 00048 ; 5: DTE.RTS in 00049 ; 6: DTE.RxD out(SCI) 00050 ; 7: DTE.TxD in(SCI) 00051 ; RD0: a0 out 00052 ; 1: a1 out 00053 ; 2: a2 out MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 2 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00054 ; 3: a3 out 00055 ; 4: a4 out 00056 ; 5: a5 out 00057 ; 6: a6 out 00058 ; 7: a7 out 00059 ; RE0: a13 out 00060 ; 1: a14 out 00061 ; 2: a15 out 00062 00063 00064 title gbread21 00065 processor 16c74a Warning[216]: Radix superceded by command line. 00066 radix dec 00067 list c = 110, n = 88 00068 00069 ;#define debug 1 00070 #include 00001 LIST 00002 ; P16C74A.INC Standard Header File, Version 1.01 Microchip Technology, Inc. 00323 LIST 00071 2007 3FF2 00072 __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON 00073 00074 00075 #define BS(x) ( 1 << x ) ; bit set 00076 00077 ; supplyed clock 00078 #define XTAL 14745600 ; supplyed clock 00079 #define RTCLK ( XTAL / 4 ) ; internal timer clock 00080 00081 ; baudrate 00082 #define baud(X) ( ((10 * XTAL / (16 * X)) + 5) / 10 - 1 ) 00083 #define baud_l(X) ( ((10 * XTAL / (64 * X)) + 5) / 10 - 1 ) 00084 00085 #define BAUDRATE 115200 ; communication speed 00086 #define BRGVALUE baud_l( BAUDRATE ) 00087 00088 ; 00089 ; Receive buffer size 00090 #define LBUFLEN 64 00091 00092 ; 00093 ; maximum of autodetect memory size 00094 #define ROMMAX 8 00095 #define RAMMAX 4 00096 00097 ; bit define 00098 ; 00000000 00099 P_WR equ 0 00000001 00100 P_RD equ 1 00000002 00101 P_CLK equ 2 00000003 00102 P_MREQ equ 3 00000004 00103 P_CTS equ 4 00000005 00104 P_RTS equ 5 00105 00106 ; DMODE flags 00000000 00107 D_SRAM equ 0 ; DL ROM: 0, DL SRAM:1 00000001 00108 D_ECHO equ 1 ; echo: 0, noecho: 1 00000002 00109 D_PROT equ 2 ; SRAM Protect(enable/disable) flag 00000003 00110 D_ACT equ 3 ; Cartridge detect 00000004 00111 D_MBC2 equ 4 ; flag for MBC2 RAM data filter 00000005 00112 D_CKSM equ 5 ; flag for calc CheckSum only 00000006 00113 D_INFO equ 6 ; infomation activated 00114 00115 ; CTFLAG contents 00000000 00116 C_CAR equ 0 ; 1: Unknown Cartridge type 00000001 00117 C_ROM equ 1 ; 1: Unknown ROM type 00000002 00118 C_RAM equ 2 ; 1: Unknown SRAM type 00119 00120 ; CTYPEB Cartridge type 00000000 00121 CT_ROM equ 0 00000001 00122 CT_SRAM equ 1 00000002 00123 CT_BATT equ 2 00000003 00124 CT_MBC1 equ 3 ; MBC bank chips 00000004 00125 CT_MBC2 equ 4 00000005 00126 CT_MBC3 equ 5 00000006 00127 CT_MBC5 equ 6 00128 00129 ; CFUNC contents 00000000 00130 CF_NORM equ 0 00000001 00131 CF_SUPR equ 1 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 3 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00000002 00132 CF_COLR equ 2 00133 00134 00135 ; CRSIZE contents 00000000 00136 CRS_256 equ 0 00000001 00137 CRS_512 equ 1 00000002 00138 CRS_1M equ 2 00000003 00139 CRS_2M equ 3 00000004 00140 CRS_4M equ 4 00000005 00141 CRS_8M equ 5 00000006 00142 CRS_16M equ 6 00000007 00143 CRS_32M equ 7 00000008 00144 CRS_64M equ 8 00145 00146 ; work area 00147 ; 00148 cblock 0x20 00000020 00149 VAR1, VAR2, VAR3, VAR4, VAR5 00000025 00150 CONVT1, CONVT2, DMODE 00000028 00151 LBUFP, ARGP, ARGPP, ARGC, ARGCT 0000002D 00152 GBADRH, GBADRL, GBDATA 00000030 00153 GBBANK_H, GBBANK_L 00000032 00154 CUBANK_H, CUBANK_L 00000034 00155 COLUMN, CTFLAG 00000036 00156 UUDAT1, UUDAT2, UUDAT3, UASCP ; binary temp for UUENCODE 0000003A 00157 ARG0H, ARG0L, ARG1H, ARG1L ; argument values 0000003E 00158 ARG2H, ARG2L, ARG3H, ARG3L 00000042 00159 ARGT_H, ARGT_L, CMP_H, CMP_L 00000046 00160 D_ADRH, D_ADRL, E_ADRH, E_ADRL ; dump address 0000004A 00161 DMCURH, DMCURL ; current dump address 0000004C 00162 CKSUMH, CKSUML 0000004E 00163 CTITLE:16 ; Cartridge Infotable 0000005E 00164 CTYPE, CSSIZE, CRSIZE 00000061 00165 CSUM_L, CSUM_H, CFUNC 00000064 00166 CTYPEB ; bitflaged Cartridge type 00167 endc 00168 00169 cblock 0xa0 000000A0 00170 ASCBUF:16 ; ASCII buffer for dump 000000B0 00171 LBUF:64 ; line buffer 64byte 00172 endc 00173 ; 00174 ; macros (0x000-0x7ff only) 00175 PRINT macro ptr ; print ptr string 00176 clrf VAR1 00177 PAGESEL ptr ; loop 00178 movfw VAR1 00179 call ptr 00180 bcf PCLATH, 3 ; reset PCL 00181 andlw 0xff 00182 btfsc STATUS, Z 00183 goto $ + 4 00184 call PutC 00185 incf VAR1, F 00186 goto $ - 10 00187 endm 00188 00189 PRINTP macro ptr, skip ; print ptr string table with skip 00190 clrf VAR1 ; pointer 00191 movfw skip 00192 movwf VAR2 ; skip count 00193 00194 PAGESEL ptr ; (l1) 00195 movfw VAR1 00196 call ptr ; string data 00197 bcf PCLATH, 3 ; reset PCL 00198 movwf VAR3 00199 incf VAR1, F ; incriment pointer 00200 00201 andlw 0xff 00202 btfss STATUS, Z 00203 goto $ + 6 ; char != null (goto l2) 00204 00205 movfw VAR2 ; char == null 00206 btfsc STATUS, Z 00207 goto $ + 9 ; skip == 0, exit. 00208 00209 decf VAR2, F ; decriment skip count(skip) 00210 goto $ - 14 ; goto l1 00211 00212 movfw VAR2 ; skip == 0 ? (l2) 00213 btfss STATUS, Z MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 4 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00214 goto $ - 17 ; skip, next char 00215 00216 movfw VAR3 00217 call PutC ; print char 00218 goto $ - 20 ; goto l1 00219 00220 endm 00221 00222 PRINTPB macro ptr, take ; print ptr string table with skip 00223 clrf VAR1 ; pointer 00224 movfw take 00225 movwf VAR2 ; take bits 00226 00227 PAGESEL ptr ; (l1) 00228 movfw VAR1 00229 call ptr ; string data 00230 bcf PCLATH, 3 ; reset PCL 00231 movwf VAR3 00232 incf VAR1, F ; incriment pointer 00233 00234 andlw 0xff 00235 btfss STATUS, Z 00236 goto $ + 11 ; char != null (goto l2) 00237 00238 bcf STATUS, C 00239 rrf VAR2, F ; shift take bit 00240 movfw VAR2 00241 btfsc STATUS, Z ; take bit is zero? 00242 goto $ + 11 ; VAR2 == 0, no flag. exit. 00243 00244 btfss VAR2, 0 ; next is takely turn? 00245 goto $ - 16 ; no print "+", goto l1 00246 00247 movlw '+' 00248 call PutC 00249 goto $ - 19 ; goto l1 00250 00251 btfss VAR2, 0 ; (l2), is takely turn? 00252 goto $ - 21 ; not use, next char 00253 00254 movfw VAR3 00255 call PutC ; print char 00256 goto $ - 24 ; goto l1 00257 00258 endm 00259 00260 ; 00261 ; reset vector 00262 ; 0000 00263 org 0x000 0000 2801 00264 goto start 00265 00266 ; interrupt vector 00267 ; 00268 ; org 0x004 00269 ; goto int_sub 00270 00271 ; 00272 ; cold start 00273 ; MCU initialize 00274 ; 0001 00275 start 0001 1683 00276 BANKSEL OPTION_REG ; bank select RP0 = 1 00277 0002 3007 00278 movlw BS(PS2) | BS(PS1) | BS(PS0) Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0003 0081 00279 movwf OPTION_REG ; pullup PORTB, PS=1:256 00280 0004 30C0 00281 movlw b'11000000' ; initialize I/O port Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0005 0085 00282 movwf TRISA 0006 30FF 00283 movlw b'11111111' Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0007 0086 00284 movwf TRISB 0008 30A0 00285 movlw b'10100000' Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0009 0087 00286 movwf TRISC 000A 3000 00287 movlw b'00000000' Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 000B 0088 00288 movwf TRISD 000C 3000 00289 movlw b'00000000' Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 5 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 000D 0089 00290 movwf TRISE 00291 000E 3006 00292 movlw BS(PCFG2) | BS(PCFG1) Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 000F 009F 00293 movwf ADCON1 00294 0010 3001 00295 movlw BRGVALUE Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0011 0099 00296 movwf SPBRG 00297 00298 ; movlw BS(TXEN) | BS(BRGH) ; enable transmitter 0012 3020 00299 movlw BS(TXEN) ; on old 16C74, BRGH = 0 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0013 0098 00300 movwf TXSTA 0014 3003 00301 movlw 3 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0015 0092 00302 movwf PR2 ; PWM freq = XTAL / 16 00303 0016 1283 00304 BANKSEL PORTA ; bank select RP0 = 0 0017 0185 00305 clrf PORTA ; initialize output 0018 0186 00306 clrf PORTB 0019 303F 00307 movlw b'00111111' 001A 0087 00308 movwf PORTC 001B 0188 00309 clrf PORTD 001C 0189 00310 clrf PORTE 00311 001D 3090 00312 movlw BS(SPEN) | BS(CREN) ; enable receiver 001E 0098 00313 movwf RCSTA 00314 001F 3002 00315 movlw 2 0020 0095 00316 movwf CCPR1L ; DC1:MSB = 2 0021 300C 00317 movlw BS(CCP1M3) | BS(CCP1M2) ; PWM1 setup, PWM on, DC1:LSB = 0 0022 0097 00318 movwf CCP1CON 00319 0023 3004 00320 movlw b'00000100' ; TMR2 control 0024 0092 00321 movwf T2CON 00322 0025 1207 00323 bcf PORTC, P_CTS ; CTS goes low 0026 01CA 00324 clrf DMCURH ; clear current dump 0027 01CB 00325 clrf DMCURL ; pointer 0028 01A7 00326 clrf DMODE ; clear mode flags 00327 00328 ; 00329 ; main loop 00330 ; 0029 00331 main 00332 mloop1 PRINT prom_s ; print prompt 0029 01A0 M clrf VAR1 002A 3008 008A M PAGESEL prom_s ; loop 002C 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 002D 2077 M call prom_s 002E 118A M bcf PCLATH, 3 ; reset PCL 002F 39FF M andlw 0xff 0030 1903 M btfsc STATUS, Z 0031 2835 M goto $ + 4 0032 27A1 M call PutC 0033 0AA0 M incf VAR1, F 0034 282A M goto $ - 10 0035 10A7 00333 bcf DMODE, D_ECHO ; echo on 0036 27A7 00334 call GetS ; get line 0037 00A1 00335 movwf VAR2 ; push return code 00336 0038 1087 00337 bcf PORTC, P_RD ; CR or other, set access readable 0039 0805 00338 movfw PORTA 003A 0084 00339 movwf FSR ; push PORTA 003B 1605 00340 bsf PORTA, 4 ; LED active for read fixed code 00341 003C 243A 00342 call ChkCart ; check cartridge 003D 00A2 00343 movwf VAR3 ; store condition 00344 003E 1E04 00345 mloop0b btfss FSR, 4 003F 1205 00346 bcf PORTA, 4 ; pull PORTA:4 00347 0040 0821 00348 movfw VAR2 ; recall GetS return code 0041 3CFF 00349 sublw 0xff ; ESC inputed? 0042 1D03 00350 btfss STATUS, Z 0043 2857 00351 goto mloop0c 00352 0044 1E05 00353 btfss PORTA, 4 ; ESC inputed, already disactived? 0045 2829 00354 goto mloop1 00355 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 6 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0046 1327 00356 bcf DMODE, D_INFO ; information disactive 0047 2724 00357 call MBCoff ; MBC disactive 0048 1487 00358 bsf PORTC, P_RD ; set access IDLE 0049 1205 00359 bcf PORTA, 4 ; disactive LED 00360 PRINT disc_s ; print disable cartridge 004A 01A0 M clrf VAR1 004B 300A 008A M PAGESEL disc_s ; loop 004D 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 004E 2284 M call disc_s 004F 118A M bcf PCLATH, 3 ; reset PCL 0050 39FF M andlw 0xff 0051 1903 M btfsc STATUS, Z 0052 2856 M goto $ + 4 0053 27A1 M call PutC 0054 0AA0 M incf VAR1, F 0055 284B M goto $ - 10 0056 2829 00361 goto mloop1 00362 0057 1A05 00363 mloop0c btfsc PORTA, 4 ; already actived? 0058 287D 00364 goto mloop0f 00365 0059 1FA2 00366 btfss VAR3, 7 ; check current condition 005A 2869 00367 goto mloop0d ; valid infomation 00368 00369 PRINT ninfo_s ; print info not found 005B 01A0 M clrf VAR1 005C 300A 008A M PAGESEL ninfo_s ; loop 005E 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 005F 22B5 M call ninfo_s 0060 118A M bcf PCLATH, 3 ; reset PCL 0061 39FF M andlw 0xff 0062 1903 M btfsc STATUS, Z 0063 2867 M goto $ + 4 0064 27A1 M call PutC 0065 0AA0 M incf VAR1, F 0066 285C M goto $ - 10 0067 1327 00370 bcf DMODE, D_INFO ; information disactive 0068 286A 00371 goto mloop0e 00372 0069 1727 00373 mloop0d bsf DMODE, D_INFO ; information active 00374 006A 1605 00375 mloop0e bsf PORTA, 4 ; cartridge inserted, LED active 00376 PRINT cenab_s ; print poweruped(with powerup wait) 006B 01A0 M clrf VAR1 006C 300A 008A M PAGESEL cenab_s ; loop 006E 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 006F 229D M call cenab_s 0070 118A M bcf PCLATH, 3 ; reset PCL 0071 39FF M andlw 0xff 0072 1903 M btfsc STATUS, Z 0073 2877 M goto $ + 4 0074 27A1 M call PutC 0075 0AA0 M incf VAR1, F 0076 286C M goto $ - 10 0077 2719 00377 call MBCact ; MBC active 0078 3008 008A 00378 PAGESEL GetInfo Message[306]: Crossing page boundary -- ensure page bits are set. 007A 2000 00379 call GetInfo ; get information 007B 118A 00380 bcf PCLATH, 3 007C 00B5 00381 movwf CTFLAG ; store condition 00382 007D 0821 00383 mloop0f movfw VAR2 ; GetS return code 007E 39FF 00384 andlw 0xff 007F 1903 00385 btfsc STATUS, Z 0080 2829 00386 goto mloop1 ; non argument, only CR 00387 0081 27DF 00388 call PutLF ; line feed 0082 25FD 00389 call cmdpar ; parse command 00390 0083 16BA 00391 bsf ARG0H, 5 ; to lower 0084 16BB 00392 bsf ARG0L, 5 00393 0085 3001 00394 movlw 1 0086 022B 00395 subwf ARGC, W 0087 1D03 00396 btfss STATUS, Z 0088 28BC 00397 goto mloop2 ; 1 arg 00398 0089 083A 00399 movfw ARG0H 008A 3C69 00400 sublw 'i' ; information MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 7 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 008B 1D03 00401 btfss STATUS, Z 008C 2897 00402 goto mloop1b 008D 083B 00403 movfw ARG0L 008E 3C72 00404 sublw 'r' 008F 1D03 00405 btfss STATUS, Z 0090 2943 00406 goto C_info 00407 ; print info with update 0091 3008 008A 00408 PAGESEL GetInfo Message[306]: Crossing page boundary -- ensure page bits are set. 0093 2000 00409 call GetInfo ; get information 0094 118A 00410 bcf PCLATH, 3 0095 00B5 00411 movwf CTFLAG ; store condition 0096 2943 00412 goto C_info 00413 0097 083A 00414 mloop1b movfw ARG0H ; help 0098 3C68 00415 sublw 'h' 0099 1D03 00416 btfss STATUS, Z 009A 289C 00417 goto mloop1d 009B 291E 00418 goto C_help 00419 009C 083A 00420 mloop1d movfw ARG0H ; download all of SRAM 009D 3C64 00421 sublw 'd' 009E 1D03 00422 btfss STATUS, Z 009F 28A7 00423 goto mloop1e 00A0 083B 00424 movfw ARG0L 00A1 3C73 00425 sublw 's' 00A2 1D03 00426 btfss STATUS, Z 00A3 28A7 00427 goto mloop1e 00428 00A4 1427 00429 bsf DMODE, D_SRAM ; set SRAM mode 00A5 12A7 00430 bcf DMODE, D_CKSM ; clear CheckSum flag 00A6 2A45 00431 goto C_down 00432 00A7 083A 00433 mloop1e movfw ARG0H ; download all of SRAM 00A8 3C75 00434 sublw 'u' 00A9 1D03 00435 btfss STATUS, Z 00AA 28B1 00436 goto mloop1f 00AB 083B 00437 movfw ARG0L 00AC 3C73 00438 sublw 's' 00AD 1D03 00439 btfss STATUS, Z 00AE 28B1 00440 goto mloop1f 00AF 1427 00441 bsf DMODE, D_SRAM ; set SRAM mode 00B0 2B42 00442 goto C_up 00443 00B1 083A 00444 mloop1f movfw ARG0H ; calc SRAM CheckSum 00B2 3C63 00445 sublw 'c' 00B3 1D03 00446 btfss STATUS, Z 00B4 28E8 00447 goto mloop5 00B5 083B 00448 movfw ARG0L 00B6 3C73 00449 sublw 's' 00B7 1D03 00450 btfss STATUS, Z 00B8 28E8 00451 goto mloop5 00452 00B9 1427 00453 bsf DMODE, D_SRAM ; set SRAM mode 00BA 16A7 00454 bsf DMODE, D_CKSM ; clear CheckSum flag 00BB 2A45 00455 goto C_down 00456 00BC 3002 00457 mloop2 movlw 2 00BD 022B 00458 subwf ARGC, W 00BE 1D03 00459 btfss STATUS, Z 00BF 28DB 00460 goto mloop3 00461 ; 2 args 00C0 083A 00462 movfw ARG0H ; read 00C1 3C72 00463 sublw 'r' 00C2 1D03 00464 btfss STATUS, Z 00C3 28C9 00465 goto mloop2b 00C4 083B 00466 movfw ARG0L 00C5 3C64 00467 sublw 'd' 00C6 1D03 00468 btfss STATUS, Z 00C7 28C9 00469 goto mloop2b 00C8 2C5E 00470 goto C_read 00471 00C9 083A 00472 mloop2b movfw ARG0H ; select ROM bank 00CA 3C62 00473 sublw 'b' 00CB 1D03 00474 btfss STATUS, Z 00CC 28D2 00475 goto mloop2c 00CD 083B 00476 movfw ARG0L 00CE 3C72 00477 sublw 'r' 00CF 1D03 00478 btfss STATUS, Z 00D0 28D2 00479 goto mloop2c 00D1 2C67 00480 goto C_sbR 00481 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 8 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00D2 083A 00482 mloop2c movfw ARG0H ; select SRAM bank 00D3 3C62 00483 sublw 'b' 00D4 1D03 00484 btfss STATUS, Z 00D5 28E8 00485 goto mloop5 00D6 083B 00486 movfw ARG0L 00D7 3C73 00487 sublw 's' 00D8 1D03 00488 btfss STATUS, Z 00D9 28E8 00489 goto mloop5 00DA 2C6F 00490 goto C_sbS 00491 00DB 3003 00492 mloop3 movlw 3 00DC 022B 00493 subwf ARGC, W 00DD 1D03 00494 btfss STATUS, Z 00DE 28E8 00495 goto mloop5 00496 ; 3 args 00DF 083A 00497 movfw ARG0H ; write 00E0 3C77 00498 sublw 'w' 00E1 1D03 00499 btfss STATUS, Z 00E2 28E8 00500 goto mloop5 00E3 083B 00501 movfw ARG0L 00E4 3C64 00502 sublw 'd' 00E5 1D03 00503 btfss STATUS, Z 00E6 28E8 00504 goto mloop5 00E7 2C56 00505 goto C_wd 00506 00507 ; any args 00E8 083A 00508 mloop5 movfw ARG0H ; download 00E9 3C64 00509 sublw 'd' 00EA 1D03 00510 btfss STATUS, Z 00EB 28F3 00511 goto mloop5b 00EC 083B 00512 movfw ARG0L 00ED 3C6C 00513 sublw 'l' 00EE 1D03 00514 btfss STATUS, Z 00EF 28F3 00515 goto mloop5b 00516 00F0 1027 00517 bcf DMODE, D_SRAM ; set ROM mode 00F1 12A7 00518 bcf DMODE, D_CKSM ; clear CheckSum flag 00F2 2A45 00519 goto C_down 00520 00F3 083A 00521 mloop5b movfw ARG0H ; upload 00F4 3C75 00522 sublw 'u' 00F5 1D03 00523 btfss STATUS, Z 00F6 28FD 00524 goto mloop5c 00F7 083B 00525 movfw ARG0L 00F8 3C70 00526 sublw 'p' 00F9 1D03 00527 btfss STATUS, Z 00FA 28FD 00528 goto mloop5c 00FB 1027 00529 bcf DMODE, D_SRAM ; set ROM mode 00FC 2B42 00530 goto C_up 00531 00FD 083A 00532 mloop5c movfw ARG0H ; memory dump 00FE 3C64 00533 sublw 'd' 00FF 1D03 00534 btfss STATUS, Z 0100 2906 00535 goto mloop5d 0101 083B 00536 movfw ARG0L 0102 3C6D 00537 sublw 'm' 0103 1D03 00538 btfss STATUS, Z 0104 2906 00539 goto mloop5d 0105 2C75 00540 goto C_dump 00541 0106 083A 00542 mloop5d movfw ARG0H ; calc ROM CheckSum 0107 3C63 00543 sublw 'c' 0108 1D03 00544 btfss STATUS, Z 0109 2911 00545 goto mloop4 010A 083B 00546 movfw ARG0L 010B 3C72 00547 sublw 'r' 010C 1D03 00548 btfss STATUS, Z 010D 2911 00549 goto mloop4 00550 010E 1027 00551 bcf DMODE, D_SRAM ; set ROM mode 010F 16A7 00552 bsf DMODE, D_CKSM ; set CheckSum flag 0110 2A45 00553 goto C_down 00554 0111 00555 merror 00556 mloop4 PRINT err_s ; error 0111 01A0 M clrf VAR1 0112 3009 008A M PAGESEL err_s ; loop 0114 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0115 21E0 M call err_s 0116 118A M bcf PCLATH, 3 ; reset PCL 0117 39FF M andlw 0xff MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 9 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0118 1903 M btfsc STATUS, Z 0119 291D M goto $ + 4 011A 27A1 M call PutC 011B 0AA0 M incf VAR1, F 011C 2912 M goto $ - 10 011D 2829 00557 goto mloop1 00558 00559 ; 00560 ; command proc. 00561 ; 00562 ; "h" print help 00563 C_help PRINT ver_s ; print version 011E 01A0 M clrf VAR1 011F 300A 008A M PAGESEL ver_s ; loop 0121 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0122 2200 M call ver_s 0123 118A M bcf PCLATH, 3 ; reset PCL 0124 39FF M andlw 0xff 0125 1903 M btfsc STATUS, Z 0126 292A M goto $ + 4 0127 27A1 M call PutC 0128 0AA0 M incf VAR1, F 0129 291F M goto $ - 10 00564 PRINT help1_s ; print help1 012A 01A0 M clrf VAR1 012B 300B 008A M PAGESEL help1_s ; loop 012D 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 012E 2300 M call help1_s 012F 118A M bcf PCLATH, 3 ; reset PCL 0130 39FF M andlw 0xff 0131 1903 M btfsc STATUS, Z 0132 2936 M goto $ + 4 0133 27A1 M call PutC 0134 0AA0 M incf VAR1, F 0135 292B M goto $ - 10 00565 PRINT help2_s ; print help2 0136 01A0 M clrf VAR1 0137 300C 008A M PAGESEL help2_s ; loop 0139 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 013A 2400 M call help2_s 013B 118A M bcf PCLATH, 3 ; reset PCL 013C 39FF M andlw 0xff 013D 1903 M btfsc STATUS, Z 013E 2942 M goto $ + 4 013F 27A1 M call PutC 0140 0AA0 M incf VAR1, F 0141 2937 M goto $ - 10 0142 2829 00566 goto mloop1 00567 ; 00568 ; "i" print cartridge information 0143 1A05 00569 C_info btfsc PORTA, 4 ; LED is active? 0144 2952 00570 goto info1 00571 00572 norom PRINT norom_s ; print no ROM 0145 01A0 M clrf VAR1 0146 300A 008A M PAGESEL norom_s ; loop 0148 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0149 2237 M call norom_s 014A 118A M bcf PCLATH, 3 ; reset PCL 014B 39FF M andlw 0xff 014C 1903 M btfsc STATUS, Z 014D 2951 M goto $ + 4 014E 27A1 M call PutC 014F 0AA0 M incf VAR1, F 0150 2946 M goto $ - 10 0151 2829 00573 goto mloop1 00574 0152 1F27 00575 info1 btfss DMODE, D_INFO ; check information 0153 2945 00576 goto norom 00577 00578 PRINT inf1_s ; print title 0154 01A0 M clrf VAR1 0155 3008 008A M PAGESEL inf1_s ; loop 0157 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0158 207F M call inf1_s 0159 118A M bcf PCLATH, 3 ; reset PCL 015A 39FF M andlw 0xff MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 10 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 015B 1903 M btfsc STATUS, Z 015C 2960 M goto $ + 4 015D 27A1 M call PutC 015E 0AA0 M incf VAR1, F 015F 2955 M goto $ - 10 00579 0160 304E 00580 movlw CTITLE 0161 0084 00581 movwf FSR 0162 0800 00582 info2 movfw INDF ; get title 0163 39FF 00583 andlw 0xff 0164 1903 00584 btfsc STATUS, Z 0165 296C 00585 goto info3 ; expected null char 00586 0166 27A1 00587 call PutC ; print title char 0167 0A84 00588 incf FSR, F 0168 0804 00589 movfw FSR 0169 3C5E 00590 sublw CTITLE + 16 016A 1D03 00591 btfss STATUS, Z 016B 2962 00592 goto info2 00593 016C 27DF 00594 info3 call PutLF 00595 PRINT inf2_s 016D 01A0 M clrf VAR1 016E 3008 008A M PAGESEL inf2_s ; loop 0170 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0171 2088 M call inf2_s 0172 118A M bcf PCLATH, 3 ; reset PCL 0173 39FF M andlw 0xff 0174 1903 M btfsc STATUS, Z 0175 2979 M goto $ + 4 0176 27A1 M call PutC 0177 0AA0 M incf VAR1, F 0178 296E M goto $ - 10 0179 085E 00596 movfw CTYPE ; print type code 017A 2699 00597 call hex2pr 017B 302C 00598 movlw ',' 017C 27A1 00599 call PutC 017D 1C35 00600 btfss CTFLAG, C_CAR ; check known cartridge 017E 2981 00601 goto info3a 017F 2449 00602 call prunknw 0180 299E 00603 goto info3b 00604 info3a PRINTPB type_s, CTYPEB ; print type 0181 01A0 M clrf VAR1 ; pointer 0182 0864 M movfw CTYPEB 0183 00A1 M movwf VAR2 ; take bits M 0184 3009 008A M PAGESEL type_s ; (l1) 0186 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0187 2135 M call type_s ; string data 0188 118A M bcf PCLATH, 3 ; reset PCL 0189 00A2 M movwf VAR3 018A 0AA0 M incf VAR1, F ; incriment pointer M 018B 39FF M andlw 0xff 018C 1D03 M btfss STATUS, Z 018D 2998 M goto $ + 11 ; char != null (goto l2) M 018E 1003 M bcf STATUS, C 018F 0CA1 M rrf VAR2, F ; shift take bit 0190 0821 M movfw VAR2 0191 1903 M btfsc STATUS, Z ; take bit is zero? 0192 299D M goto $ + 11 ; VAR2 == 0, no flag. exit. M 0193 1C21 M btfss VAR2, 0 ; next is takely turn? 0194 2984 M goto $ - 16 ; no print "+", goto l1 M 0195 302B M movlw '+' 0196 27A1 M call PutC 0197 2984 M goto $ - 19 ; goto l1 M 0198 1C21 M btfss VAR2, 0 ; (l2), is takely turn? 0199 2984 M goto $ - 21 ; not use, next char M 019A 0822 M movfw VAR3 019B 27A1 M call PutC ; print char 019C 2984 M goto $ - 24 ; goto l1 M 019D 27DF 00605 call PutLF 00606 00607 info3b PRINT inf3_s ; ROM type MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 11 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 019E 01A0 M clrf VAR1 019F 3008 008A M PAGESEL inf3_s ; loop 01A1 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 01A2 2091 M call inf3_s 01A3 118A M bcf PCLATH, 3 ; reset PCL 01A4 39FF M andlw 0xff 01A5 1903 M btfsc STATUS, Z 01A6 29AA M goto $ + 4 01A7 27A1 M call PutC 01A8 0AA0 M incf VAR1, F 01A9 299F M goto $ - 10 01AA 0860 00608 movfw CRSIZE ; print size code 01AB 2699 00609 call hex2pr 01AC 302C 00610 movlw ',' 01AD 27A1 00611 call PutC 01AE 1CB5 00612 btfss CTFLAG, C_ROM ; check known cartridge 01AF 29B2 00613 goto info3c 01B0 2449 00614 call prunknw 01B1 29CA 00615 goto info3d 00616 info3c PRINTP roms_s, CRSIZE ; print ROM size 01B2 01A0 M clrf VAR1 ; pointer 01B3 0860 M movfw CRSIZE 01B4 00A1 M movwf VAR2 ; skip count M 01B5 3009 008A M PAGESEL roms_s ; (l1) 01B7 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 01B8 2100 M call roms_s ; string data 01B9 118A M bcf PCLATH, 3 ; reset PCL 01BA 00A2 M movwf VAR3 01BB 0AA0 M incf VAR1, F ; incriment pointer M 01BC 39FF M andlw 0xff 01BD 1D03 M btfss STATUS, Z 01BE 29C4 M goto $ + 6 ; char != null (goto l2) M 01BF 0821 M movfw VAR2 ; char == null 01C0 1903 M btfsc STATUS, Z 01C1 29CA M goto $ + 9 ; skip == 0, exit. M 01C2 03A1 M decf VAR2, F ; decriment skip count(skip) 01C3 29B5 M goto $ - 14 ; goto l1 M 01C4 0821 M movfw VAR2 ; skip == 0 ? (l2) 01C5 1D03 M btfss STATUS, Z 01C6 29B5 M goto $ - 17 ; skip, next char M 01C7 0822 M movfw VAR3 01C8 27A1 M call PutC ; print char 01C9 29B5 M goto $ - 20 ; goto l1 M 00617 00618 info3d PRINT inf4_s 01CA 01A0 M clrf VAR1 01CB 3008 008A M PAGESEL inf4_s ; loop 01CD 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 01CE 209A M call inf4_s 01CF 118A M bcf PCLATH, 3 ; reset PCL 01D0 39FF M andlw 0xff 01D1 1903 M btfsc STATUS, Z 01D2 29D6 M goto $ + 4 01D3 27A1 M call PutC 01D4 0AA0 M incf VAR1, F 01D5 29CB M goto $ - 10 01D6 085F 00619 movfw CSSIZE ; print size code 01D7 2699 00620 call hex2pr 01D8 302C 00621 movlw ',' 01D9 27A1 00622 call PutC 01DA 1D35 00623 btfss CTFLAG, C_RAM ; check known cartridge 01DB 29DE 00624 goto info3e 01DC 2449 00625 call prunknw 01DD 29F6 00626 goto info3f 00627 info3e PRINTP rams_s, CSSIZE ; print RAM size 01DE 01A0 M clrf VAR1 ; pointer 01DF 085F M movfw CSSIZE 01E0 00A1 M movwf VAR2 ; skip count M 01E1 3008 008A M PAGESEL rams_s ; (l1) 01E3 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 12 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01E4 20DF M call rams_s ; string data 01E5 118A M bcf PCLATH, 3 ; reset PCL 01E6 00A2 M movwf VAR3 01E7 0AA0 M incf VAR1, F ; incriment pointer M 01E8 39FF M andlw 0xff 01E9 1D03 M btfss STATUS, Z 01EA 29F0 M goto $ + 6 ; char != null (goto l2) M 01EB 0821 M movfw VAR2 ; char == null 01EC 1903 M btfsc STATUS, Z 01ED 29F6 M goto $ + 9 ; skip == 0, exit. M 01EE 03A1 M decf VAR2, F ; decriment skip count(skip) 01EF 29E1 M goto $ - 14 ; goto l1 M 01F0 0821 M movfw VAR2 ; skip == 0 ? (l2) 01F1 1D03 M btfss STATUS, Z 01F2 29E1 M goto $ - 17 ; skip, next char M 01F3 0822 M movfw VAR3 01F4 27A1 M call PutC ; print char 01F5 29E1 M goto $ - 20 ; goto l1 M 00628 00629 info3f PRINT inf6_s ; used function flag 01F6 01A0 M clrf VAR1 01F7 3008 008A M PAGESEL inf6_s ; loop 01F9 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 01FA 20AC M call inf6_s 01FB 118A M bcf PCLATH, 3 ; reset PCL 01FC 39FF M andlw 0xff 01FD 1903 M btfsc STATUS, Z 01FE 2A02 M goto $ + 4 01FF 27A1 M call PutC 0200 0AA0 M incf VAR1, F 0201 29F7 M goto $ - 10 00630 PRINTPB func_s, CFUNC 0202 01A0 M clrf VAR1 ; pointer 0203 0863 M movfw CFUNC 0204 00A1 M movwf VAR2 ; take bits M 0205 3008 008A M PAGESEL func_s ; (l1) 0207 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0208 20BB M call func_s ; string data 0209 118A M bcf PCLATH, 3 ; reset PCL 020A 00A2 M movwf VAR3 020B 0AA0 M incf VAR1, F ; incriment pointer M 020C 39FF M andlw 0xff 020D 1D03 M btfss STATUS, Z 020E 2A19 M goto $ + 11 ; char != null (goto l2) M 020F 1003 M bcf STATUS, C 0210 0CA1 M rrf VAR2, F ; shift take bit 0211 0821 M movfw VAR2 0212 1903 M btfsc STATUS, Z ; take bit is zero? 0213 2A1E M goto $ + 11 ; VAR2 == 0, no flag. exit. M 0214 1C21 M btfss VAR2, 0 ; next is takely turn? 0215 2A05 M goto $ - 16 ; no print "+", goto l1 M 0216 302B M movlw '+' 0217 27A1 M call PutC 0218 2A05 M goto $ - 19 ; goto l1 M 0219 1C21 M btfss VAR2, 0 ; (l2), is takely turn? 021A 2A05 M goto $ - 21 ; not use, next char M 021B 0822 M movfw VAR3 021C 27A1 M call PutC ; print char 021D 2A05 M goto $ - 24 ; goto l1 M 021E 27DF 00631 call PutLF 00632 00633 PRINT inf5_s 021F 01A0 M clrf VAR1 0220 3008 008A M PAGESEL inf5_s ; loop 0222 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 13 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0223 20A3 M call inf5_s 0224 118A M bcf PCLATH, 3 ; reset PCL 0225 39FF M andlw 0xff 0226 1903 M btfsc STATUS, Z 0227 2A2B M goto $ + 4 0228 27A1 M call PutC 0229 0AA0 M incf VAR1, F 022A 2A20 M goto $ - 10 022B 0862 00634 movfw CSUM_H ; get SUM MSB 022C 00CC 00635 movwf CKSUMH 022D 00C4 00636 movwf CMP_H 022E 2699 00637 call hex2pr 00638 022F 0861 00639 movfw CSUM_L ; get SUM LSB 0230 00CD 00640 movwf CKSUML 0231 00C5 00641 movwf CMP_L 00642 0232 2699 00643 call hex2pr ; print sum 00644 0233 3028 00645 movlw '(' ; print calc'ed sum 0234 27A1 00646 call PutC 0235 084C 00647 movfw CKSUMH ; sum = sum + 0236 07C5 00648 addwf CMP_L, F ; sum_l + sum_h 0237 1803 00649 btfsc STATUS, C 0238 0AC4 00650 incf CMP_H, F 0239 084D 00651 movfw CKSUML 023A 07C5 00652 addwf CMP_L, F 023B 1803 00653 btfsc STATUS, C 023C 0AC4 00654 incf CMP_H, F 00655 023D 0844 00656 movfw CMP_H 023E 2699 00657 call hex2pr 023F 0845 00658 movfw CMP_L 0240 2699 00659 call hex2pr 0241 3029 00660 movlw ')' 0242 27A1 00661 call PutC 0243 27DF 00662 call PutLF 00663 0244 2829 00664 goto mloop1 00665 00666 ; 00667 ; "dl {ADDR} {END}" download with UUENCODE 00668 ; "ds" download SRAM with UUENCODE in case of DMODE:D_SRAM == 1 00669 ; "cr {ADDR} {END}" caluculate ROM checksum DMODE:D_CKSM == 1 00670 ; "cs" caluculate SRAM checksum 0245 1E05 00671 C_down btfss PORTA, 4 ; LED is active? 0246 2945 00672 goto norom ; print no ROM 00673 0247 1F27 00674 btfss DMODE, D_INFO ; infomation active? 0248 2945 00675 goto norom 00676 0249 1EA7 00677 btfss DMODE, D_CKSM 024A 2A4E 00678 goto sram0 00679 024B 01B4 00680 clrf COLUMN ; calculate animation 024C 3020 00681 movlw ' ' ; initialize 024D 27A1 00682 call PutC 00683 024E 1827 00684 sram0 btfsc DMODE, D_SRAM ; check DMODE 024F 2A5F 00685 goto sram1 00686 ; ROM dl mode 0250 3003 00687 movlw 3 ; Check ABS DUMP 0251 022B 00688 subwf ARGC, W 0252 1903 00689 btfsc STATUS, Z 0253 2B15 00690 goto down6 ; Absolute DUMP 00691 0254 0835 00692 movfw CTFLAG ; correct cartridge flag 0255 3902 00693 andlw BS(C_ROM) ; check known size ROM 0256 1903 00694 btfsc STATUS, Z 0257 2A5A 00695 goto down0 00696 0258 2449 00697 unknown call prunknw ; print unknown type 0259 2829 00698 goto mloop1 00699 025A 3001 00700 down0 movlw 1 ; DMODE:0 == 0, download ROM 025B 022B 00701 subwf ARGC, W 025C 1903 00702 btfsc STATUS, Z 025D 2A7C 00703 goto down1 00704 025E 2911 00705 goto merror ; ARGC != [1|3], error 00706 00707 ; unknown type is set to MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 14 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 00708 ; MBC5 + SRAM 025F 0835 00709 sram1 movfw CTFLAG ; SRAM dl mode, correct cartridge flag 0260 3904 00710 andlw BS(C_RAM) ; check known size ROM, SRAM 0261 1D03 00711 btfss STATUS, Z 0262 2A58 00712 goto unknown ; reading with unknown SRAM size 00713 0263 1A64 00714 btfsc CTYPEB, CT_MBC2 ; check have SRAM or MBC2 0264 2A74 00715 goto sram1b 00716 0265 18E4 00717 btfsc CTYPEB, CT_SRAM 0266 2A74 00718 goto sram1b 00719 00720 nosram PRINT only_s ; haven't SRAM 0267 01A0 M clrf VAR1 0268 3009 008A M PAGESEL only_s ; loop 026A 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 026B 219C M call only_s 026C 118A M bcf PCLATH, 3 ; reset PCL 026D 39FF M andlw 0xff 026E 1903 M btfsc STATUS, Z 026F 2A73 M goto $ + 4 0270 27A1 M call PutC 0271 0AA0 M incf VAR1, F 0272 2A68 M goto $ - 10 0273 2829 00721 goto mloop1 00722 0274 00723 sram1b 0274 3009 008A 00724 PAGESEL ram_t ; translate SRAM bank 0276 085F 00725 movfw CSSIZE Message[306]: Crossing page boundary -- ensure page bits are set. 0277 2196 00726 call ram_t 0278 00B3 00727 movwf CUBANK_L 0279 118A 00728 bcf PCLATH, 3 ; reset PCL 027A 01B2 00729 clrf CUBANK_H 027B 2A89 00730 goto down3 ; all bank down only at SRAM mode 00731 027C 00732 down1 027C 3009 008A 00733 PAGESEL rom_t ; translate ROM bank 027E 1003 00734 bcf STATUS, C 027F 0D60 00735 rlf CRSIZE, W ; W = rom_t[2 * CRSIZE] 0280 0084 00736 movwf FSR Message[306]: Crossing page boundary -- ensure page bits are set. 0281 2183 00737 call rom_t 0282 00B2 00738 movwf CUBANK_H 0283 3009 008A 00739 PAGESEL rom_t 0285 0A04 00740 incf FSR, W Message[306]: Crossing page boundary -- ensure page bits are set. 0286 2183 00741 call rom_t 0287 00B3 00742 movwf CUBANK_L 0288 118A 00743 bcf PCLATH, 3 ; reset PCL 00744 0289 01CC 00745 down3 clrf CKSUMH ; clear check sum 028A 01CD 00746 clrf CKSUML 028B 01B0 00747 clrf GBBANK_H ; set bank 0 028C 01B1 00748 clrf GBBANK_L ; set bank 0 028D 1C27 00749 btfss DMODE, D_SRAM ; check DMODE 028E 2A91 00750 goto sram2 00751 028F 274C 00752 call RAMBank ; SRAM mode, reset BANK 0290 2A92 00753 goto sram3 00754 0291 272C 00755 sram2 call ROMBank ; ROM mode, reset BANK 0292 1AA7 00756 sram3 btfsc DMODE, D_CKSM ; calc only? 0293 2ABA 00757 goto down4 ; skip print header 00758 00759 PRINT begin_s ; print header 0294 01A0 M clrf VAR1 0295 3009 008A M PAGESEL begin_s ; loop 0297 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0298 21C1 M call begin_s 0299 118A M bcf PCLATH, 3 ; reset PCL 029A 39FF M andlw 0xff 029B 1903 M btfsc STATUS, Z 029C 2AA0 M goto $ + 4 029D 27A1 M call PutC 029E 0AA0 M incf VAR1, F 029F 2A95 M goto $ - 10 02A0 24EC 00760 call GenFN ; generate filename 02A1 3008 00761 movlw 8 ; print filename 02A2 00A0 00762 movwf VAR1 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 15 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 02A3 30A0 00763 movlw ASCBUF 02A4 0084 00764 movwf FSR 02A5 0800 00765 down3b movfw INDF 02A6 27A1 00766 call PutC 02A7 0A84 00767 incf FSR, F 02A8 0BA0 00768 decfsz VAR1, F 02A9 2AA5 00769 goto down3b 00770 02AA 302E 00771 movlw '.' ; add extention 02AB 27A1 00772 call PutC 00773 02AC 1827 00774 btfsc DMODE, D_SRAM 02AD 2AB3 00775 goto sram3a 00776 02AE 3047 00777 movlw 'G' ; ROM mode 02AF 27A1 00778 call PutC 02B0 3042 00779 movlw 'B' 02B1 27A1 00780 call PutC 02B2 2AB9 00781 goto sram3b 00782 02B3 3053 00783 sram3a movlw 'S' ; SRAM mode 02B4 27A1 00784 call PutC 02B5 3041 00785 movlw 'A' 02B6 27A1 00786 call PutC 02B7 3056 00787 movlw 'V' 02B8 27A1 00788 call PutC 00789 02B9 27DF 00790 sram3b call PutLF ; line feed 00791 02BA 1C27 00792 down4 btfss DMODE, D_SRAM ; bank loop 02BB 2AD3 00793 goto sram4 00794 02BC 30A0 00795 movlw 0xa0 ; SRAM mode 02BD 00C6 00796 movwf D_ADRH ; addr = 0xa000 to 0xbfff 00797 02BE 1E64 00798 btfss CTYPEB, CT_MBC2 ; is MBC2 type ? 02BF 2AC6 00799 goto sram3c 00800 02C0 30A1 00801 movlw 0xa1 ; MBC2, addr = 0xa000 - 0xa1ff 02C1 00C8 00802 movwf E_ADRH 02C2 01B2 00803 clrf CUBANK_H 02C3 3001 00804 movlw 1 02C4 00B3 00805 movwf CUBANK_L ; N of BANK = 1 02C5 2ADF 00806 goto sram5 00807 02C6 3001 00808 sram3c movlw 1 02C7 025F 00809 subwf CSSIZE, W 02C8 1D03 00810 btfss STATUS, Z ; SRAM size is 2KB? 02C9 2AD0 00811 goto sram3d 00812 02CA 30A7 00813 movlw 0xa7 ; at SRAM 2KB, - 0xa7ff 02CB 00C8 00814 movwf E_ADRH 02CC 01B2 00815 clrf CUBANK_H 02CD 3001 00816 movlw 1 02CE 00B3 00817 movwf CUBANK_L ; N of BANK = 1 02CF 2ADF 00818 goto sram5 00819 02D0 30BF 00820 sram3d movlw 0xbf ; MBC1 and not 2KB SRAM, - 0xbfff 02D1 00C8 00821 movwf E_ADRH 02D2 2ADF 00822 goto sram5 00823 02D3 3040 00824 sram4 movlw 0x40 ; set ROM bank window 02D4 00C6 00825 movwf D_ADRH ; addr = 0x4000 to 0x7fff 02D5 307F 00826 movlw 0x7f 02D6 00C8 00827 movwf E_ADRH 00828 02D7 0831 00829 movfw GBBANK_L ; first bank? 02D8 1D03 00830 btfss STATUS, Z 02D9 2ADF 00831 goto sram5 00832 02DA 0830 00833 movfw GBBANK_H 02DB 1D03 00834 btfss STATUS, Z 02DC 2ADF 00835 goto sram5 00836 02DD 1346 00837 bcf D_ADRH, 6 ; if bank == 0, 02DE 1348 00838 bcf E_ADRH, 6 ; translate 0x0000 - 0x3fff 00839 02DF 01C7 00840 sram5 clrf D_ADRL 02E0 30FF 00841 movlw 0xff 02E1 00C9 00842 movwf E_ADRL 00843 02E2 1EA7 00844 btfss DMODE, D_CKSM ; checksum calc mode? MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 16 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 02E3 2AE7 00845 goto sram4a 00846 02E4 258E 00847 call TurnC ; put loading animation 02E5 24C7 00848 call CalcSUM ; calc SUM(D_ADR to E_ADR) 02E6 2AEC 00849 goto down4b 00850 02E7 25AE 00851 sram4a call UUDump ; start dump in UUENCODE 02E8 39FF 00852 andlw 0xff ; aborted? 02E9 1903 00853 btfsc STATUS, Z 02EA 2AEC 00854 goto down4b 00855 02EB 2BD7 00856 goto cabort ; print abort, done 00857 02EC 3001 00858 down4b movlw 1 02ED 07B1 00859 addwf GBBANK_L, F ; window dumped, incriment bank and end chec k 02EE 1803 00860 btfsc STATUS, C 02EF 0AB0 00861 incf GBBANK_H, F ; carried, incriment MSB 00862 02F0 0832 00863 movfw CUBANK_H ; compare bank, 02F1 0230 00864 subwf GBBANK_H, W ; end of bank reached ? 02F2 1C03 00865 btfss STATUS, C ; GB - CU >= 0 02F3 2AF8 00866 goto down4d 00867 02F4 0833 00868 movfw CUBANK_L 02F5 0231 00869 subwf GBBANK_L, W 02F6 1903 00870 btfsc STATUS, Z 02F7 2AFE 00871 goto down5 ; end of bank 00872 02F8 1C27 00873 down4d btfss DMODE, D_SRAM ; not end, continue 02F9 2AFC 00874 goto sram6 00875 02FA 274C 00876 call RAMBank ; SRAM mode, set bank 02FB 2ABA 00877 goto down4 00878 02FC 272C 00879 sram6 call ROMBank ; set bank 02FD 2ABA 00880 goto down4 ; next bank 00881 02FE 1AA7 00882 down5 btfsc DMODE, D_CKSM ; check calc only 02FF 2B0D 00883 goto down5a ; skip print tailer 00884 00885 PRINT end_s ; print tailer 0300 01A0 M clrf VAR1 0301 3009 008A M PAGESEL end_s ; loop 0303 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0304 21D6 M call end_s 0305 118A M bcf PCLATH, 3 ; reset PCL 0306 39FF M andlw 0xff 0307 1903 M btfsc STATUS, Z 0308 2B0C M goto $ + 4 0309 27A1 M call PutC 030A 0AA0 M incf VAR1, F 030B 2B01 M goto $ - 10 030C 2829 00886 goto mloop1 ; dump done. 00887 030D 3008 00888 down5a movlw 0x08 ; delete animation char 030E 27A1 00889 call PutC 030F 084C 00890 movfw CKSUMH ; print check sum 0310 2699 00891 call hex2pr 0311 084D 00892 movfw CKSUML 0312 2699 00893 call hex2pr 0313 27DF 00894 call PutLF 0314 2829 00895 goto mloop1 ; calc done. 00896 0315 01CD 00897 down6 clrf CKSUML ; absolute dump 0316 01CC 00898 clrf CKSUMH 0317 1AA7 00899 btfsc DMODE, D_CKSM 0318 2B31 00900 goto down6a 00901 00902 PRINT begin_s ; print header 0319 01A0 M clrf VAR1 031A 3009 008A M PAGESEL begin_s ; loop 031C 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 031D 21C1 M call begin_s 031E 118A M bcf PCLATH, 3 ; reset PCL 031F 39FF M andlw 0xff 0320 1903 M btfsc STATUS, Z 0321 2B25 M goto $ + 4 0322 27A1 M call PutC 0323 0AA0 M incf VAR1, F MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 17 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0324 2B1A M goto $ - 10 00903 PRINT partf_s ; dummy file name 0325 01A0 M clrf VAR1 0326 3009 008A M PAGESEL partf_s ; loop 0328 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 0329 21CD M call partf_s 032A 118A M bcf PCLATH, 3 ; reset PCL 032B 39FF M andlw 0xff 032C 1903 M btfsc STATUS, Z 032D 2B31 M goto $ + 4 032E 27A1 M call PutC 032F 0AA0 M incf VAR1, F 0330 2B26 M goto $ - 10 0331 083C 00904 down6a movfw ARG1H 0332 00C6 00905 movwf D_ADRH ; set start addr 0333 083D 00906 movfw ARG1L 0334 00C7 00907 movwf D_ADRL 0335 083E 00908 movfw ARG2H 0336 00C8 00909 movwf E_ADRH ; set end addr 0337 083F 00910 movfw ARG2L 0338 00C9 00911 movwf E_ADRL 0339 1EA7 00912 btfss DMODE, D_CKSM 033A 2B3D 00913 goto down6b 00914 033B 24C7 00915 call CalcSUM ; calc checksum 033C 2B0D 00916 goto down5a ; print sum 00917 033D 25AE 00918 down6b call UUDump 033E 39FF 00919 andlw 0xff 033F 1903 00920 btfsc STATUS, Z 0340 2AFE 00921 goto down5 ; print tailer, done 00922 0341 2BD7 00923 goto cabort ; print abort, done 00924 00925 ; 00926 ; "up" upload with UUDECODE 00927 ; "us" upload to SRAM with UUENCODE 0342 1E05 00928 C_up btfss PORTA, 4 ; LED is active? 0343 2945 00929 goto norom ; print no ROM 00930 0344 3003 00931 movlw 3 ; arg1, arg2 given 0345 022B 00932 subwf ARGC, W 0346 1903 00933 btfsc STATUS, Z 0347 2BE4 00934 goto up13 ; ABS upload mode 00935 0348 1F27 00936 btfss DMODE, D_INFO ; infomation active? 0349 2945 00937 goto norom 00938 034A 0835 00939 movfw CTFLAG ; correct cartridge flag 034B 3906 00940 andlw BS(C_ROM) | BS(C_RAM) ; check known size ROM, SRAM 034C 1D03 00941 btfss STATUS, Z 034D 2A58 00942 goto unknown ; unknown cartridge 00943 034E 3001 00944 movlw 1 ; arg1 given 034F 022B 00945 subwf ARGC, W 0350 1903 00946 btfsc STATUS, Z 0351 2B53 00947 goto up1 00948 0352 2911 00949 goto merror ; argc != [1|3], goto error 00950 0353 1C27 00951 up1 btfss DMODE, D_SRAM ; check DMODE 0354 2B62 00952 goto up3 00953 0355 1A64 00954 up2 btfsc CTYPEB, CT_MBC2 ; check have SRAM or MBC2 0356 2B5A 00955 goto up2a 00956 0357 18E4 00957 btfsc CTYPEB, CT_SRAM 0358 2B5A 00958 goto up2a 00959 0359 2A67 00960 goto nosram 00961 035A 00962 up2a 035A 3009 008A 00963 PAGESEL ram_t ; translare SRAM bank 035C 085F 00964 movfw CSSIZE Message[306]: Crossing page boundary -- ensure page bits are set. 035D 2196 00965 call ram_t 035E 00B3 00966 movwf CUBANK_L 035F 118A 00967 bcf PCLATH, 3 ; reset PCL 0360 01B2 00968 clrf CUBANK_H 0361 2B6F 00969 goto up4 00970 ; all bank down MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 18 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0362 00971 up3 0362 3009 008A 00972 PAGESEL rom_t ; translate ROM bank 0364 1003 00973 bcf STATUS, C 0365 0D60 00974 rlf CRSIZE, W 0366 0084 00975 movwf FSR Message[306]: Crossing page boundary -- ensure page bits are set. 0367 2183 00976 call rom_t 0368 00B2 00977 movwf CUBANK_H 0369 0A04 00978 incf FSR, W 036A 3009 008A 00979 PAGESEL rom_t Message[306]: Crossing page boundary -- ensure page bits are set. 036C 2183 00980 call rom_t 036D 00B3 00981 movwf CUBANK_L 036E 118A 00982 bcf PCLATH, 3 ; reset PCL 00983 036F 01CC 00984 up4 clrf CKSUMH ; clear check sum 0370 01CD 00985 clrf CKSUML 0371 23FA 00986 call Wbegin ; wait the begin 0372 39FF 00987 andlw 0xff 0373 1D03 00988 btfss STATUS, Z 0374 2BD7 00989 goto up12 00990 0375 01B0 00991 clrf GBBANK_H ; set bank 0 0376 01B1 00992 clrf GBBANK_L 0377 1C27 00993 btfss DMODE, D_SRAM ; check DMODE 0378 2B7B 00994 goto up4a 00995 0379 274C 00996 call RAMBank 037A 2B7C 00997 goto up5 00998 037B 272C 00999 up4a call ROMBank 01000 037C 1C27 01001 up5 btfss DMODE, D_SRAM ; bank loop 037D 2B95 01002 goto up6 01003 037E 30A0 01004 movlw 0xa0 ; SRAM mode 037F 00C6 01005 movwf D_ADRH ; addr = 0xa000 to 0xbfff 01006 0380 1E64 01007 btfss CTYPEB, CT_MBC2 ; is MBC2 type? 0381 2B88 01008 goto up5a 01009 0382 30A1 01010 movlw 0xa1 ; MBC2, addr = 0xa000 - 0xa1ff 0383 00C8 01011 movwf E_ADRH 0384 3001 01012 movlw 1 0385 00B3 01013 movwf CUBANK_L ; N of BANK = 1 0386 01B2 01014 clrf CUBANK_H 0387 2BA1 01015 goto up7 01016 0388 3001 01017 up5a movlw 1 0389 025F 01018 subwf CSSIZE, W 038A 1D03 01019 btfss STATUS, Z ; SRAM size is 2KB? 038B 2B92 01020 goto up5b 01021 038C 30A7 01022 movlw 0xa7 ; at SRAM 2KB, - 0xa7ff 038D 00C8 01023 movwf E_ADRH 038E 3001 01024 movlw 1 038F 00B3 01025 movwf CUBANK_L ; N of BANK = 1 0390 01B2 01026 clrf CUBANK_H 0391 2B95 01027 goto up6 01028 0392 30BF 01029 up5b movlw 0xbf ; MBC1 and SRAM not 2KB 0393 00C8 01030 movwf E_ADRH 0394 2BA1 01031 goto up7 01032 0395 3040 01033 up6 movlw 0x40 ; set ROM bank window 0396 00C6 01034 movwf D_ADRH ; addr = 0x4000 to 0x7fff 0397 307F 01035 movlw 0x7f 0398 00C8 01036 movwf E_ADRH 01037 0399 0831 01038 movfw GBBANK_L ; first bank? 039A 1D03 01039 btfss STATUS, Z 039B 2BA1 01040 goto up7 039C 0830 01041 movfw GBBANK_H 039D 1D03 01042 btfss STATUS, Z 039E 2BA1 01043 goto up7 01044 039F 1346 01045 bcf D_ADRH, 6 ; if bank == 0, 03A0 1348 01046 bcf E_ADRH, 6 ; translate 0x0000 - 0x3fff 01047 03A1 01C7 01048 up7 clrf D_ADRL 03A2 30FF 01049 movlw 0xff 03A3 00C9 01050 movwf E_ADRL MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 19 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01051 03A4 2548 01052 call UURecv ; start receive 03A5 39FF 01053 andlw 0xff ; aborted? 03A6 1903 01054 btfsc STATUS, Z 03A7 2BA9 01055 goto up8 01056 03A8 2BD7 01057 goto up12 ; abort exit. 01058 03A9 3001 01059 up8 movlw 1 03AA 07B1 01060 addwf GBBANK_L, F ; window dumped, incriment bank 03AB 1803 01061 btfsc STATUS, C 03AC 0AB0 01062 incf GBBANK_H, F 01063 03AD 0833 01064 movfw CUBANK_L ; compare bank 03AE 0231 01065 subwf GBBANK_L, W ; GB >= CU ? 03AF 1C03 01066 btfss STATUS, C 03B0 2BB5 01067 goto up8b 03B1 0832 01068 movfw CUBANK_H 03B2 0230 01069 subwf GBBANK_H, W 03B3 1803 01070 btfsc STATUS, C 03B4 2BBF 01071 goto up10 ; end of bank 01072 03B5 3008 01073 up8b movlw 0x08 ; continue, print bank meter 03B6 27A1 01074 call PutC 03B7 306F 01075 movlw 'o' 03B8 27A1 01076 call PutC 01077 03B9 1C27 01078 btfss DMODE, D_SRAM 03BA 2BBD 01079 goto up9 01080 03BB 274C 01081 call RAMBank ; SRAM mode, set bank 03BC 2B7C 01082 goto up5 01083 03BD 272C 01084 up9 call ROMBank ; set bank 03BE 2B7C 01085 goto up5 ; next bank 01086 03BF 241A 01087 up10 call Wend ; wait the end 03C0 39FF 01088 andlw 0xff 03C1 1D03 01089 btfss STATUS, Z 03C2 2BD7 01090 goto up12 01091 01092 up11 PRINT done_s 03C3 01A0 M clrf VAR1 03C4 300A 008A M PAGESEL done_s ; loop 03C6 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 03C7 2277 M call done_s 03C8 118A M bcf PCLATH, 3 ; reset PCL 03C9 39FF M andlw 0xff 03CA 1903 M btfsc STATUS, Z 03CB 2BCF M goto $ + 4 03CC 27A1 M call PutC 03CD 0AA0 M incf VAR1, F 03CE 2BC4 M goto $ - 10 03CF 084C 01093 movfw CKSUMH ; print check sum 03D0 2699 01094 call hex2pr 03D1 084D 01095 movfw CKSUML 03D2 2699 01096 call hex2pr 03D3 302C 01097 movlw ',' 03D4 27A1 01098 call PutC 03D5 16A7 01099 bsf DMODE, D_CKSM ; set calc mode 03D6 2A45 01100 goto C_down ; calculate CheckSUM 01101 03D7 01102 cabort 01103 up12 PRINT abort_s ; print abort 03D7 01A0 M clrf VAR1 03D8 300C 008A M PAGESEL abort_s ; loop 03DA 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 03DB 24F1 M call abort_s 03DC 118A M bcf PCLATH, 3 ; reset PCL 03DD 39FF M andlw 0xff 03DE 1903 M btfsc STATUS, Z 03DF 2BE3 M goto $ + 4 03E0 27A1 M call PutC 03E1 0AA0 M incf VAR1, F 03E2 2BD8 M goto $ - 10 03E3 2829 01104 goto mloop1 ; done. 01105 01106 ; absolute dump 03E4 083C 01107 up13 movfw ARG1H 03E5 00C6 01108 movwf D_ADRH ; set start addr MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 20 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 03E6 083D 01109 movfw ARG1L 03E7 00C7 01110 movwf D_ADRL 03E8 083E 01111 movfw ARG2H 03E9 00C8 01112 movwf E_ADRH ; set end addr 03EA 083F 01113 movfw ARG2L 03EB 00C9 01114 movwf E_ADRL 01115 03EC 23FA 01116 call Wbegin ; wait the begin 03ED 39FF 01117 andlw 0xff 03EE 1903 01118 btfsc STATUS, Z ; aborted? 03EF 2BD7 01119 goto up12 01120 03F0 2548 01121 call UURecv ; get uudecode 03F1 39FF 01122 andlw 0xff 03F2 1D03 01123 btfss STATUS, Z ; aborted? 03F3 2BD7 01124 goto up12 01125 03F4 27DF 01126 call PutLF ; line feed 03F5 241A 01127 call Wend ; wait the begin 03F6 39FF 01128 andlw 0xff 03F7 1903 01129 btfsc STATUS, Z ; aborted? 03F8 2BD7 01130 goto up12 01131 03F9 2BC3 01132 goto up11 ; print sum, done 01133 01134 01135 ; wait "begin" 01136 ; 03FA 01137 Wbegin 03FA 1283 01138 BANKSEL 0 01139 PRINT wbeg_s ; print the waiting 03FB 01A0 M clrf VAR1 03FC 300A 008A M PAGESEL wbeg_s ; loop 03FE 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 03FF 225C M call wbeg_s 0400 118A M bcf PCLATH, 3 ; reset PCL 0401 39FF M andlw 0xff 0402 1903 M btfsc STATUS, Z 0403 2C07 M goto $ + 4 0404 27A1 M call PutC 0405 0AA0 M incf VAR1, F 0406 2BFC M goto $ - 10 01140 0407 14A7 01141 bsf DMODE, D_ECHO ; set noecho 0408 27A7 01142 call GetS ; wait "begin" 0409 3CFF 01143 sublw 0xff 040A 1D03 01144 btfss STATUS, Z 040B 2C0E 01145 goto wbeg2 01146 040C 10A7 01147 bcf DMODE, D_ECHO ; echo 040D 34FF 01148 retlw 0xff ; ESC expected, abort 040E 01149 wbeg2 040E 1683 01150 BANKSEL LBUF Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 040F 0830 01151 movfw LBUF 0410 3C62 01152 sublw 'b' 0411 1D03 01153 btfss STATUS, Z 0412 2BFA 01154 goto Wbegin 01155 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0413 0831 01156 movfw LBUF + 1 0414 3C65 01157 sublw 'e' 0415 1D03 01158 btfss STATUS, Z 0416 2BFA 01159 goto Wbegin 01160 0417 1283 01161 BANKSEL 0 0418 10A7 01162 bcf DMODE, D_ECHO ; echo 0419 3400 01163 retlw 0 01164 01165 01166 ; wait "end" 01167 ; 041A 01168 Wend 041A 1283 01169 BANKSEL 0 01170 PRINT wend_s ; print the waiting 041B 01A0 M clrf VAR1 041C 300A 008A M PAGESEL wend_s ; loop 041E 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 041F 2269 M call wend_s 0420 118A M bcf PCLATH, 3 ; reset PCL MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 21 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0421 39FF M andlw 0xff 0422 1903 M btfsc STATUS, Z 0423 2C27 M goto $ + 4 0424 27A1 M call PutC 0425 0AA0 M incf VAR1, F 0426 2C1C M goto $ - 10 01171 0427 14A7 01172 bsf DMODE, D_ECHO ; set noecho 0428 27A7 01173 call GetS ; wait the end 0429 3CFF 01174 sublw 0xff 042A 1D03 01175 btfss STATUS, Z 042B 2C2E 01176 goto wend2 01177 042C 10A7 01178 bcf DMODE, D_ECHO ; echo 042D 34FF 01179 retlw 0xff ; ESC expected, abort 01180 042E 01181 wend2 042E 1683 01182 BANKSEL LBUF Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 042F 0830 01183 movfw LBUF 0430 3C65 01184 sublw 'e' 0431 1D03 01185 btfss STATUS, Z 0432 2C1A 01186 goto Wend 01187 Message[302]: Register in operand not in bank 0. Ensure that bank bits are correct. 0433 0831 01188 movfw LBUF + 1 0434 3C6E 01189 sublw 'n' 0435 1D03 01190 btfss STATUS, Z 0436 2C1A 01191 goto Wend 01192 0437 1283 01193 BANKSEL 0 0438 10A7 01194 bcf DMODE, D_ECHO ; echo 0439 3400 01195 retlw 0 01196 01197 ; 01198 ; get cartdidge information 01199 ; 043A 3001 01200 ChkCart movlw 0x01 ; check cartridge 043B 00AD 01201 movwf GBADRH 043C 01AE 01202 clrf GBADRL 043D 276C 01203 call GBread 043E 082F 01204 movfw GBDATA 043F 1D03 01205 btfss STATUS, Z ; ROM[0x0100] == 0x00 0440 2C47 01206 goto ginf1 0441 3001 01207 movlw 0x01 0442 00AE 01208 movwf GBADRL 0443 276C 01209 call GBread 0444 082F 01210 movfw GBDATA 0445 3CC3 01211 sublw 0xc3 0446 1D03 01212 btfss STATUS, Z ; ROM[0x0101] == 0xc3 0447 34FF 01213 ginf1 retlw 0xff ; invalid cartridge, return 0x80 01214 0448 3400 01215 retlw 0 01216 01217 ; 01218 ; print unknown 01219 prunknw PRINT unknw_s ; print unknown types 0449 01A0 M clrf VAR1 044A 3009 008A M PAGESEL unknw_s ; loop 044C 0820 M movfw VAR1 Message[306]: Crossing page boundary -- ensure page bits are set. 044D 21A7 M call unknw_s 044E 118A M bcf PCLATH, 3 ; reset PCL 044F 39FF M andlw 0xff 0450 1903 M btfsc STATUS, Z 0451 2C55 M goto $ + 4 0452 27A1 M call PutC 0453 0AA0 M incf VAR1, F 0454 2C4A M goto $ - 10 0455 0008 01220 return 01221 01222 01223 ; 01224 ; "wd" write data 0456 083C 01225 C_wd movfw ARG1H 0457 00AD 01226 movwf GBADRH 0458 083D 01227 movfw ARG1L 0459 00AE 01228 movwf GBADRL 045A 083F 01229 movfw ARG2L 045B 00AF 01230 movwf GBDATA 045C 277D 01231 call GBwrite 01232 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 22 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 045D 2829 01233 goto mloop1 01234 ; 01235 ; "rd" read data 045E 083C 01236 C_read movfw ARG1H 045F 00AD 01237 movwf GBADRH 0460 083D 01238 movfw ARG1L 0461 00AE 01239 movwf GBADRL 0462 276C 01240 call GBread 0463 082F 01241 movfw GBDATA 0464 2699 01242 call hex2pr 0465 27DF 01243 call PutLF 01244 0466 2829 01245 goto mloop1 01246 ; 01247 ; "br" set ROM bank 0467 1E05 01248 C_sbR btfss PORTA, 4 ; LED is active? 0468 2945 01249 goto norom ; print no ROM 01250 0469 083C 01251 movfw ARG1H 046A 00B0 01252 movwf GBBANK_H 046B 083D 01253 movfw ARG1L 046C 00B1 01254 movwf GBBANK_L 046D 272C 01255 call ROMBank 01256 046E 2829 01257 goto mloop1 01258 ; 01259 ; "bs" set SRAM bank 046F 1E05 01260 C_sbS btfss PORTA, 4 ; LED is active? 0470 2945 01261 goto norom ; print no ROM 01262 0471 083D 01263 movfw ARG1L 0472 00B1 01264 movwf GBBANK_L 0473 274C 01265 call RAMBank 01266 0474 2829 01267 goto mloop1 01268 01269 ; 01270 ; "dm" dump memory 0475 1207 01271 C_dump bcf PORTC, P_CTS ; CTS goes low restart flow 0476 3001 01272 movlw 1 ; no given address? 0477 022B 01273 subwf ARGC, W 0478 1D03 01274 btfss STATUS, Z 0479 2C81 01275 goto cdmp0a 01276 047A 084A 01277 movfw DMCURH ; no given 047B 00C6 01278 movwf D_ADRH 047C 00C8 01279 movwf E_ADRH 047D 084B 01280 movfw DMCURL 047E 00C7 01281 movwf D_ADRL 047F 00C9 01282 movwf E_ADRL 0480 2C8B 01283 goto cdmp0b 01284 0481 3002 01285 cdmp0a movlw 2 ; 1 set address ? 0482 022B 01286 subwf ARGC, W 0483 1D03 01287 btfss STATUS, Z 0484 2C97 01288 goto cdmp0c 01289 0485 083C 01290 movfw ARG1H ; 1 args 0486 00C6 01291 movwf D_ADRH 0487 00C8 01292 movwf E_ADRH 0488 083D 01293 movfw ARG1L 0489 00C7 01294 movwf D_ADRL 048A 00C9 01295 movwf E_ADRL 01296 048B 3080 01297 cdmp0b movlw 0x80 ; E_ADR = GBADR + 0x80 048C 07C9 01298 addwf E_ADRL, F 048D 1C03 01299 btfss STATUS, C 048E 2CA3 01300 goto cdmp1 01301 048F 3001 01302 movlw 1 ; carry, E_ADRH++ 0490 07C8 01303 addwf E_ADRH, F 0491 1C03 01304 btfss STATUS, C 0492 2CA3 01305 goto cdmp1 01306 0493 30FF 01307 movlw 0xff ; over 0xffff, set 0xffff 0494 00C9 01308 movwf E_ADRL 0495 00C8 01309 movwf E_ADRH 0496 2CA3 01310 goto cdmp1 01311 0497 3003 01312 cdmp0c movlw 3 ; 2 set address 0498 022B 01313 subwf ARGC, W 0499 1D03 01314 btfss STATUS, Z MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 23 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 049A 2911 01315 goto merror ; error 01316 049B 083C 01317 movfw ARG1H ; start address 049C 00C6 01318 movwf D_ADRH 049D 083D 01319 movfw ARG1L 049E 00C7 01320 movwf D_ADRL 049F 083E 01321 movfw ARG2H ; set end address 04A0 00C8 01322 movwf E_ADRH 04A1 083F 01323 movfw ARG2L 04A2 00C9 01324 movwf E_ADRL 01325 04A3 0846 01326 cdmp1 movfw D_ADRH ; set address 04A4 00AD 01327 movwf GBADRH 04A5 0847 01328 movfw D_ADRL 04A6 00AE 01329 movwf GBADRL 04A7 250E 01330 call Dump16 ; 16byte dump, GBADR += 16 04A8 39FF 01331 andlw 0xff 04A9 1903 01332 btfsc STATUS, Z ; ESC expected, exit 04AA 2CAD 01333 goto cdmp2 01334 04AB 1607 01335 bsf PORTC, P_CTS ; CTS goes high flow stop 04AC 2BD7 01336 goto cabort ; print abort, return 01337 04AD 3010 01338 cdmp2 movlw 16 ; D_ADR += 16 04AE 07C7 01339 addwf D_ADRL, F 04AF 1C03 01340 btfss STATUS, C 04B0 2CB5 01341 goto cdmp2a 01342 04B1 3001 01343 movlw 1 04B2 07C6 01344 addwf D_ADRH, F 04B3 1803 01345 btfsc STATUS, C 04B4 2CC1 01346 goto cdmp3 ; over 0xffff, exit 01347 04B5 0846 01348 cdmp2a movfw D_ADRH ; E_ADR >= D_ADR ? 04B6 0248 01349 subwf E_ADRH, W 04B7 1C03 01350 btfss STATUS, C 04B8 2CC1 01351 goto cdmp3 01352 04B9 1D03 01353 btfss STATUS, Z 04BA 2CA3 01354 goto cdmp1 01355 04BB 0847 01356 movfw D_ADRL 04BC 0249 01357 subwf E_ADRL, W 04BD 1903 01358 btfsc STATUS, Z 04BE 2CC1 01359 goto cdmp3 01360 04BF 1803 01361 btfsc STATUS, C 04C0 2CA3 01362 goto cdmp1 01363 04C1 0846 01364 cdmp3 movfw D_ADRH ; store current address 04C2 00CA 01365 movwf DMCURH 04C3 0847 01366 movfw D_ADRL 04C4 00CB 01367 movwf DMCURL 01368 04C5 1607 01369 bsf PORTC, P_CTS ; CTS goes high flow stop 04C6 2829 01370 goto mloop1 ; return main 01371 01372 01373 ; 01374 ; subroutines 01375 ; 01376 ; 01377 ; 01378 ; calculate CheckSUM, D_ADR to E_ADR 04C7 0848 01379 CalcSUM movfw E_ADRH ; D_ADR > E_ADR? 04C8 00C4 01380 movwf CMP_H 04C9 0847 01381 movfw D_ADRL ; E_ADR - D_ADR 04CA 0249 01382 subwf E_ADRL, W 04CB 1803 01383 btfsc STATUS, C 04CC 2CD2 01384 goto csum1 01385 04CD 3001 01386 movlw 1 ; borrow 04CE 0248 01387 subwf E_ADRH, W 04CF 00C4 01388 movwf CMP_H 04D0 1C03 01389 btfss STATUS, C 04D1 0008 01390 return 01391 04D2 0846 01392 csum1 movfw D_ADRH 04D3 0244 01393 subwf CMP_H, W 04D4 1C03 01394 btfss STATUS, C 04D5 0008 01395 return ; D_ADR > E_ADR 01396 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 24 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 04D6 0846 01397 movfw D_ADRH ; D_ADR =< E_ADR 04D7 00AD 01398 movwf GBADRH 04D8 0847 01399 movfw D_ADRL 04D9 00AE 01400 movwf GBADRL 04DA 276C 01401 call GBread ; read data 04DB 082F 01402 movfw GBDATA 04DC 07CD 01403 addwf CKSUML, F 04DD 1803 01404 btfsc STATUS, C 04DE 0ACC 01405 incf CKSUMH, F 01406 04DF 0846 01407 movfw D_ADRH ; D_ADR == E_ADR? 04E0 0248 01408 subwf E_ADRH, W 04E1 1D03 01409 btfss STATUS, Z 04E2 2CE7 01410 goto csum2 01411 04E3 0847 01412 movfw D_ADRL 04E4 0249 01413 subwf E_ADRL, W 04E5 1903 01414 btfsc STATUS, Z 04E6 0008 01415 return ; same, return 01416 04E7 3001 01417 csum2 movlw 1 ; D_ADR++ 04E8 07C7 01418 addwf D_ADRL, F 04E9 1803 01419 btfsc STATUS, C 04EA 0AC6 01420 incf D_ADRH, F 01421 04EB 2CC7 01422 goto CalcSUM 01423 01424 01425 ; 01426 ; generate filename for download from cartridge 04EC 30A0 01427 GenFN movlw ASCBUF 04ED 0084 01428 movwf FSR 04EE 3008 01429 movlw 8 04EF 00A0 01430 movwf VAR1 04F0 3001 01431 movlw 0x01 04F1 00AD 01432 movwf GBADRH 04F2 3034 01433 movlw 0x34 04F3 00AE 01434 movwf GBADRL 01435 04F4 276C 01436 genf0 call GBread 04F5 0AAE 01437 incf GBADRL, F 01438 04F6 305C 01439 movlw '\\' 04F7 022F 01440 subwf GBDATA, W 04F8 1903 01441 btfsc STATUS, Z 04F9 2D06 01442 goto genf1 01443 04FA 302F 01444 movlw '/' 04FB 022F 01445 subwf GBDATA, W 04FC 1903 01446 btfsc STATUS, Z 04FD 2D06 01447 goto genf1 01448 04FE 3020 01449 movlw ' ' 04FF 022F 01450 subwf GBDATA, W 0500 1903 01451 btfsc STATUS, Z 0501 2D06 01452 goto genf1 01453 0502 302E 01454 movlw '.' 0503 022F 01455 subwf GBDATA, W 0504 1D03 01456 btfss STATUS, Z 0505 2D08 01457 goto genf2 01458 0506 305F 01459 genf1 movlw '_' 0507 2D09 01460 goto genf3 01461 0508 082F 01462 genf2 movfw GBDATA 0509 0080 01463 genf3 movwf INDF 050A 0A84 01464 incf FSR, F 050B 0BA0 01465 decfsz VAR1, F 050C 2CF4 01466 goto genf0 01467 050D 0008 01468 return 01469 ; 01470 ; print dump GBADR to +16 with ASCII 050E 3010 01471 Dump16 movlw 16 050F 00A1 01472 movwf VAR2 0510 30A0 01473 movlw ASCBUF 0511 0084 01474 movwf FSR 01475 0512 082D 01476 movfw GBADRH ; print address 0513 2699 01477 call hex2pr 0514 082E 01478 movfw GBADRL MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 25 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0515 2699 01479 call hex2pr 0516 3020 01480 movlw 0x20 ; two spaces 0517 27A1 01481 call PutC 0518 3020 01482 movlw 0x20 0519 27A1 01483 call PutC 01484 051A 27D9 01485 dmp0 call GetCNP ; get char non blocking 051B 39FF 01486 andlw 0xff 051C 1903 01487 btfsc STATUS, Z 051D 2D21 01488 goto dmp0a 01489 051E 3C1B 01490 sublw 0x1b ; ESC inputed? 051F 1903 01491 btfsc STATUS, Z 0520 34FF 01492 retlw 0xff ; ESC expected, return 0xff 01493 0521 276C 01494 dmp0a call GBread ; read data 0522 082F 01495 movfw GBDATA 0523 2699 01496 call hex2pr ; print data 0524 3020 01497 movlw 0x20 0525 022F 01498 subwf GBDATA, W 0526 1C03 01499 btfss STATUS, C 0527 2D2C 01500 goto dmp1 0528 307E 01501 movlw 0x7e 0529 022F 01502 subwf GBDATA, W 052A 1C03 01503 btfss STATUS, C 052B 2D2E 01504 goto dmp2 052C 302E 01505 dmp1 movlw '.' ; X >= 7f or X < 0x20 052D 2D2F 01506 goto dmp3 052E 082F 01507 dmp2 movfw GBDATA 052F 0080 01508 dmp3 movwf INDF ; store ascii data 0530 0A84 01509 incf FSR, F 01510 0531 3020 01511 movlw 0x20 ; print one space 0532 27A1 01512 call PutC 01513 0533 3001 01514 movlw 1 0534 07AE 01515 addwf GBADRL, F ; GBADRL++ 0535 1C03 01516 btfss STATUS, C 0536 2D39 01517 goto dmp3a 0537 3001 01518 movlw 1 0538 07AD 01519 addwf GBADRH, F 01520 0539 0BA1 01521 dmp3a decfsz VAR2, F 053A 2D1A 01522 goto dmp0 01523 053B 3020 01524 movlw 0x20 ; print one space 053C 27A1 01525 call PutC 053D 3010 01526 movlw 16 ; print ascii chars 053E 00A1 01527 movwf VAR2 053F 30A0 01528 movlw ASCBUF 0540 0084 01529 movwf FSR 01530 0541 0800 01531 dmp4 movfw INDF 0542 27A1 01532 call PutC 0543 0A84 01533 incf FSR, F 0544 0BA1 01534 decfsz VAR2, F 0545 2D41 01535 goto dmp4 01536 0546 27DF 01537 call PutLF ; line feed 0547 3400 01538 retlw 0 01539 01540 ; 01541 ; receive uudecode D_ADR to E_ADR 01542 ; 0548 0847 01543 UURecv movfw D_ADRL ; set top address 0549 00AE 01544 movwf GBADRL 054A 0846 01545 movfw D_ADRH 054B 00AD 01546 movwf GBADRH 054C 01B4 01547 clrf COLUMN ; reset LF counter 054D 3020 01548 movlw ' ' 054E 27A1 01549 call PutC ; print SP for turn chars. 01550 054F 258E 01551 uurec1 call TurnC ; put loading animation 01552 0550 14A7 01553 bsf DMODE, D_ECHO ; noecho 0551 27A7 01554 call GetS ; get 1 line 0552 10A7 01555 bcf DMODE, D_ECHO ; echo 0553 3CFF 01556 sublw 0xff 0554 1903 01557 btfsc STATUS, Z 0555 34FF 01558 retlw 0xff ; ESC expected, abort. return 0xff 01559 0556 30B0 01560 uurec2 movlw LBUF MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 26 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 0557 0084 01561 movwf FSR ; get size char 0558 0800 01562 movfw INDF 0559 1903 01563 btfsc STATUS, Z ; if buffer empty, reread 055A 2D4F 01564 goto uurec1 01565 055B 26B7 01566 call UDecChG ; translate 055C 00A2 01567 movwf VAR3 ; byte / line count 055D 39FF 01568 andlw 0xff 055E 1903 01569 btfsc STATUS, Z ; size == 0, end of all? 055F 3400 01570 retlw 0 ; normal exit 01571 0560 30B1 01572 movlw LBUF + 1 ; reset UASCP 0561 00B9 01573 movwf UASCP 01574 0562 26E0 01575 uurec3 call UDec3 ; get 4 char and translate 0563 3CFF 01576 sublw 0xff 0564 1903 01577 btfsc STATUS, Z 0565 2D4F 01578 goto uurec1 ; length != 3, eol expected 01579 0566 3036 01580 uurec5 movlw UUDAT1 0567 0084 01581 movwf FSR ; reset UUDAT index 0568 3003 01582 movlw 3 0569 00A3 01583 movwf VAR4 01584 056A 0800 01585 uurec6 movfw INDF ; memory store loop 056B 00AF 01586 movwf GBDATA 056C 277D 01587 call GBwrite ; store data 01588 056D 0800 01589 movfw INDF 056E 07CD 01590 addwf CKSUML, F ; add check sum 056F 1803 01591 btfsc STATUS, C 0570 0ACC 01592 incf CKSUMH, F 01593 0571 3001 01594 movlw 1 ; addr += 1 0572 07AE 01595 addwf GBADRL, F 0573 1C03 01596 btfss STATUS, C 0574 2D76 01597 goto uurec7 ; non carry 0575 0AAD 01598 incf GBADRH, F 01599 0576 082D 01600 uurec7 movfw GBADRH ; 16bit end address compare 0577 0248 01601 subwf E_ADRH, W 0578 1C03 01602 btfss STATUS, C 0579 3400 01603 retlw 0 ; grater than (GBADR > E_ADR), normal exit 01604 057A 1D03 01605 btfss STATUS, Z 057B 2D84 01606 goto uurec8 ; less than (GBADR < E_ADR) 01607 057C 082E 01608 movfw GBADRL 057D 0249 01609 subwf E_ADRL, W 057E 1C03 01610 btfss STATUS, C 057F 3400 01611 retlw 0 ; grater than, normal exit 01612 0580 3001 01613 movlw 1 0581 02A2 01614 subwf VAR3, F ; byte/line counter -= 1 0582 1903 01615 btfsc STATUS, Z 0583 2D4F 01616 goto uurec1 ; size reached, next line 01617 01618 ; equal or less than 0584 0A84 01619 uurec8 incf FSR, F ; continue store 0585 0BA3 01620 decfsz VAR4, F 0586 2D6A 01621 goto uurec6 ; next byte 01622 0587 3004 01623 uurec9 movlw 4 0588 07B9 01624 addwf UASCP, F ; UASCP += 4 0589 30F0 01625 movlw LBUF + LBUFLEN 058A 0239 01626 subwf UASCP, W 058B 1C03 01627 btfss STATUS, C ; LBUF max reached? 058C 2D62 01628 goto uurec3 ; next char pack 01629 058D 34FF 01630 retlw 0xff ; LBUF overflow, exit 01631 01632 ; 01633 ; 01634 ; loading animation 058E 3008 01635 TurnC movlw 0x08 058F 27A1 01636 call PutC ; print BS 0590 0834 01637 movfw COLUMN 0591 1D03 01638 btfss STATUS, Z 0592 2D96 01639 goto tc1 0593 305C 01640 movlw '\\' ; \ | / - 0594 27A1 01641 call PutC 0595 2DAC 01642 goto tc5 MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 27 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01643 0596 0834 01644 tc1 movfw COLUMN 0597 3C01 01645 sublw 1 0598 1D03 01646 btfss STATUS, Z 0599 2D9D 01647 goto tc2 059A 307C 01648 movlw '|' 059B 27A1 01649 call PutC 059C 2DAC 01650 goto tc5 01651 059D 0834 01652 tc2 movfw COLUMN 059E 3C02 01653 sublw 2 059F 1D03 01654 btfss STATUS, Z 05A0 2DA4 01655 goto tc3 05A1 302F 01656 movlw '/' 05A2 27A1 01657 call PutC 05A3 2DAC 01658 goto tc5 01659 05A4 0834 01660 tc3 movfw COLUMN 05A5 3C03 01661 sublw 3 05A6 1D03 01662 btfss STATUS, Z 05A7 2DAA 01663 goto tc4 05A8 302D 01664 movlw '-' 05A9 27A1 01665 call PutC 01666 05AA 01B4 01667 tc4 clrf COLUMN 05AB 0008 01668 return 01669 05AC 0AB4 01670 tc5 incf COLUMN, F 05AD 0008 01671 return 01672 01673 ; 01674 ; dump uuencode D_ADR to E_ADR 01675 ; 05AE 1207 01676 UUDump bcf PORTC, P_CTS ; CTS goes low flow restart 05AF 0847 01677 uud1 movfw D_ADRL ; CMP = E_ADR - D_ADR 05B0 0249 01678 subwf E_ADRL, W ; calc remain char 05B1 00C5 01679 movwf CMP_L 05B2 1803 01680 btfsc STATUS, C 05B3 2DB9 01681 goto uud1a 01682 05B4 3001 01683 movlw 1 05B5 0248 01684 subwf E_ADRH, W 05B6 00C4 01685 movwf CMP_H 05B7 1C03 01686 btfss STATUS, C 05B8 2DF9 01687 goto uud_r0 ; E_ADR < D_ADR 01688 05B9 3001 01689 uud1a movlw 1 ; CMP++ 05BA 07C5 01690 addwf CMP_L, F 05BB 1C03 01691 btfss STATUS, C 05BC 2DBE 01692 goto uud2 01693 05BD 0AC4 01694 incf CMP_H, F 01695 05BE 0846 01696 uud2 movfw D_ADRH ; MSB diff >= 0 05BF 0248 01697 subwf E_ADRH, W 05C0 00C4 01698 movwf CMP_H 05C1 1C03 01699 btfss STATUS, C 05C2 2DF9 01700 goto uud_r0 ; E_ADR < D_ADR 01701 05C3 0844 01702 movfw CMP_H ; remain < 45 ? 05C4 1D03 01703 btfss STATUS, Z 05C5 2DD0 01704 goto uud3 01705 05C6 302D 01706 movlw 45 05C7 0245 01707 subwf CMP_L, W 05C8 1803 01708 btfsc STATUS, C 05C9 2DD0 01709 goto uud3 01710 05CA 0845 01711 movfw CMP_L ; remain less than 45 byte. 05CB 1903 01712 btfsc STATUS, Z 05CC 2DF9 01713 goto uud_r0 ; remain zero 01714 05CD 26AF 01715 call UEncChP 05CE 0845 01716 movfw CMP_L ; column count 05CF 2DD3 01717 goto uud4 01718 05D0 304D 01719 uud3 movlw 'M' ; print line header 05D1 27A1 01720 call PutC ; 15 * 3 byte / line 05D2 302D 01721 movlw 45 ; column count 05D3 00A2 01722 uud4 movwf VAR3 01723 05D4 3036 01724 uud5 movlw UUDAT1 ; reset UUDAT pointer MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 28 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 05D5 0084 01725 movwf FSR 01726 05D6 27D9 01727 uud5b call GetCNP ; get char non blocking 05D7 39FF 01728 andlw 0xff 05D8 1903 01729 btfsc STATUS, Z 05D9 2DDD 01730 goto uud5c 01731 05DA 3C1B 01732 sublw 0x1b ; ESC inputed? 05DB 1903 01733 btfsc STATUS, Z 05DC 2DFB 01734 goto uud_r1 01735 05DD 0846 01736 uud5c movfw D_ADRH ; get ROM data 05DE 00AD 01737 movwf GBADRH 05DF 0847 01738 movfw D_ADRL 05E0 00AE 01739 movwf GBADRL 05E1 276C 01740 call GBread 05E2 082F 01741 movfw GBDATA 05E3 0080 01742 movwf INDF 01743 05E4 07CD 01744 addwf CKSUML, F ; add check sum 05E5 1803 01745 btfsc STATUS, C 05E6 0ACC 01746 incf CKSUMH, F 01747 05E7 3001 01748 movlw 1 ; addr += 1 05E8 07C7 01749 addwf D_ADRL, F 05E9 1C03 01750 btfss STATUS, C 05EA 2DEC 01751 goto uud6 ; non carry 05EB 0AC6 01752 incf D_ADRH, F 01753 05EC 0BA2 01754 uud6 decfsz VAR3, F ; column count-- 05ED 2DF1 01755 goto uud7 ; next char 01756 05EE 26BC 01757 call UEnc3 ; end reached, send chars 05EF 27DF 01758 call PutLF ; line feed 05F0 2DAF 01759 goto uud1 ; continue next line 01760 05F1 3001 01761 uud7 movlw 1 05F2 0784 01762 addwf FSR, F 05F3 3039 01763 movlw UUDAT3 + 1 ; FSR == UUDAT3 + 1? 05F4 0204 01764 subwf FSR, W 05F5 1D03 01765 btfss STATUS, Z 05F6 2DD6 01766 goto uud5b ; continue packing 01767 05F7 26BC 01768 call UEnc3 ; UUDAT full, send 4 chars 05F8 2DD4 01769 goto uud5 ; next char 01770 05F9 01771 uud_r0 05F9 1607 01772 uud9 bsf PORTC, P_CTS ; CTS goes high flow stop 05FA 3400 01773 retlw 0 01774 05FB 1607 01775 uud_r1 bsf PORTC, P_CTS ; CTS goes high flow stop 05FC 34FF 01776 retlw 0xff 01777 01778 01779 ; parse command line 05FD 3001 01780 cmdpar movlw 1 05FE 00AB 01781 movwf ARGC 05FF 30B0 01782 movlw LBUF 0600 00A8 01783 movwf LBUFP ; buffer pointer 0601 0084 01784 movwf FSR ; count argument 01785 0602 0800 01786 cmd1 movfw INDF 0603 1903 01787 btfsc STATUS, Z ; eol? 0604 2E15 01788 goto cmd2 01789 0605 3C20 01790 sublw 0x20 0606 1D03 01791 btfss STATUS, Z 0607 2E0A 01792 goto cmd1b 01793 0608 0A84 01794 incf FSR, F 0609 2E02 01795 goto cmd1 ; skip space char 01796 060A 0800 01797 cmd1b movfw INDF ; char != SP 060B 1903 01798 btfsc STATUS, Z ; end of line? 060C 2E15 01799 goto cmd2 01800 060D 3C20 01801 sublw 0x20 060E 1903 01802 btfsc STATUS, Z 060F 2E12 01803 goto cmd1c 01804 0610 0A84 01805 incf FSR, F ; search end of an argment 0611 2E0A 01806 goto cmd1b MPASM 02.15.06 Intermediate GBREAD21.ASM 11-19-1998 14:48:49 PAGE 29 gbread21 LOC OBJECT CODE LINE SOURCE TEXT VALUE 01807 0612 0AAB 01808 cmd1c incf ARGC, F ; incriment argc, next arg 0613 0A84 01809 incf FSR, F ; search end of an argment 0614 2E02 0