EPROM boot code for OS loading



    SECTION .text

    ORG    $00000000




    ; Define the initial stack pointer and reset vector

    DC.L $00108000   ; Initial Stack Pointer (example address, adjust as needed)

    DC.L _start      ; Reset vector pointing to the program entry point




    ORG    $00000100




SWWAIT        EQU   100

DUART1        EQU   $00080000

DUART2        EQU   $00080020

DUART3        EQU   $00080040

DISPLAY_ADDR  EQU   $800A0

ACR           EQU   $09

CTUR          EQU   $0D

CTLR          EQU   $0F

OPCR          EQU   $1B

SOP           EQU   $1D

ROP           EQU   $1F

IP            EQU   $1B

OS_DEST       EQU  $00108000

OSLEN        EQU  43915




_start:

    ; Configure DUART3 for timer mode

    ; OPCR = $04 (Timer on O/P 3)

    ; ACR  = $60 (Timer mode, x1 prescaler)

    ; CTUR = $40

    ; CTLR = $00

    MOVE.B  #$04,(DUART3+OPCR).L

    MOVE.B  #$60,(DUART3+ACR).L

    MOVE.B  #$40,(DUART3+CTUR).L

    MOVE.B  #$00,(DUART3+CTLR).L




    ; --- Beep #1 ---

    ; Turn buzzer on

    MOVE.B  #$08,(DUART2+ROP).L

    

    ; Wait for CART LOAD to be pressed

waitcl:

    MOVE.B #$03,(DUART3+SOP).L

    ; Switch Bank 2

MOVE.B#$02,(DUART3+ROP).L 

MOVE.L#SWWAIT,d0

w3:SUBI.L#1,d0

BNE.Sw3;

BTST #02,(DUART3+IP)

BEQ.Swaitcl

    ; Turn buzzer off

    MOVE.B  #$08,(DUART2+SOP).L

    ; Short pause ~1s

    MOVE.L  #$0007D00,D0

short_delay1:

    SUBI.L  #1,D0

    BNE.S   short_delay1




    ; --- Beep #2 ---

    MOVE.B  #$08,(DUART2+ROP).L

    MOVE.L  #$003D090,D0

long_delay2:

    SUBI.L  #1,D0

    BNE.S   long_delay2

    MOVE.B  #$08,(DUART2+SOP).L

    MOVE.L  #$0007D00,D0

short_delay2:

    SUBI.L  #1,D0

    BNE.S   short_delay2




    ; --- Beep #3 ---

    MOVE.B  #$08,(DUART2+ROP).L

    MOVE.L  #$003D090,D0

long_delay3:

    SUBI.L  #1,D0

    BNE.S   long_delay3

    MOVE.B  #$08,(DUART2+SOP).L

    MOVE.L  #$0007D00,D0

short_delay3:

    SUBI.L  #1,D0

    BNE.S   short_delay3

display:    

    MOVE.B  #$38,(DUART1+ROP).L   

    MOVE.B  #$08,(DUART1+SOP).L

    LEA     DISPLAY_ADDR,A0

    MOVE.B  #$10,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$10,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$7E,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$10,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$7E,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$10,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$10,(A0)

    ADDQ.L  #2,A0

    MOVE.B  #$00,(A0)




copy_os:

    LEA   OS_BIN_START,A0   ; EPROM source

    LEA   OS_DEST,A1        ; RAM destination

    MOVE.L #OSLEN,D0        ; number of bytes to copy




loop_copy:

    MOVE.B (A0)+,(A1)+

    SUBQ.L #1,D0

    BNE.S  loop_copy

    RTS




done:

    BRA.S done




    SECTION .osdata




OS_BIN_START:

    INCBIN  "VX15B.BIN"     

OS_BIN_END:




END
To top