From 08074672cafe8abea353a9397a07bee01cd35c83 Mon Sep 17 00:00:00 2001 From: Zellyn Hunter Date: Wed, 7 Dec 2016 23:05:07 -0500 Subject: [PATCH] add first pass of machine detection to audit.asm Currently having issues with some plain Apple II and II+, but seems to work for IIe and IIe enhanced. --- audit/audit.asm | 75 ++++++++- audit/audit.dsk | Bin 143360 -> 143360 bytes audit/technote2.asm | 400 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 466 insertions(+), 9 deletions(-) create mode 100644 audit/technote2.asm diff --git a/audit/audit.asm b/audit/audit.asm index ef7a1c8..503b360 100644 --- a/audit/audit.asm +++ b/audit/audit.asm @@ -7,22 +7,76 @@ HOME = $FC58 COUT = $FDED + PRBYTE = $FDDA main: jsr HOME jsr print - !text "Apple II audit",$8D,0 + !text "APPLE II AUDIT",$8D,0 jsr print - !text "Detecting machine version...",$8D,0 + !text "DETECTING MACHINE VERSION...",$8D,0 + + !zone detect { + jsr IDENTIFY + lda MACHINE + bne .known + ;; MACHINE=0 - unknown machine + jsr print + !text "UNABLE TO INDENTIFY",$8D,0 + jmp end +.known + cmp #IIeCard + bcc .leiic + bne .gs +;IIeCard + jsr print + !text "IIE EMULATION CARD",0 + beq .notsupported +.gs ;PLUGH + jsr print + !text "IIGS",0 +.notsupported + jsr print + !text " NOT SUPPORTED",$8D,0 + jmp end +.leiic + cmp #IIe + bcc .leiii + beq .iie +;IIc + jsr print + !text "IIC",0 + beq .notsupported +.iie + jsr print + !text "APPLE IIE",$8D,0 + beq .done +.leiii + cmp #IIplus + bcc .iiplain + beq .iiplus +;iiiem + jsr print + !text "APPLE III IN EMULATION MODE",0 + beq .notsupported +.iiplain + jsr print + !text "PLAIN APPLE II",$8D,0 + beq .done +.iiplus + jsr print + !text "APPLE II PLUS",$8D,0 +.done + } ;detect + end: jmp * ;;; print prints a null-terminated string from the address after the ;;; JSR that called it, returning to the address following the null. print: - tsx - lda $101,X + pla sta getch+1 - lda $102,X + pla sta getch+2 - inc getch+1 bne getch @@ -31,8 +85,11 @@ getch lda $FEED ; $FEED gets modified beq + jsr COUT jmp - -+ lda getch+1 - sta $101,X - lda getch+2 - sta $102,x ++ lda getch+2 + pha + lda getch+1 + pha + lda #0 ; so we can always beq after print-ing rts + + !src "technote2.asm" diff --git a/audit/audit.dsk b/audit/audit.dsk index d0676a832d2491fe6f612f1472f0802dfd91e953..4e39b41b253d03f4c09e43012856f66dfc8d4995 100644 GIT binary patch delta 1009 zcmZ8gO=ufO6n?X_yIvdHICdJZe_|L_ozbt!iPPYAExZHSOU+H@O180>_i^~`J5cbH| zL$A}7vb`4ujkjifYc3j2L^}}urNH|m1{9*JLfcx3K0n0@Rs2+uX1ftU^pg_E-MY%W zH!JVtDVHaAyMsXqYyHwddpV_P8vbb1`gqL5x~|v8MqZiaS(IlGHq%5}3|=%ZkSNQF zoWXu`fkY-NaAz&YKsHmScCq|JE-_)HTxN@8!(>ZjW9T~jfvZ^o>HkVWehE@eUR9fG zF|uwe^o4Wm`WdxU^0S=H^AW#z(dHC!i(cdOYyJRq3OWOQ6ZGY(MZe)0Oo9J$ONFmE zFUnOm#WSny9M7zHE02$I4*`CJyGOaA{MSKXc`FZ(a(4lW^7VQZJBPWXqVv-Ad(_|* za|-IhqoOCZ@$vGMQJzG37-e8JVN~L571>nhRO3!3cZd*DAJRmqmIV#f4i^~UINSmq z)l7Z}W*qka)*b`sS`5L68F(@PBi_Rk00SoggP|ut2g68!0q;g>X81xoj^9LP`nd0mt0r~V*tEOm!*%OB^-gqwsP~~MwT3jU))({wVK=y%K2V#` z8FJsGi{$Lrx???864>C~Go z?6l(FW4NG<_KEd0qewbOZqJj=^JMwt!Fj^9Dtf*-LpYKnY=KC_&ntoQWNcwXXN4I} z2wh_5`<%e?+vMr}0-aR{j$2LI>JqBSG&!+7hxHPk>EFww(DsUE-1&5H=h9$%5u2sU Usebu0bZ=ty%*`u5UqS!;4!L+Bznq%Pu?-_X5_yU^<(bm$;rvRa(Ybc;*jj37EB)C3%a z4n+kE4xOD^;?V|^OGs0pLp;UNcYcPqKdbg<)u9Y$Z9LAhn9<3E&etDNVOJV${FG*! zJX$OZdK=zRe|Y~u-&q`QIDK97g5~y~dS(R+i-<31G7py#XY`BZt0?83=T%yV_;Cba zn|LIFZDDTWDdHA(lkZGzBxS3IT@w#90N26;3GjG2eS7)cAP1;NKoUeqpLO&vS(bwm z)l?*e2x?m^_4-N&XB(Wl5_EI~1nH%tfxm;~;8ec=a;%?_BSZN6NF`mPbPVu!C54DR RCFmNL8o{V@-n?l-`U9beh(G`U diff --git a/audit/technote2.asm b/audit/technote2.asm new file mode 100644 index 0000000..532b9cc --- /dev/null +++ b/audit/technote2.asm @@ -0,0 +1,400 @@ +;;; From http://www.1000bit.it/support/manuali/apple/technotes/misc/tn.misc.02.html +;;; ********************************************* +;;; * * +;;; * Apple II Family Identification Program * +;;; * * +;;; * Version 2.2 * +;;; * * +;;; * March, 1990 * +;;; * * +;;; * Includes support for the Apple IIe Card * +;;; * for the Macintosh LC. * +;;; * * +;;; ********************************************* + +; First, some global equates for the routine: + + !zone technote2 { + +IIplain = $01 ;Apple II +IIplus = $02 ;Apple II+ +IIIem = $03 ;Apple /// in emulation mode +IIe = $04 ;Apple IIe +IIc = $05 ;Apple IIc +IIeCard = $06 ;Apple IIe Card for the Macintosh LC + +.safe = $0001 ;start of code relocated to zp +.location = $06 ;zero page location to use + +.test1 = $AA ;test byte #1 +.test2 = $55 ;lsr of test1 +.test3 = $88 ;test byte #3 +.test4 = $EE ;test byte #4 + +.begpage1 = $400 ;beginning of text page 1 +.begpage2 = $800 ;beginning of text page 2 +.begsprse = $C00 ;byte after text page 2 + +.clr80col = $C000 ;disable 80-column store +.set80col = $C001 ;enable 80-column store +.rdmainram = $C002 ;read main ram +.rdcardram = $C003 ;read aux ram +.wrmainram = $C004 ;write main ram +.wrcardram = $C005 ;write aux ram +.rdramrd = $C013 ;are we reading aux ram? +.rdaltzp = $C016 ;are we reading aux zero page? +.rd80col = $C018 ;are we using 80-columns? +.rdtext = $C01A ;read if text is displayed +.rdpage2 = $C01C ;read if page 2 is displayed +.txtclr = $C050 ;switch in graphics +.txtset = $C051 ;switch in text +.txtpage1 = $C054 ;switch in page 1 +.txtpage2 = $C055 ;switch in page 2 +.ramin = $C080 ;read LC bank 2, write protected +.romin = $C081 ;read ROM, 2 reads write enable LC +.lcbank1 = $C08B ;LC bank 1 enable + +.lc1 = $E000 ;bytes to save for LC +.lc2 = $D000 ;save/restore routine +.lc3 = $D400 +.lc4 = $D800 + +.idroutine = $FE1F ;IIgs id routine + +; Start by saving the state of the language card banks and +; by switching in main ROM. + +IDENTIFY + php ;save the processor state + sei ;before disabling interrupts + lda .lc1 ;save four bytes from + sta .save ;ROM/RAM area for later + lda .lc2 ;restoring of RAM/ROM + sta .save+1 ;to original condition + lda .lc3 + sta .save+2 + lda .lc4 + sta .save+3 + lda $C081 ;read ROM + lda $C081 + lda #0 ;start by assuming unknown machine + sta MACHINE + sta ROMLEVEL +.IdStart + lda .location ;save zero page locations + sta .save+4 ;for later restoration + lda .location+1 + sta .save+5 + lda #$FB ;all ID bytes are in page $FB + sta .location+1 ;save in zero page as high byte + ldx #0 ;init pointer to start of ID table +.loop lda .IDTable,x ;get the machine we are testing for + sta MACHINE ;and save it + lda .IDTable+1,x ;get the ROM level we are testing for + sta ROMLEVEL ;and save it + ora MACHINE ;are both zero? + beq .matched ;yes - at end of list - leave + +.loop2 inx ;bump index to loc/byte pair to test + inx + lda .IDTable,x ;get the byte that should be in ROM + beq .matched ;if zero, we're at end of list + sta .location ;save in zero page + + ldy #0 ;init index for indirect addressing + lda .IDTable+1,x ;get the byte that should be in ROM + cmp (.location),y ;is it there? + beq .loop2 ;yes, so keep on looping + +.loop3 inx ;we didn't match. Scoot to the end of the + inx ;line in the ID table so we can start + lda .IDTable,x ;checking for another machine + bne .loop3 + inx ;point to start of next line + bne .loop ;should always be taken + +.matched ; anop + +; Here we check the 16-bit ID routine at idroutine ($FE1F). If it +; returns with carry clear, we call it again in 16-bit +; mode to provide more information on the machine. + + !cpu 65816 { +.idIIgs + sec ;set the carry bit + jsr .idroutine ;Apple IIgs ID Routine + bcc .idIIgs2 ;it's a IIgs or equivalent + jmp .IIgsOut ;nope, go check memory +.idIIgs2 + lda MACHINE ;get the value for machine + ora #$80 ;and set the high bit + sta MACHINE ;put it back + clc ;get ready to switch into native mode + xce + php ;save the processor status + rep #$30 ;sets 16-bit registers + !al { ;longa on + !rl { ;longi on + jsr .idroutine ;call the ID routine again + sta .IIgsA ;16-bit store! + stx .IIgsX ;16-bit store! + sty .IIgsY ;16-bit store! + plp ;restores 8-bit registers + xce ;switches back to whatever it was before + } ;longi off + } ;longa off + + ldy .IIgsY ;get the ROM vers number (starts at 0) + cpy #$02 ;is it ROM 01 or 00? + bcs .idIIgs3 ;if not, don't increment + iny ;bump it up for romlevel +.idIIgs3 + sty ROMLEVEL ;and put it there + cpy #$01 ;is it the first ROM? + bne .IIgsOut ;no, go on with things + lda .IIgsY+1 ;check the other byte too + bne .IIgsOut ;nope, it's a IIgs successor + lda #$7F ;fix faulty ROM 00 on the IIgs + sta .IIgsA +.IIgsOut ; anop +} + +;;; ****************************************** +;;; * This part of the code checks for the * +;;; * memory configuration of the machine. * +;;; * If it's a IIgs, we've already stored * +;;; * the total memory from above. If it's * +;;; * a IIc or a IIe Card, we know it's * +;;; * 128K; if it's a ][+, we know it's at * +;;; * least 48K and maybe 64K. We won't * +;;; * check for less than 48K, since that's * +;;; * a really rare circumstance. * +;;; ****************************************** + +.exit lda MACHINE ;get the machine kind + bmi .exit128 ;it's a 16-bit machine (has 128K) + cmp #IIc ;is it a IIc? + beq .exit128 ;yup, it's got 128K + cmp #IIeCard ;is it a IIe Card? + beq .exit128 ;yes, it's got 128K + cmp #IIe ;is it a IIe? + bne .contexit ;yes, go muck with aux memory + jmp .muckaux +.contexit + cmp #IIIem ;is it a /// in emulation? + bne .exitII ;nope, it's a ][ or ][+ + lda #48 ;/// emulation has 48K + jmp .exita +.exit128 + lda #128 ;128K +.exita sta MEMORY +.exit1 lda .lc1 ;time to restore the LC + cmp .save ;if all 4 bytes are the same + bne .exit2 ;then LC was never on so + lda .lc2 ;do nothing + cmp .save+1 + bne .exit2 + lda .lc3 + cmp .save+2 + bne .exit2 + lda .lc4 + cmp .save+3 + beq .exit6 +.exit2 lda $C088 ;no match! so turn first LC + lda .lc1 ;bank on and check + cmp .save + beq .exit3 + lda $C080 + jmp .exit6 +.exit3 lda .lc2 + cmp .save+1 ;if all locations check + beq .exit4 ;then do more more else + lda $C080 ;turn on bank 2 + jmp .exit6 +.exit4 lda .lc3 ;check second byte in bank 1 + cmp .save+2 + beq .exit5 + lda $C080 ;select bank 2 + jmp .exit6 +.exit5 lda .lc4 ;check third byte in bank 1 + cmp .save+3 + beq .exit6 + lda $C080 ;select bank 2 +.exit6 plp ;restore interrupt status + lda .save+4 ;put zero page back + sta .location + lda .save+5 ;like we found it + sta .location+1 + rts ;and go home. + +.exitII + lda .lcbank1 ;force in language card + lda .lcbank1 ;bank 1 + ldx .lc2 ;save the byte there + lda #.test1 ;use this as a test byte + sta .lc2 + eor .lc2 ;if the same, should return zero + bne .noLC + lsr .lc2 ;check twice just to be sure + lda #.test2 ;this is the shifted value + eor .lc2 ;here's the second check + bne .noLC + stx .lc2 ;put it back! + lda #64 ;there's 64K here + jmp .exita +.noLC lda #48 ;no restore - no LC! + jmp .exita ;and get out of here + +.muckaux + ldx .rdtext ;remember graphics in X + lda .rdpage2 ;remember current video display + asl ;in the carry bit + lda #.test3 ;another test character + bit .rd80col ;remember video mode in N + sta .set80col ;enable 80-column store + php ;save N and C flags + sta .txtpage2 ;set page two + sta .txtset ;set text + ldy .begpage1 ;save first character + sta .begpage1 ;and replace it with test character + lda .begpage1 ;get it back + sty .begpage1 ;and put back what was there + plp + bcs .muck2 ;stay in page 2 + sta .txtpage1 ;restore page 1 +.muck1 bmi .muck2 ;stay in 80-columns + sta $c000 ;turn off 80-columns +.muck2 tay ;save returned character + txa ;get graphics/text setting + bmi .muck3 + sta .txtclr ;turn graphics back on +.muck3 cpy #.test3 ;finally compare it + bne .nocard ;no 80-column card! + lda .rdramrd ;is aux memory being read? + bmi .muck128 ;yup, there's 128K! + lda .rdaltzp ;is aux zero page used? + bmi .muck128 ;yup! + ldy #.done-.start +.move ldx .start-1,y ;swap section of zero page + lda <.safe-1,y ;code needing safe location during + stx <.safe-1,y ;reading of aux mem + sta .start-1,Y + dey + bne .move + jmp .safe ;jump to safe ground +.back php ;save status + ldy #.done-.start ;move zero page back +.move2 lda .start-1,y + sta .safe-1,y + dey + bne .move2 + pla + bcs .noaux +.isaux jmp .muck128 ;there is 128K + +;;; * You can put your own routine at "noaux" if you wish to +;;; * distinguish between 64K without an 80-column card and +;;; * 64K with an 80-column card. + +.noaux ; anop +.nocard lda #64 ;only 64K + jmp .exita +.muck128 + jmp .exit128 ;there's 128K + +;;; * This is the routine run in the safe area not affected +;;; * by bank-switching the main and aux RAM. + +.start lda #.test4 ;yet another test byte + sta .wrcardram ;write to aux while on main zero page + sta .rdcardram ;read aux ram as well + sta .begpage2 ;check for sparse memory mapping + lda .begsprse ;if sparse, these will be the same + cmp #.test4 ;value since they're 1K apart + bne .auxmem ;yup, there's 128K! + asl .begsprse ;may have been lucky so we'll + lda .begpage2 ;change the value and see what happens + cmp .begsprse + bne .auxmem + sec ;oops, no auxiliary memory + bcs .goback +.auxmem clc +.goback sta .wrmainram ;write main RAM + sta .rdmainram ;read main RAM + jmp .back ;continue with program in main mem +.done nop ;end of relocated program marker + + +;;; * The storage locations for the returned machine ID: + +MACHINE !byte 1 ;the type of Apple II +ROMLEVEL !byte 1 ;which revision of the machine +MEMORY !byte 1 ;how much memory (up to 128K) +.IIgsA !byte 2 ;16-bit field +.IIgsX !byte 2 ;16-bit field +.IIgsY !byte 2 ;16-bit field +.save !byte 6 ;six bytes for saved data + +.IDTable + ;dc I1'1,1' ;Apple ][ + ;dc H'B3 38 00' + !byte 1,1 + !byte $B3,$38,0 + + ;dc I1'2,1' ;Apple ][+ + ;dc H'B3 EA 1E AD 00' + !byte 2,1 + !byte $B3,$EA,$1E,$AD,0 + + ;dc I1'3,1' ;Apple /// (emulation) + ;dc H'B3 EA 1E 8A 00' + !byte 3,1 + !byte $B3,$EA,$1E,$8A,0 + + ;dc I1'4,1' ;Apple IIe (original) + ;dc H'B3 06 C0 EA 00' + !byte 4,1 + !byte $B3,$06,$C0,$EA,0 + +; Note: You must check for the Apple IIe Card BEFORE you +; check for the enhanced Apple IIe since the first +; two identification bytes are the same. + + ;dc I1'6,1' ;Apple IIe Card for the Macintosh LC (1st release) + ;dc H'B3 06 C0 E0 DD 02 BE 00 00' + !byte 6,1 + !byte $B3,$06,$C0,$E0,$DD,$02,$BE,$00,0 + + ;dc I1'4,2' ;Apple IIe (enhanced) + ;dc H'B3 06 C0 E0 00' + !byte 4,2 + !byte $B3,$06,$C0,$E0,0 + + ;dc I1'5,1' ;Apple IIc (original) + ;dc H'B3 06 C0 00 BF FF 00' + !byte 5,1 + !byte $B3,$06,$C0,$00,$BF,$FF,0 + + ;dc I1'5,2' ;Apple IIc (3.5 ROM) + ;dc H'B3 06 C0 00 BF 00 00' + !byte 5,2 + !byte $B3,$06,$C0,$00,$BF,$00,0 + + ;dc I1'5,3' ;Apple IIc (Mem. Exp) + ;dc H'B3 06 C0 00 BF 03 00' + !byte 5,3 + !byte $B3,$06,$C0,$00,$BF,$03,0 + + ;dc I1'5,4' ;Apple IIc (Rev. Mem. Exp.) + ;dc H'B3 06 C0 00 BF 04 00' + !byte 5,4 + !byte $B3,$06,$C0,$00,$BF,$04,0 + + ;dc I1'5,5' ;Apple IIc Plus + ;dc H'B3 06 C0 00 BF 05 00' + !byte 5,5 + !byte $B3,$06,$C0,$00,$BF,$05,0 + + ;dc I1'0,0' ;end of table + !byte 0,0 +} ; end of zone technote2