home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / mac / 0600 / CCE_0635.ZIP / CCE_0635.PD / TTTOOLS / TT2TF.S < prev    next >
Text File  |  1990-05-21  |  7KB  |  277 lines

  1. *
  2. * TT2TF (Thirty-Two To Twenty-Four)
  3. *
  4. * Zweck: Der Adressbus wird von 32 auf 24 Bits "beschnitten". Dadurch
  5. *        laufen einige Programme auf dem TT, die die oberen 8 Bits
  6. *        fuer eigene Zwecke reservieren (z.B. TEMPUS 2).
  7. *
  8. * Zum Assemblieren unter TC/MASM Stacksize auf 0 stellen.
  9. *
  10. * (c) 1990 Marcel Waldvogel
  11. *
  12.  
  13. TWOLEVEL= 1            ;Zweistufig?
  14. ; Braucht weniger Platz, ist dafuer (manchmal) unmerklich langsamer.
  15.  
  16. id    = 'TTTF'
  17. cookie    = $5A0            ;Adresse des Cookie-Pointers
  18. ssize    = 2048            ;Stackgroesse
  19.  
  20.     move.l    4(A7),A5    ;Get Basepage
  21.     lea    stack,A7    ;Install stack
  22.  
  23.     pea    message
  24.     move.w    #9,-(A7)    ;Cconws()
  25.     trap    #1
  26.     addq.l    #6,A7
  27.  
  28.     clr.l    -(A7)
  29.     move.w    #$20,-(A7)    ;Super()
  30.     trap    #1
  31.     addq.l    #2,A7        ;Nur 2!!
  32.     move.l    D0,(A7)        ;Schon wieder auf den Stack (kein "-"!!)
  33.  
  34.     suba.l    A3,A3        ;Zeiger auf eigenes Cookie loeschen
  35.     move.l    cookie.w,D0    ;Existiert er?
  36.     beq    dommu        ;Nein, dann einfach installieren
  37.     movea.l    D0,A0
  38.     move.l    #id,D0        ;Meine ID
  39. cloop:    move.l    (A0),D1        ;Noch ein Eintrag?
  40.     beq    install        ;Nein ->
  41.     addq.l    #8,A0        ;Zum naechsten Cookie
  42.     cmp.l    D0,D1        ;Mein Eintrag?
  43.     bne    cloop        ;Nein ->
  44.  
  45.                 ;Bereits installierten TT2TF aufrufen
  46. callold:move.l    -(A0),D0    ;Keine Bemerkung: Installation missglueckt
  47.     lea    nullmsg,A0    ;Defaultfehler (aendert CCR nicht)
  48.     beq    msgterm        ;Keine ->
  49.     movea.l    D0,A3
  50.     not.w    -2(A3)        ;Zustand wechseln
  51. ;    jsr    (A3)        ;Anspringen
  52.  
  53.     lea    oldmsg,A0    ;Defaultmessage
  54.     tst.w    -(A3)        ;Alter Zustand?
  55.     bmi    msgterm        ;Ja ->
  56.     lea    okmsg,A0    ;Neuer Zustand (A24)
  57.     bra    msgterm
  58.  
  59.  
  60. install:move.l    cookie.w,A0    ;Jetzt eintragen (Cookiejar sicher da!)
  61.     moveq    #0,D0
  62. ciloop:    addq.l    #1,D0
  63.     tst.l    (A0)        ;Ende?
  64.     beq    endfnd
  65.     addq.l    #8,A0
  66.     bra    ciloop
  67. endfnd:    cmp.l    4(A0),D0    ;Noch Platz?
  68.     beq    dommu        ;Nein ->
  69.     move.l    4(A0),12(A0)    ;Ja, einfuegen
  70.     clr.l    8(A0)
  71.     move.l    #id,(A0)+
  72.     clr.l    (A0)        ;"Noch nicht eingetragen"
  73.     movea.l    A0,A3        ;Adresse speichern
  74.  
  75.  
  76. dommu:    move.l    #table,D0    ;Tabelle erzeugen
  77.     and.w    #$FFF0,D0    ;Unterste Bits ausmaskieren
  78.     move.l    D0,rootadr    ;CPU Root Pointer fertig initialisieren
  79.     movea.l    D0,A0
  80.  
  81.     IF    TWOLEVEL
  82.     move.l    #16*32768,D1    ;Offset zwischen zwei Seiten
  83.     moveq    #$1,D0        ;Adresse 0 | Page_descriptor
  84.     moveq    #30,D2        ;31 "1:1"-Eintraege
  85. maketab:move.l    D0,(A0)+    ;Eintragen
  86.     add.l    D1,D0        ;Offset zur naechsten Page
  87.     dbf    D2,maketab
  88.     move.l    A0,D1        ;Hole aktuellen Zeiger
  89.     addq.l    #6,D1        ;+4: Naechste Adresse, +2: Table_Desc 4 Bytes
  90.     move.l    D1,(A0)+
  91.  
  92.     move.l    #32768,D1    ;Neuer Offset zwischen zwei Seiten
  93.     moveq    #14,D2        ;15 "1:1"-Eintraege
  94. maket2:    move.l    D0,(A0)+
  95.     add.l    D1,D0
  96.     dbf    D2,maket2
  97.     move.l    #$FFFF8041,(A0)    ;1 Eintrag I/O-Bereich, mit Cache Inhibit
  98.  
  99.     ELSE
  100.  
  101.     move.l    #32768,D1    ;Offset zwischen zwei Seiten
  102.     moveq    #$1,D0        ;Adresse 0 | Page_descriptor
  103.     move.w    #510,D2        ;511 "1:1"-Eintraege
  104. maketab:move.l    D0,(A0)+    ;Eintragen
  105.     add.l    D1,D0        ;Offset zur naechsten Page
  106.     dbf    D2,maketab
  107.     move.l    #$FFFF8041,(A0)    ;1 Eintrag I/O-Bereich, mit Cache Inhibit
  108.     ENDC
  109.  
  110.     move.l    A7,A6
  111.     move.l    44.w,A4        ;Alten Exc.-Vektor holen
  112.     move.l    #newexc,44.w
  113.  
  114.     move    SR,D0        ;Wird in setmmu wieder zurueckgesetzt
  115.     ori    #$2700,SR
  116.     lea    oldreg,A0
  117.     bsr    getmmu
  118.  
  119.     bsr    dismmu        ;MMU ausschalten
  120.  
  121.     lea    myreg,A0
  122.     bsr    setmmu
  123.     move.l    A4,44.w        ;Wieder zurueck
  124.  
  125.     move.l    A3,D0        ;In Cookie-Jar eingetragen?
  126.     beq    cfull        ;Nein, war voll ->
  127.     move.l    #swapper,(A3)    ;Ja, eintragen
  128.  
  129. cfull:    pea    okmsg
  130.     move.w    #9,-(A7)    ;Cconws()
  131.     trap    #1
  132.     addq.l    #6,A7
  133.  
  134. resi:    move.w    #$20,-(A7)    ;Super(), altes A7 schon vorher auf dem Stack
  135.     trap    #1
  136.     addq.l    #6,A7
  137.  
  138.                 ;Der Stack wird mit freigegeben!
  139.     movea.w    #256-ssize,A0    ;Groesse der Basepage - Stack
  140.     adda.l    12(A5),A0    ;   "    des TEXT-Segmentes
  141.     adda.l    20(A5),A0    ;   "     "  DATA-Segmentes
  142.     adda.l    28(A5),A0    ;   "     "  BSS-Segmentes
  143.  
  144.     clr.w    -(a7)        ;Alles ok
  145.     move.l    A0,-(a7)    ;Belegter Speicher
  146.     move.w    #$31,-(a7)    ;Ptermres()
  147.     trap    #1
  148.     illegal
  149.  
  150.  
  151.  
  152. newexc:    move.l    A4,44.w        ;Wieder zurueck
  153.     move.l    A6,A7
  154.     lea    mmumsg,A0
  155.  
  156. msgterm:move.l    A0,-(A7)
  157.     move.w    #9,-(A7)    ;Cconws()
  158.     trap    #1
  159.     addq.l    #6,A7
  160.  
  161.     move.w    #$20,-(A7)    ;Super(), altes A7 schon vorher auf dem Stack
  162.     trap    #1
  163.     addq.l    #6,A7
  164.  
  165.     clr.w    -(A7)        ;Pterm0()
  166.     trap    #1
  167.     illegal
  168.  
  169.  
  170. setmmu:
  171. ;    pmove    (A0),TT0    ;Evt. Line-F-Exception generieren
  172.     dc.l    $F0100800    ;Von Hand, der Assembler macht Fehler
  173.     addq.l    #4,A0
  174. ;    pmove    transp1,TT1    ;Evt. Line-F-Exception generieren
  175.     dc.l    $F0100C00
  176.     addq.l    #4,A0
  177.  
  178.     pmove    (A0),CRP    ;CPU Root Pointer setzen
  179.     addq.l    #8,A0
  180.  
  181.     pmove    (A0),TC        ;Translation Control setzen
  182.     move    D0,SR
  183.     rts
  184.  
  185.  
  186. getmmu:
  187. ;    pmove    TT0,(A0)    ;Hole TT0
  188.     dc.l    $F0100A00    ;Der Assembler will nicht...
  189.     addq.l    #4,A0        ;Zum naechsten Platz
  190.  
  191. ;    pmove    TT1,(A0)    ;Hole TT0
  192.     dc.l    $F0100E00    ;Der Assembler will nicht...
  193.     addq.l    #4,A0        ;Zum naechsten Platz
  194.  
  195.     pmove    CRP,(A0)    ;Hole CRP
  196.     addq.l    #8,A0        ;Zum naechsten Platz
  197.     pmove    TC,(A0)        ;Hole TC
  198.     rts
  199.  
  200.  
  201. dismmu:    lea    null2l,A0    ;Sicher kein E[nabled]-Bit gesetzt...
  202. ;    pmove    (A0),TT0    ;Evt. Line-F-Exception generieren
  203.     dc.l    $F0100800    ;Von Hand, der Assembler macht Fehler
  204. ;    pmove    transp1,TT1    ;Evt. Line-F-Exception generieren
  205.     dc.l    $F0100C00
  206.  
  207.     pmove    (A0),TC        ;Translation Control zuerst setzen!
  208.     rts
  209.  
  210.  
  211. config:    dc.w    0        ;Zustandsflag
  212. swapper:move    SR,D0        ;Statusregister wird in setmmu zurueckgesetzt
  213.     ori    #$2700,SR    ;Interrupts weg
  214.  
  215.     bsr    dismmu        ;MMU ausschalten
  216.     lea    myreg,A0    ;Default-MMU-Konfiguration
  217.  
  218.     tst.w    config        ;Alter/neuer Zustand?
  219.     bpl    setmmu        ;Neuen Zustand, ja ->
  220.  
  221.     lea    oldreg,A0
  222.     bra    setmmu        ;bsr + rts =: bra
  223.  
  224.  
  225.     DATA
  226.  
  227. message:dc.b    13,10,"TT2TF - Thirty-Two To Twenty-Four"
  228.     dc.b    13,10,"(c) 1990 Marcel Waldvogel",0
  229. nullmsg:dc.b    13,10,27,'p',"ERROR: Resident TT2TF badly installed,"
  230.     dc.b    13,10,       "       MMU or 68030 was missing!",27,'q',7,13,10,0
  231. mmumsg:    dc.b    13,10,27,'p',"ERROR: MMU or 68030 missing!",27,'q',7,13,10,0
  232. oldmsg:    dc.b    13,10,"Old MMU settings restored",13,10,0
  233. okmsg:    dc.b    13,10,"24 Bit Address Bus installed",13,10,0
  234.     even
  235.  
  236. null2l:    dc.l    0,0    ;Zum disablen der MMU-Register
  237.  
  238. myreg:
  239. transp0:dc.l    0    ;No transparent translation
  240. transp1:dc.l    0    ;No transparent translation
  241. root:    dc.w    $8000,$0002    ;Unlimited, 4-Byte
  242. rootadr:dc.l    0
  243.     IF    TWOLEVEL
  244. tctrl:    dc.l    $80F85400
  245. ;             ^^^^ 1. Stufe: 5 Bits, 2. Stufe: 4 Bits
  246. ;            ^ die obersten 8 Bits werden ignoriert
  247. ;           ^ Page Size: 32 KB (15 Bits)
  248. ;          ^ No Supervisor Root Pointer, No Function Code Lookup
  249. ;         ^ Enable
  250.  
  251.     ELSE
  252.  
  253. tctrl:    dc.l    $80F89000
  254. ;             ^^^^ 1. Stufe: 5 Bits, 2. Stufe: 4 Bits
  255. ;            ^ die obersten 8 Bits werden ignoriert
  256. ;           ^ Page Size: 32 KB (15 Bits)
  257. ;          ^ No Supervisor Root Pointer, No Function Code Lookup
  258. ;         ^ Enable
  259.     ENDC
  260.  
  261.  
  262.     BSS
  263.  
  264. oldreg:    ds.l    5        ;Platz zum Auslesen der MMU-Register
  265.  
  266.     even
  267.     ds.b    16        ;Platz, falls Tabelle sonst nicht aligned
  268.     IF    TWOLEVEL
  269. table:    ds.l    32+16
  270.     ELSE
  271. table:    ds.l    512
  272.     ENDC
  273.  
  274.     even
  275.     ds.b    ssize        ;Platz fuer den Stack
  276. stack:
  277.