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