Annotation of doom/eeprom.gas, revision 1.1.1.1

1.1       root        1: ;************************************************
                      2: ;                                              *
                      3: ;      EEPROM Write & Read Primitives          *
                      4: ;                                              *
                      5: ;************************************************
                      6: ;
                      7: ;      Hi-Score on-board-cartridge EEPROM primitives 
                      8: ;      for use by Jaguar game cartridge developers.
                      9: ;
                     10: ;      128 bytes (accessable as 64 words) of non-volatile
                     11: ;      memory are available on Jaguar game cartridges to
                     12: ;      preserve Hi-scores or other game status.
                     13: ;      Data is retained for up to 10 years, and a minimum
                     14: ;       of 10,000 read/write cycles is assured, according to
                     15: ;      product literature. 
                     16: ;
                     17: ;
                     18: ;
                     19: ;
                     20: ;
                     21: ;       Programmer: Dave Staugas
                     22: ;                   Atari, Sunnyvale
                     23: ;                   [408] 745-8802
                     24: ;
                     25: ;      Last Update: 24-Sept-93
                     26: ;
                     27: ;
                     28: ;   Equates needed that may already be defined in the JAGUAR.INC file..
                     29: ;
                     30: JOY1           equ     $f14000         ;this we'll use as our I/O base address
                     31: GPIO_0         equ     $f14800         ;General purpose I/O #0
                     32: GPIO_1         equ     $f15000         ;General purpose I/O #1
                     33: ;
                     34: ;   Equates derived from the above
                     35: ;    to allow indirect with 16-bit displacement addressing
                     36: ;
                     37: GPIO_0of       equ     GPIO_0-JOY1     ;offset to GPIO_0 (when addr reg Ax -> JOY1) 
                     38: GPIO_1of       equ     GPIO_1-JOY1     ;offset to GPIO_1 (when addr reg Ax -> JOY1) 
                     39: ;
                     40: ;   Commands specific to the National Semiconductor NM93C14
                     41: ;
                     42: ;  9-bit commands..
                     43: ;               876543210
                     44: eREAD  equ     %110000000              ;read from EEPROM
                     45: eEWEN  equ     %100110000              ;Erase/write Enable
                     46: eWRITE equ     %101000000              ;Write selected register
                     47: eEWDS  equ     %100000000              ;Erase/Write disable (default)
                     48: ;
                     49: ;
                     50: ;  DO (data out)       - is read on bit0 of JOY1
                     51: ;  DI (data in)        - is written on bit0 of GPIO_0
                     52: ;  CS (chip select)    - is pulsed low by any access to GPIO_1
                     53: ;
                     54: ;
                     55: ;*****************************************************************
                     56: ;
                     57: ;  Write a word to EEPROM
                     58: ;
                     59: ;  entry: d0.w = data to be written
                     60: ;        d1.w = least signifigant 6 bits specify write address (0-63)  
                     61: ;
                     62: ;   exit: all preserved
                     63: ;
                     64: ;
                     65: _eewrite::
                     66:        movem.l a0/d0-d4,-(sp)
                     67: 
                     68:        move.l  28(sp),d0                       ; get data from stack (JDC)
                     69:        move.l  32(sp),d1               ; get address from stack (JDC)
                     70:        lea     JOY1,a0         ;set ptr to EEPROM i/o addresses
                     71: ;
                     72:        tst.w   GPIO_1of(a0)    ;strobe ChipSelect
                     73: ;
                     74:        move.w  #eEWEN,d2       ;erase/write enable command
                     75:        bsr     out9bits        ;send it to EEPROM
                     76: ;      
                     77:        tst.w   GPIO_1of(a0)    ;strobe ChipSelect
                     78: ;
                     79:        andi.w  #$3f,d1         ;force write addr to be legit (0-63)
                     80:        ori.w   #eWRITE,d1      ;form WRITE command
                     81:        move.w  d1,d2
                     82:        bsr     out9bits        ;send it to EEPROM
                     83: ;
                     84:        move.w  d0,d2           ;get 16-bit data word to send
                     85:        bsr     out16bit        ;  & send it
                     86: ;
                     87:        tst.w   GPIO_1of(a0)    ;strobe ChipSelect
                     88: ;
                     89:        nop                     ;1 us required after CS for status valid
                     90:        nop
                     91:        move.w  #1,d2
                     92:        move.w  #$2000,d4
                     93: wrwait:
                     94:        move.w  (a0),d3         ;wait until write is complete
                     95:        sub.w   #1,d4           ; don't stay in here forever
                     96:        beq             badwrite        ; didn't work
                     97:        and.w   d2,d3
                     98:        beq     wrwait  
                     99: ;      
                    100:        move.w  #eEWDS,d2       ;get erase/write disable command
                    101:        bsr     out9bits        ;send it
                    102: ;
                    103:        tst.w   GPIO_1of(a0)    ;strobe ChipSelect
                    104: ;
                    105:        movem.l (sp)+,a0/d0-d4
                    106:        move.l  #1,d0                   ; ok write
                    107:        rts                     ;we're done
                    108:        
                    109: badwrite:
                    110:        movem.l (sp)+,a0/d0-d4
                    111:        move.l  #0,d0                   ; bad write
                    112:        rts
                    113:        
                    114: ;
                    115: ;
                    116: ;
                    117: ;******************************************************
                    118: ;
                    119: ;
                    120: ;  Read a word from EEPROM
                    121: ;
                    122: ;  entry:  d1.w = least signifigant 6 bits specify read address (0-63)  
                    123: ;
                    124: ;   exit:  d0.w = data as read from EEPROM
                    125: ;                all other registers preserved
                    126: ;
                    127: _eeread::
                    128:        movem.l a0/d1-d4,-(sp)
                    129: 
                    130:        move.l  24(sp),d1                       ; get address off the stack (JDC)
                    131:        lea     JOY1,a0         ;set ptr to EEPROM i/o address
                    132: ;
                    133:        tst.w   GPIO_1of(a0)    ;strobe ChipSelect
                    134: ;
                    135:        andi.w  #$3f,d1         ;force legit read addr
                    136:        ori.w   #eREAD,d1
                    137:        move.w  d1,d2
                    138:        bsr     out9bits
                    139: ;
                    140:        moveq   #0,d0
                    141:        moveq   #15,d3          ;pick up 17 bits (1st is dummy)
                    142: inlp:  
                    143:        tst.w   GPIO_0of(a0)
                    144:        nop
                    145:        move.w  (a0),d1
                    146:        lsr.w   #1,d1
                    147:        addx.w  d0,d0
                    148:        nop
                    149:        nop
                    150:        nop
                    151:        nop
                    152:        nop
                    153:        nop
                    154:        dbra    d3,inlp
                    155: ;
                    156:        movem.l (sp)+,a0/d1-d4
                    157:        rts
                    158: ;
                    159: ;
                    160: ;
                    161: ;**************************************************************
                    162: ;
                    163: ;  Subordinate Routines needed by "eewrite"
                    164: ;
                    165: ;  Serial data sent to device is written to DI, bit0 of GPIO_0
                    166: ;
                    167: ; entry:
                    168: ;  a0 -> JOY1
                    169: ;  d2.w = 16-bit data word to write
                    170: ;
                    171: ; exit:
                    172: ;  d2.w, d3.l destroyed
                    173: ;
                    174: out16bit:
                    175:        rol.w   #1,d2           ;align 1st serial data bit (bit15) to bit0
                    176:        moveq   #15,d3          ;send 16 bits
                    177:        bra.s   out9lp
                    178: ;
                    179: ; entry:
                    180: ;  a0 -> JOY1
                    181: ;  d2.w = 9-bit command to write
                    182: ;
                    183: out9bits:
                    184:        rol.w   #8,d2           ;align 1st serial data bit (bit8) to bit0
                    185:        moveq   #8,d3           ;send 9
                    186: out9lp:
                    187:        move.w  d2,GPIO_0of(a0)         ;write next bit
                    188:        nop
                    189:        nop
                    190:        nop                     ;delay next write
                    191:        nop
                    192:        nop
                    193:        nop
                    194:        rol.w   #1,d2           ;adjust bit0 for next datum
                    195:        dbra    d3,out9lp       ;go for all 9 or all 16
                    196:        rts
                    197: ;
                    198: ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.