Skip to content

Instantly share code, notes, and snippets.

@mgcaret
Last active April 5, 2017 16:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mgcaret/d4b68f3924bc9bc8349bdc05a4ea9545 to your computer and use it in GitHub Desktop.
Save mgcaret/d4b68f3924bc9bc8349bdc05a4ea9545 to your computer and use it in GitHub Desktop.
MIG Inspector
ca65 V2.15
Main file : mig.insp.s
Current file: mig.insp.s
000000r 1 ; MIG Inspector by M.G.
000000r 1
000000r 1 ; Displays the MIG RAM from the Apple IIc Plus
000000r 1 ; this is used by the 3.5 drive firmware and the
000000r 1 ; accelerator.
000000r 1
000000r 1 ; When run, 4 pages of the MIG RAM are displayed and
000000r 1 ; are left at $1000 when the program is exited.
000000r 1
000000r 1 ; Keys:
000000r 1 ; Arrows - change pages in view
000000r 1 ; 0 - 9 - jump to page n*7, 0 = page 0, 9 = page 63
000000r 1 ; ESC - quit
000000r 1 ; ~ - Jump to page 0 and copy all 2K of the MIG to
000000r 1 ; $1000-$17FF.
000000r 1
000000r 1 ; Technical:
000000r 1
000000r 1 ; The MIG is briefly mentioned in the Apple IIc
000000r 1 ; Techincal Reference 2nd Edition. It gives the
000000r 1 ; pinouts of the chip and general function description
000000r 1 ; but not the level of detail we are used to for Apple
000000r 1 ; II technical manuals.
000000r 1
000000r 1 ; I wanted to see what was behind the smoke and mirrors.
000000r 1
000000r 1 ; The MIG RAM is a 2K SRAM that is accessed through
000000r 1 ; a small window from $CE00-$CFFF (and $DE00-$DFFF)
000000r 1 ; when the alternate firmware bank is active.
000000r 1
000000r 1 ; 32 bytes of MIG RAM are accessed in 64 pages, with
000000r 1 ; $CEA0 resetting to page 0, and $CE20 incrementing it
000000r 1
000000r 1 ; All but page 2 is used by the 3.5 code. Page 2 is
000000r 1 ; used by the accelerator code.
000000r 1
000000r 1 ; Other locations in the MIG window are likly used to
000000r 1 ; control the 3.5 drive control signals that the MIG
000000r 1 ; outputs.
000000r 1
000000r 1 .psc02
000000r 1 .code
000000r 1
000000r 1 ; build options
000000r 1 SKIPROMID = 0 ; skip ROM identification
000000r 1 ; lets you use on a non-
000000r 1 ; IIc Plus, but obviously
000000r 1 ; isn't useful beyond some
000000r 1 ; testing purposes
000000r 1
000000r 1 ; entry points
000000r 1 COut1 = $fdf0
000000r 1 TabV = $fb5b
000000r 1 PrByte = $fdda
000000r 1 Home = $fc58
000000r 1 VTab = $fc22
000000r 1 PrErr = $ff2d
000000r 1 KeyIn = $fd1b
000000r 1
000000r 1 ; locs
000000r 1 CH = $24
000000r 1 CV = $25
000000r 1 Buffer = $1000
000000r 1 ROMBank = $c028
000000r 1 MigBase = $ce00
000000r 1 MigRAM = MigBase
000000r 1 MigPage0 = MigBase+$A0
000000r 1 MigPageI = MigBase+$20
000000r 1 BufPtr = $06
000000r 1 MigPage = $08
000000r 1
000000r 1 .org $2000
002000 1
002000 1 D8 cld
002001 1 .if SKIPROMID
002001 1 ; none
002001 1 .else
002001 1 AD B3 FB lda $fbb3 ; first check for Apple IIc
002004 1 C9 06 cmp #$06
002006 1 D0 0E bne badid
002008 1 AD C0 FB lda $fbc0
00200B 1 C9 00 cmp #$00
00200D 1 D0 07 bne badid
00200F 1 AD BF FB lda $fbbf ; check for Plus
002012 1 C9 05 cmp #$05
002014 1 F0 03 beq init ; all good!
002016 1 4C 2D FF badid: jmp PrErr
002019 1 .endif
002019 1 64 08 init: stz MigPage
00201B 1 A9 91 lda #$91
00201D 1 20 F0 FD jsr COut1 ; go to 40 cols if 80 col firmware active
002020 1 20 58 FC jsr Home
002023 1 A9 17 lda #23
002025 1 20 5B FB jsr TabV
002028 1 A0 00 ldy #$00
00202A 1 B9 7C 20 : lda mmsg,y
00202D 1 F0 08 beq dispmig
00202F 1 49 80 eor #$80
002031 1 20 F0 FD jsr COut1
002034 1 C8 iny
002035 1 80 F3 bra :-
002037 1 20 20 21 dispmig: jsr get4mig ; 4 mig pages to buffer
00203A 1 20 9E 20 jsr d4page
00203D 1 A9 A0 uinput: lda #' '+$80
00203F 1 20 1B FD jsr KeyIn
002042 1 C9 8B cmp #$8b ; up arrow
002044 1 F0 08 beq goup
002046 1 C9 8A cmp #$8a ; down arrow
002048 1 F0 0C beq godn
00204A 1 C9 88 cmp #$88 ; left arrow
00204C 1 D0 04 bne :+
00204E 1 C6 08 goup: dec MigPage
002050 1 80 E5 bra dispmig
002052 1 C9 95 : cmp #$95 ; right arrow
002054 1 D0 04 bne :+
002056 1 E6 08 godn: inc MigPage
002058 1 80 DD bra dispmig
00205A 1 C9 FE : cmp #'~'+$80 ; tilde - git all MIG RAM to $1000
00205C 1 D0 05 bne :+
00205E 1 20 1A 21 jsr getallmig
002061 1 80 D4 bra dispmig
002063 1 C9 9B : cmp #$9b ; escape
002065 1 D0 01 bne jump
002067 1 60 rts
002068 1 E9 B0 jump: sbc #$b0 ; check for digit for page jump
00206A 1 30 D1 bmi uinput ; nope
00206C 1 C9 0A cmp #10 ; 10 or bigger?
00206E 1 B0 CD bcs uinput ; also nope
002070 1 85 08 sta MigPage ; compute digit * 7
002072 1 0A asl ; * 2
002073 1 0A asl ; * 4
002074 1 0A asl ; * 8
002075 1 38 sec
002076 1 E5 08 sbc MigPage ; * 7
002078 1 85 08 sta MigPage
00207A 1 80 BB bra dispmig
00207C 1 4D 49 47 20 mmsg: .byte "MIG Inspector by M.G. 04/26/2017"
002080 1 49 6E 73 70
002084 1 65 63 74 6F
00209D 1 00 .byte $00
00209E 1 ; display 4 MIG pages on screen
00209E 1 .proc d4page
00209E 1 20 05 21 jsr rsetbptr
0020A1 1 A9 00 lda #$00
0020A3 1 20 5B FB jsr TabV
0020A6 1 A2 00 ldx #$00
0020A8 1 64 24 : stz CH
0020AA 1 8A txa
0020AB 1 18 clc
0020AC 1 65 08 adc MigPage
0020AE 1 29 3F and #$3f
0020B0 1 20 DA FD jsr PrByte
0020B3 1 A9 BA lda #':'+$80
0020B5 1 20 F0 FD jsr COut1
0020B8 1 20 C6 20 jsr d4line
0020BB 1 E6 25 inc CV
0020BD 1 20 22 FC jsr VTab
0020C0 1 E8 inx
0020C1 1 E0 04 cpx #$04
0020C3 1 D0 E3 bne :-
0020C5 1 60 rts
0020C6 1 .endproc
0020C6 1 ; display 4 lines at BufPtr, inc bufptr as we go
0020C6 1 ; assume CV is where we want it to be
0020C6 1 .proc d4line
0020C6 1 DA phx
0020C7 1 A2 03 ldx #$03
0020C9 1 20 DB 20 : jsr dline
0020CC 1 E6 25 inc CV
0020CE 1 20 22 FC jsr VTab
0020D1 1 A9 08 lda #$08
0020D3 1 20 10 21 jsr addbptr
0020D6 1 CA dex
0020D7 1 10 F0 bpl :-
0020D9 1 FA plx
0020DA 1 60 rts
0020DB 1 .endproc
0020DB 1 ; display 1 line at BufPtr
0020DB 1 .proc dline
0020DB 1 A9 04 lda #4
0020DD 1 85 24 sta CH
0020DF 1 A0 00 ldy #$00 ; start hex display
0020E1 1 B1 06 : lda (BufPtr),y
0020E3 1 20 DA FD jsr PrByte
0020E6 1 A9 A0 lda #' '+$80
0020E8 1 20 F0 FD jsr COut1
0020EB 1 C8 iny
0020EC 1 C0 08 cpy #$08 ; done?
0020EE 1 D0 F1 bne :- ; nope, next hex
0020F0 1 A0 00 ldy #$00 ; start ASCII display
0020F2 1 B1 06 : lda (BufPtr),y
0020F4 1 09 80 ora #$80
0020F6 1 C9 A0 cmp #' '+$80 ; space
0020F8 1 B0 02 bcs :+ ; if not ctrl char
0020FA 1 A9 AE lda #'.'+$80 ; if so, use dot
0020FC 1 20 F0 FD : jsr COut1
0020FF 1 C8 iny
002100 1 C0 08 cpy #$08 ; done?
002102 1 D0 EE bne :-- ; nope, next ASCII
002104 1 60 rts
002105 1 .endproc
002105 1 ; reset buffer BufPtr
002105 1 .proc rsetbptr
002105 1 48 pha
002106 1 A9 00 lda #<Buffer
002108 1 85 06 sta BufPtr
00210A 1 A9 10 lda #>Buffer
00210C 1 85 07 sta BufPtr+1
00210E 1 68 pla
00210F 1 60 rts
002110 1 .endproc
002110 1 ; add A to buffer BufPtr
002110 1 .proc addbptr
002110 1 18 clc
002111 1 65 06 adc BufPtr
002113 1 90 02 bcc done
002115 1 E6 07 inc BufPtr+1
002117 1 85 06 done: sta BufPtr
002119 1 60 rts
00211A 1 .endproc
00211A 1 ; copy all mig pages (2048 bytes) to (bufptr)
00211A 1 .proc getallmig
00211A 1 64 08 stz MigPage
00211C 1 A2 3F ldx #$3f
00211E 1 80 02 bra getxmig
002120 1 .endproc
002120 1 ; copy 4 mig pages (128 bytes) to (bufptr)
002120 1 .proc get4mig
002120 1 A2 03 ldx #$03
002122 1 ; fall through
002122 1 .endproc
002122 1 ; copy x mig pages (x*32 bytes) to (bufptr)
002122 1 .proc getxmig
002122 1 A5 08 lda MigPage
002124 1 29 3F and #$3f ; enforce range
002126 1 85 08 sta MigPage
002128 1 8D 28 C0 sta ROMBank ; mig only visible when alt ROM switched in
00212B 1 20 50 21 jsr setmigpg
00212E 1 20 05 21 jsr rsetbptr
002131 1 20 43 21 : jsr copymig
002134 1 A9 20 lda #$20
002136 1 20 10 21 jsr addbptr ; next buffer segment
002139 1 2C 20 CE bit MigPageI ; next MIG page
00213C 1 CA dex
00213D 1 10 F2 bpl :-
00213F 1 8D 28 C0 sta ROMBank
002142 1 60 rts
002143 1 .endproc
002143 1 ; copy one mig page (32 bytes) to (bufptr)
002143 1 .proc copymig
002143 1 5A phy
002144 1 A0 1F ldy #$1f
002146 1 B9 00 CE : lda MigRAM,y
002149 1 91 06 sta (BufPtr),y
00214B 1 88 dey
00214C 1 10 F8 bpl :-
00214E 1 7A ply
00214F 1 60 rts
002150 1 .endproc
002150 1 ; set MIG page
002150 1 .proc setmigpg
002150 1 DA phx
002151 1 2C A0 CE bit MigPage0
002154 1 A6 08 ldx MigPage
002156 1 F0 06 beq done
002158 1 2C 20 CE : bit MigPageI
00215B 1 CA dex
00215C 1 D0 FA bne :-
00215E 1 FA done: plx
00215F 1 60 rts
002160 1 .endproc
002160 1
@mgcaret
Copy link
Author

mgcaret commented Apr 5, 2017

2000:d8 ad b3 fb c9 06 d0 0e
2008:ad c0 fb c9 00 d0 07 ad
2010:bf fb c9 05 f0 03 4c 2d
2018:ff 64 08 a9 91 20 f0 fd
2020:20 58 fc a9 17 20 5b fb
2028:a0 00 b9 7c 20 f0 08 49
2030:80 20 f0 fd c8 80 f3 20
2038:20 21 20 9e 20 a9 a0 20
2040:1b fd c9 8b f0 08 c9 8a
2048:f0 0c c9 88 d0 04 c6 08
2050:80 e5 c9 95 d0 04 e6 08
2058:80 dd c9 fe d0 05 20 1a
2060:21 80 d4 c9 9b d0 01 60
2068:e9 b0 30 d1 c9 0a b0 cd
2070:85 08 0a 0a 0a 38 e5 08
2078:85 08 80 bb 4d 49 47 20
2080:49 6e 73 70 65 63 74 6f
2088:72 20 62 79 20 4d 2e 47
2090:2e 20 20 30 34 2f 32 36
2098:2f 32 30 31 37 00 20 05
20a0:21 a9 00 20 5b fb a2 00
20a8:64 24 8a 18 65 08 29 3f
20b0:20 da fd a9 ba 20 f0 fd
20b8:20 c6 20 e6 25 20 22 fc
20c0:e8 e0 04 d0 e3 60 da a2
20c8:03 20 db 20 e6 25 20 22
20d0:fc a9 08 20 10 21 ca 10
20d8:f0 fa 60 a9 04 85 24 a0
20e0:00 b1 06 20 da fd a9 a0
20e8:20 f0 fd c8 c0 08 d0 f1
20f0:a0 00 b1 06 09 80 c9 a0
20f8:b0 02 a9 ae 20 f0 fd c8
2100:c0 08 d0 ee 60 48 a9 00
2108:85 06 a9 10 85 07 68 60
2110:18 65 06 90 02 e6 07 85
2118:06 60 64 08 a2 3f 80 02
2120:a2 03 a5 08 29 3f 85 08
2128:8d 28 c0 20 50 21 20 05
2130:21 20 43 21 a9 20 20 10
2138:21 2c 20 ce ca 10 f2 8d
2140:28 c0 60 5a a0 1f b9 00
2148:ce 91 06 88 10 f8 7a 60
2150:da 2c a0 ce a6 08 f0 06
2158:2c 20 ce ca d0 fa fa 60

@mgcaret
Copy link
Author

mgcaret commented Apr 5, 2017

Looks something like this on the screen:

00: 8D FB 05 20 BA CA A5 20 .{. :J%     
    2C 1F C0 10 01 4A 18 65 ,.@..J.e    
    28 85 28 60 C9 E1 90 06 (.(`Ia..    
    C9 FB B0 02 29 DF 60 AD I{0.)_`-    
                                        
01: 8D FB 05 20 BA CA A5 20 .{. :J%     
    2C 1F C0 10 01 4A 18 65 ,.@..J.e    
    28 85 28 60 C9 E1 90 06 (.(`Ia..    
    C9 FB B0 02 29 DF 60 AD I{0.)_`-    
                                        
02: 8D FB 05 20 BA CA A5 20 .{. :J%     
    2C 1F C0 10 01 4A 18 65 ,.@..J.e    
    28 85 28 60 C9 E1 90 06 (.(`Ia..    
    C9 FB B0 02 29 DF 60 AD I{0.)_`-    
                                        
03: 8D FB 05 20 BA CA A5 20 .{. :J%     
    2C 1F C0 10 01 4A 18 65 ,.@..J.e    
    28 85 28 60 C9 E1 90 06 (.(`Ia..    
    C9 FB B0 02 29 DF 60 AD I{0.)_`-    
                                        
                                        
                                        
                                        
MIG Inspector by M.G.  04/26/2017       

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment