Last active
April 5, 2017 16:59
-
-
Save mgcaret/d4b68f3924bc9bc8349bdc05a4ea9545 to your computer and use it in GitHub Desktop.
MIG Inspector
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
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 ,[email protected]
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 ,[email protected]
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 ,[email protected]
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 ,[email protected]
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