home *** CD-ROM | disk | FTP | other *** search
/ Dream 55 / Amiga_Dream_55.iso / RISCOS / MAGAZINE / NEWS / PCE021.ZIP / Pce021 / Src / s / interface next >
Text File  |  1998-07-24  |  5KB  |  285 lines

  1. ;    interface.s
  2. ;    -----------
  3. ;    Simple command line interface to PC Engine emulator
  4.  
  5.  
  6.     GET    hdr.SWINames
  7.     GET    hdr.defines
  8.     GET    cpu.hdr.workspace
  9.  
  10.  
  11.     AREA    |!!interface$$code|, CODE, READONLY
  12.  
  13.     EXPORT    Claim_Memory
  14.     EXPORT    Claim_Zero_Memory
  15.  
  16.     IMPORT    Run_CPU_Core
  17.     IMPORT    CPU_Initialise
  18.     IMPORT    Memory_Initialise
  19.     IMPORT    VDC_Initialise
  20.     IMPORT    VDC_Finalise
  21.     IMPORT    Joypad_Initialise
  22.     IMPORT    Joypad_Finalise
  23.     IMPORT    PSG_Initialise
  24.     IMPORT    PSG_Finalise
  25.  
  26.     IMPORT    PSG_Disable
  27.     IMPORT    PSG_Disable_Address
  28.  
  29.     IMPORT    Timer_StartIncrement
  30.     IMPORT    Timer_StopIncrement
  31.     IMPORT    Timer_SetSpeed
  32.  
  33.     ENTRY
  34.  
  35.     ldr    r4, adrof_memory_status
  36.     mov    r0, #0 ; MemoryLimit
  37.     mov    r1, #0
  38.     swi    OS_ChangeEnvironment
  39.     ldr    r0, adrof_program_end
  40.     stmia    r4, {r0, r1}
  41.     ldr    r13, adrof_stack_end
  42.  
  43.     swi    OS_GetEnv
  44.     mov    r1, r0
  45.     adr    r0, keyword_definition
  46.     sub    r2, r13, #1024
  47.     mov    r3, #1024
  48.     swi    XOS_ReadArgs
  49.     adrvs    r0, syntax
  50.     bvs    Show_Error
  51.  
  52.     ldr    r0, [r2, #4]        ; turbografx switch
  53.     cmp    r0, #0            ; off?
  54.     movne    r0, #0x40        ; no
  55.     ldr    r1, adrof_machine
  56.     str    r0, [r1, #0]        ; store machine value
  57.     ldr    r0, [r2, #12]
  58.     cmp    r0, #0
  59.     movne    r0, #1
  60.     ldr    r1, =nosound_flag
  61.     str    r0, [r1, #0]
  62.     ldrne    r0, =PSG_Disable_Address
  63.     ldrne    r1, =PSG_Disable
  64.     strne    r0, [r1, #0]
  65.     ldr    r0, [r2, #16]
  66. ;    cmp    r0, #0
  67. ;    movne    r0, #1
  68.     mov    r0, #1
  69.     ldr    r1, =vsync_flag
  70.     str    r0, [r1, #0]
  71. ;    beq    No_MHzTimer
  72.  
  73.     add    r0, r1, #4
  74.     bl    Timer_StartIncrement
  75.     mov    r0, #0x4100
  76.     orr    r0, r0, #0x1a
  77.     bl    Timer_SetSpeed
  78.     sub    r2, r13, #1024
  79. ;No_MHzTimer
  80.  
  81.     ldr    data, adrof_cpu_emulation_data
  82.     mov    r0, #17
  83.     ldr    r1, [r2, #20]
  84.     swi    OS_File
  85.     cmp    r0, #1
  86.     adrne    r0, bad_file
  87.     bne    Show_Error
  88.     mov    r7, r4
  89.     mov    r6, r4
  90.     bl    Claim_Memory
  91.     str    r6, [data, #rom_address]
  92.     mov    r0, #16
  93.     mov    r2, r6
  94.     mov    r3, #0
  95.     swi    OS_File
  96.     ldr    r0, [data, #rom_address]
  97.     ldrb    r1, [r0, #0]
  98.     sub    r2, r7, r1, lsl #13
  99.     subs    r2, r2, #512
  100.     addeq    r0, r0, #512
  101.     subeq    r7, r7, #512
  102.     streq    r0, [data, #rom_address]
  103.     movne    r1, r7, lsr #13
  104. ;    cmp    r1, #0xf6
  105. ;    adrgt    r0, oversized_file
  106. ;    bgt    Show_Error
  107.  
  108.     str    r7, [data, #rom_size]
  109.     mov    r6, #0x2000
  110.     bl    Claim_Zero_Memory
  111.     str    r6, [data, #bram_address]
  112.     mov    r6, #0x8000
  113.     bl    Claim_Zero_Memory
  114.     str    r6, [data, #ram_address]
  115.     bl    Memory_Initialise
  116.  
  117.     bl    PSG_Initialise
  118.  
  119.     ldr    r4, adrof_handler_data
  120.     mov    r0, #11 ; exit handler
  121.     adr    r1, Exit_Handler
  122.     mov    r2, r4
  123.     mov    r3, #0
  124.     swi    OS_ChangeEnvironment
  125.     mov    r3, r1
  126.     stmia    r4!, {r2, r3}
  127. ;    mov    r0, #9 ; escape handler
  128. ;    adr    r1, Escape_Handler
  129. ;    mov    r2, r4
  130. ;    mov    r3, #0
  131. ;    swi    OS_ChangeEnvironment
  132. ;    mov    r3, r1
  133. ;    stmia    r4!, {r2, r3}
  134.  
  135.     bl    VDC_Initialise
  136.     bl    Joypad_Initialise
  137.     bl    CPU_Initialise
  138.  
  139.     b    Run_CPU_Core
  140.  
  141. Show_Error
  142.     mov    r1, #0
  143.     mov    r2, #0
  144.     swi    OS_PrettyPrint
  145.     swi    OS_Exit
  146.  
  147. Exit_Handler
  148.     stmfd    r13!, {r0, r11-r12, r14}
  149.     ldr    r0, =vsync_flag
  150.     ldr    r1, [r0], #4
  151.     cmp    r1, #0
  152.     blne    Timer_StopIncrement
  153.     bl    PSG_Finalise
  154.     bl    VDC_Finalise
  155.     bl    Joypad_Finalise
  156.     ldmfd    r13!, {r0, r11-r12, r14}
  157.     ldmia    r12, {r12, pc}
  158. ;Escape_Handler
  159. ;    swi    OS_Exit
  160.  
  161.  
  162. Claim_Memory
  163. ; entry
  164. ;   r6 = amount to claim
  165. ; exit
  166. ;   r6 = pointer to memory
  167. ;  all other registers preserved
  168.     stmfd    r13!, {r0-r3, r14}
  169.     ldr    r3, adrof_memory_status
  170.     ldmia    r3, {r0, r1}
  171.     add    r6, r6, #3
  172.     bic    r6, r6, #3
  173.     add    r0, r0, r6
  174.     sub    r6, r0, r6
  175.     cmp    r0, r1
  176.     movgt    r1, r0
  177.     addgt    r1, r1, #16 * 1024
  178.     stmia    r3, {r0, r1}
  179.     movgt    r0, #0 ; MemoryLimit
  180.     swigt    OS_ChangeEnvironment
  181.     ldmfd    r13!, {r0-r3, pc}^
  182.  
  183. Claim_Zero_Memory
  184. ; entry
  185. ;   r6 = amount to claim
  186. ; exit
  187. ;   r6 = pointer to memory
  188. ;  all other registers preserved
  189.     stmfd    r13!, {r0-r2, r14}
  190.     mov    r1, r6
  191.     bl    Claim_Memory
  192.     mov    r0, r6
  193.     add    r1, r1, r6
  194.     mov    r2, #0
  195. Zero_Loop
  196.     str    r2, [r0], #4
  197.     cmp    r0, r1
  198.     blt    Zero_Loop
  199.     ldmfd    r13!, {r0-r2, pc}^
  200.  
  201.  
  202. keyword_definition
  203.     =    "/a,us/s,jp/s,nosound/s,vsync/s,/a", 0
  204.     ALIGN
  205. syntax
  206.     =    "pcengine v0.20 (30 May 1998) by Paul Clifford (paul@plasma.demon.co.uk)", 13, 13
  207.     =    "Syntax: pcengine [options] <rom filename>", 13, 13
  208.     =    "-us", 9, 9, "Emulate a TurboGrafx 16 [default]", 13
  209.     =    "-jp", 9, 9, "Emulate a PC Engine", 13
  210.     =    "-nosound", 9, "Disable sound", 13
  211. ;    =    "-vsync", 9, 9, "Lock frame rate to vsync", 13
  212.     =    0
  213.     ALIGN
  214. bad_file
  215.     =    "Cannot load specified file", 13
  216.     =    0
  217.     ALIGN
  218. oversized_file
  219.     =    "File is too big - are you sure it is a ROM image?", 13
  220.     =    0
  221.     ALIGN
  222.  
  223.  
  224. adrof_program_end
  225.     DCD    program_end
  226. adrof_stack_end
  227.     DCD    stack_end
  228. adrof_handler_data
  229.     DCD    handler_data
  230. adrof_machine
  231.     DCD    machine
  232. adrof_memory_status
  233.     DCD    memory_status
  234.  
  235.     IMPORT    cpu_emulation_data
  236. adrof_cpu_emulation_data
  237.     DCD    cpu_emulation_data
  238.  
  239.  
  240.     AREA    |!!interface$$data|, DATA
  241.  
  242.  
  243.     EXPORT    handler_data
  244. handler_data
  245.     DCD    0
  246.     DCD    0
  247.     DCD    0
  248.     DCD    0
  249.  
  250.     EXPORT    machine
  251. machine
  252.     DCD    0
  253.  
  254.     EXPORT    memory_status
  255. memory_status
  256.     DCD    0
  257.     DCD    0
  258.  
  259. vsync_flag
  260.     EXPORT    vsync_flag
  261.     DCD    0
  262.     DCD    0
  263. nosound_flag
  264.     EXPORT    nosound_flag
  265.     DCD    0
  266.  
  267.  
  268.     AREA    |!!interface$$zidata|, NOINIT
  269.  
  270.  
  271.     EXPORT    stack_end
  272.     %    1024
  273. stack_end
  274.  
  275.  
  276.     AREA    |zzz$zidata|, NOINIT
  277.  
  278.  
  279.     EXPORT    program_end
  280.     ALIGN
  281. program_end
  282.  
  283.  
  284.     END
  285.