Top secrets sources NedoPC pentevo

Rev

Rev 635 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?


;        ORG     0X6000

        ; rom programming example for PENTEVO
        ; contains 2 parts: example and working procedures


        ; prepare hardware

;        DI

;        LD      A,3
;        OUT     (0XBF),A ; enable shadow ports, enable ROM write


        ; write byte
;
 ;      LD      E,0X04
  ;     LD      HL,0X0001
   ;    LD      A,0X55
    ;   CALL    PGM_BYTE

     ;  LD      HL,0X0123
      ; LD      A,0XAA
       ;CALL    PGM_BYTE


        ; erase 64Kb block

;       LD      E,0X04
 ;      LD      HL,0X0000
  ;     CALL    ERASE_BLK


        ; program 16k of shit

;       LD      E,0X04
 ;      LD      HL,0X0000
  ;     LD      IX,0X8000
   ;    LD      BC,0X4000

;L2
    ;   LD      A,(IX)
     ;  CALL    PGM_BYTE

      ; INC     IX
       ;CALL    INC_EHL
;       DEC     BC
 ;      LD      A,B
  ;     OR      C
   ;    JR      NZ,L2

        ; read page

;        LD      E,0X04
;        LD      HL,0X0000
;        LD      IX,0X8000
;        LD      BC,0X4000
;L1
;        CALL    RDBYTE
;        LD      (IX),A

;        CALL    INC_EHL
;        INC     IX
;        DEC     BC
;        LD      A,B
;        OR      C
;        JR      NZ,L1

;        LD      BC,0XFFF7 ;return RAM to 0XC000..0XFFFF
;        LD      A,0XFF
;        OUT     (C),A

;        LD      A,0
;        OUT     (0XBF),A ; disable ports, disable ROM write

;        EI
;        RET





;INC_EHL
;        INC     L
;        RET     NZ
;        INC     H
;        RET     NZ
;        INC     E
;        RET



PGM_BYTE
        ; programs byte to the given location
        ; address in EHL (512kB only)
        ; byte in A

        ; preserves BC,DE,HL

        ; returns carry=1 if error

        PUSH    DE
        PUSH    HL
        PUSH    AF

        LD      E,0X00
        LD      HL,0X0555
        LD      A,0XAA
        CALL    WRBYTE

        LD      HL,0X2AA
        LD      A,0X55
        CALL    WRBYTE

        LD      HL,0X555
        LD      A,0XA0
        CALL    WRBYTE

        POP     AF
        POP     HL
        POP     DE
        CALL    WRBYTE

        JR      ERR_END ; wait for end/error as always


ERASE_BLK
        ; erases 64kB block of ROM.
        ; block address is given in EHL (any addr in block)

        ; returns carry=1 if error

        ; BC,DE,HL are preserved


        PUSH    DE
        PUSH    HL

        LD      E,0X00
        LD      HL,0X0555
        LD      A,0XAA
        CALL    WRBYTE

        LD      HL,0X2AA
        LD      A,0X55
        CALL    WRBYTE

        LD      HL,0X555
        LD      A,0X80
        CALL    WRBYTE

        LD      A,0XAA
        CALL    WRBYTE

        LD      HL,0X2AA
        LD      A,0X55
        CALL    WRBYTE

        POP     HL
        POP     DE
        LD      A,0X30
        CALL    WRBYTE

        ;now wait 100uS @ 14MHz to start actual block erase

        LD      A,87
        DEC     A
        JR      NZ,$-1

        ; then wait for erase end
ERR_END
        CALL    WAIT_END

        RET     NC ; if no error - return

        ; send read/reset command to ROM

        LD      A,0XF0
        CALL    WRBYTE

        ;then wait 10uS @ 14MHz

        LD      A,9
        DEC     A
        JR      NZ,$-1

        SCF
        RET ; set error condition

WAIT_END;wait for ROM to end op or to indicate error

        PUSH    BC

WE_REPEAT
        CALL    RDBYTE
        LD      B,A

        CALL    RDBYTE
        XOR     B

        BIT     6,A
        JR      Z,WE_END ; no toggle - end! (carry is clear)

        BIT     5,A
        JR      NZ,WE_REPEAT ; if toggle and error bit toggles -
                             ; repeat reading

        BIT     5,B ; toggle, error bit is set - error!
        JR      Z,WE_REPEAT ; otherwise - just toggle, wait more

;WE_ERROR
        SCF

WE_END  POP     BC
        RET

WRBYTE  ; writes given in A byte to rom at address EHL
        ; in a range 0..512kB

        ; assumes shadow ports are on
        ; uses paging in 0XC000..0XFFFF window

        ; preserves A,BC,DE,HL

        PUSH    BC
        PUSH    AF

        LD      A,E
        AND     7 ; 512kB only
        LD      B,A

        LD      A,H
        AND     0XC0
        OR      B

        RLCA
        RLCA

        CPL
        AND     0X3F
;;;;;;;;OR      0X00

        LD      BC,WIN_A3;0XFFF7
        OUT     (C),A    ; page is done

        LD      A,H
        OR      0XC0
        LD      B,A
        LD      A,L
        LD      C,A

        POP     AF
        LD      (BC),A

        POP     BC
        RET

RDBYTE  ; read byte (same as WRBYTE), reads in A

        PUSH    BC


        LD      A,E
        AND     7 ; 512kB only
        LD      B,A

        LD      A,H
        AND     0XC0
        OR      B

        RLCA
        RLCA

        CPL
        AND     0X3F
;;;;;;;;OR      0X00

        LD      BC,WIN_A3;0XFFF7
        OUT     (C),A    ; page is done

        LD      A,H
        OR      0XC0
        LD      B,A
        LD      A,L
        LD      C,A

        LD      A,(BC)

        POP     BC
        RET