Los fuentes 900x.
 ;
;       PIC12C508 version of the "v5.3" serial data chip emulation.
;       Written by the Old Crow (Scott Rider) on 6-JUN-97.
;
;
;       Modified by Charles on 10-August 1998 for Model 7502
;
;       5 Wire Version.  
;
;       Modified by Charles on 6-July 1999 for Model 9002
;
;       4 Wire Version.  
;
;
;
;       Boots ALL Original Games and ALL Copied games.
;
;
;       Revision History:
;
;       P1.01v5 on 19-JAN-97    ;Uses v5.0 chip data
;       P1.05   on 29-JAN-97    ;Uses ASCII version of v5.0 data
;       P1.051  on 22-FEB-97    ;Fixed tiny, unimportant timing bug
;       P1.052  on 06-JUN-97    ;Revised 5-wire version of '508 for 550x
;       P1.053  on 08-JUN-97    ;Alternating 4MHz/4.45MHz delay on 5-wire
;       P1.054  on 08-MAY-98    ;Fixed timing bug in 5-wire version
;
;       This version uses Microchip assembler mnemonics and the
;       Microchip MPASM assembler.  
;
;       Chip is connected in 5-wire fashion:
;
;                       _______  _______
;                      |       \/       |
;                Vdd --+ 1 <<      >> 8 +-- Vss
;                      |                |
;           GP5/OSC1 --+ 2 <<      >> 7 +-- GP0
;                      |                |
;           GP4/OSC2 --+ 3         >> 6 +-- GP1
;                      |                |
;          GP3/!MCLR --+ 4 <<      >> 5 +-- GP2/T0CKI
;                      |                |
;                      +----------------+
;
;
;       Note: change the "P509 EQU 0" to "P509 EQU 1" below to instruct
;       the assembler to make the hex object code for a PIC12C509.
;
P509    EQU     0       ;Default assembles for a PIC12C508
   IF      P509
   list    p=12c509
   include "p12c509.inc"
   ELSE
   list    p=12c508
   include "p12c508.inc"
   ENDIF
   radix   dec
;
;
   __FUSES _MCLRE_OFF & _CP_OFF & _WDT_OFF & _INT_OSC
   cblock  0x07    ;Store variables above control registers 
      i       ;Loop counters
      j
      k       ;/
      x       ;Used by delay routine
      y       ;/
      xmit    ;Transmit data holding register
      index   ;Index register for table lookups
      tstat   ;Current TRIS setting
        endc
   org     0x00            ;Start of code space 
   
   movwf   OSCCAL          ;Set oscillator calibration reg.
   goto    start           ;Jump into main code segment
;
;  Support routines
;
;  dly50  -- entry for 50ms delay
;  dly_ms -- entry with number of ms in w (1 to 255)
;
dly50   movlw   50              ;Enter here for a 50ms delay
dly_ms  movwf   x               ;/
dy_0    movlw   65              ;1ms loop count on 100x series
   movwf   y               ;/
dy_1    btfsc   GPIO,3          ;Check Input rb.3                         
        bsf     tstat,0         ;Set Output rb.0                         
        btfss   GPIO,3          ;Check Input rb.3                         
        bcf     tstat,0         ;Clear Output rb.0                       
  
   movlw   b'11111000'     ;Set rb.5
   btfss   tstat,0         ;Check Timing Signal                      
        movlw   b'11011000'       ;Clear rb.5                             
        btfss   tstat,1         ;Check Datagram                           
        movlw   b'11011000'     ;Clear rb.5
   movwf   GPIO
   movf    tstat,W         ;Read TRIS State                         
        tris    GPIO                                                     
        decfsz  y,F                                                      
   goto    dy_1
   
        nop                     ;Another 6 Micro's
        nop
        nop
        nop
        nop
        nop
dy_3    decfsz  x,F             ;# of 1ms delays
   goto    dy_0
   
   retlw   3
;
;  sendln -- send 4-byte line(s) with a 72ms marker at head of line.
;  Enter with number of lines in w.
;
sendln  movwf   i               ;Do this many lines
sl_0    movlw   72              ;Delay 72ms
   call    dly_ms
   movlw   4               ;Do first half of line
   movwf   j               ;/
sl_1    movf    index,W         ;Restore index
   call    lines           ;Get a data byte..
   movwf   xmit            ;..into xmit buffer
   comf    xmit,F          ;Invert for sending
;
;       Send a byte on rb.1.  LSB first, 4ms/bit (250 bps) with one
;  start bit and two stop bits per byte.  Instead of setting and 
;  clearing the port bit, the port's direction is changed.  The actual 
;  port register is set to zero, so that when the port bit is directed 
;  to be an output, it automatically goes low.  Directing the port bit 
;  to be an input floats the I/O pin, and the external pullup creates 
;  the high.  This allows open-collector operation of the port bits.
;
   movlw   8               ;8 bit bytes
   movwf   k               ;/
   bsf     tstat,1         ;Start bit on pin 6=1
        movf    tstat,W
   tris    GPIO
   movlw   4               ;4ms bit-time
   call    dly_ms
sl_2    rrf     xmit,F          ;Get a bit..
        
   btfsc   STATUS,C        ;High or low?
   bsf     tstat,1         ;Set pin 6 high via port direction control
   btfss   STATUS,C        ;High or low?
   bcf     tstat,1         ;Set pin 6 low via port direction control
        movf    tstat,W
   tris    GPIO            ;Set the port
   
   movlw   4               ;Delay 4ms
   call    dly_ms
   decfsz  k,F             ;Do all bits requested
   goto    sl_2
   bcf     tstat,1         ;Stop bits
        movf    tstat,W
   tris    GPIO
   movlw   8               ;Two 4ms bit-times
   call    dly_ms
;
;        
   incf    index,F         ;Point to next
   decfsz  j,F
   goto    sl_1
   decfsz  i,F             ;Do specified number of lines
   goto    sl_0
   
   retlw   3
;
;    Data block.
;
lines   addwf   PCL,F   ;Get index into table                 
   dt      'S','C','E','I' ;Japanese/NTSC
   dt      'S','C','E','A' ;U.S./NTSC
   dt      'S','C','E','E' ;European/PAL
;
; Main program loop.
;
   org     0x0100
start   movlw   b'11000010'     ;Set TMR0 prescaler = 1:8 (f_osc=4MHz)     
   option                  ;/
        movlw   b'11011111'     ;Make all port bits inputs initially
        movwf   tstat
   tris    GPIO            ;/
   
   movlw   b'11111000'     ;Keep port bits low when outputs
   movwf   GPIO            ;/
;        
;  Step 1 -- approx. 50ms after reset, I/O pin 6 goes low.
;
   call    dly50           ;Delay 50ms
   
        bcf     GPIO,0          ;Make sure PIN 7 is low
   bcf     GPIO,1          ;Make sure it's low
   bcf     tstat,1         ;Make rb.1 low via port direction
        movf    tstat,W
   tris    GPIO            ;/
;
;  Step 2 -- approx. 850ms later I/O pin 5 goes low.
;        
step2   movlw   17              ;17 x 50ms = 850ms
   movwf   i               ;/
s2_0    call    dly50
   decfsz  i,F
   goto    s2_0            ;/
   bcf     GPIO,2          ;Make sure it's low
   bcf     tstat,2         ;Make rb.2 (and keep rb.1) low
        movf    tstat,W
   tris    GPIO            ;/
;
;  Step 3 -- wait approx. 314ms
;
step3   movlw   6               ;6 x 50ms = 300ms
   movwf   i               ;/
s3_0    call    dly50
   decfsz  i,F
   goto    s3_0            ;/
   movlw   14              ;Final 14ms
   call    dly_ms
;
;  Step 4 -- clock out all three datagrams on rb.1 ad infinitum.
;
step4   clrf    index           ;Do first line
   call    sendln
   goto    step4
;
; (Note: do NOT overwrite factory-programmed location 0x1FF !!)
;
; That's all, folks!
;
   end