From 6ff40412518a5ad69d6cb9f7ddf9cd420f8d4ac3 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Tue, 30 Jun 2020 12:10:15 -0500 Subject: [PATCH] added xasm6809 USE directive support; atari7800: fixed header --- index.html | 4 + presets/vectrex/hello.xasm | 7 +- presets/vectrex/skeleton.xasm6809 | 7 +- presets/vectrex/threed.c | 10 - presets/vectrex/vectrex.inc | 318 ++++++++++++++++++++++++++++++ src/ide/project.ts | 5 + src/machine/atari7800.ts | 2 +- src/platform/vectrex.ts | 46 +++-- src/worker/lib/atari7800/crt0.o | Bin 2259 -> 2592 bytes src/worker/lib/atari7800/crt0.s | 36 +++- src/worker/workermain.ts | 2 +- 11 files changed, 392 insertions(+), 45 deletions(-) create mode 100644 presets/vectrex/vectrex.inc diff --git a/index.html b/index.html index e85f0df7..5933a3ee 100644 --- a/index.html +++ b/index.html @@ -348,6 +348,10 @@ if (window.location.host.endsWith('8bitworkshop.com')) { 1 2 3 ,
\ 0 . = Keypad + diff --git a/presets/vectrex/hello.xasm b/presets/vectrex/hello.xasm index 70ddd9f2..13163ccf 100644 --- a/presets/vectrex/hello.xasm +++ b/presets/vectrex/hello.xasm @@ -2,11 +2,8 @@ ;*************************************************************************** ; DEFINE SECTION ;*************************************************************************** -Intensity_5F EQU $F2A5 ; BIOS Intensity routine -Print_Str_d EQU $F37A ; BIOS print routine -Wait_Recal EQU $F192 ; BIOS recalibration -music1 EQU $FF8F ; address of a (BIOS ROM) - ; music + USE vectrex.inc ; include file + ; start of vectrex memory with cartridge name... ORG 0 ;*************************************************************************** diff --git a/presets/vectrex/skeleton.xasm6809 b/presets/vectrex/skeleton.xasm6809 index eab90bb7..45e60e85 100644 --- a/presets/vectrex/skeleton.xasm6809 +++ b/presets/vectrex/skeleton.xasm6809 @@ -1,11 +1,8 @@ ;*************************************************************************** ; DEFINE SECTION ;*************************************************************************** -Intensity_5F EQU $F2A5 ; BIOS Intensity routine -Print_Str_d EQU $F37A ; BIOS print routine -Wait_Recal EQU $F192 ; BIOS recalibration -music1 EQU $FF8F ; address of a (BIOS ROM) - ; music + USE vectrex.inc ; include file + ; start of vectrex memory with cartridge name... ORG 0 ;*************************************************************************** diff --git a/presets/vectrex/threed.c b/presets/vectrex/threed.c index 026e7e51..8656aaff 100644 --- a/presets/vectrex/threed.c +++ b/presets/vectrex/threed.c @@ -8,16 +8,6 @@ #include "stdlib.h" #include "bios.h" -char rectangle[10] = { - // These are relative coordinates. - 50, 0, - 0, 50, - -50, 0, - 0, -50, - // We also take the middle point of the rectangle which we move to before drawing. - -25, -25 -}; - typedef struct { sbyte m[3][3]; } Matrix; diff --git a/presets/vectrex/vectrex.inc b/presets/vectrex/vectrex.inc new file mode 100644 index 00000000..da2d97d4 --- /dev/null +++ b/presets/vectrex/vectrex.inc @@ -0,0 +1,318 @@ +; this file is part of vectrex frogger, written by Christopher Salomon +; in March-April 1998 all stuff contained here is public domain (?) +; +; Fixed to compile with AS6809 by Joakim Larsson Edström 2015. +; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; this file contains includes for vectrex BIOS functions and variables ; +; it was written by Bruce Tomlin, slighte changed by Christopher Salomon ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +Vec_Snd_Shadow EQU $C800 ;Shadow of sound chip registers (15 bytes) +Vec_Btn_State EQU $C80F ;Current state of all joystick buttons +Vec_Prev_Btns EQU $C810 ;Previous state of all joystick buttons +Vec_Buttons EQU $C811 ;Current toggle state of all buttons +Vec_Button_1_1 EQU $C812 ;Current toggle state of stick 1 button 1 +Vec_Button_1_2 EQU $C813 ;Current toggle state of stick 1 button 2 +Vec_Button_1_3 EQU $C814 ;Current toggle state of stick 1 button 3 +Vec_Button_1_4 EQU $C815 ;Current toggle state of stick 1 button 4 +Vec_Button_2_1 EQU $C816 ;Current toggle state of stick 2 button 1 +Vec_Button_2_2 EQU $C817 ;Current toggle state of stick 2 button 2 +Vec_Button_2_3 EQU $C818 ;Current toggle state of stick 2 button 3 +Vec_Button_2_4 EQU $C819 ;Current toggle state of stick 2 button 4 +Vec_Joy_Resltn EQU $C81A ;Joystick A/D resolution ($80=min $00=max) +Vec_Joy_1_X EQU $C81B ;Joystick 1 left/right +Vec_Joy_1_Y EQU $C81C ;Joystick 1 up/down +Vec_Joy_2_X EQU $C81D ;Joystick 2 left/right +Vec_Joy_2_Y EQU $C81E ;Joystick 2 up/down +Vec_Joy_Mux EQU $C81F ;Joystick enable/mux flags (4 bytes) +Vec_Joy_Mux_1_X EQU $C81F ;Joystick 1 X enable/mux flag (=1) +Vec_Joy_Mux_1_Y EQU $C820 ;Joystick 1 Y enable/mux flag (=3) +Vec_Joy_Mux_2_X EQU $C821 ;Joystick 2 X enable/mux flag (=5) +Vec_Joy_Mux_2_Y EQU $C822 ;Joystick 2 Y enable/mux flag (=7) +Vec_Misc_Count EQU $C823 ;Misc counter/flag byte, zero when not in use +Vec_0Ref_Enable EQU $C824 ;Check0Ref enable flag +Vec_Loop_Count EQU $C825 ;Loop counter word (incremented in Wait_Recal) +Vec_Brightness EQU $C827 ;Default brightness +Vec_Dot_Dwell EQU $C828 ;Dot dwell time? +Vec_Pattern EQU $C829 ;Dot pattern (bits) +Vec_Text_HW EQU $C82A ;Default text height and width +Vec_Text_Height EQU $C82A ;Default text height +Vec_Text_Width EQU $C82B ;Default text width +Vec_Str_Ptr EQU $C82C ;Temporary string pointer for Print_Str +Vec_Counters EQU $C82E ;Six bytes of counters +Vec_Counter_1 EQU $C82E ;First counter byte +Vec_Counter_2 EQU $C82F ;Second counter byte +Vec_Counter_3 EQU $C830 ;Third counter byte +Vec_Counter_4 EQU $C831 ;Fourth counter byte +Vec_Counter_5 EQU $C832 ;Fifth counter byte +Vec_Counter_6 EQU $C833 ;Sixth counter byte +Vec_RiseRun_Tmp EQU $C834 ;Temp storage word for rise/run +Vec_Angle EQU $C836 ;Angle for rise/run and rotation calculations +Vec_Run_Index EQU $C837 ;Index pair for run +;* $C839 ;Pointer to copyright string during startup +Vec_Rise_Index EQU $C839 ;Index pair for rise +;* $C83B ;High score cold-start flag (=0 if valid) +Vec_RiseRun_Len EQU $C83B ;length for rise/run +;* $C83C ;temp byte +Vec_Rfrsh EQU $C83D ;Refresh time (divided by 1.5MHz) +Vec_Rfrsh_lo EQU $C83D ;Refresh time low byte +Vec_Rfrsh_hi EQU $C83E ;Refresh time high byte +Vec_Music_Work EQU $C83F ;Music work buffer (14 bytes, backwards?) +Vec_Music_Wk_A EQU $C842 ; register 10 +;* $C843 ; register 9 +;* $C844 ; register 8 +Vec_Music_Wk_7 EQU $C845 ; register 7 +Vec_Music_Wk_6 EQU $C846 ; register 6 +Vec_Music_Wk_5 EQU $C847 ; register 5 +;* $C848 ; register 4 +;* $C849 ; register 3 +;* $C84A ; register 2 +Vec_Music_Wk_1 EQU $C84B ; register 1 +;* $C84C ; register 0 +Vec_Freq_Table EQU $C84D ;Pointer to note-to-frEQUency table (normally $FC8D) +Vec_Max_Players EQU $C84F ;Maximum number of players for Select_Game +Vec_Max_Games EQU $C850 ;Maximum number of games for Select_Game +Vec_ADSR_Table EQU $C84F ;Storage for first music header word (ADSR table) +Vec_Twang_Table EQU $C851 ;Storage for second music header word ('twang' table) +Vec_Music_Ptr EQU $C853 ;Music data pointer +Vec_Expl_ChanA EQU $C853 ;Used by Explosion_Snd - bit for first channel used? +Vec_Expl_Chans EQU $C854 ;Used by Explosion_Snd - bits for all channels used? +Vec_Music_Chan EQU $C855 ;Current sound channel number for Init_Music +Vec_Music_Flag EQU $C856 ;Music active flag ($00=off $01=start $80=on) +Vec_Duration EQU $C857 ;Duration counter for Init_Music +Vec_Music_Twang EQU $C858 ;3 word 'twang' table used by Init_Music +Vec_Expl_1 EQU $C858 ;Four bytes copied from Explosion_Snd's U-reg parameters +Vec_Expl_2 EQU $C859 ; +Vec_Expl_3 EQU $C85A ; +Vec_Expl_4 EQU $C85B ; +Vec_Expl_Chan EQU $C85C ;Used by Explosion_Snd - channel number in use? +Vec_Expl_ChanB EQU $C85D ;Used by Explosion_Snd - bit for second channel used? +Vec_ADSR_Timers EQU $C85E ;ADSR timers for each sound channel (3 bytes) +Vec_Music_Freq EQU $C861 ;Storage for base frEQUency of each channel (3 words) +;* $C85E ;Scratch 'score' storage for Display_Option (7 bytes) +Vec_Expl_Flag EQU $C867 ;Explosion_Snd initialization flag? +;* $C868...$C876 ;Unused? +Vec_Expl_Timer EQU $C877 ;Used by Explosion_Snd +;* $C878 ;Unused? +Vec_Num_Players EQU $C879 ;Number of players selected in Select_Game +Vec_Num_Game EQU $C87A ;Game number selected in Select_Game +Vec_Seed_Ptr EQU $C87B ;Pointer to 3-byte random number seed (=$C87D) +Vec_Random_Seed EQU $C87D ;Default 3-byte random number seed + ; +;* $C880 - $CBEA is user RAM ; + ; +Vec_Default_Stk EQU $CBEA ;Default top-of-stack +Vec_High_Score EQU $CBEB ;High score storage (7 bytes) +Vec_SWI3_Vector EQU $CBF2 ;SWI2/SWI3 interrupt vector (3 bytes) +Vec_SWI2_Vector EQU $CBF2 ;SWI2/SWI3 interrupt vector (3 bytes) +Vec_FIRQ_Vector EQU $CBF5 ;FIRQ interrupt vector (3 bytes) +Vec_IRQ_Vector EQU $CBF8 ;IRQ interrupt vector (3 bytes) +Vec_SWI_Vector EQU $CBFB ;SWI/NMI interrupt vector (3 bytes) +Vec_NMI_Vector EQU $CBFB ;SWI/NMI interrupt vector (3 bytes) +Vec_Cold_Flag EQU $CBFE ;Cold start flag (warm start if = $7321) + ; +VIA_port_b EQU $D000 ;VIA port B data I/O register +;* 0 sample/hold (0=enable mux 1=disable mux) +;* 1 mux sel 0 +;* 2 mux sel 1 +;* 3 sound BC1 +;* 4 sound BDIR +;* 5 comparator input +;* 6 external device (slot pin 35) initialized to input +;* 7 /RAMP +VIA_port_a EQU $D001 ;VIA port A data I/O register (handshaking) +VIA_DDR_b EQU $D002 ;VIA port B data direction register (0=input 1=output) +VIA_DDR_a EQU $D003 ;VIA port A data direction register (0=input 1=output) +VIA_t1_cnt_lo EQU $D004 ;VIA timer 1 count register lo (scale factor) +VIA_t1_cnt_hi EQU $D005 ;VIA timer 1 count register hi +VIA_t1_lch_lo EQU $D006 ;VIA timer 1 latch register lo +VIA_t1_lch_hi EQU $D007 ;VIA timer 1 latch register hi +VIA_t2_lo EQU $D008 ;VIA timer 2 count/latch register lo (refresh) +VIA_t2_hi EQU $D009 ;VIA timer 2 count/latch register hi +VIA_shift_reg EQU $D00A ;VIA shift register +VIA_aux_cntl EQU $D00B ;VIA auxiliary control register +;* 0 PA latch enable +;* 1 PB latch enable +;* 2 \ 110=output to CB2 under control of phase 2 clock +;* 3 > shift register control (110 is the only mode used by the Vectrex ROM) +;* 4 / +;* 5 0=t2 one shot 1=t2 free running +;* 6 0=t1 one shot 1=t1 free running +;* 7 0=t1 disable PB7 output 1=t1 enable PB7 output +VIA_cntl EQU $D00C ;VIA control register +;* 0 CA1 control CA1 -> SW7 0=IRQ on low 1=IRQ on high +;* 1 \ +;* 2 > CA2 control CA2 -> /ZERO 110=low 111=high +;* 3 / +;* 4 CB1 control CB1 -> NC 0=IRQ on low 1=IRQ on high +;* 5 \ +;* 6 > CB2 control CB2 -> /BLANK 110=low 111=high +;* 7 / +VIA_int_flags EQU $D00D ;VIA interrupt flags register +;* bit cleared by +;* 0 CA2 interrupt flag reading or writing port A I/O +;* 1 CA1 interrupt flag reading or writing port A I/O +;* 2 shift register interrupt flag reading or writing shift register +;* 3 CB2 interrupt flag reading or writing port B I/O +;* 4 CB1 interrupt flag reading or writing port A I/O +;* 5 timer 2 interrupt flag read t2 low or write t2 high +;* 6 timer 1 interrupt flag read t1 count low or write t1 high +;* 7 IRQ status flag write logic 0 to IER or IFR bit +VIA_int_enable EQU $D00E ;VIA interrupt enable register +;* 0 CA2 interrupt enable +;* 1 CA1 interrupt enable +;* 2 shift register interrupt enable +;* 3 CB2 interrupt enable +;* 4 CB1 interrupt enable +;* 5 timer 2 interrupt enable +;* 6 timer 1 interrupt enable +;* 7 IER set/clear control +VIA_port_a_nohs EQU $D00F ;VIA port A data I/O register (no handshaking) + +Cold_Start EQU $F000 ; +Warm_Start EQU $F06C ; +Init_VIA EQU $F14C ; +Init_OS_RAM EQU $F164 ; +Init_OS EQU $F18B ; +Wait_Recal EQU $F192 ; +Set_Refresh EQU $F1A2 ; +DP_to_D0 EQU $F1AA ; +DP_to_C8 EQU $F1AF ; +Read_Btns_Mask EQU $F1B4 ; +Read_Btns EQU $F1BA ; +Joy_Analog EQU $F1F5 ; +Joy_Digital EQU $F1F8 ; +Sound_Byte EQU $F256 ; +Sound_Byte_x EQU $F259 ; +Sound_Byte_raw EQU $F25B ; +Clear_Sound EQU $F272 ; +Sound_Bytes EQU $F27D ; +Sound_Bytes_x EQU $F284 ; +Do_Sound EQU $F289 ; +Do_Sound_x EQU $F28C ; +Intensity_1F EQU $F29D ; +Intensity_3F EQU $F2A1 ; +Intensity_5F EQU $F2A5 ; +Intensity_7F EQU $F2A9 ; +Intensity_a EQU $F2AB ; +Dot_ix_b EQU $F2BE ; +Dot_ix EQU $F2C1 ; +Dot_d EQU $F2C3 ; +Dot_here EQU $F2C5 ; +Dot_List EQU $F2D5 ; +Dot_List_Reset EQU $F2DE ; +Recalibrate EQU $F2E6 ; +Moveto_x_7F EQU $F2F2 ; +Moveto_d_7F EQU $F2FC ; +Moveto_ix_FF EQU $F308 ; +Moveto_ix_7F EQU $F30C ; +Moveto_ix_b EQU $F30E ; Used to be named Moveto_ix_a but this is wrong. +Moveto_ix EQU $F310 ; +Moveto_d EQU $F312 ; +Reset0Ref_D0 EQU $F34A ; +Check0Ref EQU $F34F ; +Reset0Ref EQU $F354 ; +Reset_Pen EQU $F35B ; +Reset0Int EQU $F36B ; +Print_Str_hwyx EQU $F373 ; +Print_Str_yx EQU $F378 ; +Print_Str_d EQU $F37A ; +Print_List_hw EQU $F385 ; +Print_List EQU $F38A ; +Print_List_chk EQU $F38C ; +Print_Ships_x EQU $F391 ; +Print_Ships EQU $F393 ; +Mov_Draw_VLc_a EQU $F3AD ;count y x y x ... +Mov_Draw_VL_b EQU $F3B1 ;y x y x ... +Mov_Draw_VLcs EQU $F3B5 ;count scale y x y x ... +Mov_Draw_VL_ab EQU $F3B7 ;y x y x ... +Mov_Draw_VL_a EQU $F3B9 ;y x y x ... +Mov_Draw_VL EQU $F3BC ;y x y x ... +Mov_Draw_VL_d EQU $F3BE ;y x y x ... +Draw_VLc EQU $F3CE ;count y x y x ... +Draw_VL_b EQU $F3D2 ;y x y x ... +Draw_VLcs EQU $F3D6 ;count scale y x y x ... +Draw_VL_ab EQU $F3D8 ;y x y x ... +Draw_VL_a EQU $F3DA ;y x y x ... +Draw_VL EQU $F3DD ;y x y x ... +Draw_Line_d EQU $F3DF ;y x y x ... +Draw_VLp_FF EQU $F404 ;pattern y x pattern y x ... $01 +Draw_VLp_7F EQU $F408 ;pattern y x pattern y x ... $01 +Draw_VLp_scale EQU $F40C ;scale pattern y x pattern y x ... $01 +Draw_VLp_b EQU $F40E ;pattern y x pattern y x ... $01 +Draw_VLp EQU $F410 ;pattern y x pattern y x ... $01 +Draw_Pat_VL_a EQU $F434 ;y x y x ... +Draw_Pat_VL EQU $F437 ;y x y x ... +Draw_Pat_VL_d EQU $F439 ;y x y x ... +Draw_VL_mode EQU $F46E ;mode y x mode y x ... $01 +Print_Str EQU $F495 ; +Random_3 EQU $F511 ; +Random EQU $F517 ; +Init_Music_Buf EQU $F533 ; +Clear_x_b EQU $F53F ; +Clear_C8_RAM EQU $F542 ;never used by GCE carts? +Clear_x_256 EQU $F545 ; +Clear_x_d EQU $F548 ; +Clear_x_b_80 EQU $F550 ; +Clear_x_b_a EQU $F552 ; +Dec_3_Counters EQU $F55A ; +Dec_6_Counters EQU $F55E ; +Dec_Counters EQU $F563 ; +Delay_3 EQU $F56D ;30 cycles +Delay_2 EQU $F571 ;25 cycles +Delay_1 EQU $F575 ;20 cycles +Delay_0 EQU $F579 ;12 cycles +Delay_b EQU $F57A ;5*B + 10 cycles +Delay_RTS EQU $F57D ;5 cycles +Bitmask_a EQU $F57E ; +Abs_a_b EQU $F584 ; +Abs_b EQU $F58B ; +Rise_Run_Angle EQU $F593 ; +Get_Rise_Idx EQU $F5D9 ; +Get_Run_Idx EQU $F5DB ; +Get_Rise_Run EQU $F5EF ; +Rise_Run_X EQU $F5FF ; +Rise_Run_Y EQU $F601 ; +Rise_Run_Len EQU $F603 ; +Rot_VL_ab EQU $F610 ; +Rot_VL EQU $F616 ; +Rot_VL_Mode_a EQU $F61F ; +Rot_VL_Mode EQU $F62B ; +Rot_VL_dft EQU $F637 ; +Xform_Run_a EQU $F65B ; +Xform_Run EQU $F65D ; +Xform_Rise_a EQU $F661 ; +Xform_Rise EQU $F663 ; +Move_Mem_a_1 EQU $F67F ; +Move_Mem_a EQU $F683 ; +Init_Music_chk EQU $F687 ; +Init_Music EQU $F68D ; +Init_Music_x EQU $F692 ; +Select_Game EQU $F7A9 ; +Clear_Score EQU $F84F ; +Add_Score_a EQU $F85E ; +Add_Score_d EQU $F87C ; +Strip_Zeros EQU $F8B7 ; +Compare_Score EQU $F8C7 ; +New_High_Score EQU $F8D8 ; +Obj_Will_Hit_u EQU $F8E5 ; +Obj_Will_Hit EQU $F8F3 ; +Obj_Hit EQU $F8FF ; +Explosion_Snd EQU $F92E ; +Draw_Grid_VL EQU $FF9F ; + ; +music1 EQU $FD0D ; +music2 EQU $FD1D ; +music3 EQU $FD81 ; +music4 EQU $FDD3 ; +music5 EQU $FE38 ; +music6 EQU $FE76 ; +music7 EQU $FEC6 ; +music8 EQU $FEF8 ; +music9 EQU $FF26 ; +musica EQU $FF44 ; +musicb EQU $FF62 ; +musicc EQU $FF7A ; +musicd EQU $FF8F ; + diff --git a/src/ide/project.ts b/src/ide/project.ts index cb4a45de..e6fe7d65 100644 --- a/src/ide/project.ts +++ b/src/ide/project.ts @@ -103,6 +103,11 @@ export class CodeProject { while (m = re3.exec(text)) { this.pushAllFiles(files, m[2]); } + // for XASM only (USE include.ext) + let re4 = /^\s+(USE)\s+(\S+[.]\S+)/gm; + while (m = re4.exec(text)) { + this.pushAllFiles(files, m[2]); + } } return files; } diff --git a/src/machine/atari7800.ts b/src/machine/atari7800.ts index 85747bdc..04a2989e 100644 --- a/src/machine/atari7800.ts +++ b/src/machine/atari7800.ts @@ -247,7 +247,7 @@ class MARIA { } data = this.readDMA(indadr); } - // TODO: more modes + // TODO: more modes (https://github.com/gstanton/ProSystem1_3/blob/master/Core/Maria.cpp) switch (readmode) { case 0: // 160 A/B for (let j=0; j<4; j++) { diff --git a/src/platform/vectrex.ts b/src/platform/vectrex.ts index afc72519..ba225757 100644 --- a/src/platform/vectrex.ts +++ b/src/platform/vectrex.ts @@ -28,19 +28,19 @@ var VECTREX_KEYCODE_MAP = makeKeycodeMap([ [Keys.RIGHT, 0, 0x02], [Keys.DOWN, 0, 0x04], [Keys.UP, 0, 0x08], - [Keys.GP_A, 2, 0x01], - [Keys.GP_B, 2, 0x02], - [Keys.GP_C, 2, 0x04], - [Keys.GP_D, 2, 0x08], + [Keys.GP_B, 2, 0x01], + [Keys.GP_A, 2, 0x02], + [Keys.GP_D, 2, 0x04], + [Keys.GP_C, 2, 0x08], [Keys.P2_LEFT, 1, 0x01], [Keys.P2_RIGHT, 1, 0x02], [Keys.P2_DOWN, 1, 0x04], [Keys.P2_UP, 1, 0x08], - [Keys.P2_GP_A, 2, 0x10], - [Keys.P2_GP_B, 2, 0x20], - [Keys.P2_GP_C, 2, 0x40], - [Keys.P2_GP_D, 2, 0x80], + [Keys.P2_GP_B, 2, 0x10], + [Keys.P2_GP_A, 2, 0x20], + [Keys.P2_GP_D, 2, 0x40], + [Keys.P2_GP_C, 2, 0x80], ]); // @@ -844,22 +844,26 @@ class VectrexPlatform extends Base6809Platform { this.probe.logNewFrame(); var cycles = 1500000 / 60; while (cycles > 0) { - this.probe.logExecute(this.getPC(), this.getSP()); - if (this.via.ifr & 0x80) { - this._cpu.interrupt(); - } - var n = this.runCPU(this._cpu, 1); - if (n == 0) n = 1; // TODO? - this.probe.logClocks(n); - cycles -= n; - for (; n > 0; n--) { - this.via.step0(); - this.alg.step(); - this.via.step1(); - } + cycles -= this.step(); } } + step() { + this.probe.logExecute(this.getPC(), this.getSP()); + if (this.via.ifr & 0x80) { + this._cpu.interrupt(); + } + var n = this.runCPU(this._cpu, 1); + if (n == 0) n = 1; // TODO? + this.probe.logClocks(n); + for (var i=0; iMo~tSj1?Iv2hk%L$A$kU@tnj_jYvsMOZ-+ytBdG&iOt^nyp-rH zeuw0UN~ys|KmGcLuK4TE|C;%<&Di*H=G?s&k5kMuQlkiLYKu*8v9mUlKJ*$XW;PU0 zp;ne5vrbC)8M?`=f+S`$xx=||Cf+~b=hMVC7|g`~3GS(-<+72?FYq;T7K~V-To5L+ zmj5>xMrVPq05&7u2PVMW0Ei$h0tNsR{{lyiBmA=5vY8tXCk&I{Vo5SNBO(vMPK>NP zja=41qQ#<_sE{w@ky*6N$|PRlBg8-Oo1`API7#X@b6EHdUKD}@JWc$kfclJhH#t6{eS8LCKd&Ji z;5meY+>6l43kYqTLTKk#5IWdE@Ub7^u&iFf5gtM4WCy}g?nCI}XNkX&T_KkpBK}@L zJs>`bMIGV-*3?Ss=Rxj4MHLGZFnG*cbMP4PLoRt@T;m!Mmq>2#7JF(+5SH$VZ(2I6 zE)Um~I8xe$9!=hw&P^z+u{2qC-KvU5lA*fAv#xOqT$i-jGF|XO9$we#okGM3-s7!l zyodM-uX<(HD)Aui^+~VuvH*1%Ip;GdeW45Qkfm1IJXtIGB;QxeS6_AI6 z#CM?KRmM{9@+G%~cEAGQGT@|aVY-GHC&1R_U=qCppmAU`RC#;iqdX05FVY)et)CPNb5b8iG8%;I@;I93I&%+*)K^Pey6w4&i^b}d;;dd;u3YkKrKM6{2dwDU zLcX}@S}T;7W-Ar<+)`1%_#}-_M=h&v2A(!0-7-^8&$Lt9 zY~EgNA{CBUR@1hS8Bbc)KMLyY4#oP8~ zU%Ah6QU2Ke?&9K{JDyDE%v>g+hsPtP-^KuN*yh7FpRoBvKu59P#ySt$JY-{!jlJ%n zuz7kUlZ=dJC!uGbO2%iVnD=Ec}+Pj9fTN!7&Jp#B%O|F=@7IKv`}43 zXz3nkJ|l?}grLhMcM4;cQg8_Cf7~+9w@wlUlkTT0gXYxqNm~ zde}JRG;@jUWVjxNobhCCB5La0mEu}K4F=R;Pz{FKeU}$X#atyQ*_KVaV_B)2E?ad$?-_@r>}u(rd+s@R?tC-zee%q9z1&Mg z4<%d@HHmJCEs48|=x2#x;eSiMC%I@N5=wKDKN0duC;C(J_s;fpv!b*3zetU&lnTH8 z;kQ3@#Sbcv=f6AX`KSNR{O5fxyO?*RM-kZFJyzOdayxO|;@&64%pS!V^v+v)RM-RR zVAVmK;RZ-}SJ_9Y$VgGk3X zht$ubNXK~{X@E~5o!||mlRS)cijzn~+>3OYdyvj>6zMEaAf4kyr1LyT{3Cbbwzr92 z38)vuPAqAV7qFxzsn=olp+m#M1U$U$ZrOO7_$6<;65QgJyy;Ei=bUx56lYJ5HEALTdwLR4)ftb8TF9ttZZ&v{xK$Ba_=~JWxrmst3IAqo1_j|iF>$TWxG_j z?2m2LDLA5Bf@%A=teiUz;u~smMY!YbNMf&=ToT2;udtfDB#OSj>Z`U!srnf!&3g6$ z9uV7xaff(7*7fv0^hXkO1?NB>n`lPP1oeO^OG8Tz+7XnvjN~N}`Cz1B%!4fh5-6tu zHvvNuGy-E4Aa9Du26!JvFPIC4>;obl>;TwRFarZ7z*1m3j4qVJVEurzfH7!sv@C)3 z0*=FIf>i(?NziF%MfAxgBJ#sH4;F!T4W*nB0k99C)g{P*@(jQW7?dE{vGRsc;_%W% zKoVChKpREr1iJyP6D$OnLOBHYJ;1nBWWqQCb`LC!mJHwmT3mn&Fyw&BP(T213~&ih zmLNaaIlxiNfOZ0`8*EcTUWxpwDDxP93($v_$I!fB2LV@5dcY>ZHUOsqr=ZEs!4?pR zVt^e+0W1bM45I|i4t84z-9dQ<I0Ya5LZecIaU zT3H8d>E=qgR(EVKuCG=a4QF+A?a4y9Syqj;F4N3M(!Ta=)9id(CQEVCY@7afO)2-x z?7LT5rDgW)uQrv9#7wh$U&zm7O!Get?QwEvBO8mG?e>n{%IbYTE|<`9 zL1;l}!M2vta-+~jp^X|rr;&){qme>f%Y~qapofg0Jv%j3h|AP5sAEvaWC9*i%Z)=D zhc+&^FU-jd3!`?Um@3Rg+9_&JW{R_ML-#gn+lwmfSK)vP2Tu+?T3Pc9mn)5tAy2uw zzS?Mb*2+tZp33U_!s5Dy?`3bldt0L{e&)(or%*kKHzeiPF%K!iX diff --git a/src/worker/lib/atari7800/crt0.s b/src/worker/lib/atari7800/crt0.s index 26e4e10c..a4925d2d 100644 --- a/src/worker/lib/atari7800/crt0.s +++ b/src/worker/lib/atari7800/crt0.s @@ -24,8 +24,40 @@ INTVEC: .res 2 .segment "HEADER" -.byte $4e,$45,$53,$1a -.res 8,0 +; A78 Header - http://7800.8bitdev.org/index.php/A78_Header_Specification + .byte 1 ; 0 Header version - 1 byte + .byte "ATARI7800" ; 1..16 "ATARI7800 " - 16 bytes + .res 7,32 + .byte "Your Name Here"; 17..48 Cart title - 32 bytes + .res (32-.strlen("Your Name Here")),0 + .byte $00,$00,$c0,$00; 49..52 data length - 4 bytes + .byte $00,$00 ; 53..54 cart type - 2 bytes + ; bit 0 - pokey at $4000 + ; bit 1 - supergame bank switched + ; bit 2 - supergame ram at $4000 + ; bit 3 - rom at $4000 + ; bit 4 - bank 6 at $4000 + ; bit 5 - supergame banked ram + ; bit 6 - pokey at $450 + ; bit 7 - mirror ram at $4000 + ; bit 8-15 - Special + ; 0 = Normal cart + .byte 1 ; 55 controller 1 type - 1 byte + .byte 1 ; 56 controller 2 type - 1 byte + ; 0 = None + ; 1 = Joystick + ; 2 = Light Gun + .byte 0 ; 57 0 = NTSC 1 = PAL + .byte 0 ; 58 Save data peripheral - 1 byte (version 2) + ; 0 = None / unknown (default) + ; 1 = High Score Cart (HSC) + ; 2 = SaveKey + .byte 0,0,0,0 + .byte 0 ; 63 Expansion module + ; 0 = No expansion module (default on all currently released games) + ; 1 = Expansion module required + .res 36 + .byte "ACTUAL CART DATA STARTS HERE" .segment "STARTUP" diff --git a/src/worker/workermain.ts b/src/worker/workermain.ts index b9169d01..41153b73 100644 --- a/src/worker/workermain.ts +++ b/src/worker/workermain.ts @@ -1924,7 +1924,7 @@ function assembleXASM6809(step:BuildStep) { alst += s; alst += "\n"; if (lasterror) { - var line = parseInt(s.slice(0,5)); + var line = parseInt(s.slice(0,5)) || 0; errors.push({ line:line, msg:lasterror