From: bizzetti@mbox.vol.it (Fabio Bizzetti) Newsgroups: comp.sys.amiga.programmer,comp.sys.amiga.games,alt.sys.amiga.demos Subject: Amiga coders support, issue 2 Date: 8 Oct 1996 13:14:41 GMT Organization: Video On Line Lines: 286 Distribution: world Message-ID: <11146.6855T912T1130@mbox.vol.it> NNTP-Posting-Host: molcl2.vol.it X-Newsreader: THOR 2.22 (Amiga;TCP/IP) Xref: news.lut.fi comp.sys.amiga.programmer:98617 comp.sys.amiga.games:112011 alt.sys.amiga.demos:16397 Here I wanna spend two words for some lame flamers in this newsgroup, that after I posted a routine "as it is" to help someone programming the 030 MMU to emulate an Amiga (OCS/ECS/AGA) chipset on gfx boards, these flamers didn't have anything better to do to flame "shit!! he posts a source commented in Italian.. what an arrogant bastard". This is the kind of "gratitude" of those C/C-- (f)lamers, the ones that blame to coders everything they could invent. So, reposting the MMU example (that emulates the hardware of a Action Replay, giving you a copy of all the custom registers, write-only included, not using any other hardware than the MMU) this time I will add (for them) a precisation: "love it or leave it". Gratitude is not included in the C/C-- standard I see.. --------------------------------------- Fabio Bizzetti - bizzetti@mbox.vol.it section MMU,code PRG: BSR SET_MMU MOVE.W #100,D1 ..w1 MOVE.W #65535,D0 ..w0 DBRA D0,.w0 DBRA D1,.w1 MOVE.L #$DC001D,MAGIC RTS ******************************************************************************* DISABLE: MOVE.L 4.w,A6 JSR -150(A6) ;SuperState LEA USERSTACK,A1 MOVE.L D0,(A1) PMOVE.L .zero,TC ;turn off MMU MOVE.L USERSTACK(PC),D0 MOVE.L 4.w,A6 JSR -156(A6) ;UserState RTS ..zero DC.L $0 ******************************************************************************* EXCEPTION: MOVE.W #$2700,SR ;prevent crash by interrupts.. BCLR.B #$00,$000A(A7) ;CHECK IF MMU's BUS ERROR AND CLEAR IT BEQ.W .exit MOVEM.L D0/D1/A0/A1,.save_regs MOVEC CACR,D0 ;ENABLE FREEZE CACHE MOVE.L D0,.save_cacr OR.W #$0202,D0 MOVEC D0,CACR MOVE.L $10(A7),A0 ;address to write MOVE.L $18(A7),D0 ;data to write LEA .disable(PC),A1 PMOVE.L $00(A1),TC ;turn off MMU MOVE.B $B(A7),D1 AND.B #%00111000,D1 ;size CMP.B #%00010000,D1 ;check if BYTE BNE.B .w MOVE.B D0,(A0) ;write original MOVE.L A0,D1 AND.W #511,D1 LEA copy(PC),A0 MOVE.B D0,(A0,D1.W) ;write copy BRA.B .done ..w CMP.B #%00101000,D1 ;check if WORD BNE.B .l MOVE.W D0,(A0) ;write original MOVE.L A0,D1 AND.W #511,D1 LEA copy(PC),A0 MOVE.W D0,(A0,D1.W) ;write copy BRA.B .done ..l CMP.B #%00001000,D1 ;check if LONG BNE.B .done MOVE.L D0,(A0) ;write original MOVE.L A0,D1 AND.W #511,D1 LEA copy(PC),A0 MOVE.L D0,(A0,D1.W) ;write copy BTST.B #7,$BFE001 BNE.B .done MOVE.L 2(A7),0.w ..done PMOVE.L $04(A1),TC ;turn on MMU MOVE.L .save_cacr,D0 ;DISABLE FREEZE CACHE MOVEC D0,CACR MOVEM.L .save_regs,D0/D1/A0/A1 ..exit RTE CNOP 0,4 ..disable DC.L $00000000 ..enable DC.L $80A08680 ..save_regs DS.L 16 ..save_cacr DS.L 1 test DS.L 16 copy DS.B 512 ;copy of custom write only registers ******** ; move.w $00(A7),$100000 ;SR when exception ; move.l $02(A7),$100002 ; > l'istruzione dopo quella bad ; move.w $06(A7),$100006 ;$B008 (offset del vettore) ; move.w $08(A7),$100008 ;registro interno ; move.w $0A(A7),$10000A ; > word di stato speciale ; move.w $0C(A7),$10000C ;stadio pipeline C ; move.w $0E(A7),$10000E ;stadio pipeline B ; move.l $10(A7),$100010 ; > indirizzo difetto ciclo dati ; move.l $14(A7),$100014 ;registro interno ; move.l $18(A7),$100018 ; > buffer di uscita dei dati (READ) ; move.l $1C(A7),$10001C ;registro interno ; move.l $20(A7),$100020 ;registro interno ; move.l $24(A7),$100024 ;puntatore stadio pipeline B ; move.l $28(A7),$100028 ;puntatore stadio pipeline C ; move.l $2C(A7),$10002C ; > buffer di ingresso dei dati (WRITE) ;CONTROL WORD $A ;0 >> AZZERARE PER USCIRE DALL'EXCEPTION ;CONTROL WORD $B ;7 >> ? ;6 >> READ=0 WRITE=1 ;543 >> BYTE=010 WORD=101 LONG=001 ;210 >> FCx ;THE MMU CONVERSION TABLE MUST BE %00101 (WRITE_PROT+OK) ;EVERY READ WILL BE TRANSPARENT ;EVERY WRITE WILL GENERATE AN EXCEPTION ; THEN , YOU WILL WRITE $18 to ($10) and to your copy table.. ******************************************************************************* SET_MMU: MOVE.L 4.w,A6 JSR -150(A6) ;SuperState LEA USERSTACK,A1 MOVE.L D0,(A1) MOVEC VBR,D0 MOVE.L D0,SYS_VBR LEA .mmu_regs(PC),A0 PMOVE.Q $00(A0),CRP PMOVE.Q $08(A0),SRP PMOVE.L $10(A0),TC PMOVE.L $14(A0),TT0 PMOVE.L $18(A0),TT1 PMOVE.W $1C(A0),MMUSR MOVE.L USERSTACK(PC),D0 MOVE.L 4.w,A6 JSR -156(A6) ;UserState RTS ******************** ..mmu_regs DC.L $80000002,$001F0000,$FFFFFFFF,$FFFFFFFF DC.L $80A08680,$00000000,$00000000,$0000 **************************************** USERSTACK DS.L 1 SYS_VBR DS.L 1 ******************************************************************************* ******************************************************************************* ;MMU's CONVERSION TABLE ORG $1F0000 LOAD $1F0000 DC.L _16MEGs+$A,$01000001,$02000001,$03000001,$04000001,$05000001,$06000001,$07000001,$08000001,$09000001,$0A000001,$0B000001,$0C000001,$0D000001,$0E000001,$0F000001 DC.L $10000001,$11000001,$12000001,$13000001,$14000001,$15000001,$16000001,$17000001,$18000001,$19000001,$1A000001,$1B000001,$1C000001,$1D000001,$1E000001,$1F000001 DC.L $20000001,$21000001,$22000001,$23000001,$24000001,$25000001,$26000001,$27000001,$28000001,$29000001,$2A000001,$2B000001,$2C000001,$2D000001,$2E000001,$2F000001 DC.L $30000001,$31000001,$32000001,$33000001,$34000001,$35000001,$36000001,$37000001,$38000001,$39000001,$3A000001,$3B000001,$3C000001,$3D000001,$3E000001,$3F000001 DC.L $40000001,$41000001,$42000001,$43000001,$44000001,$45000001,$46000001,$47000001,$48000001,$49000001,$4A000001,$4B000001,$4C000001,$4D000001,$4E000001,$4F000001 DC.L $50000001,$51000001,$52000001,$53000001,$54000001,$55000001,$56000001,$57000001,$58000001,$59000001,$5A000001,$5B000001,$5C000001,$5D000001,$5E000001,$5F000001 DC.L $60000001,$61000001,$62000001,$63000001,$64000001,$65000001,$66000001,$67000001,$68000001,$69000001,$6A000001,$6B000001,$6C000001,$6D000001,$6E000001,$6F000001 DC.L $70000001,$71000001,$72000001,$73000001,$74000001,$75000001,$76000001,$77000001,$78000001,$79000001,$7A000001,$7B000001,$7C000001,$7D000001,$7E000001,$7F000001 DC.L $80000001,$81000001,$82000001,$83000001,$84000001,$85000001,$86000001,$87000001,$88000001,$89000001,$8A000001,$8B000001,$8C000001,$8D000001,$8E000001,$8F000001 DC.L $90000001,$91000001,$92000001,$93000001,$94000001,$95000001,$96000001,$97000001,$98000001,$99000001,$9A000001,$9B000001,$9C000001,$9D000001,$9E000001,$9F000001 DC.L $A0000001,$A1000001,$A2000001,$A3000001,$A4000001,$A5000001,$A6000001,$A7000001,$A8000001,$A9000001,$AA000001,$AB000001,$AC000001,$AD000001,$AE000001,$AF000001 DC.L $B0000001,$B1000001,$B2000001,$B3000001,$B4000001,$B5000001,$B6000001,$B7000001,$B8000001,$B9000001,$BA000001,$BB000001,$BC000001,$BD000001,$BE000001,$BF000001 DC.L $C0000001,$C1000001,$C2000001,$C3000001,$C4000001,$C5000001,$C6000001,$C7000001,$C8000001,$C9000001,$CA000001,$CB000001,$CC000001,$CD000001,$CE000001,$CF000001 DC.L $D0000001,$D1000001,$D2000001,$D3000001,$D4000001,$D5000001,$D6000001,$D7000001,$D8000001,$D9000001,$DA000001,$DB000001,$DC000001,$DD000001,$DE000001,$DF000001 DC.L $E0000001,$E1000001,$E2000001,$E3000001,$E4000001,$E5000001,$E6000001,$E7000001,$E8000001,$E9000001,$EA000001,$EB000001,$EC000001,$ED000001,$EE000001,$EF000001 DC.L $F0000001,$F1000001,$F2000001,$F3000001,$F4000001,$F5000001,$F6000001,$F7000001,$F8000001,$F9000001,$FA000001,$FB000001,$FC000001,$FD000001,$FE000001,$FF000001 _16MEGs ; DC.L _P_ZERO+$A,$00040001,$00080001,$000C0001 ;page zero version DC.L $00000001,$00040001,$00080001,$000C0001 ;no page zero version DC.L $00100001,$00140001,$00180001,$001C0001 DC.L $00200001,$00240001,$00280001,$002C0001 DC.L $00300001,$00340001,$00380001,$003C0001 DC.L $00400001,$00440001,$00480001,$004C0001 DC.L $00500001,$00540001,$00580001,$005C0001 DC.L $00600001,$00640001,$00680001,$006C0001 DC.L $00700001,$00740001,$00780001,$007C0001 DC.L $00800001,$00840001,$00880001,$008C0001 DC.L $00900001,$00940001,$00980001,$009C0001 DC.L $00A00001,$00A40001,$00A80001,$00AC0001 DC.L $00B00001,$00B40001,$00B80001,$00BC0001 DC.L $00C00001,$00C40001,$00C80001,$00CC0001 DC.L $00D00001,$00D40001,$00D80001 MAGIC: DC.L $00DC0001 DC.L $00E00001,$00E40001,$00E80001,$00EC0001 DC.L $00F00001,$00F40001,$00F80001,$00FC0001 _P_ZERO: DC.L $00000001,$00000401,$00000801,$00000C01 ;$BADF00D0 DC.L $00001001,$00001401,$00001801,$00001C01 DC.L $00002001,$00002401,$00002801,$00002C01 DC.L $00003001,$00003401,$00003801,$00003C01 DC.L $00004001,$00004401,$00004801,$00004C01 DC.L $00005001,$00005401,$00005801,$00005C01 DC.L $00006001,$00006401,$00006801,$00006C01 DC.L $00007001,$00007401,$00007801,$00007C01 DC.L $00008001,$00008401,$00008801,$00008C01 DC.L $00009001,$00009401,$00009801,$00009C01 DC.L $0000A001,$0000A401,$0000A801,$0000AC01 DC.L $0000B001,$0000B401,$0000B801,$0000BC01 DC.L $0000C001,$0000C401,$0000C801,$0000CC01 DC.L $0000D001,$0000D401,$0000D801,$0000DC01 DC.L $0000E001,$0000E401,$0000E801,$0000EC01 DC.L $0000F001,$0000F401,$0000F801,$0000FC01 DC.L $00010001,$00010401,$00010801,$00010C01 DC.L $00011001,$00011401,$00011801,$00011C01 DC.L $00012001,$00012401,$00012801,$00012C01 DC.L $00013001,$00013401,$00013801,$00013C01 DC.L $00014001,$00014401,$00014801,$00014C01 DC.L $00015001,$00015401,$00015801,$00015C01 DC.L $00016001,$00016401,$00016801,$00016C01 DC.L $00017001,$00017401,$00017801,$00017C01 DC.L $00018001,$00018401,$00018801,$00018C01 DC.L $00019001,$00019401,$00019801,$00019C01 DC.L $0001A001,$0001A401,$0001A801,$0001AC01 DC.L $0001B001,$0001B401,$0001B801,$0001BC01 DC.L $0001C001,$0001C401,$0001C801,$0001CC01 DC.L $0001D001,$0001D401,$0001D801,$0001DC01 DC.L $0001E001,$0001E401,$0001E801,$0001EC01 DC.L $0001F001,$0001F401,$0001F801,$0001FC01 DC.L $00020001,$00020401,$00020801,$00020C01 DC.L $00021001,$00021401,$00021801,$00021C01 DC.L $00022001,$00022401,$00022801,$00022C01 DC.L $00023001,$00023401,$00023801,$00023C01 DC.L $00024001,$00024401,$00024801,$00024C01 DC.L $00025001,$00025401,$00025801,$00025C01 DC.L $00026001,$00026401,$00026801,$00026C01 DC.L $00027001,$00027401,$00027801,$00027C01 DC.L $00028001,$00028401,$00028801,$00028C01 DC.L $00029001,$00029401,$00029801,$00029C01 DC.L $0002A001,$0002A401,$0002A801,$0002AC01 DC.L $0002B001,$0002B401,$0002B801,$0002BC01 DC.L $0002C001,$0002C401,$0002C801,$0002CC01 DC.L $0002D001,$0002D401,$0002D801,$0002DC01 DC.L $0002E001,$0002E401,$0002E801,$0002EC01 DC.L $0002F001,$0002F401,$0002F801,$0002FC01 DC.L $00030001,$00030401,$00030801,$00030C01 DC.L $00031001,$00031401,$00031801,$00031C01 DC.L $00032001,$00032401,$00032801,$00032C01 DC.L $00033001,$00033401,$00033801,$00033C01 DC.L $00034001,$00034401,$00034801,$00034C01 DC.L $00035001,$00035401,$00035801,$00035C01 DC.L $00036001,$00036401,$00036801,$00036C01 DC.L $00037001,$00037401,$00037801,$00037C01 DC.L $00038001,$00038401,$00038801,$00038C01 DC.L $00039001,$00039401,$00039801,$00039C01 DC.L $0003A001,$0003A401,$0003A801,$0003AC01 DC.L $0003B001,$0003B401,$0003B801,$0003BC01 DC.L $0003C001,$0003C401,$0003C801,$0003CC01 DC.L $0003D001,$0003D401,$0003D801,$0003DC01 DC.L $0003E001,$0003E401,$0003E801,$0003EC01 DC.L $0003F001,$0003F401,$0003F801,$0003FC01 .. .