├── failright.mod ├── uae └── dh0 │ ├── main │ ├── c │ └── UAEquit │ └── s │ └── startup-sequence ├── include ├── funcdef.i ├── graphics │ ├── sprite.i │ ├── regions.i │ ├── display.i │ ├── gfx.i │ ├── layers_lib.i │ ├── layers.i │ ├── copper.i │ ├── text.i │ ├── view.i │ ├── gfxbase.i │ ├── clip.i │ ├── rastport.i │ ├── gels.i │ └── graphics_lib.i ├── exec │ ├── funcdef.i │ ├── errors.i │ ├── exec.i │ ├── strings.i │ ├── devices.i │ ├── ports.i │ ├── initializers.i │ ├── resident.i │ ├── semaphores.i │ ├── interrupts.i │ ├── nodes.i │ ├── exec_lib.i │ ├── io.i │ ├── macros.i │ ├── ables.i │ ├── memory.i │ ├── tasks.i │ ├── types.i │ ├── libraries.i │ ├── lists.i │ ├── execbase.i │ └── alerts.i ├── hardware │ ├── custom.i │ └── cia.i └── hw.i ├── .vscode ├── tasks.json └── launch.json ├── protracker_macro.asm ├── main.asm ├── README.md └── protracker.asm /failright.mod: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djh0ffman/ProTrackerReplay/HEAD/failright.mod -------------------------------------------------------------------------------- /uae/dh0/main: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djh0ffman/ProTrackerReplay/HEAD/uae/dh0/main -------------------------------------------------------------------------------- /uae/dh0/c/UAEquit: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/djh0ffman/ProTrackerReplay/HEAD/uae/dh0/c/UAEquit -------------------------------------------------------------------------------- /uae/dh0/s/startup-sequence: -------------------------------------------------------------------------------- 1 | sys:main 2 | ; Quits the emulator at the end of the program 3 | UAEquit -------------------------------------------------------------------------------- /include/funcdef.i: -------------------------------------------------------------------------------- 1 | INCDIR "include_std" 2 | INCLUDE "exec/libraries.i" 3 | 4 | MACRO FUNCDEF 5 | _LVO\1 EQU FUNC_CNT 6 | FUNC_CNT SET FUNC_CNT-LIB_VECTSIZE 7 | ENDM 8 | 9 | FUNC_CNT SET LIB_USERDEF -------------------------------------------------------------------------------- /include/graphics/sprite.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_SPRITE_I 2 | GRAPHICS_SPRITE_I = 1 3 | RSRESET 4 | SimpleSprite RS.B 0 5 | ss_posctldata RS.L 1 6 | ss_height RS.W 1 7 | ss_x RS.W 1 8 | ss_y RS.W 1 9 | ss_num RS.W 1 10 | ss_SIZEOF RS.W 0 11 | ENDC 12 | -------------------------------------------------------------------------------- /include/exec/funcdef.i: -------------------------------------------------------------------------------- 1 | * FUNCDEF macro definition for 'exec/exec_lib.i' 2 | 3 | FUNCDEF MACRO *function 4 | _LVO\1 EQU FUNC_CNT 5 | FUNC_CNT SET FUNC_CNT-6 6 | ENDM 7 | FUNC_CNT SET 5*-6 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /include/graphics/regions.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_REGIONS_I 2 | GRAPHICS_REGIONS_I = 1 3 | IFND GRAPHICS_GFX_I 4 | INCLUDE graphics/gfx.i 5 | ENDC 6 | RSRESET 7 | Region RS.B 0 8 | rg_bounds RS.B ra_SIZEOF 9 | rg_RegionRectangle RS.L 1 10 | rg_SIZEOF RS.W 0 11 | RSRESET 12 | RegionRectangle RS.B 0 13 | rr_Next RS.L 1 14 | rr_Prev RS.L 1 15 | rr_bounds RS.B ra_SIZEOF 16 | rr_SIZEOF RS.W 0 17 | ENDC 18 | -------------------------------------------------------------------------------- /include/graphics/display.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_DISPLAY_I 2 | GRAPHICS_DISPLAY_I = 1 3 | MODE_640 = $8000 4 | PLNCNTMSK = $7 5 | PLNCNTSHFT = 12 6 | PF2PRI = $40 7 | COLORON = $0200 8 | DBLPF = $400 9 | HOLDNMODIFY = $800 10 | INTERLACE = 4 11 | PFA_FINE_SCROLL = $F 12 | PFB_FINE_SCROLL_SHIFT= 4 13 | PF_FINE_SCROLL_MASK= $F 14 | DIW_HORIZ_POS = $7F 15 | DIW_VRTCL_POS = $1FF 16 | DIW_VRTCL_POS_SHIFT= 7 17 | DFTCH_MASK = $FF 18 | VPOSRLOF = $8000 19 | ENDC 20 | -------------------------------------------------------------------------------- /include/graphics/gfx.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_GFX_I 2 | GRAPHICS_GFX_I = 1 3 | BITSET = $8000 4 | BITCLR = 0 5 | AGNUS = 1 6 | DENISE = 1 7 | RSRESET 8 | BitMap RS.B 0 9 | bm_BytesPerRow RS.W 1 10 | bm_Rows RS.W 1 11 | bm_Flags RS.B 1 12 | bm_Depth RS.B 1 13 | bm_Pad RS.W 1 14 | bm_Planes RS.B 8*4 15 | bm_SIZEOF RS.W 0 16 | RSRESET 17 | Rectangle RS.B 0 18 | ra_MinX RS.W 1 19 | ra_MinY RS.W 1 20 | ra_MaxX RS.W 1 21 | ra_MaxY RS.W 1 22 | ra_SIZEOF RS.W 0 23 | ENDC 24 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "label": "asm-main", 6 | "type": "shell", 7 | "command": "vasmm68k_mot", 8 | "args": [ 9 | "main.asm", 10 | "-o", 11 | "build\\main.o", 12 | "-m68000", 13 | "-Fhunk", 14 | "-linedebug", 15 | "-ignore-mult-inc", 16 | "-nowarn=2047", 17 | "-nowarn=2069" 18 | ], 19 | "group": "build" 20 | }, 21 | { 22 | "label": "build-main", 23 | "type": "shell", 24 | "command": "vlink", 25 | "args": [ 26 | "build\\main.o", 27 | "-ouae\\dh0\\main", 28 | "-bamigahunk", 29 | "-Bstatic" 30 | ], 31 | "group": "build", 32 | "dependsOn": "asm-main", 33 | "problemMatcher": [] 34 | }, 35 | ] 36 | } -------------------------------------------------------------------------------- /include/graphics/layers_lib.i: -------------------------------------------------------------------------------- 1 | _LVOInitLayers = -30 2 | _LVOCreateUpfrontLayer = -36 3 | _LVOCreateBehindLayer = -42 4 | _LVOUpfrontLayer = -48 5 | _LVOBehindLayer = -54 6 | _LVOMoveLayer = -60 7 | _LVOSizeLayer = -66 8 | _LVOScrollLayer = -72 9 | _LVOBeginUpdate = -78 10 | _LVOEndUpdate = -84 11 | _LVODeleteLayer = -90 12 | _LVOLockLayer = -96 13 | _LVOUnlockLayer = -102 14 | _LVOLockLayers = -108 15 | _LVOUnlockLayers = -114 16 | _LVOLockLayerInfo = -120 17 | _LVOSwapBitsRastPortClipRect= -126 18 | _LVOWhichLayer = -132 19 | _LVOUnlockLayerInfo = -138 20 | _LVONewLayerInfo = -144 21 | _LVODisposeLayerInfo = -150 22 | _LVOFattenLayerInfo = -156 23 | _LVOThinLayerInfo = -162 24 | _LVOMoveLayerInFrontOf = -168 25 | _LVOInstallClipRegion = -174 26 | -------------------------------------------------------------------------------- /include/exec/errors.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_ERRORS_I 2 | EXEC_ERRORS_I SET 1 3 | ** 4 | ** $VER: errors.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Standard Device IO Errors (returned in io_Error) 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IOERR_OPENFAIL EQU -1 ; device/unit failed to open 14 | IOERR_ABORTED EQU -2 ; request terminated early [after AbortIO()] 15 | IOERR_NOCMD EQU -3 ; command not supported by device 16 | IOERR_BADLENGTH EQU -4 ; not a valid length (usually IO_LENGTH) 17 | IOERR_BADADDRESS EQU -5 ; invalid address (misaligned or bad range) 18 | IOERR_UNITBUSY EQU -6 ; device opens ok, but requested unit is busy 19 | IOERR_SELFTEST EQU -7 ; hardware failed self-test 20 | 21 | ERR_OPENDEVICE EQU IOERR_OPENFAIL ; Obsolete 22 | 23 | ENDC ; EXEC_ERRORS_I 24 | -------------------------------------------------------------------------------- /include/graphics/layers.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_LAYERS_I 2 | GRAPHICS_LAYERS_I = 1 3 | IFND EXEC_SEMAPHORES_I 4 | INCLUDE exec/semaphores.i 5 | ENDC 6 | IFND EXEC_LISTS_I 7 | INCLUDE exec/lists.i 8 | ENDC 9 | RSRESET 10 | LayerInfo_extra RS.B 0 11 | lie_env RS.B 13*4 12 | lie_mem RS.B LH_SIZE 13 | lie_SIZEOF RS.W 0 14 | LAYERSIMPLE = 1 15 | LAYERSMART = 2 16 | LAYERSUPER = 4 17 | LAYERUPDATING = $10 18 | LAYERBACKDROP = $40 19 | LAYERREFRESH = $80 20 | LAYER_CLIPRECTS_LOST= $100 21 | LMN_REGION = -1 22 | RSRESET 23 | Layer_Info RS.B 0 24 | li_top_layer RS.L 1 25 | li_check_lp RS.L 1 26 | li_obs RS.L 1 27 | li_FreeClipRects RS.B MLH_SIZE 28 | li_Lock RS.B SS_SIZE 29 | li_gs_Head RS.B LH_SIZE 30 | li_long_reserved RS.L 1 31 | li_Flags RS.W 1 32 | li_fatten_count RS.B 1 33 | li_LockLayersCount RS.B 1 34 | li_LayerInfo_extra_size RS.W 1 35 | li_blitbuff RS.L 1 36 | li_LayerInfo_extra RS.L 1 37 | li_SIZEOF RS.W 0 38 | NEWLAYERINFO_CALLED = 1 39 | ALERTLAYERSNOMEM = $83010000 40 | ENDC 41 | -------------------------------------------------------------------------------- /include/exec/exec.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_EXEC_I 2 | EXEC_EXEC_I SET 1 3 | ** 4 | ** $VER: exec.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Include all other Exec include files in non-overlapping order. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_TYPES_I 14 | INCLUDE "exec/types.i" 15 | ENDC 16 | INCLUDE "exec/macros.i" 17 | INCLUDE "exec/nodes.i" 18 | INCLUDE "exec/lists.i" 19 | INCLUDE "exec/alerts.i" 20 | INCLUDE "exec/errors.i" 21 | INCLUDE "exec/initializers.i" 22 | INCLUDE "exec/resident.i" 23 | INCLUDE "exec/strings.i" 24 | INCLUDE "exec/memory.i" 25 | INCLUDE "exec/tasks.i" 26 | INCLUDE "exec/ports.i" 27 | INCLUDE "exec/interrupts.i" 28 | INCLUDE "exec/semaphores.i" 29 | INCLUDE "exec/libraries.i" 30 | INCLUDE "exec/io.i" 31 | INCLUDE "exec/devices.i" 32 | INCLUDE "exec/execbase.i" 33 | INCLUDE "exec/ables.i" 34 | ;;;;;;;;INCLUDE "exec/exec_lib.i" ;special information 35 | 36 | ENDC ; EXEC_EXEC_I 37 | -------------------------------------------------------------------------------- /protracker_macro.asm: -------------------------------------------------------------------------------- 1 | ** push and pops 2 | 3 | PUSH MACRO 4 | move.l \1,-(sp) 5 | ENDM 6 | 7 | POP MACRO 8 | move.l (sp)+,\1 9 | ENDM 10 | 11 | PUSHM MACRO 12 | movem.l \1,-(sp) 13 | ENDM 14 | 15 | POPM MACRO 16 | movem.l (sp)+,\1 17 | ENDM 18 | 19 | PUSHMOST MACRO 20 | movem.l d0-a4,-(sp) 21 | ENDM 22 | 23 | POPMOST MACRO 24 | movem.l (sp)+,d0-a4 25 | ENDM 26 | 27 | PUSHALL MACRO 28 | movem.l d0-a6,-(sp) 29 | ENDM 30 | 31 | POPALL MACRO 32 | movem.l (sp)+,d0-a6 33 | ENDM 34 | 35 | RASON MACRO 36 | IF SHOW_RAS=1 37 | move.w #\1,$dff180 38 | ENDIF 39 | ENDM 40 | 41 | RASOFF MACRO 42 | IF SHOW_RAS=1 43 | move.w #$000,$dff180 44 | ENDIF 45 | ENDM -------------------------------------------------------------------------------- /main.asm: -------------------------------------------------------------------------------- 1 | ;--------------------------- 2 | ; 3 | ; protracker replay test rig 4 | ; h0ffman 5 | ; 6 | ;--------------------------- 7 | 8 | INCDIR "include" 9 | INCLUDE "hw.i" 10 | 11 | section test,code_c 12 | Main: 13 | lea CUSTOM,a6 14 | move.w #$7fff,DMACON(a6) 15 | move.w #$7fff,INTENA(a6) 16 | move.w #0,COLOR00(a6) 17 | 18 | move.w #$c000,INTENA(a6) ; enable master interrupt 19 | move.w #$8200,DMACON(a6) ; enable base DMA 20 | 21 | sub.l a0,a0 ; vector base, go find it yourself 22 | moveq #0,d1 ; 0 = pal / 1 = ntsc 23 | bsr CIA_Install ; install cia interrupts 24 | 25 | lea mod,a0 ; module 26 | bsr mt_init ; init module 27 | 28 | st mt_Enable ; enable playback 29 | 30 | 31 | .forever 32 | bra .forever 33 | rts 34 | 35 | 36 | include "protracker.asm" 37 | 38 | mod: 39 | incbin "failright.mod" -------------------------------------------------------------------------------- /include/exec/strings.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_STRINGS_I 2 | EXEC_STRINGS_I SET 1 3 | ** 4 | ** $VER: strings.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Macros for defining old style CR/LF terminated string constants 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | *------ Terminal Control: 14 | 15 | EOS EQU 0 16 | BELL EQU 7 17 | LF EQU 10 18 | CR EQU 13 19 | BS EQU 8 20 | DEL EQU $7F 21 | NL EQU LF 22 | 23 | 24 | *---------------------------------------------------------------- 25 | * 26 | * String Support Macros 27 | * 28 | *---------------------------------------------------------------- 29 | 30 | STRING MACRO 31 | dc.b \1 32 | dc.b 0 33 | CNOP 0,2 34 | ENDM 35 | 36 | 37 | STRINGL MACRO 38 | dc.b 13,10 39 | dc.b \1 40 | dc.b 0 41 | CNOP 0,2 42 | ENDM 43 | 44 | 45 | STRINGR MACRO 46 | dc.b \1 47 | dc.b 13,10,0 48 | CNOP 0,2 49 | ENDM 50 | 51 | 52 | STRINGLR MACRO 53 | dc.b 13,10 54 | dc.b \1 55 | dc.b 13,10,0 56 | CNOP 0,2 57 | ENDM 58 | 59 | ENDC ; EXEC_STRINGS_I 60 | -------------------------------------------------------------------------------- /include/graphics/copper.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_COPPER_I 2 | GRAPHICS_COPPER_I = 1 3 | COPPER_MOVE = 0 4 | COPPER_WAIT = 1 5 | CPRNXTBUF = 2 6 | CPR_NT_LOF = $8000 7 | CPR_NT_SHT = $4000 8 | RSRESET 9 | CopIns RS.B 0 10 | ci_OpCode RS.W 1 11 | ci_nxtlist RS.B 0 12 | ci_VWaitPos RS.B 0 13 | ci_DestAddr RS.B 2 14 | ci_HWaitPos RS.B 0 15 | ci_DestData RS.B 2 16 | ci_SIZEOF RS.W 0 17 | RSRESET 18 | cprlist RS.B 0 19 | crl_Next RS.L 1 20 | crl_start RS.L 1 21 | crl_MaxCount RS.W 1 22 | crl_SIZEOF RS.W 0 23 | RSRESET 24 | CopList RS.B 0 25 | cl_Next RS.L 1 26 | cl__CopList RS.L 1 27 | cl__ViewPort RS.L 1 28 | cl_CopIns RS.L 1 29 | cl_CopPtr RS.L 1 30 | cl_CopLStart RS.L 1 31 | cl_CopSStart RS.L 1 32 | cl_Count RS.W 1 33 | cl_MaxCount RS.W 1 34 | cl_DyOffset RS.W 1 35 | cl_SIZEOF RS.W 0 36 | RSRESET 37 | UCopList RS.B 0 38 | ucl_Next RS.L 1 39 | ucl_FirstCopList RS.L 1 40 | ucl_CopList RS.L 1 41 | ucl_SIZEOF RS.W 0 42 | RSRESET 43 | copinit RS.B 0 44 | copinit_diagstrt RS.B 8 45 | copinit_sprstrtup RS.B 2*[[2*8*2]+2+[2*2]+2] 46 | copinit_sprstop RS.B 4 47 | copinit_SIZEOF RS.W 0 48 | ENDC 49 | -------------------------------------------------------------------------------- /include/graphics/text.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_TEXT_I 2 | GRAPHICS_TEXT_I = 1 3 | IFND EXEC_PORTS_I 4 | INCLUDE exec/ports.i 5 | ENDC 6 | FS_NORMAL = 0 7 | FSB_EXTENDED = 3 8 | FSF_EXTENDED = 1<<3 9 | FSB_ITALIC = 2 10 | FSF_ITALIC = 1<<2 11 | FSB_BOLD = 1 12 | FSF_BOLD = 1<<1 13 | FSB_UNDERLINED = 0 14 | FSF_UNDERLINED = 1<<0 15 | FPB_ROMFONT = 0 16 | FPF_ROMFONT = 1<<0 17 | FPB_DISKFONT = 1 18 | FPF_DISKFONT = 1<<1 19 | FPB_REVPATH = 2 20 | FPF_REVPATH = 1<<2 21 | FPB_TALLDOT = 3 22 | FPF_TALLDOT = 1<<3 23 | FPB_WIDEDOT = 4 24 | FPF_WIDEDOT = 1<<4 25 | FPB_PROPORTIONAL= 5 26 | FPF_PROPORTIONAL= 1<<5 27 | FPB_DESIGNED = 6 28 | FPF_DESIGNED = 1<<6 29 | FPB_REMOVED = 7 30 | FPF_REMOVED = 1<<7 31 | RSRESET 32 | TextAttr RS.B 0 33 | ta_Name RS.L 1 34 | ta_YSize RS.W 1 35 | ta_Style RS.B 1 36 | ta_Flags RS.B 1 37 | ta_SIZEOF RS.W 0 38 | RSRESET 39 | TextFont RS.B MN_SIZE 40 | tf_YSize RS.W 1 41 | tf_Style RS.B 1 42 | tf_Flags RS.B 1 43 | tf_XSize RS.W 1 44 | tf_Baseline RS.W 1 45 | tf_BoldSmear RS.W 1 46 | tf_Accessors RS.W 1 47 | tf_LoChar RS.B 1 48 | tf_HiChar RS.B 1 49 | tf_CharData RS.L 1 50 | tf_Modulo RS.W 1 51 | tf_CharLoc RS.L 1 52 | tf_CharSpace RS.L 1 53 | tf_CharKern RS.L 1 54 | tf_SIZEOF RS.W 0 55 | ENDC 56 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProTracker Replay Code 2 | ProTracker Replay v2.3a 3 | 4 | Essentially the original ProTracker replay but with a few fixes and some minor optimisations. 5 | 6 | This is in no way a fast replay, if you're looking for CPU Cycles, check out LSP, P61 and PHX. 7 | 8 | It is meant to be just an accurate replay which ensures all those weird edge cases are supported. 9 | 10 | 1. DMA Wait 11 | Now uses a three stage CIA interrupt. 12 | Stage 1 - mt_music (standard replay code) 13 | Stage 2 - enable DMA for any new samples to be played 14 | Stage 3 - set sample loop pointers 15 | 16 | 2. Volume clicks 17 | The original replay writes the volume register multiple 18 | times a tick. This has been moved to stage 2 CIA, when 19 | the DMA is enabled. Seemed to really clean up chip-tunes 20 | I tried out. 21 | 22 | 3. Channel variables 23 | On each call to mt_init, the channel variables are cleared. 24 | This ensures effect commands and values used in the previous 25 | playing module do not persist. 26 | 27 | 4. Minor optimisation 28 | If no finetune values are used, the period value comes straight 29 | from the pattern data saving a look-up on every bloody note! 30 | -------------------------------------------------------------------------------- /include/graphics/view.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_VIEW_I 2 | GRAPHICS_VIEW_I = 1 3 | IFND GRAPHICS_GFX_I 4 | INCLUDE graphics/gfx.i 5 | ENDC 6 | IFND GRAPHICS_COPPER_I 7 | INCLUDE graphics/copper.i 8 | ENDC 9 | V_PFBA = $40 10 | V_DUALPF= $400 11 | V_HIRES = $8000 12 | V_LACE = 4 13 | V_HAM = $800 14 | V_SPRITES= $4000 15 | GENLOCK_VIDEO= 2 16 | RSRESET 17 | ColorMap RS.B 0 18 | cm_Flags RS.B 1 19 | cm_Type RS.B 1 20 | cm_Count RS.W 1 21 | cm_ColorTable RS.L 1 22 | cm_SIZEOF RS.W 0 23 | rsreset 24 | ViewPort RS.B 0 25 | vp_Next RS.L 1 26 | vp_ColorMap RS.L 1 27 | vp_DspIns RS.L 1 28 | vp_SprIns RS.L 1 29 | vp_ClrIns RS.L 1 30 | vp_UCopIns RS.L 1 31 | vp_DWidth RS.W 1 32 | vp_DHeight RS.W 1 33 | vp_DxOffset RS.W 1 34 | vp_DyOffset RS.W 1 35 | vp_Modes RS.W 1 36 | vp_reserved RS.W 1 37 | vp_RasInfo RS.L 1 38 | vp_SIZEOF RS.W 0 39 | RSRESET 40 | View RS.B 0 41 | v_ViewPort RS.L 1 42 | v_LOFCprList RS.L 1 43 | v_SHFCprList RS.L 1 44 | v_DyOffset RS.W 1 45 | v_DxOffset RS.W 1 46 | v_Modes RS.W 1 47 | v_SIZEOF RS.W 0 48 | RSRESET 49 | collTable RS.B 0 50 | cp_collPtrs RS.L 1 51 | cp_SIZEOF RS.W 0 52 | RSRESET 53 | RasInfo RS.B 0 54 | ri_Next RS.L 1 55 | ri_BitMap RS.L 1 56 | ri_RxOffset RS.W 1 57 | ri_RyOffset RS.W 1 58 | ri_SIZEOF RS.W 0 59 | ENDC 60 | -------------------------------------------------------------------------------- /include/exec/devices.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_DEVICES_I 2 | EXEC_DEVICES_I SET 1 3 | ** 4 | ** $VER: devices.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Include file for use by Exec device drivers 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_LIBRARIES_I 14 | INCLUDE "exec/libraries.i" 15 | ENDC ; EXEC_LIBRARIES_I 16 | 17 | IFND EXEC_PORTS_I 18 | INCLUDE "exec/ports.i" 19 | ENDC ; EXEC_PORTS_I 20 | 21 | 22 | *---------------------------------------------------------------- 23 | * 24 | * Device Data Structure 25 | * 26 | *---------------------------------------------------------------- 27 | 28 | STRUCTURE DD,LIB_SIZE 29 | LABEL DD_SIZE ; identical to library 30 | 31 | 32 | *---------------------------------------------------------------- 33 | * 34 | * Suggested Unit Structure 35 | * 36 | *---------------------------------------------------------------- 37 | 38 | STRUCTURE UNIT,MP_SIZE ; queue for requests 39 | UBYTE UNIT_FLAGS 40 | UBYTE UNIT_pad 41 | UWORD UNIT_OPENCNT 42 | LABEL UNIT_SIZE 43 | 44 | 45 | *------ UNIT_FLAG definitions: 46 | 47 | BITDEF UNIT,ACTIVE,0 ; driver is active 48 | BITDEF UNIT,INTASK,1 ; running in driver's task 49 | 50 | ENDC ; EXEC_DEVICES_I 51 | -------------------------------------------------------------------------------- /include/graphics/gfxbase.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_GFXBASE_I 2 | GRAPHICS_GFXBASE_I = 1 3 | IFND EXEC_LISTS_I 4 | INCLUDE exec/lists.i 5 | ENDC 6 | IFND EXEC_LIBRARIES_I 7 | INCLUDE exec/libraries.i 8 | ENDC 9 | IFND EXEC_INTERRUPTS_I 10 | INCLUDE exec/interrupts.i 11 | ENDC 12 | RSRESET 13 | GfxBase RS.B LIB_SIZE 14 | gb_ActiView RS.L 1 15 | gb_copinit RS.L 1 16 | gb_cia RS.L 1 17 | gb_blitter RS.L 1 18 | gb_LOFlist RS.L 1 19 | gb_SHFlist RS.L 1 20 | gb_blthd RS.L 1 21 | gb_blttl RS.L 1 22 | gb_bsblthd RS.L 1 23 | gb_bsblttl RS.L 1 24 | gb_vbsrv RS.B IS_SIZE 25 | gb_timsrv RS.B IS_SIZE 26 | gb_bltsrv RS.B IS_SIZE 27 | gb_TextFonts RS.B LH_SIZE 28 | gb_DefaultFont RS.L 1 29 | gb_Modes RS.W 1 30 | gb_VBlank RS.B 1 31 | gb_Debug RS.B 1 32 | gb_BeamSync RS.W 1 33 | gb_system_bplcon0 RS.W 1 34 | gb_SpriteReserved RS.B 1 35 | gb_bytereserved RS.B 1 36 | gb_Flags RS.W 1 37 | gb_BlitLock RS.W 1 38 | gb_BlitNest RS.W 1 39 | gb_BlitWaitQ RS.B LH_SIZE 40 | gb_BlitOwner RS.L 1 41 | gb_TOF_WaitQ RS.B LH_SIZE 42 | gb_DisplayFlags RS.W 1 43 | gb_SimpleSprites RS.L 1 44 | gb_MaxDisplayRow RS.W 1 45 | gb_MaxDisplayColumn RS.W 1 46 | gb_NormalDisplayRows RS.W 1 47 | gb_NormalDisplayColumns RS.W 1 48 | gb_NormalDPMX RS.W 1 49 | gb_NormalDPMY RS.W 1 50 | gb_LastChanceMemory RS.L 1 51 | gb_LCMptr RS.L 1 52 | gb_MicrosPerLine RS.W 1 53 | gb_reserved RS.B 8 54 | gb_SIZE RS.W 0 55 | OWNBLITTERn = 0 56 | QBOWNERn = 1 57 | QBOWNER = 1<>16)&$0FF) 67 | DC.W ((\2)&$0FFFF) 68 | ENDM 69 | 70 | ENDC ; EXEC_INITIALIZERS_I 71 | -------------------------------------------------------------------------------- /include/exec/resident.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_RESIDENT_I 2 | EXEC_RESIDENT_I SET 1 3 | ** 4 | ** $VER: resident.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Resident/ROMTag stuff. Used to identify and initialize code modules. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_TYPES_I 14 | INCLUDE "exec/types.i" 15 | ENDC ; EXEC_TYPES_I 16 | 17 | 18 | *---------------------------------------------------------------- 19 | * 20 | * Resident Module Tag 21 | * 22 | *---------------------------------------------------------------- 23 | 24 | STRUCTURE RT,0 25 | UWORD RT_MATCHWORD ; word to match on (ILLEGAL) 26 | APTR RT_MATCHTAG ; pointer to the above (RT_MATCHWORD) 27 | APTR RT_ENDSKIP ; address to continue scan 28 | UBYTE RT_FLAGS ; various tag flags 29 | UBYTE RT_VERSION ; release version number 30 | UBYTE RT_TYPE ; type of module (NT_XXXXXX) 31 | BYTE RT_PRI ; initialization priority 32 | APTR RT_NAME ; pointer to node name 33 | APTR RT_IDSTRING ; pointer to identification string 34 | APTR RT_INIT ; pointer to init code 35 | LABEL RT_SIZE 36 | 37 | 38 | ;------ Match word definition: 39 | 40 | RTC_MATCHWORD EQU $4AFC ; The 68000 "ILLEGAL" instruction 41 | 42 | 43 | ;------ RT_FLAGS bit and field definitions: 44 | 45 | BITDEF RT,COLDSTART,0 46 | BITDEF RT,SINGLETASK,1 47 | BITDEF RT,AFTERDOS,2 48 | BITDEF RT,AUTOINIT,7 ; RT_INIT points to data structure 49 | 50 | ; Compatibility: (obsolete) 51 | ;RTM_WHEN EQU 1 ; field position in RT_FLAGS 52 | RTW_NEVER EQU 0 ; never ever init 53 | RTW_COLDSTART EQU 1 ; init at coldstart time 54 | 55 | ENDC ; EXEC_RESIDENT_I 56 | -------------------------------------------------------------------------------- /include/exec/semaphores.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_SEMAPHORES_I 2 | EXEC_SEMAPHORES_I SET 1 3 | ** 4 | ** $VER: semaphores.i 39.1 (7.2.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Definitions for locking functions. 8 | ** 9 | ** (C) Copyright 1986-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_NODES_I 14 | INCLUDE "exec/nodes.i" 15 | ENDC ; EXEC_NODES_I 16 | 17 | IFND EXEC_LISTS_I 18 | INCLUDE "exec/lists.i" 19 | ENDC ; EXEC_LISTS_I 20 | 21 | IFND EXEC_PORTS_I 22 | INCLUDE "exec/ports.i" 23 | ENDC ; EXEC_PORTS_I 24 | 25 | 26 | *---------------------------------------------------------------- 27 | * 28 | * Signal Semaphore Structure 29 | * 30 | *---------------------------------------------------------------- 31 | 32 | ** Private structure used by ObtainSemaphore() 33 | STRUCTURE SSR,MLN_SIZE 34 | APTR SSR_WAITER 35 | LABEL SSR_SIZE 36 | 37 | ** Signal Semaphore data structure 38 | STRUCTURE SS,LN_SIZE 39 | WORD SS_NESTCOUNT 40 | STRUCT SS_WAITQUEUE,MLH_SIZE 41 | STRUCT SS_MULTIPLELINK,SSR_SIZE 42 | APTR SS_OWNER 43 | WORD SS_QUEUECOUNT 44 | LABEL SS_SIZE 45 | 46 | ** Semaphore procure message (for use in V39 Procure/Vacate ****/ 47 | STRUCTURE SemaphoreMessage,MN_SIZE 48 | APTR SSM_SEMAPHORE 49 | LABEL SSM_SIZEOF 50 | 51 | 52 | *---------------------------------------------------------------- 53 | * 54 | * Semaphore Structure (Old Procure/Vacate type, not reliable) 55 | * 56 | *---------------------------------------------------------------- 57 | 58 | 59 | STRUCTURE SM,MP_SIZE ; Do not use these semaphores! 60 | WORD SM_BIDS ; number of bids for lock 61 | LABEL SM_SIZE 62 | 63 | *------ unions: 64 | 65 | SM_LOCKMSG EQU MP_SIGTASK 66 | 67 | 68 | ENDC ; EXEC_SEMAPHORES_I 69 | -------------------------------------------------------------------------------- /include/exec/interrupts.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_INTERRUPTS_I 2 | EXEC_INTERRUPTS_I SET 1 3 | ** 4 | ** $VER: interrupts.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Callback structures used by hardware & software interrupts 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_NODES_I 14 | INCLUDE "exec/nodes.i" 15 | ENDC ; EXEC_NODES_I 16 | 17 | IFND EXEC_LISTS_I 18 | INCLUDE "exec/lists.i" 19 | ENDC ; EXEC_LISTS_I 20 | 21 | 22 | *---------------------------------------------------------------- 23 | * 24 | * Interrupt Structure 25 | * 26 | *---------------------------------------------------------------- 27 | 28 | STRUCTURE IS,LN_SIZE 29 | APTR IS_DATA 30 | APTR IS_CODE 31 | LABEL IS_SIZE 32 | 33 | 34 | *--------------------------------------------------------------------- 35 | * 36 | * Exec Internal Interrupt Vectors 37 | * 38 | *--------------------------------------------------------------------- 39 | 40 | STRUCTURE IV,0 41 | APTR IV_DATA 42 | APTR IV_CODE 43 | APTR IV_NODE 44 | LABEL IV_SIZE 45 | 46 | 47 | *------ System Flag bits (in SysBase.SysFlags ) 48 | 49 | BITDEF S,SAR,15 ; scheduling attention required (TOP BIT) 50 | BITDEF S,TQE,14 ; time quantum expended -- time to resched 51 | BITDEF S,SINT,13 52 | 53 | 54 | *--------------------------------------------------------------------- 55 | * 56 | * Software Interrupt List Headers 57 | * 58 | *--------------------------------------------------------------------- 59 | 60 | STRUCTURE SH,LH_SIZE 61 | UWORD SH_PAD 62 | LABEL SH_SIZE 63 | 64 | SIH_PRIMASK EQU $0F0 65 | SIH_QUEUES EQU 5 66 | 67 | ** this is a fake INT definition, used only for AddIntServer and the like 68 | BITDEF INT,NMI,15 69 | 70 | ENDC ; EXEC_INTERRUPTS_I 71 | -------------------------------------------------------------------------------- /include/exec/nodes.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_NODES_I 2 | EXEC_NODES_I SET 1 3 | ** 4 | ** $VER: nodes.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Nodes & Node type identifiers. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_TYPES_I 14 | INCLUDE "exec/types.i" 15 | ENDC ; EXEC_TYPES_I 16 | 17 | 18 | * 19 | * List Node Structure. Each member in a list starts with a Node 20 | * 21 | STRUCTURE LN,0 ; List Node 22 | APTR LN_SUCC ; Pointer to next (successor) 23 | APTR LN_PRED ; Pointer to previous (predecessor) 24 | UBYTE LN_TYPE 25 | BYTE LN_PRI ; Priority, for sorting 26 | APTR LN_NAME ; ID string, null terminated 27 | LABEL LN_SIZE ; Note: word aligned 28 | 29 | ; minimal node -- no type checking possible 30 | STRUCTURE MLN,0 ; Minimal List Node 31 | APTR MLN_SUCC 32 | APTR MLN_PRED 33 | LABEL MLN_SIZE 34 | 35 | 36 | ** 37 | ** Note: Newly initialized IORequests, and software interrupt structures 38 | ** used with Cause(), should have type NT_UNKNOWN. The OS will assign a type 39 | ** when they are first used. 40 | ** 41 | ;------ Node Types for LN_TYPE 42 | 43 | NT_UNKNOWN EQU 0 44 | NT_TASK EQU 1 ; Exec task 45 | NT_INTERRUPT EQU 2 46 | NT_DEVICE EQU 3 47 | NT_MSGPORT EQU 4 48 | NT_MESSAGE EQU 5 ; Indicates message currently pending 49 | NT_FREEMSG EQU 6 50 | NT_REPLYMSG EQU 7 ; Message has been replied 51 | NT_RESOURCE EQU 8 52 | NT_LIBRARY EQU 9 53 | NT_MEMORY EQU 10 54 | NT_SOFTINT EQU 11 ; Internal flag used by SoftInts 55 | NT_FONT EQU 12 56 | NT_PROCESS EQU 13 ; AmigaDOS Process 57 | NT_SEMAPHORE EQU 14 58 | NT_SIGNALSEM EQU 15 ; signal semaphores 59 | NT_BOOTNODE EQU 16 60 | NT_KICKMEM EQU 17 61 | NT_GRAPHICS EQU 18 62 | NT_DEATHMESSAGE EQU 19 63 | 64 | NT_USER EQU 254 ; User node types work down from here 65 | NT_EXTENDED EQU 255 66 | 67 | ENDC ;EXEC_NODES_I 68 | -------------------------------------------------------------------------------- /include/graphics/rastport.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_RASTPORT_I 2 | GRAPHICS_RASTPORT_I = 1 3 | IFND GRAPHICS_GFX_I 4 | INCLUDE graphics/gfx.i 5 | ENDC 6 | RSRESET 7 | TmpRas RS.B 0 8 | tr_RasPtr RS.L 1 9 | tr_Size RS.L 1 10 | tr_SIZEOF RS.W 0 11 | RSRESET 12 | GelsInfo RS.B 0 13 | gi_sprRsrvd RS.B 1 14 | gi_Flags RS.B 1 15 | gi_gelHead RS.L 1 16 | gi_gelTail RS.L 1 17 | gi_nextLine RS.L 1 18 | gi_lastColor RS.L 1 19 | gi_collHandler RS.L 1 20 | gi_leftmost RS.W 1 21 | gi_rightmost RS.W 1 22 | gi_topmost RS.W 1 23 | gi_bottommost RS.W 1 24 | gi_firstBlissObj RS.L 1 25 | gi_lastBlissObj RS.L 1 26 | gi_SIZEOF RS.W 0 27 | RPB_FRST_DOT = 0 28 | RPF_FRST_DOT = 1<<0 29 | RPB_ONE_DOT = 1 30 | RPF_ONE_DOT = 1<<1 31 | RPB_DBUFFER = 2 32 | RPF_DBUFFER = 1<<2 33 | RPB_AREAOUTLINE = 3 34 | RPF_AREAOUTLINE = 1<<3 35 | RPB_NOCROSSFILL = 5 36 | RPF_NOCROSSFILL = 1<<5 37 | RP_JAM1 = 0 38 | RP_JAM2 = 1 39 | RP_COMPLEMENT = 2 40 | RP_INVERSVID = 4 41 | RPB_TXSCALE = 0 42 | RPF_TXSCALE = 1<<0 43 | RSRESET 44 | RastPort RS.B 0 45 | rp_Layer RS.L 1 46 | rp_BitMap RS.L 1 47 | rp_AreaPtrn RS.L 1 48 | rp_TmpRas RS.L 1 49 | rp_AreaInfo RS.L 1 50 | rp_GelsInfo RS.L 1 51 | rp_Mask RS.B 1 52 | rp_FgPen RS.B 1 53 | rp_BgPen RS.B 1 54 | rp_AOLPen RS.B 1 55 | rp_DrawMode RS.B 1 56 | rp_AreaPtSz RS.B 1 57 | rp_Dummy RS.B 1 58 | rp_linpatcnt RS.B 1 59 | rp_Flags RS.W 1 60 | rp_LinePtrn RS.W 1 61 | rp_cp_x RS.W 1 62 | rp_cp_y RS.W 1 63 | rp_minterms RS.B 8 64 | rp_PenWidth RS.W 1 65 | rp_PenHeight RS.W 1 66 | rp_Font RS.L 1 67 | rp_AlgoStyle RS.B 1 68 | rp_TxFlags RS.B 1 69 | rp_TxHeight RS.W 1 70 | rp_TxWidth RS.W 1 71 | rp_TxBaseline RS.W 1 72 | rp_TxSpacing RS.W 1 73 | rp_RP_User RS.L 1 74 | rp_longreserved RS.B 8 75 | IFND GFX_RASTPORT_1_2 76 | rp_wordreserved RS.B 14 77 | rp_reserved RS.B 8 78 | ENDC 79 | rp_SIZEOF RS.W 0 80 | RSRESET 81 | AreaInfo RS.B 0 82 | ai_VctrTbl RS.L 1 83 | ai_VctrPtr RS.L 1 84 | ai_FlagTbl RS.L 1 85 | ai_FlagPtr RS.L 1 86 | ai_Count RS.W 1 87 | ai_MaxCount RS.W 1 88 | ai_FirstX RS.W 1 89 | ai_FirstY RS.W 1 90 | ai_SIZEOF RS.W 0 91 | ONE_DOTn = 1 92 | ONE_DOT = 2 93 | FRST_DOTn = 0 94 | FRST_DOT = 1 95 | ENDC 96 | -------------------------------------------------------------------------------- /include/graphics/gels.i: -------------------------------------------------------------------------------- 1 | IFND GRAPHICS_GELS_I 2 | GRAPHICS_GELS_I = 1 3 | SUSERFLAGS = $00FF 4 | VSB_VSPRITE = 0 5 | VSF_VSPRITE = 1<<0 6 | VSB_SAVEBACK = 1 7 | VSF_SAVEBACK = 1<<1 8 | VSB_OVERLAY = 2 9 | VSF_OVERLAY = 1<<2 10 | VSB_MUSTDRAW = 3 11 | VSF_MUSTDRAW = 1<<3 12 | VSB_BACKSAVED = 8 13 | VSF_BACKSAVED = 1<<8 14 | VSB_BOBUPDATE = 9 15 | VSF_BOBUPDATE = 1<<9 16 | VSB_GELGONE = 10 17 | VSF_GELGONE = 1<<10 18 | VSB_VSOVERFLOW = 11 19 | VSF_VSOVERFLOW = 1<<11 20 | BUSERFLAGS = $00FF 21 | BB_SAVEBOB = 0 22 | BF_SAVEBOB = 1<<0 23 | BB_BOBISCOMP = 1 24 | BF_BOBISCOMP = 1<<1 25 | BB_BWAITING = 8 26 | BF_BWAITING = 1<<8 27 | BB_BDRAWN = 9 28 | BF_BDRAWN = 1<<9 29 | BB_BOBSAWAY = 10 30 | BF_BOBSAWAY = 1<<10 31 | BB_BOBNIX = 11 32 | BF_BOBNIX = 1<<11 33 | BB_SAVEPRESERVE = 12 34 | BF_SAVEPRESERVE = 1<<12 35 | BB_OUTSTEP = 13 36 | BF_OUTSTEP = 1<<13 37 | ANFRACSIZE = 6 38 | ANIMHALF = $0020 39 | RINGTRIGGER = $0001 40 | InitAnimate MACRO 41 | CLR.L \1 42 | ENDM 43 | RemBob MACRO 44 | OR.W #BF_BOBSAWAY,b_BobFlags+\1 45 | ENDM 46 | RSRESET 47 | VS RS.B 0 48 | vs_NextVSprite RS.L 1 49 | vs_PrevVSprite RS.L 1 50 | vs_DrawPath RS.L 1 51 | vs_ClearPath RS.L 1 52 | vs_Oldy RS.W 1 53 | vs_Oldx RS.W 1 54 | vs_VSFlags RS.W 1 55 | vs_Y RS.W 1 56 | vs_X RS.W 1 57 | vs_Height RS.W 1 58 | vs_Width RS.W 1 59 | vs_Depth RS.W 1 60 | vs_MeMask RS.W 1 61 | vs_HitMask RS.W 1 62 | vs_ImageData RS.L 1 63 | vs_BorderLine RS.L 1 64 | vs_CollMask RS.L 1 65 | vs_SprColors RS.L 1 66 | vs_VSBob RS.L 1 67 | vs_PlanePick RS.B 1 68 | vs_PlaneOnOff RS.B 1 69 | vs_SUserExt RS.W 0 70 | vs_SIZEOF RS.W 0 71 | RSRESET 72 | BOB RS.B 0 73 | bob_BobFlags RS.W 1 74 | bob_SaveBuffer RS.L 1 75 | bob_ImageShadow RS.L 1 76 | bob_Before RS.L 1 77 | bob_After RS.L 1 78 | bob_BobVSprite RS.L 1 79 | bob_BobComp RS.L 1 80 | bob_DBuffer RS.L 1 81 | bob_BUserExt RS.W 0 82 | bob_SIZEOF RS.W 0 83 | RSRESET 84 | AC RS.B 0 85 | ac_CompFlags RS.W 1 86 | ac_Timer RS.W 1 87 | ac_TimeSet RS.W 1 88 | ac_NextComp RS.L 1 89 | ac_PrevComp RS.L 1 90 | ac_NextSeq RS.L 1 91 | ac_PrevSeq RS.L 1 92 | ac_AnimCRoutine RS.L 1 93 | ac_YTrans RS.W 1 94 | ac_XTrans RS.W 1 95 | ac_HeadOb RS.L 1 96 | ac_AnimBob RS.L 1 97 | ac_SIZE RS.W 0 98 | RSRESET 99 | AO RS.B 0 100 | ao_NextOb RS.L 1 101 | ao_PrevOb RS.L 1 102 | ao_Clock RS.L 1 103 | ao_AnOldY RS.W 1 104 | ao_AnOldX RS.W 1 105 | ao_AnY RS.W 1 106 | ao_AnX RS.W 1 107 | ao_YVel RS.W 1 108 | ao_XVel RS.W 1 109 | ao_XAccel RS.W 1 110 | ao_YAccel RS.W 1 111 | ao_RingYTrans RS.W 1 112 | ao_RingXTrans RS.W 1 113 | ao_AnimORoutine RS.L 1 114 | ao_HeadComp RS.L 1 115 | ao_AUserExt RS.W 0 116 | ao_SIZEOF RS.W 0 117 | RSRESET 118 | DBP RS.B 0 119 | dbp_BufY RS.W 1 120 | dbp_BufX RS.W 1 121 | dbp_BufPath RS.L 1 122 | dbp_BufBuffer RS.L 1 123 | dbp_BufPlanes RS.L 1 124 | dbp_SIZEOF RS.W 0 125 | ENDC 126 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "type": "winuae", 6 | "request": "launch", 7 | "name": "WinUAE Debug", 8 | "stopOnEntry": false, 9 | "serverName": "localhost", 10 | "serverPort": 2345, 11 | "startEmulator": true, 12 | "trace": false, 13 | "exceptionMask": 8188, 14 | "emulatorStartDelay": 1500, 15 | "emulator": "${config:amiga-assembly.binDir}/winuae.exe", 16 | "emulatorWorkingDir": "${config:amiga-assembly.binDir}", 17 | "program": "${workspaceFolder}/uae/dh0/main", 18 | "options": [ 19 | "-s", 20 | "quickstart=a600,1", 21 | "-s", 22 | "chipset=ocs", 23 | "-s", 24 | "filesystem=rw,dh0:${workspaceFolder}/uae/dh0", 25 | "-s", 26 | "debugging_trigger=SYS:main", 27 | "-s", 28 | "kickstart_rom_file=%AmigaRoms%/Kickstart 1.3.rom", 29 | "-s", 30 | "debugging_features=gdbserver", 31 | "-s", 32 | "sound_output=exact", 33 | "-s", 34 | "sound_channels=mono", 35 | "-s", 36 | "sound_stereo_separation=0", 37 | "-s", 38 | "sound_stereo_mixing_delay=0", 39 | "-s", 40 | "sound_max_buff=16384", 41 | "-s", 42 | "sound_frequency=48000", 43 | "-s", 44 | "sound_interpol=anti", 45 | "-s", 46 | "sound_filter=off", 47 | "-s", 48 | "sound_filter_type=standard", 49 | "-s", 50 | "sound_volume=0", 51 | "-s", 52 | "sound_volume_paula=0", 53 | "-s", 54 | "sound_volume_cd=0", 55 | "-s", 56 | "sound_volume_ahi=0", 57 | "-s", 58 | "sound_volume_midi=0", 59 | "-s", 60 | "sound_volume_genlock=0", 61 | "-s", 62 | "sound_auto=true", 63 | "-s", 64 | "sound_max_buff=1024", 65 | "-s", 66 | "chipmem_size=4", 67 | "-s", 68 | "bogomem_size=4", 69 | "-s", 70 | "win32.active_priority=1", 71 | "-s", 72 | "win32.inactive_priority=1", 73 | "-s", 74 | "win32.iconified_priority=1", 75 | "-s", 76 | "win32.iconified_nosound=false", 77 | "-s", 78 | "win32.iconified_pause=false", 79 | ], 80 | "preLaunchTask": "" 81 | }, 82 | ] 83 | } -------------------------------------------------------------------------------- /include/graphics/graphics_lib.i: -------------------------------------------------------------------------------- 1 | _LVOBltBitMap = -30 2 | _LVOBltTemplate = -36 3 | _LVOClearEOL = -42 4 | _LVOClearScreen = -48 5 | _LVOTextLength = -54 6 | _LVOText = -60 7 | _LVOSetFont = -66 8 | _LVOOpenFont = -72 9 | _LVOCloseFont = -78 10 | _LVOAskSoftStyle= -84 11 | _LVOSetSoftStyle= -90 12 | _LVOAddBob = -96 13 | _LVOAddVSprite = -102 14 | _LVODoCollision = -108 15 | _LVODrawGList = -114 16 | _LVOInitGels = -120 17 | _LVOInitMasks = -126 18 | _LVORemIBob = -132 19 | _LVORemVSprite = -138 20 | _LVOSetCollision= -144 21 | _LVOSortGList = -150 22 | _LVOAddAnimOb = -156 23 | _LVOAnimate = -162 24 | _LVOGetGBuffers = -168 25 | _LVOInitGMasks = -174 26 | _LVODrawEllipse = -180 27 | _LVOAreaEllipse = -186 28 | _LVOLoadRGB4 = -192 29 | _LVOInitRastPort= -198 30 | _LVOInitVPort = -204 31 | _LVOMrgCop = -210 32 | _LVOMakeVPort = -216 33 | _LVOLoadView = -222 34 | _LVOWaitBlit = -228 35 | _LVOSetRast = -234 36 | _LVOMove = -240 37 | _LVODraw = -246 38 | _LVOAreaMove = -252 39 | _LVOAreaDraw = -258 40 | _LVOAreaEnd = -264 41 | _LVOWaitTOF = -270 42 | _LVOQBlit = -276 43 | _LVOInitArea = -282 44 | _LVOSetRGB4 = -288 45 | _LVOQBSBlit = -294 46 | _LVOBltClear = -300 47 | _LVORectFill = -306 48 | _LVOBltPattern = -312 49 | _LVOReadPixel = -318 50 | _LVOWritePixel = -324 51 | _LVOFlood = -330 52 | _LVOPolyDraw = -336 53 | _LVOSetAPen = -342 54 | _LVOSetBPen = -348 55 | _LVOSetDrMd = -354 56 | _LVOInitView = -360 57 | _LVOCBump = -366 58 | _LVOCMove = -372 59 | _LVOCWait = -378 60 | _LVOVBeamPos = -384 61 | _LVOInitBitMap = -390 62 | _LVOScrollRaster= -396 63 | _LVOWaitBOVP = -402 64 | _LVOGetSprite = -408 65 | _LVOFreeSprite = -414 66 | _LVOChangeSprite= -420 67 | _LVOMoveSprite = -426 68 | _LVOLockLayerRom= -432 69 | _LVOUnlockLayerRom= -438 70 | _LVOSyncSBitMap = -444 71 | _LVOCopySBitMap = -450 72 | _LVOOwnBlitter = -456 73 | _LVODisownBlitter= -462 74 | _LVOInitTmpRas = -468 75 | _LVOAskFont = -474 76 | _LVOAddFont = -480 77 | _LVORemFont = -486 78 | _LVOAllocRaster = -492 79 | _LVOFreeRaster = -498 80 | _LVOAndRectRegion= -504 81 | _LVOOrRectRegion= -510 82 | _LVONewRegion = -516 83 | _LVOClearRectRegion= -522 84 | _LVOClearRegion = -528 85 | _LVODisposeRegion= -534 86 | _LVOFreeVPortCopLists= -540 87 | _LVOFreeCopList = -546 88 | _LVOClipBlit = -552 89 | _LVOXorRectRegion= -558 90 | _LVOFreeCprList = -564 91 | _LVOGetColorMap = -570 92 | _LVOFreeColorMap= -576 93 | _LVOGetRGB4 = -582 94 | _LVOScrollVPort = -588 95 | _LVOUCopperListInit= -594 96 | _LVOFreeGBuffers= -600 97 | _LVOBltBitMapRastPort= -606 98 | _LVOOrRegionRegion= -612 99 | _LVOXorRegionRegion= -618 100 | _LVOAndRegionRegion= -624 101 | _LVOSetRGB4CM = -630 102 | _LVOBltMaskBitMapRastPort=-636 103 | _LVOGraphicsReserved1= -642 104 | _LVOGraphicsReserved2= -648 105 | _LVOAttemptLockLayerRom=-654 106 | CALLGRAF MACRO 107 | MOVE.L _GfxBase,A6 108 | JSR _LVO\1(A6) 109 | ENDM 110 | GRAFNAME MACRO 111 | DC.B 'graphics.library',0 112 | ENDM 113 | -------------------------------------------------------------------------------- /include/exec/exec_lib.i: -------------------------------------------------------------------------------- 1 | FUNCDEF Supervisor 2 | FUNCDEF ExitIntr 3 | FUNCDEF Schedule 4 | FUNCDEF Reschedule 5 | FUNCDEF Switch 6 | FUNCDEF Dispatch 7 | FUNCDEF Exception 8 | FUNCDEF InitCode 9 | FUNCDEF InitStruct 10 | FUNCDEF MakeLibrary 11 | FUNCDEF MakeFunctions 12 | FUNCDEF FindResident 13 | FUNCDEF InitResident 14 | FUNCDEF Alert 15 | FUNCDEF Debug 16 | FUNCDEF Disable 17 | FUNCDEF Enable 18 | FUNCDEF Forbid 19 | FUNCDEF Permit 20 | FUNCDEF SetSR 21 | FUNCDEF SuperState 22 | FUNCDEF UserState 23 | FUNCDEF SetIntVector 24 | FUNCDEF AddIntServer 25 | FUNCDEF RemIntServer 26 | FUNCDEF Cause 27 | FUNCDEF Allocate 28 | FUNCDEF Deallocate 29 | FUNCDEF AllocMem 30 | FUNCDEF AllocAbs 31 | FUNCDEF FreeMem 32 | FUNCDEF AvailMem 33 | FUNCDEF AllocEntry 34 | FUNCDEF FreeEntry 35 | FUNCDEF Insert 36 | FUNCDEF AddHead 37 | FUNCDEF AddTail 38 | FUNCDEF Remove 39 | FUNCDEF RemHead 40 | FUNCDEF RemTail 41 | FUNCDEF Enqueue 42 | FUNCDEF FindName 43 | FUNCDEF AddTask 44 | FUNCDEF RemTask 45 | FUNCDEF FindTask 46 | FUNCDEF SetTaskPri 47 | FUNCDEF SetSignal 48 | FUNCDEF SetExcept 49 | FUNCDEF Wait 50 | FUNCDEF Signal 51 | FUNCDEF AllocSignal 52 | FUNCDEF FreeSignal 53 | FUNCDEF AllocTrap 54 | FUNCDEF FreeTrap 55 | FUNCDEF AddPort 56 | FUNCDEF RemPort 57 | FUNCDEF PutMsg 58 | FUNCDEF GetMsg 59 | FUNCDEF ReplyMsg 60 | FUNCDEF WaitPort 61 | FUNCDEF FindPort 62 | FUNCDEF AddLibrary 63 | FUNCDEF RemLibrary 64 | FUNCDEF OldOpenLibrary 65 | FUNCDEF CloseLibrary 66 | FUNCDEF SetFunction 67 | FUNCDEF SumLibrary 68 | FUNCDEF AddDevice 69 | FUNCDEF RemDevice 70 | FUNCDEF OpenDevice 71 | FUNCDEF CloseDevice 72 | FUNCDEF DoIO 73 | FUNCDEF SendIO 74 | FUNCDEF CheckIO 75 | FUNCDEF WaitIO 76 | FUNCDEF AbortIO 77 | FUNCDEF AddResource 78 | FUNCDEF RemResource 79 | FUNCDEF OpenResource 80 | FUNCDEF RawIOInit 81 | FUNCDEF RawMayGetChar 82 | FUNCDEF RawPutChar 83 | FUNCDEF RawDoFmt 84 | FUNCDEF GetCC 85 | FUNCDEF TypeOfMem 86 | FUNCDEF Procure 87 | FUNCDEF Vacate 88 | FUNCDEF OpenLibrary 89 | FUNCDEF InitSemaphore 90 | FUNCDEF ObtainSemaphore 91 | FUNCDEF ReleaseSemaphore 92 | FUNCDEF AttemptSemaphore 93 | FUNCDEF ObtainSemaphoreList 94 | FUNCDEF ReleaseSemaphoreList 95 | FUNCDEF FindSemaphore 96 | FUNCDEF AddSemaphore 97 | FUNCDEF RemSemaphore 98 | FUNCDEF SumKickData 99 | FUNCDEF AddMemList 100 | FUNCDEF CopyMem 101 | FUNCDEF CopyMemQuick 102 | FUNCDEF CacheClearU 103 | FUNCDEF CacheClearE 104 | FUNCDEF CacheControl 105 | FUNCDEF CreateIORequest 106 | FUNCDEF DeleteIORequest 107 | FUNCDEF CreateMsgPort 108 | FUNCDEF DeleteMsgPort 109 | FUNCDEF ObtainSemaphoreShared 110 | FUNCDEF AllocVec 111 | FUNCDEF FreeVec 112 | FUNCDEF CreatePool 113 | FUNCDEF DeletePool 114 | FUNCDEF AllocPooled 115 | FUNCDEF FreePooled 116 | FUNCDEF AttemptSemaphoreShared 117 | FUNCDEF ColdReboot 118 | FUNCDEF StackSwap 119 | FUNCDEF ChildFree 120 | FUNCDEF ChildOrphan 121 | FUNCDEF ChildStatus 122 | FUNCDEF ChildWait 123 | FUNCDEF CachePreDMA 124 | FUNCDEF CachePostDMA 125 | FUNCDEF AddMemHandler 126 | FUNCDEF RemMemHandler 127 | FUNCDEF ObtainQuickVector 128 | FUNCDEF ExecReserved04 129 | FUNCDEF ExecReserved05 130 | FUNCDEF ExecReserved06 131 | FUNCDEF TaggedOpenLibrary 132 | FUNCDEF ReadGayle 133 | FUNCDEF ExecReserved08 134 | -------------------------------------------------------------------------------- /include/exec/io.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_IO_I 2 | EXEC_IO_I SET 1 3 | ** 4 | ** $VER: io.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Message structures used for device communication 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_PORTS_I 14 | INCLUDE "exec/ports.i" 15 | ENDC ; EXEC_PORTS_I 16 | 17 | IFND EXEC_LIBRARIES_I 18 | INCLUDE "exec/libraries.i" 19 | ENDC ; EXEC_LIBRARIES_I 20 | 21 | 22 | ;---------------------------------------------------------------- 23 | ; 24 | ; IO Request Structures 25 | ; 26 | ;---------------------------------------------------------------- 27 | 28 | ;------ Required portion of IO request: 29 | 30 | STRUCTURE IO,MN_SIZE 31 | APTR IO_DEVICE ; device node pointer 32 | APTR IO_UNIT ; unit (driver private) 33 | UWORD IO_COMMAND ; device command 34 | UBYTE IO_FLAGS ; special flags 35 | BYTE IO_ERROR ; error or warning code 36 | LABEL IO_SIZE 37 | 38 | 39 | ;------ Standard IO request extension: 40 | 41 | ULONG IO_ACTUAL ; actual # of bytes transfered 42 | ULONG IO_LENGTH ; requested # of bytes transfered 43 | APTR IO_DATA ; pointer to data area 44 | ULONG IO_OFFSET ; offset for seeking devices 45 | LABEL IOSTD_SIZE 46 | 47 | 48 | ;------ IO_FLAGS bit definitions: 49 | 50 | BITDEF IO,QUICK,0 ; complete IO quickly 51 | 52 | 53 | ;---------------------------------------------------------------- 54 | ; 55 | ; Standard Device Library Functions 56 | ; 57 | ;---------------------------------------------------------------- 58 | 59 | LIBINIT 60 | 61 | LIBDEF DEV_BEGINIO ; process IO request 62 | LIBDEF DEV_ABORTIO ; abort IO request 63 | 64 | 65 | ;---------------------------------------------------------------- 66 | ; 67 | ; IO Function Macros 68 | ; 69 | ;---------------------------------------------------------------- 70 | 71 | BEGINIO MACRO 72 | LINKLIB DEV_BEGINIO,IO_DEVICE(A1) 73 | ENDM 74 | 75 | ABORTIO MACRO 76 | LINKLIB DEV_ABORTIO,IO_DEVICE(A1) 77 | ENDM 78 | 79 | 80 | ;---------------------------------------------------------------- 81 | ; 82 | ; Standard Device Command Definitions 83 | ; 84 | ;---------------------------------------------------------------- 85 | 86 | ;------ Command definition macro: 87 | DEVINIT MACRO ; [baseOffset] 88 | IFC '\1','' 89 | CMD_COUNT SET CMD_NONSTD 90 | ENDC 91 | IFNC '\1','' 92 | CMD_COUNT SET \1 93 | ENDC 94 | ENDM 95 | 96 | DEVCMD MACRO ; cmdname 97 | \1 EQU CMD_COUNT 98 | CMD_COUNT SET CMD_COUNT+1 99 | ENDM 100 | 101 | 102 | ;------ Standard device commands: 103 | 104 | DEVINIT 0 105 | 106 | DEVCMD CMD_INVALID ; invalid command 107 | DEVCMD CMD_RESET ; reset as if just inited 108 | DEVCMD CMD_READ ; standard read 109 | DEVCMD CMD_WRITE ; standard write 110 | DEVCMD CMD_UPDATE ; write out all buffers 111 | DEVCMD CMD_CLEAR ; clear all buffers 112 | DEVCMD CMD_STOP ; hold current and queued 113 | DEVCMD CMD_START ; restart after stop 114 | DEVCMD CMD_FLUSH ; abort entire queue 115 | 116 | 117 | ;------ First non-standard device command value: 118 | 119 | DEVCMD CMD_NONSTD 120 | 121 | ENDC ; EXEC_IO_I 122 | -------------------------------------------------------------------------------- /include/exec/macros.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_MACROS_I 2 | EXEC_MACROS_I SET 1 3 | ** 4 | ** $VER: macros.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Handy macros for assembly language programmers. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND DEBUG_DETAIL 14 | DEBUG_DETAIL SET 0 ;Detail level of debugging. Zero for none. 15 | ENDC 16 | 17 | 18 | JSRLIB MACRO ;FunctionName 19 | XREF _LVO\1 20 | jsr _LVO\1(a6) 21 | ENDM 22 | 23 | JMPLIB MACRO ;FunctionName 24 | XREF _LVO\1 25 | jmp _LVO\1(a6) 26 | ENDM 27 | 28 | BSRSELF MACRO 29 | XREF \1 30 | bsr \1 31 | ENDM 32 | 33 | BRASELF MACRO 34 | XREF \1 35 | bra \1 36 | ENDM 37 | 38 | BLINK MACRO 39 | IFNE DEBUG_DETAIL 40 | bchg.b #1,$bfe001 ;Toggle the power LED 41 | ENDC 42 | ENDM 43 | 44 | TRIGGER MACRO ; Trigger a hardware state analyzer 45 | IFGE DEBUG_DETAIL-\1 46 | move.w #$5555,$2fe 47 | ENDC 48 | ENDM 49 | 50 | CLEAR MACRO 51 | moveq.l #0,\1 52 | ENDM 53 | 54 | CLEARA MACRO 55 | suba.l \1,\1 ;Quick way to put zero in an address register 56 | ENDM 57 | 58 | ************************************************************************* 59 | IFND PRINTF 60 | PRINTF MACRO ; level,,... 61 | IFGE DEBUG_DETAIL-\1 62 | XREF kprint_macro 63 | PUSHCOUNT SET 0 64 | 65 | IFNC '\9','' 66 | move.l \9,-(sp) 67 | PUSHCOUNT SET PUSHCOUNT+4 68 | ENDC 69 | 70 | IFNC '\8','' 71 | move.l \8,-(sp) 72 | PUSHCOUNT SET PUSHCOUNT+4 73 | ENDC 74 | 75 | IFNC '\7','' 76 | move.l \7,-(sp) 77 | PUSHCOUNT SET PUSHCOUNT+4 78 | ENDC 79 | 80 | IFNC '\6','' 81 | move.l \6,-(sp) 82 | PUSHCOUNT SET PUSHCOUNT+4 83 | ENDC 84 | 85 | IFNC '\5','' 86 | move.l \5,-(sp) 87 | PUSHCOUNT SET PUSHCOUNT+4 88 | ENDC 89 | 90 | IFNC '\4','' 91 | move.l \4,-(sp) 92 | PUSHCOUNT SET PUSHCOUNT+4 93 | ENDC 94 | 95 | IFNC '\3','' 96 | move.l \3,-(sp) 97 | PUSHCOUNT SET PUSHCOUNT+4 98 | ENDC 99 | 100 | movem.l a0/a1,-(sp) 101 | lea.l PSS\@(pc),A0 102 | lea.l 4*2(SP),A1 103 | BSR kprint_macro 104 | movem.l (sp)+,a0/a1 105 | bra.s PSE\@ 106 | 107 | PSS\@ dc.b \2 108 | IFEQ (\1&1) ;If even, add CR/LF par... 109 | dc.b 13,10 110 | ENDC 111 | dc.b 0 112 | ds.w 0 113 | PSE\@ 114 | lea.l PUSHCOUNT(sp),sp 115 | ENDC ;IFGE DEBUG_DETAIL-\1 116 | ENDM ;PRINTF MACRO 117 | ENDC ;IFND PRINTF 118 | 119 | 120 | ;---------------------------------------------------------------------------- 121 | ;Push a set of registers onto the stack - undo with POPM. This prevents 122 | ;the need to update or synchronize two MOVEM instructions. These macros 123 | ;assume an optimizing assembler that will convert single register MOVEM 124 | ;to MOVE. Because the REG assignment can't be reset, these macros do 125 | ;not nest. 126 | ; 127 | ; PUSHM d2/a2/a5 128 | ; ...code... 129 | ; POPM 130 | ; RTS 131 | ; 132 | PUSHM_COUNT SET 0 133 | PUSHM MACRO 134 | IFGT NARG-1 135 | FAIL !!!! TOO MANY ARGUMENTS TO PUSHM !!!! 136 | ENDC 137 | PUSHM_COUNT SET PUSHM_COUNT+1 138 | PUSHM_\*VALOF(PUSHM_COUNT) REG \1 139 | movem.l PUSHM_\*VALOF(PUSHM_COUNT),-(sp) 140 | ENDM 141 | 142 | ; 143 | ;Undo most recent PUSHM. 'POPM NOBUMP' allows multiple exit points. 144 | ; 145 | POPM MACRO 146 | movem.l (sp)+,PUSHM_\*VALOF(PUSHM_COUNT) 147 | IFNC '\1','NOBUMP' 148 | PUSHM_COUNT SET PUSHM_COUNT+1 ;error if re-used 149 | ENDC 150 | ENDM 151 | ;---------------------------------------------------------------------------- 152 | 153 | 154 | ENDC ; EXEC_MACROS_I 155 | -------------------------------------------------------------------------------- /include/exec/ables.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_ABLES_I 2 | EXEC_ABLES_I SET 1 3 | ** 4 | ** $VER: ables.i 39.0 (15.10.91) 5 | ** Includes Release 40.13 6 | ** 7 | ** Task switch and interrupt control macros 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_TYPES_I 14 | INCLUDE "exec/types.i" 15 | ENDC ; EXEC_TYPES_I 16 | 17 | IFND EXEC_EXECBASE_I 18 | INCLUDE "exec/execbase.i" 19 | ENDC ; EXEC_EXECBASE_I 20 | 21 | 22 | *------------------------------------------------------------------------- 23 | * 24 | * Interrupt Exclusion Macros. Disable all tasks and interrupts. 25 | * 26 | *------------------------------------------------------------------------- 27 | 28 | INT_ABLES MACRO ; externals used by DISABLE and ENABLE 29 | XREF _intena 30 | ENDM 31 | 32 | ;Disable interrupts. Avoid use of DISABLE if at all possible. 33 | ;Please realize the danger of this macro! Don't disable for long periods! 34 | DISABLE MACRO ; [scratchReg],[NOFETCH] or have ExecBase in A6. 35 | IFC '\1','' ;Case 1: Assume A6=ExecBase 36 | MOVE.W #$04000,_intena ;(NOT IF_SETCLR)+IF_INTEN 37 | ADDQ.B #1,IDNestCnt(A6) 38 | MEXIT 39 | ENDC 40 | IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase 41 | MOVE.W #$04000,_intena 42 | ADDQ.B #1,IDNestCnt(\1) 43 | MEXIT 44 | ENDC 45 | IFNC '\1','' ;Case 3: Use \1 as scratch 46 | MOVE.L 4,\1 ;Get ExecBase 47 | MOVE.W #$04000,_intena 48 | ADDQ.B #1,IDNestCnt(\1) 49 | MEXIT 50 | ENDC 51 | ENDM 52 | 53 | ;Enable interrupts. Please realize the danger of this macro! 54 | ENABLE MACRO ; [scratchReg],[NOFETCH] or have ExecBase in A6. 55 | IFC '\1','' ;Case 1: Assume A6=ExecBase 56 | SUBQ.B #1,IDNestCnt(A6) 57 | BGE.S ENABLE\@ 58 | MOVE.W #$0C000,_intena ;IF_SETCLR+IF_INTEN 59 | ENABLE\@: 60 | MEXIT 61 | ENDC 62 | IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase 63 | SUBQ.B #1,IDNestCnt(\1) 64 | BGE.S ENABLE\@ 65 | MOVE.W #$0C000,_intena 66 | ENABLE\@: 67 | MEXIT 68 | ENDC 69 | IFNC '\1','' ;Case 3: Use \1 as scratch 70 | MOVE.L 4,\1 ;Get ExecBase 71 | SUBQ.B #1,IDNestCnt(\1) 72 | BGE.S ENABLE\@ 73 | MOVE.W #$0C000,_intena 74 | ENABLE\@: 75 | MEXIT 76 | ENDC 77 | ENDM 78 | 79 | 80 | *------------------------------------------------------------------------- 81 | * 82 | * Tasking Exclusion Macros. Forbid all other tasks (but not interrupts) 83 | * 84 | *------------------------------------------------------------------------- 85 | 86 | TASK_ABLES MACRO ; externals used by FORBID and PERMIT 87 | XREF _LVOPermit 88 | ENDM 89 | 90 | ;Prevent task switching (disables reschedule) 91 | FORBID MACRO ; [scratchReg],[NOFETCH] or ExecBase in A6! 92 | IFC '\1','' ;Case 1: Assume A6=ExecBase 93 | ADDQ.B #1,TDNestCnt(A6) 94 | MEXIT 95 | ENDC 96 | IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase 97 | ADDQ.B #1,TDNestCnt(\1) 98 | MEXIT 99 | ENDC 100 | IFNC '\1','' ;Case 3: Use \1 as scratch 101 | MOVE.L 4,\1 ;Get ExecBase 102 | ADDQ.B #1,TDNestCnt(\1) 103 | MEXIT 104 | ENDC 105 | ENDM 106 | 107 | ;Enable task switching 108 | PERMIT MACRO ; [saveFlag],[NOFETCH] or ExecBase in A6! 109 | IFC '\1','' ;Case 1: Assume A6=ExecBase 110 | JSR _LVOPermit(A6) 111 | MEXIT 112 | ENDC 113 | IFC '\2','NOFETCH' ;Case 2: Assume \1=ExecBase 114 | EXG.L A6,\1 ;put execbase in A6 115 | JSR _LVOPermit(A6) ;no registers touched. A6=ExecBase 116 | EXG.L A6,\1 117 | MEXIT 118 | ENDC 119 | IFNC '\1','' ;Case 2: save/restore A6 120 | MOVE.L A6,-(SP) 121 | MOVE.L 4,A6 122 | JSR _LVOPermit(A6) 123 | MOVE.L (SP)+,A6 124 | MEXIT 125 | ENDC 126 | ENDM 127 | 128 | ENDC ; EXEC_ABLES_I 129 | -------------------------------------------------------------------------------- /include/exec/memory.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_MEMORY_I 2 | EXEC_MEMORY_I SET 1 3 | ** 4 | ** $VER: memory.i 39.3 (20.5.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Definitions and structures used by the memory allocation system 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_NODES_I 14 | INCLUDE "exec/nodes.i" 15 | ENDC ; EXEC_NODES_I 16 | 17 | 18 | *--------------------------------------------------------------------- 19 | * 20 | * Memory List Structures 21 | * 22 | *--------------------------------------------------------------------- 23 | * 24 | * A memory list appears in two forms: One is a requirements list 25 | * the other is a list of already allocated memory. The format is 26 | * the same, with the reqirements/address field occupying the same 27 | * position. 28 | * 29 | * The format is a linked list of ML structures each of which has 30 | * an array of ME entries. 31 | * 32 | *--------------------------------------------------------------------- 33 | 34 | STRUCTURE ML,LN_SIZE 35 | UWORD ML_NUMENTRIES ; The number of ME structures that follow 36 | LABEL ML_ME ; where the ME structures begin 37 | LABEL ML_SIZE ;Note: does NOT include any "ME" structures. 38 | 39 | 40 | STRUCTURE ME,0 41 | LABEL ME_REQS ; the AllocMem requirements 42 | APTR ME_ADDR ; the address of this block (an alias 43 | ; for the same location as ME_REQS) 44 | ULONG ME_LENGTH ; the length of this region 45 | LABEL ME_SIZE 46 | 47 | 48 | *------ memory options: 49 | *------ see the AllocMem() documentation for details------* 50 | 51 | MEMF_ANY EQU 0 ;Any type of memory will do 52 | BITDEF MEM,PUBLIC,0 53 | BITDEF MEM,CHIP,1 54 | BITDEF MEM,FAST,2 55 | BITDEF MEM,LOCAL,8 ;Memory that does not go away at RESET 56 | BITDEF MEM,24BITDMA,9 ;DMAable memory within 24 bits of address 57 | BITDEF MEM,KICK,10 ;Memory that can be used for KickTag stuff 58 | 59 | BITDEF MEM,CLEAR,16 ;AllocMem: NULL out area before return 60 | BITDEF MEM,LARGEST,17 ;AvailMem: return the largest chunk size 61 | BITDEF MEM,REVERSE,18 ;AllocMem: allocate from the top down 62 | BITDEF MEM,TOTAL,19 ;AvailMem: return total size of memory 63 | 64 | BITDEF MEM,NO_EXPUNGE,31 ;AllocMem: Do not cause expunge on failure 65 | 66 | *----- Current alignment rules for memory blocks (may increase) ----- 67 | MEM_BLOCKSIZE EQU 8 68 | MEM_BLOCKMASK EQU (MEM_BLOCKSIZE-1) 69 | 70 | 71 | *--------------------------------------------------------------------- 72 | * 73 | * Low memory handler data structure 74 | * 75 | * Note: This structure is *READ ONLY* and only EXEC can create it! 76 | *--------------------------------------------------------------------- 77 | STRUCTURE MemHandlerData,0 78 | ULONG memh_RequestSize ; Requested allocation size 79 | ULONG memh_RequestFlags ; Requested allocation flags 80 | ULONG memh_Flags ; Flags (see blow) 81 | LABEL memh_SIZEOF 82 | 83 | * Flag definitions: 84 | BITDEF MEMH,RECYCLE,0 ; 0==First time, 1==recycle 85 | 86 | *------ Low Memory handler return values 87 | MEM_DID_NOTHING EQU 0 ; Nothing we could do... 88 | MEM_ALL_DONE EQU -1 ; We did all we could do 89 | MEM_TRY_AGAIN EQU 1 ; We did some, try the allocation again 90 | 91 | *--------------------------------------------------------------------- 92 | * 93 | * Memory Region Header 94 | * 95 | *--------------------------------------------------------------------- 96 | 97 | STRUCTURE MH,LN_SIZE ; (LN_TYPE will be set to NT_MEMORY) 98 | UWORD MH_ATTRIBUTES ; characteristics of this region 99 | APTR MH_FIRST ; first free region 100 | APTR MH_LOWER ; lower memory bound 101 | APTR MH_UPPER ; upper memory bound+1 102 | ULONG MH_FREE ; number of free bytes 103 | LABEL MH_SIZE 104 | 105 | 106 | *--------------------------------------------------------------------- 107 | * 108 | * Memory Chunk 109 | * 110 | *--------------------------------------------------------------------- 111 | 112 | STRUCTURE MC,0 113 | APTR MC_NEXT ; ptr to next chunk 114 | ULONG MC_BYTES ; chunk byte size 115 | APTR MC_SIZE 116 | 117 | ENDC ; EXEC_MEMORY_I 118 | -------------------------------------------------------------------------------- /include/exec/tasks.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_TASKS_I 2 | EXEC_TASKS_I SET 1 3 | ** 4 | ** $VER: tasks.i 39.1 (18.9.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Task Control Block, Signals, and Task flags. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_NODES_I 14 | INCLUDE "exec/nodes.i" 15 | ENDC ; EXEC_NODES_I 16 | 17 | IFND EXEC_LISTS_I 18 | INCLUDE "exec/lists.i" 19 | ENDC ; EXEC_LISTS_I 20 | 21 | IFND EXEC_PORTS_I 22 | INCLUDE "exec/ports.i" 23 | ENDC ; EXEC_PORTS_I 24 | 25 | 26 | *---------------------------------------------------------------- 27 | * 28 | * Task Control Structure 29 | * 30 | * Please use Exec functions to modify task structure fields, 31 | * where available. 32 | * 33 | *---------------------------------------------------------------- 34 | 35 | STRUCTURE TC_Struct,LN_SIZE ; was "TC" 36 | UBYTE TC_FLAGS 37 | UBYTE TC_STATE 38 | BYTE TC_IDNESTCNT ; intr disabled nesting 39 | BYTE TC_TDNESTCNT ; task disabled nesting 40 | ULONG TC_SIGALLOC ; sigs allocated 41 | ULONG TC_SIGWAIT ; sigs we are waiting for 42 | ULONG TC_SIGRECVD ; sigs we have received 43 | ULONG TC_SIGEXCEPT ; sigs we take as exceptions 44 | ;* Pointer to an extended task structure. This structure is allocated 45 | ;* by V36 Exec if the proper flags in tc_ETaskFlags are set. This 46 | ;* field was formerly defined as: 47 | ;* UWORD TC_TRAPALLOC ; traps allocated 48 | ;* UWORD TC_TRAPABLE ; traps enabled 49 | ;* Please see the Exec AllocTrap() and FreeTrap() calls. 50 | ;* 51 | APTR tc_ETask ; pointer to extended task structure 52 | APTR TC_EXCEPTDATA ; data for except proc 53 | APTR TC_EXCEPTCODE ; exception procedure 54 | APTR TC_TRAPDATA ; data for proc trap proc 55 | APTR TC_TRAPCODE ; proc trap procedure 56 | APTR TC_SPREG ; stack pointer 57 | APTR TC_SPLOWER ; stack lower bound 58 | APTR TC_SPUPPER ; stack upper bound + 2 59 | FPTR TC_SWITCH ; task losing CPU (function pointer) 60 | FPTR TC_LAUNCH ; task getting CPU (function pointer) 61 | STRUCT TC_MEMENTRY,LH_SIZE ; Allocated memory list. Freed by RemTask() 62 | APTR TC_Userdata ; For use by the task; no restrictions! 63 | LABEL TC_SIZE 64 | 65 | 66 | ;Don't even _think_ about allocating one of these yourself. 67 | STRUCTURE ETask,MN_SIZE 68 | APTR et_Parent ;Pointer to task (TC) 69 | ULONG et_UniqueID ;ID unique to this task 70 | STRUCT et_Children,MLH_SIZE ;List of children 71 | UWORD et_TRAPALLOC 72 | UWORD et_TRAPABLE 73 | ULONG et_Result1 ;First result 74 | APTR et_Result2 ;Result data pointer (AllocVec) 75 | STRUCT et_TaskMsgPort,MP_SIZE 76 | LABEL ETask_SIZEOF ;_never_ depend on this size! 77 | 78 | 79 | CHILD_NOTNEW EQU 1 ;function not called from a new style task 80 | CHILD_NOTFOUND EQU 2 ;child not found 81 | CHILD_EXITED EQU 3 ;child has exited 82 | CHILD_ACTIVE EQU 4 ;child has exited 83 | 84 | 85 | ;Stack swap structure as passed to StackSwap() 86 | ; 87 | STRUCTURE StackSwapStruct,0 88 | APTR stk_Lower ;Lowest byte of stack 89 | ULONG stk_Upper ;Upper end of stack (size + Lowest) 90 | APTR stk_Pointer ;Stack pointer at switch point 91 | LABEL StackSwapStruct_SIZEOF 92 | 93 | 94 | ;------ TC_FLAGS Bits: 95 | 96 | BITDEF T,PROCTIME,0 97 | BITDEF T,ETASK,3 98 | BITDEF T,STACKCHK,4 99 | BITDEF T,EXCEPT,5 100 | BITDEF T,SWITCH,6 ;Enable TC_SWITCH point 101 | BITDEF T,LAUNCH,7 ;Enable TC_LAUNCH point 102 | 103 | 104 | ;------ Task States: 105 | 106 | TS_INVALID EQU 0 107 | TS_ADDED EQU TS_INVALID+1 108 | TS_RUN EQU TS_ADDED+1 109 | TS_READY EQU TS_RUN+1 110 | TS_WAIT EQU TS_READY+1 111 | TS_EXCEPT EQU TS_WAIT+1 112 | TS_REMOVED EQU TS_EXCEPT+1 113 | 114 | 115 | ;------ System Task Signals: 116 | 117 | BITDEF SIG,ABORT,0 118 | BITDEF SIG,CHILD,1 119 | BITDEF SIG,BLIT,4 ; Note: same as SINGLE 120 | BITDEF SIG,SINGLE,4 ; "single-threaded". Note: same as BLIT 121 | BITDEF SIG,INTUITION,5 122 | BITDEF SIG,NET,7 123 | BITDEF SIG,DOS,8 124 | 125 | 126 | SYS_SIGALLOC EQU $0FFFF ; pre-allocated signals 127 | SYS_TRAPALLOC EQU $08000 ; pre-allocated traps 128 | 129 | ENDC ; EXEC_TASKS_I 130 | -------------------------------------------------------------------------------- /include/exec/types.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_TYPES_I 2 | EXEC_TYPES_I SET 1 3 | ** 4 | ** $VER: types.i 39.1 (24.2.93) 5 | ** Includes Release 40.13 6 | ** 7 | ** Data storage macros. Must be included before any other Amiga include. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | 14 | INCLUDE_VERSION EQU 40 ;Version of the include files in use. (Do not 15 | ;use this label for OpenLibrary() calls!) 16 | 17 | 18 | EXTERN_LIB MACRO 19 | XREF _LVO\1 20 | ENDM 21 | 22 | ** 23 | ** Structure Building Macros 24 | ** 25 | STRUCTURE MACRO ; structure name, initial offset 26 | \1 EQU 0 27 | SOFFSET SET \2 28 | ENDM 29 | 30 | FPTR MACRO ; function pointer (32 bits - all bits valid) 31 | \1 EQU SOFFSET 32 | SOFFSET SET SOFFSET+4 33 | ENDM 34 | 35 | BOOL MACRO ; boolean (16 bits) 36 | \1 EQU SOFFSET 37 | SOFFSET SET SOFFSET+2 38 | ENDM 39 | 40 | BYTE MACRO ; byte (8 bits) 41 | \1 EQU SOFFSET 42 | SOFFSET SET SOFFSET+1 43 | ENDM 44 | 45 | UBYTE MACRO ; unsigned byte (8 bits) 46 | \1 EQU SOFFSET 47 | SOFFSET SET SOFFSET+1 48 | ENDM 49 | 50 | WORD MACRO ; word (16 bits) 51 | \1 EQU SOFFSET 52 | SOFFSET SET SOFFSET+2 53 | ENDM 54 | 55 | UWORD MACRO ; unsigned word (16 bits) 56 | \1 EQU SOFFSET 57 | SOFFSET SET SOFFSET+2 58 | ENDM 59 | 60 | SHORT MACRO ; obsolete - use WORD 61 | \1 EQU SOFFSET 62 | SOFFSET SET SOFFSET+2 63 | ENDM 64 | 65 | USHORT MACRO ; obsolete - use UWORD 66 | \1 EQU SOFFSET 67 | SOFFSET SET SOFFSET+2 68 | ENDM 69 | 70 | LONG MACRO ; long (32 bits) 71 | \1 EQU SOFFSET 72 | SOFFSET SET SOFFSET+4 73 | ENDM 74 | 75 | ULONG MACRO ; unsigned long (32 bits) 76 | \1 EQU SOFFSET 77 | SOFFSET SET SOFFSET+4 78 | ENDM 79 | 80 | FLOAT MACRO ; C float (32 bits) 81 | \1 EQU SOFFSET 82 | SOFFSET SET SOFFSET+4 83 | ENDM 84 | 85 | DOUBLE MACRO ; C double (64 bits) 86 | \1 EQU SOFFSET 87 | SOFFSET SET SOFFSET+8 88 | ENDM 89 | 90 | APTR MACRO ; untyped pointer (32 bits - all bits valid) 91 | \1 EQU SOFFSET 92 | SOFFSET SET SOFFSET+4 93 | ENDM 94 | 95 | CPTR MACRO ; obsolete 96 | \1 EQU SOFFSET 97 | SOFFSET SET SOFFSET+4 98 | ENDM 99 | 100 | RPTR MACRO ; unsigned relative pointer (16 bits) 101 | \1 EQU SOFFSET 102 | SOFFSET SET SOFFSET+2 103 | ENDM 104 | 105 | LABEL MACRO ; Define a label without bumping the offset 106 | \1 EQU SOFFSET 107 | ENDM 108 | 109 | STRUCT MACRO ; Define a sub-structure 110 | \1 EQU SOFFSET 111 | SOFFSET SET SOFFSET+\2 112 | ENDM 113 | 114 | ALIGNWORD MACRO ; Align structure offset to nearest word 115 | SOFFSET SET (SOFFSET+1)&$fffffffe 116 | ENDM 117 | 118 | ALIGNLONG MACRO ; Align structure offset to nearest longword 119 | SOFFSET SET (SOFFSET+3)&$fffffffc 120 | ENDM 121 | 122 | ** 123 | ** Enumerated variables. Use ENUM to set a base number, and EITEM to assign 124 | ** incrementing values. ENUM can be used to set a new base at any time. 125 | ** 126 | ENUM MACRO ;[new base] 127 | IFC '\1','' 128 | EOFFSET SET 0 ; Default to zero 129 | ENDC 130 | IFNC '\1','' 131 | EOFFSET SET \1 132 | ENDC 133 | ENDM 134 | 135 | EITEM MACRO ;label 136 | \1 EQU EOFFSET 137 | EOFFSET SET EOFFSET+1 138 | ENDM 139 | 140 | ** 141 | ** Bit Definition Macro 142 | ** 143 | ** Given: 144 | ** BITDEF MEM,CLEAR,16 145 | ** 146 | ** Yields: 147 | ** MEMB_CLEAR EQU 16 ; Bit number 148 | ** MEMF_CLEAR EQU 1<<16 ; Bit mask 149 | ** 150 | 151 | BITDEF MACRO ; prefix,&name,&bitnum 152 | BITDEF0 \1,\2,B_,\3 153 | \@BITDEF SET 1<<\3 154 | BITDEF0 \1,\2,F_,\@BITDEF 155 | ENDM 156 | 157 | BITDEF0 MACRO ; prefix,&name,&type,&value 158 | \1\3\2 EQU \4 159 | ENDM 160 | 161 | ** 162 | ** LIBRARY_VERSION is now obsolete. Please use LIBRARY_MINIMUM or code 163 | ** the specific minimum library version you require. 164 | ** LIBRARY_VERSION EQU 36 165 | ** 166 | LIBRARY_MINIMUM EQU 33 ;Lowest version supported by Commodore-Amiga 167 | 168 | ENDC ; EXEC_TYPES_I 169 | -------------------------------------------------------------------------------- /include/exec/libraries.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_LIBRARIES_I 2 | EXEC_LIBRARIES_I SET 1 3 | ** 4 | ** $VER: libraries.i 39.2 (10.4.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Definitions for use when creating or using Exec libraries 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_NODES_I 14 | INCLUDE "exec/nodes.i" 15 | ENDC ; EXEC_NODES_I 16 | 17 | 18 | *------ Special Constants --------------------------------------- 19 | LIB_VECTSIZE EQU 6 ;Each library entry takes 6 bytes 20 | LIB_RESERVED EQU 4 ;Exec reserves the first 4 vectors 21 | LIB_BASE EQU -LIB_VECTSIZE 22 | LIB_USERDEF EQU LIB_BASE-(LIB_RESERVED*LIB_VECTSIZE) ;First user func 23 | LIB_NONSTD EQU LIB_USERDEF 24 | 25 | 26 | *---------------------------------------------------------------- 27 | * 28 | * Library Definition Macros (for creating libraries) 29 | * 30 | *---------------------------------------------------------------- 31 | 32 | *------ LIBINIT initializes the base offset for using the "LIBDEF" macro: 33 | LIBINIT MACRO ; [baseOffset] 34 | IFC '\1','' 35 | COUNT_LIB SET LIB_USERDEF 36 | ENDC 37 | IFNC '\1','' 38 | COUNT_LIB SET \1 39 | ENDC 40 | ENDM 41 | 42 | *------ LIBDEF is used to define each library function entry: 43 | LIBDEF MACRO ;libraryFunctionSymbol 44 | \1 EQU COUNT_LIB 45 | COUNT_LIB SET COUNT_LIB-LIB_VECTSIZE 46 | ENDM 47 | 48 | *------ FUNCDEF is used to parse library offset tables. Many applications 49 | *------ need a special version of FUNCDEF - you provide your own macro 50 | *------ to match your needs. Here is an example: 51 | * 52 | * FUNCDEF MACRO 53 | * _LVO\1 EQU FUNC_CNT 54 | * FUNC_CNT SET FUNC_CNT-6 * Standard offset-6 bytes each 55 | * FUNC_CNT EQU LIB_USERDEF * Skip 4 standard vectors 56 | * ENDM 57 | 58 | *---------------------------------------------------------------- 59 | * 60 | * Standard Library Functions 61 | * 62 | *---------------------------------------------------------------- 63 | 64 | LIBINIT LIB_BASE 65 | 66 | LIBDEF LIB_OPEN 67 | LIBDEF LIB_CLOSE 68 | LIBDEF LIB_EXPUNGE ; must exist in all libraries 69 | LIBDEF LIB_EXTFUNC ; for future expansion - must return zero. 70 | 71 | 72 | *---------------------------------------------------------------- 73 | * 74 | * Library Base Structure Definition 75 | * Also used for Devices and some Resources 76 | * 77 | *---------------------------------------------------------------- 78 | 79 | STRUCTURE LIB,LN_SIZE 80 | UBYTE LIB_FLAGS ; see below 81 | UBYTE LIB_pad ; must be zero 82 | UWORD LIB_NEGSIZE ; number of bytes before LIB 83 | UWORD LIB_POSSIZE ; number of bytes after LIB 84 | UWORD LIB_VERSION ; major 85 | UWORD LIB_REVISION ; minor 86 | APTR LIB_IDSTRING ; ASCII identification 87 | ULONG LIB_SUM ; the system-calculated checksum 88 | UWORD LIB_OPENCNT ; number of current opens 89 | LABEL LIB_SIZE ;Warning: Size is not a longword multiple! 90 | 91 | *------ LIB_FLAGS bit definitions (all others are system reserved) 92 | BITDEF LIB,SUMMING,0 ; system is currently checksumming 93 | BITDEF LIB,CHANGED,1 ; something has changed the library since last sum 94 | BITDEF LIB,SUMUSED,2 ; indicates if the library allows checksumming 95 | BITDEF LIB,DELEXP,3 ; delayed expunge flag (for use by library) 96 | BITDEF LIB,EXP0CNT,4 ; special system expunge flag. 97 | 98 | 99 | *--------------------------------------------------------------------------- 100 | * 101 | * Function Invocation Macros (for calling existing, opened, libraries) 102 | * Also see exec/macros.i 103 | * 104 | *--------------------------------------------------------------------------- 105 | 106 | *------ CALLLIB for calling functions where A6 is already correct: 107 | 108 | CALLLIB MACRO ; functionOffset 109 | IFGT NARG-1 110 | FAIL !!! CALLLIB MACRO - too many arguments !!! 111 | ENDC 112 | JSR \1(A6) 113 | ENDM 114 | 115 | 116 | *------ LINKLIB for calling functions where A6 is incorrect: 117 | 118 | LINKLIB MACRO ; functionOffset,libraryBase 119 | IFGT NARG-2 120 | FAIL !!! LINKLIB MACRO - too many arguments !!! 121 | ENDC 122 | MOVE.L A6,-(SP) 123 | MOVE.L \2,A6 124 | JSR \1(A6) 125 | MOVE.L (SP)+,A6 126 | ENDM 127 | 128 | ENDC ; EXEC_LIBRARIES_I 129 | -------------------------------------------------------------------------------- /include/exec/lists.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_LISTS_I 2 | EXEC_LISTS_I SET 1 3 | ** 4 | ** $VER: lists.i 39.1 (28.5.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Definitions and macros for use with Exec lists. Most of the 8 | ** macros require ownership or locking of the list before use. 9 | ** 10 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 11 | ** All Rights Reserved 12 | ** 13 | 14 | IFND EXEC_NODES_I 15 | INCLUDE "exec/nodes.i" 16 | ENDC ; EXEC_NODES_I 17 | 18 | 19 | *--------------------------------------------------------------------- 20 | 21 | * 22 | * Full featured list header 23 | * 24 | STRUCTURE LH,0 25 | APTR LH_HEAD 26 | APTR LH_TAIL 27 | APTR LH_TAILPRED 28 | UBYTE LH_TYPE 29 | UBYTE LH_pad 30 | LABEL LH_SIZE ;word aligned 31 | 32 | * 33 | * Minimal List Header - no type checking (best for most applications) 34 | * 35 | STRUCTURE MLH,0 36 | APTR MLH_HEAD 37 | APTR MLH_TAIL 38 | APTR MLH_TAILPRED 39 | LABEL MLH_SIZE ;longword aligned 40 | 41 | *--------------------------------------------------------------------- 42 | 43 | ;Prepare a list header for use 44 | NEWLIST MACRO ; list 45 | MOVE.L \1,LH_TAILPRED(\1) 46 | ADDQ.L #4,\1 ;Get address of LH_TAIL 47 | CLR.L (\1) ;Clear LH_TAIL 48 | MOVE.L \1,-(\1) ;Address of LH_TAIL to LH_HEAD 49 | ENDM 50 | 51 | ;Test if list is empty (list address in register) 52 | ;This operation is safe at any time - no list arbitration needed. 53 | TSTLIST MACRO ; [list] 54 | IFGT NARG-1 55 | FAIL !!! TSTLIST - Too many arguments !!! 56 | ENDC 57 | IFC '\1','' 58 | CMP.L LH_TAIL+LN_PRED(A0),A0 59 | ENDC 60 | IFNC '\1','' 61 | CMP.L LH_TAIL+LN_PRED(\1),\1 62 | ENDC 63 | ENDM 64 | 65 | ;Test if list is empty (from effective address of list) 66 | ;list arbitration required. 67 | TSTLST2 MACRO ;EA of list,=node 68 | MOVE.L \1,\2 69 | TST.L (\2) 70 | ENDM 71 | 72 | ;Get next in list 73 | SUCC MACRO ; node,=succ 74 | MOVE.L (\1),\2 75 | ENDM 76 | 77 | ;Get previous in list 78 | PRED MACRO ; node,=pred 79 | MOVE.L LN_PRED(\1),\2 80 | ENDM 81 | 82 | ;If empty, branch 83 | IFEMPTY MACRO ; list,label 84 | CMP.L LH_TAIL+LN_PRED(\1),\1 85 | BEQ \2 86 | ENDM 87 | 88 | ;If not empty, branch 89 | IFNOTEMPTY MACRO ; list,label 90 | CMP.L LH_TAIL+LN_PRED(\1),\1 91 | BNE \2 92 | ENDM 93 | 94 | ;Get next node, test if at end 95 | TSTNODE MACRO ; node,=next 96 | MOVE.L (\1),\2 97 | TST.L (\2) 98 | ENDM 99 | 100 | ;Get next, go to exit label if at end 101 | NEXTNODE MACRO ; next=next,=current,exit_label ([.s],DX,AX,DISP16) 102 | MOVE.L \1,\2 103 | MOVE.L (\2),\1 104 | IFC '\0','' ;Check extension 105 | BEQ \3 106 | ENDC 107 | IFNC '\0','' 108 | BEQ.S \3 109 | ENDC 110 | ENDM 111 | 112 | ;Add to head of list 113 | ADDHEAD MACRO ; A0-list(destroyed) A1-node D0-(destroyed) 114 | MOVE.L (A0),D0 115 | MOVE.L A1,(A0) 116 | MOVEM.L D0/A0,(A1) 117 | MOVE.L D0,A0 118 | MOVE.L A1,LN_PRED(A0) 119 | ENDM 120 | 121 | ;Add to tail of list 122 | ADDTAIL MACRO ; A0-list(destroyed) A1-node D0-(destroyed) 123 | ADDQ.L #LH_TAIL,A0 124 | MOVE.L LN_PRED(A0),D0 125 | MOVE.L A1,LN_PRED(A0) 126 | EXG D0,A0 127 | MOVEM.L D0/A0,(A1) 128 | MOVE.L A1,(A0) 129 | ENDM 130 | 131 | ;Remove node from whatever list it is in 132 | REMOVE MACRO ; A0-(destroyed) A1-node(destroyed) 133 | MOVE.L (A1)+,A0 134 | MOVE.L (A1),A1 ; LN_PRED 135 | MOVE.L A0,(A1) 136 | MOVE.L A1,LN_PRED(A0) 137 | ENDM 138 | 139 | ;Remove node from head of list 140 | REMHEAD MACRO ; A0-list A1-(destroyed) D0=node 141 | MOVE.L (A0),A1 142 | MOVE.L (A1),D0 143 | BEQ.S REMHEAD\@ 144 | MOVE.L D0,(A0) 145 | EXG.L D0,A1 146 | MOVE.L A0,LN_PRED(A1) 147 | REMHEAD\@ 148 | ENDM 149 | 150 | ;Remove head quickly 151 | ; Useful when a scratch register is available, and 152 | ; list is known to contain at least one node. 153 | REMHEADQ MACRO ; list,=node,scratchReg-(destroyed) 154 | MOVE.L (\1),\2 155 | MOVE.L (\2),\3 156 | MOVE.L \3,(\1) 157 | MOVE.L \1,LN_PRED(\3) 158 | ENDM 159 | 160 | ;Remove node from tail of list 161 | REMTAIL MACRO ; A0-list A1-(destroyed) D0=node 162 | MOVE.L LH_TAIL+LN_PRED(A0),A1 163 | MOVE.L LN_PRED(A1),D0 164 | BEQ.S REMTAIL\@ 165 | MOVE.L D0,LH_TAIL+LN_PRED(A0) 166 | EXG.L D0,A1 167 | MOVE.L A0,(A1) 168 | ADDQ.L #4,(A1) 169 | REMTAIL\@ 170 | ENDM 171 | 172 | ENDC ; EXEC_LISTS_I 173 | -------------------------------------------------------------------------------- /include/hardware/cia.i: -------------------------------------------------------------------------------- 1 | IFND HARDWARE_CIA_I 2 | HARDWARE_CIA_I SET 1 3 | ** 4 | ** $VER: cia.i 39.1 (18.9.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** registers and bits in the Complex Interface Adapter (CIA) chip 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | * 14 | * _ciaa is on an ODD address (e.g. the low byte) -- $bfe001 15 | * _ciab is on an EVEN address (e.g. the high byte) -- $bfd000 16 | * 17 | * do this to get the definitions: 18 | * XREF _ciaa 19 | * XREF _ciab 20 | * 21 | 22 | 23 | * cia register offsets 24 | ciapra EQU $0000 25 | ciaprb EQU $0100 26 | ciaddra EQU $0200 27 | ciaddrb EQU $0300 28 | ciatalo EQU $0400 29 | ciatahi EQU $0500 30 | ciatblo EQU $0600 31 | ciatbhi EQU $0700 32 | ciatodlow EQU $0800 33 | ciatodmid EQU $0900 34 | ciatodhi EQU $0A00 35 | ciasdr EQU $0C00 36 | ciaicr EQU $0D00 37 | ciacra EQU $0E00 38 | ciacrb EQU $0F00 39 | 40 | * interrupt control register bit numbers 41 | CIAICRB_TA EQU 0 42 | CIAICRB_TB EQU 1 43 | CIAICRB_ALRM EQU 2 44 | CIAICRB_SP EQU 3 45 | CIAICRB_FLG EQU 4 46 | CIAICRB_IR EQU 7 47 | CIAICRB_SETCLR EQU 7 48 | 49 | * control register A bit numbers 50 | CIACRAB_START EQU 0 51 | CIACRAB_PBON EQU 1 52 | CIACRAB_OUTMODE EQU 2 53 | CIACRAB_RUNMODE EQU 3 54 | CIACRAB_LOAD EQU 4 55 | CIACRAB_INMODE EQU 5 56 | CIACRAB_SPMODE EQU 6 57 | CIACRAB_TODIN EQU 7 58 | 59 | * control register B bit numbers 60 | CIACRBB_START EQU 0 61 | CIACRBB_PBON EQU 1 62 | CIACRBB_OUTMODE EQU 2 63 | CIACRBB_RUNMODE EQU 3 64 | CIACRBB_LOAD EQU 4 65 | CIACRBB_INMODE0 EQU 5 66 | CIACRBB_INMODE1 EQU 6 67 | CIACRBB_ALARM EQU 7 68 | 69 | * interrupt control register bit masks 70 | CIAICRF_TA EQU (1<<0) 71 | CIAICRF_TB EQU (1<<1) 72 | CIAICRF_ALRM EQU (1<<2) 73 | CIAICRF_SP EQU (1<<3) 74 | CIAICRF_FLG EQU (1<<4) 75 | CIAICRF_IR EQU (1<<7) 76 | CIAICRF_SETCLR EQU (1<<7) 77 | 78 | * control register A bit masks 79 | CIACRAF_START EQU (1<<0) 80 | CIACRAF_PBON EQU (1<<1) 81 | CIACRAF_OUTMODE EQU (1<<2) 82 | CIACRAF_RUNMODE EQU (1<<3) 83 | CIACRAF_LOAD EQU (1<<4) 84 | CIACRAF_INMODE EQU (1<<5) 85 | CIACRAF_SPMODE EQU (1<<6) 86 | CIACRAF_TODIN EQU (1<<7) 87 | 88 | * control register B bit masks 89 | CIACRBF_START EQU (1<<0) 90 | CIACRBF_PBON EQU (1<<1) 91 | CIACRBF_OUTMODE EQU (1<<2) 92 | CIACRBF_RUNMODE EQU (1<<3) 93 | CIACRBF_LOAD EQU (1<<4) 94 | CIACRBF_INMODE0 EQU (1<<5) 95 | CIACRBF_INMODE1 EQU (1<<6) 96 | CIACRBF_ALARM EQU (1<<7) 97 | 98 | * control register B INMODE masks 99 | CIACRBF_IN_PHI2 EQU 0 100 | CIACRBF_IN_CNT EQU (CIACRBF_INMODE0) 101 | CIACRBF_IN_TA EQU (CIACRBF_INMODE1) 102 | CIACRBF_IN_CNT_TA EQU (CIACRBF_INMODE0!CIACRBF_INMODE1) 103 | 104 | 105 | * 106 | * Port definitions -- what each bit in a cia peripheral register is tied to 107 | * 108 | 109 | * ciaa port A (0xbfe001) 110 | CIAB_GAMEPORT1 EQU (7) * gameport 1, pin 6 (fire button*) 111 | CIAB_GAMEPORT0 EQU (6) * gameport 0, pin 6 (fire button*) 112 | CIAB_DSKRDY EQU (5) * disk ready* 113 | CIAB_DSKTRACK0 EQU (4) * disk on track 00* 114 | CIAB_DSKPROT EQU (3) * disk write protect* 115 | CIAB_DSKCHANGE EQU (2) * disk change* 116 | CIAB_LED EQU (1) * led light control (0==>bright) 117 | CIAB_OVERLAY EQU (0) * memory overlay bit 118 | 119 | * ciaa port B (0xbfe101) -- parallel port 120 | 121 | * ciab port A (0xbfd000) -- serial and printer control 122 | CIAB_COMDTR EQU (7) * serial Data Terminal Ready* 123 | CIAB_COMRTS EQU (6) * serial Request to Send* 124 | CIAB_COMCD EQU (5) * serial Carrier Detect* 125 | CIAB_COMCTS EQU (4) * serial Clear to Send* 126 | CIAB_COMDSR EQU (3) * serial Data Set Ready* 127 | CIAB_PRTRSEL EQU (2) * printer SELECT 128 | CIAB_PRTRPOUT EQU (1) * printer paper out 129 | CIAB_PRTRBUSY EQU (0) * printer busy 130 | 131 | * ciab port B (0xbfd100) -- disk control 132 | CIAB_DSKMOTOR EQU (7) * disk motorr* 133 | CIAB_DSKSEL3 EQU (6) * disk select unit 3* 134 | CIAB_DSKSEL2 EQU (5) * disk select unit 2* 135 | CIAB_DSKSEL1 EQU (4) * disk select unit 1* 136 | CIAB_DSKSEL0 EQU (3) * disk select unit 0* 137 | CIAB_DSKSIDE EQU (2) * disk side select* 138 | CIAB_DSKDIREC EQU (1) * disk direction of seek* 139 | CIAB_DSKSTEP EQU (0) * disk step heads* 140 | 141 | * ciaa port A (0xbfe001) 142 | CIAF_GAMEPORT1 EQU (1<<7) 143 | CIAF_GAMEPORT0 EQU (1<<6) 144 | CIAF_DSKRDY EQU (1<<5) 145 | CIAF_DSKTRACK0 EQU (1<<4) 146 | CIAF_DSKPROT EQU (1<<3) 147 | CIAF_DSKCHANGE EQU (1<<2) 148 | CIAF_LED EQU (1<<1) 149 | CIAF_OVERLAY EQU (1<<0) 150 | 151 | * ciaa port B (0xbfe101) -- parallel port 152 | 153 | * ciab port A (0xbfd000) -- serial and printer control 154 | CIAF_COMDTR EQU (1<<7) 155 | CIAF_COMRTS EQU (1<<6) 156 | CIAF_COMCD EQU (1<<5) 157 | CIAF_COMCTS EQU (1<<4) 158 | CIAF_COMDSR EQU (1<<3) 159 | CIAF_PRTRSEL EQU (1<<2) 160 | CIAF_PRTRPOUT EQU (1<<1) 161 | CIAF_PRTRBUSY EQU (1<<0) 162 | 163 | * ciab port B (0xbfd100) -- disk control 164 | CIAF_DSKMOTOR EQU (1<<7) 165 | CIAF_DSKSEL3 EQU (1<<6) 166 | CIAF_DSKSEL2 EQU (1<<5) 167 | CIAF_DSKSEL1 EQU (1<<4) 168 | CIAF_DSKSEL0 EQU (1<<3) 169 | CIAF_DSKSIDE EQU (1<<2) 170 | CIAF_DSKDIREC EQU (1<<1) 171 | CIAF_DSKSTEP EQU (1<<0) 172 | 173 | ENDC ; HARDWARE_CIA_I 174 | -------------------------------------------------------------------------------- /include/exec/execbase.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_EXECBASE_I 2 | EXEC_EXECBASE_I SET 1 3 | ** 4 | ** $VER: execbase.i 39.4 (18.1.93) 5 | ** Includes Release 40.13 6 | ** 7 | ** Definition of the exec.library base structure. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | IFND EXEC_TYPES_I 14 | INCLUDE "exec/types.i" 15 | ENDC ; EXEC_TYPES_I 16 | 17 | IFND EXEC_LISTS_I 18 | INCLUDE "exec/lists.i" 19 | ENDC ; EXEC_LISTS_I 20 | 21 | IFND EXEC_INTERRUPTS_I 22 | INCLUDE "exec/interrupts.i" 23 | ENDC ; EXEC_INTERRUPTS_I 24 | 25 | IFND EXEC_LIBRARIES_I 26 | INCLUDE "exec/libraries.i" 27 | ENDC ; EXEC_LIBRARIES_I 28 | 29 | 30 | 31 | ** Definition of the Exec library base structure (pointed to by location 4). 32 | ** Most fields are not to be viewed or modified by user programs. Use 33 | ** extreme caution. 34 | ** 35 | STRUCTURE ExecBase,LIB_SIZE ; Standard library node 36 | 37 | ******* Static System Variables ********************************************* 38 | 39 | UWORD SoftVer ; kickstart release number (obs.) 40 | WORD LowMemChkSum ; checksum of 68000 trap vectors 41 | ULONG ChkBase ; system base pointer complement 42 | APTR ColdCapture ; coldstart soft capture vector 43 | APTR CoolCapture ; coolstart soft capture vector 44 | APTR WarmCapture ; warmstart soft capture vector 45 | APTR SysStkUpper ; system stack base (upper bound) 46 | APTR SysStkLower ; top of system stack (lower bound) 47 | ULONG MaxLocMem ; top of chip memory 48 | APTR DebugEntry ; global debugger entry point 49 | APTR DebugData ; global debugger data segment 50 | APTR AlertData ; alert data segment 51 | APTR MaxExtMem ; top of extended mem, or null if none 52 | 53 | WORD ChkSum ; for all of the above (minus 2) 54 | 55 | 56 | ******* Interrupt Related ******************************************** 57 | 58 | LABEL IntVects 59 | STRUCT IVTBE,IV_SIZE 60 | STRUCT IVDSKBLK,IV_SIZE 61 | STRUCT IVSOFTINT,IV_SIZE 62 | STRUCT IVPORTS,IV_SIZE 63 | STRUCT IVCOPER,IV_SIZE 64 | STRUCT IVVERTB,IV_SIZE 65 | STRUCT IVBLIT,IV_SIZE 66 | STRUCT IVAUD0,IV_SIZE 67 | STRUCT IVAUD1,IV_SIZE 68 | STRUCT IVAUD2,IV_SIZE 69 | STRUCT IVAUD3,IV_SIZE 70 | STRUCT IVRBF,IV_SIZE 71 | STRUCT IVDSKSYNC,IV_SIZE 72 | STRUCT IVEXTER,IV_SIZE 73 | STRUCT IVINTEN,IV_SIZE 74 | STRUCT IVNMI,IV_SIZE 75 | 76 | 77 | ******* Dynamic System Variables ************************************* 78 | 79 | APTR ThisTask ; pointer to current task (readable) 80 | 81 | ULONG IdleCount ; idle counter 82 | ULONG DispCount ; dispatch counter 83 | UWORD Quantum ; time slice quantum 84 | UWORD Elapsed ; current quantum ticks 85 | UWORD SysFlags ; misc internal system flags 86 | BYTE IDNestCnt ; interrupt disable nesting count 87 | BYTE TDNestCnt ; task disable nesting count 88 | 89 | UWORD AttnFlags ; special attention flags (readable) 90 | 91 | UWORD AttnResched ; rescheduling attention 92 | APTR ResModules ; pointer to resident module array 93 | APTR TaskTrapCode ; default task trap routine 94 | APTR TaskExceptCode ; default task exception code 95 | APTR TaskExitCode ; default task exit code 96 | ULONG TaskSigAlloc ; preallocated signal mask 97 | UWORD TaskTrapAlloc ; preallocated trap mask 98 | 99 | 100 | ******* System List Headers (private!) ******************************** 101 | 102 | STRUCT MemList,LH_SIZE 103 | STRUCT ResourceList,LH_SIZE 104 | STRUCT DeviceList,LH_SIZE 105 | STRUCT IntrList,LH_SIZE 106 | STRUCT LibList,LH_SIZE 107 | STRUCT PortList,LH_SIZE 108 | STRUCT TaskReady,LH_SIZE 109 | STRUCT TaskWait,LH_SIZE 110 | 111 | STRUCT SoftInts,SH_SIZE*5 112 | 113 | 114 | ******* Other Globals ****************************************************** 115 | 116 | STRUCT LastAlert,4*4 117 | 118 | ;------ these next two variables are provided to allow 119 | ;------ system developers to have a rough idea of the 120 | ;------ period of two externally controlled signals -- 121 | ;------ the time between vertical blank interrupts and the 122 | ;------ external line rate (which is counted by CIA A's 123 | ;------ "time of day" clock). In general these values 124 | ;------ will be 50 or 60, and may or may not track each 125 | ;------ other. These values replace the obsolete AFB_PAL 126 | ;------ and AFB_50HZ flags. 127 | UBYTE VBlankFrequency ;(readable) 128 | UBYTE PowerSupplyFrequency ;(readable) 129 | 130 | STRUCT SemaphoreList,LH_SIZE 131 | 132 | ;------ these next two are to be able to kickstart into user ram. 133 | ;------ KickMemPtr holds a singly linked list of MemLists which 134 | ;------ will be removed from the memory list via AllocAbs. If 135 | ;------ all the AllocAbs's succeeded, then the KickTagPtr will 136 | ;------ be added to the rom tag list. 137 | APTR KickMemPtr ; ptr to queue of mem lists 138 | APTR KickTagPtr ; ptr to rom tag queue 139 | APTR KickCheckSum ; checksum for mem and tags 140 | 141 | 142 | ******* V36 Exec additions start here *************************************** 143 | 144 | UWORD ex_Pad0 ; Private internal use 145 | ULONG ex_LaunchPoint ; Private to Launch/Switch 146 | APTR ex_RamLibPrivate 147 | ;* The next ULONG contains the system "E" clock frequency, 148 | ;* expressed in Hertz. The E clock is used as a timebase for 149 | ;* the Amiga's 8520 I/O chips. (E is connected to "02"). 150 | ;* Typical values are 715909 for NTSC, or 709379 for PAL. 151 | ;* 152 | ULONG ex_EClockFrequency ;(readable) 153 | ULONG ex_CacheControl ;Private to the CacheControl call 154 | ULONG ex_TaskID ;Next available task ID 155 | 156 | STRUCT ex_Reserved1,5*4 157 | 158 | APTR ex_MMULock ;Private 159 | 160 | STRUCT ex_Reserved2,3*4 161 | 162 | ******* V39 Exec additions start here *************************************** 163 | 164 | ;* The following list and data element are used for 165 | ;* V39 exec's low memory handler. 166 | STRUCT ex_MemHandlers,MLH_SIZE ;* List of handlers 167 | APTR ex_MemHandler ;* Handler pointer (PRIVATE!) 168 | 169 | LABEL SYSBASESIZE 170 | 171 | 172 | ******* Bit defines for AttnFlags (see above) ******************************* 173 | 174 | * Processors and Co-processors: 175 | BITDEF AF,68010,0 ; also set for 68020 176 | BITDEF AF,68020,1 ; also set for 68030 177 | BITDEF AF,68030,2 ; also set for 68040 178 | BITDEF AF,68040,3 179 | BITDEF AF,68881,4 ; also set for 68882 180 | BITDEF AF,68882,5 181 | BITDEF AF,FPU40,6 ; Set if 68040 FPU 182 | ; 183 | ; The AFB_FPU40 bit is set when a working 68040 FPU 184 | ; is in the system. If this bit is set and both the 185 | ; AFB_68881 and AFB_68882 bits are not set, then the 68040 186 | ; math emulation code has not been loaded and only 68040 187 | ; FPU instructions are available. This bit is valid *ONLY* 188 | ; if the AFB_68040 bit is set. 189 | ; 190 | ; BITDEF AF,RESERVED8,8 191 | ; BITDEF AF,RESERVED9,9 192 | BITDEF AF,PRIVATE,15 ; Just what it says 193 | 194 | 195 | ******* Selected bit definitions for Cache manipulation calls ************** 196 | 197 | BITDEF CACR,EnableI,0 ;Enable instruction cache 198 | BITDEF CACR,FreezeI,1 ;Freeze instruction cache 199 | BITDEF CACR,ClearI,3 ;Clear instruction cache 200 | BITDEF CACR,IBE,4 ;Instruction burst enable 201 | BITDEF CACR,EnableD,8 ;68030 Enable data cache 202 | BITDEF CACR,FreezeD,9 ;68030 Freeze data cache 203 | BITDEF CACR,ClearD,11 ;68030 Clear data cache 204 | BITDEF CACR,DBE,12 ;68030 Data burst enable 205 | BITDEF CACR,WriteAllocate,13 ;68030 Write-Allocate mode (must 206 | ;always be set) 207 | BITDEF CACR,EnableE,30 ;Master enable for external caches 208 | ;External caches should track the 209 | ;state of the internal caches 210 | ;such that they do not cache anything 211 | ;that the internal cache turned off 212 | ;for. 213 | BITDEF CACR,CopyBack,31 ;Master enable for copyback caches 214 | 215 | 216 | BITDEF DMA,Continue,1 ;Continuation flag for CachePreDMA 217 | BITDEF DMA,NoModify,2 ;Set if DMA does not update memory 218 | BITDEF DMA,ReadFromRAM,3 ;Set if DMA goes *FROM* RAM to device 219 | 220 | ENDC ; EXEC_EXECBASE_I 221 | -------------------------------------------------------------------------------- /include/exec/alerts.i: -------------------------------------------------------------------------------- 1 | IFND EXEC_ALERTS_I 2 | EXEC_ALERTS_I SET 1 3 | ** 4 | ** $VER: alerts.i 39.4 (13.11.92) 5 | ** Includes Release 40.13 6 | ** 7 | ** Alert numbers, as displayed by system crashes. 8 | ** 9 | ** (C) Copyright 1985-1993 Commodore-Amiga, Inc. 10 | ** All Rights Reserved 11 | ** 12 | 13 | ********************************************************************** 14 | * 15 | * Format of the alert error number: 16 | * 17 | * +---------------+----------------+--------------------------------+ 18 | * |D| SubSysId | General Error | SubSystem Specific Error | 19 | * +---------------+----------------+--------------------------------+ 20 | * 1 7 bits 8 bits 16 bits 21 | * 22 | * D: DeadEnd alert 23 | * SubSysId: indicates ROM subsystem number. 24 | * General Error: roughly indicates what the error was 25 | * Specific Error: indicates more detail 26 | *********************************************************************** 27 | 28 | * 29 | * Use this macro for causing an alert. It is very sensitive to memory 30 | * corruption.... like stepping on location 4! After the alert, it 31 | * will return. 32 | * 33 | * A0/A1 and D0/D1 are destroyed 34 | * 35 | * 36 | ALERT MACRO (alertNumber, [paramArray]) 37 | movem.l d7/a5/a6,-(sp) 38 | move.l #\1,d7 39 | IFNC '\2','' 40 | lea.l \2,a5 41 | ENDC 42 | move.l 4,a6 43 | jsr _LVOAlert(a6) 44 | movem.l (sp)+,d7/a5/a6 45 | ENDM 46 | * 47 | * Use this macro for dead end alerts that never return 48 | * 49 | DEADALERT MACRO (alertNumber, [paramArray]) 50 | move.l #\1,d7 51 | IFNC '\2','' 52 | lea.l \2,a5 53 | ENDC 54 | move.l 4,a6 55 | jsr _LVOAlert(a6) ; never returns 56 | ENDM 57 | 58 | ********************************************************************** 59 | * 60 | * Hardware/CPU specific alerts: They may show without the 8 at the 61 | * front of the number. These are CPU/68000 specific. See 680x0 62 | * programmer's manuals for more details. 63 | * 64 | ********************************************************************** 65 | ACPU_BusErr equ $80000002 ; Hardware bus fault/access error 66 | ACPU_AddressErr equ $80000003 ; Illegal address access (ie: odd) 67 | ACPU_InstErr equ $80000004 ; Illegal instruction 68 | ACPU_DivZero equ $80000005 ; Divide by zero 69 | ACPU_CHK equ $80000006 ; Check instruction error 70 | ACPU_TRAPV equ $80000007 ; TrapV instruction error 71 | ACPU_PrivErr equ $80000008 ; Privilege violation error 72 | ACPU_Trace equ $80000009 ; Trace error 73 | ACPU_LineA equ $8000000A ; Line 1010 Emulator error 74 | ACPU_LineF equ $8000000B ; Line 1111 Emulator error 75 | ACPU_Format equ $8000000E ; Stack frame format error 76 | ACPU_Spurious equ $80000018 ; Spurious interrupt error 77 | ACPU_AutoVec1 equ $80000019 ; AutoVector Level 1 interrupt error 78 | ACPU_AutoVec2 equ $8000001A ; AutoVector Level 2 interrupt error 79 | ACPU_AutoVec3 equ $8000001B ; AutoVector Level 3 interrupt error 80 | ACPU_AutoVec4 equ $8000001C ; AutoVector Level 4 interrupt error 81 | ACPU_AutoVec5 equ $8000001D ; AutoVector Level 5 interrupt error 82 | ACPU_AutoVec6 equ $8000001E ; AutoVector Level 6 interrupt error 83 | ACPU_AutoVec7 equ $8000001F ; AutoVector Level 7 interrupt error 84 | 85 | ********************************************************************** 86 | * 87 | * General Alerts 88 | * 89 | * For example: timer.device cannot open math.library: 90 | * 91 | * ALERT (AN_TimerDev!AG_OpenLib!AO_MathLib) ;0x05038015 92 | * 93 | ********************************************************************** 94 | 95 | ;------ alert types 96 | AT_DeadEnd equ $80000000 97 | AT_Recovery equ $00000000 98 | 99 | ;------ general purpose alert codes 100 | AG_NoMemory equ $00010000 101 | AG_MakeLib equ $00020000 102 | AG_OpenLib equ $00030000 103 | AG_OpenDev equ $00040000 104 | AG_OpenRes equ $00050000 105 | AG_IOError equ $00060000 106 | AG_NoSignal equ $00070000 107 | AG_BadParm equ $00080000 108 | AG_CloseLib equ $00090000 ;Usually too many closes 109 | AG_CloseDev equ $000A0000 ;or a mismatched close 110 | AG_ProcCreate equ $000B0000 ;Process creation failed 111 | 112 | ;------ alert objects: 113 | AO_ExecLib equ $00008001 114 | AO_GraphicsLib equ $00008002 115 | AO_LayersLib equ $00008003 116 | AO_Intuition equ $00008004 117 | AO_MathLib equ $00008005 118 | AO_DOSLib equ $00008007 119 | AO_RAMLib equ $00008008 120 | AO_IconLib equ $00008009 121 | AO_ExpansionLib equ $0000800A 122 | AO_DiskfontLib equ $0000800B 123 | AO_UtilityLib equ $0000800C 124 | AO_KeyMapLib equ $0000800D 125 | 126 | AO_AudioDev equ $00008010 127 | AO_ConsoleDev equ $00008011 128 | AO_GamePortDev equ $00008012 129 | AO_KeyboardDev equ $00008013 130 | AO_TrackDiskDev equ $00008014 131 | AO_TimerDev equ $00008015 132 | 133 | AO_CIARsrc equ $00008020 134 | AO_DiskRsrc equ $00008021 135 | AO_MiscRsrc equ $00008022 136 | 137 | AO_BootStrap equ $00008030 138 | AO_Workbench equ $00008031 139 | AO_DiskCopy equ $00008032 140 | AO_GadTools equ $00008033 141 | AO_Unknown equ $00008035 142 | 143 | ********************************************************************** 144 | * 145 | * Specific Alerts: 146 | * 147 | * For example: exec.library -- corrupted memory list 148 | * 149 | * ALERT AN_MemCorrupt ;8100 0005 150 | * 151 | ********************************************************************** 152 | 153 | ;------ exec.library 154 | AN_ExecLib equ $01000000 155 | AN_ExcptVect equ $01000001 ; 68000 exception vector checksum (obs.) 156 | AN_BaseChkSum equ $01000002 ; Execbase checksum bad (obs.) 157 | AN_LibChkSum equ $01000003 ; Library checksum failure 158 | 159 | AN_MemCorrupt equ $81000005 ; Corrupt memory list detected in FreeMem 160 | AN_IntrMem equ $81000006 ; No memory for interrupt servers 161 | AN_InitAPtr equ $01000007 ; InitStruct() of an APTR source (obs.) 162 | AN_SemCorrupt equ $01000008 ; A semaphore is in an illegal state 163 | ; at ReleaseSemaphore() 164 | AN_FreeTwice equ $01000009 ; Freeing memory that is already free 165 | AN_BogusExcpt equ $8100000A ; Illegal 68k exception taken (obs.) 166 | AN_IOUsedTwice equ $0100000B ; Attempt to reuse active IORequest 167 | AN_MemoryInsane equ $0100000C ; Sanity check on memory list failed 168 | ; during AvailMem(MEMF_LARGEST) 169 | AN_IOAfterClose equ $0100000D ; IO attempted on closed IORequest 170 | AN_StackProbe equ $0100000E ; Stack appears to extend out of range 171 | AN_BadFreeAddr equ $0100000F ; Memory header not located. [ Usually an 172 | ; invalid address passed to FreeMem() ] 173 | AN_BadSemaphore equ $01000010 ; An attempt was made to use the old 174 | ; message semaphores. 175 | AN_BadQuickInt equ $810000FF ; A quick interrupt has happened to an 176 | ; uninitialized vector. 177 | 178 | ;------ graphics.library 179 | AN_GraphicsLib equ $02000000 180 | AN_GfxNoMem equ $82010000 ; graphics out of memory 181 | AN_GfxNoMemMspc equ $82010001 ; MonitorSpec alloc, no memory 182 | AN_LongFrame equ $82010006 ; long frame, no memory 183 | AN_ShortFrame equ $82010007 ; short frame, no memory 184 | AN_TextTmpRas equ $02010009 ; text, no memory for TmpRas 185 | AN_BltBitMap equ $8201000A ; BltBitMap, no memory 186 | AN_RegionMemory equ $8201000B ; regions, memory not available 187 | AN_MakeVPort equ $82010030 ; MakeVPort, no memory 188 | AN_GfxNewError equ $0200000C 189 | AN_GfxFreeError equ $0200000D 190 | 191 | AN_GfxNoLCM equ $82011234 ; emergency memory not available 192 | 193 | AN_ObsoleteFont equ $02000401 ; unsupported font description used 194 | 195 | ;------ layers.library 196 | AN_LayersLib equ $03000000 197 | AN_LayersNoMem equ $83010000 ; layers out of memory 198 | 199 | ;------ intuition.library 200 | AN_Intuition equ $04000000 201 | AN_GadgetType equ $84000001 ; unknown gadget type 202 | AN_BadGadget equ $04000001 ; Recovery form of AN_GadgetType 203 | AN_CreatePort equ $84010002 ; create port, no memory 204 | AN_ItemAlloc equ $04010003 ; item plane alloc, no memory 205 | AN_SubAlloc equ $04010004 ; sub alloc, no memory 206 | AN_PlaneAlloc equ $84010005 ; plane alloc, no memory 207 | AN_ItemBoxTop equ $84000006 ; item box top < RelZero 208 | AN_OpenScreen equ $84010007 ; open screen, no memory 209 | AN_OpenScrnRast equ $84010008 ; open screen, raster alloc, no memory 210 | AN_SysScrnType equ $84000009 ; open sys screen, unknown type 211 | AN_AddSWGadget equ $8401000A ; add SW gadgets, no memory 212 | AN_OpenWindow equ $8401000B ; open window, no memory 213 | AN_BadState equ $8400000C ; Bad State Return entering Intuition 214 | AN_BadMessage equ $8400000D ; Bad Message received by IDCMP 215 | AN_WeirdEcho equ $8400000E ; Weird echo causing incomprehension 216 | AN_NoConsole equ $8400000F ; couldn't open the Console Device 217 | AN_NoISem equ $04000010 ; Intuition skipped obtaining a sem 218 | AN_ISemOrder equ $04000011 ; Intuition obtained a sem in bad order 219 | 220 | ;------ math.library 221 | AN_MathLib equ $05000000 222 | 223 | ;------ dos.library 224 | AN_DOSLib equ $07000000 225 | AN_StartMem equ $07010001 ; no memory at startup 226 | AN_EndTask equ $07000002 ; EndTask didn't 227 | AN_QPktFail equ $07000003 ; Qpkt failure 228 | AN_AsyncPkt equ $07000004 ; Unexpected packet received 229 | AN_FreeVec equ $07000005 ; Freevec failed 230 | AN_DiskBlkSeq equ $07000006 ; Disk block sequence error 231 | AN_BitMap equ $07000007 ; Bitmap corrupt 232 | AN_KeyFree equ $07000008 ; Key already free 233 | AN_BadChkSum equ $07000009 ; Invalid checksum 234 | AN_DiskError equ $0700000A ; Disk Error 235 | AN_KeyRange equ $0700000B ; Key out of range 236 | AN_BadOverlay equ $0700000C ; Bad overlay 237 | AN_BadInitFunc equ $0700000D ; Invalid init packet for cli/shell 238 | AN_FileReclosed equ $0700000E ; A filehandle was closed more than once 239 | 240 | ;------ ramlib.library 241 | AN_RAMLib equ $08000000 242 | AN_BadSegList equ $08000001 ; overlays are illegal for library segments 243 | 244 | ;------ icon.library 245 | AN_IconLib equ $09000000 246 | 247 | ;------ expansion.library 248 | AN_ExpansionLib equ $0A000000 249 | AN_BadExpansionFree equ $0A000001 ;Freeed free region 250 | 251 | ;------ diskfont.library 252 | AN_DiskfontLib equ $0B000000 253 | 254 | ;------ audio.device 255 | AN_AudioDev equ $10000000 256 | 257 | ;------ console.device 258 | AN_ConsoleDev equ $11000000 259 | AN_NoWindow equ $11000001 ; Console can't open initial window 260 | 261 | ;------ gameport.device 262 | AN_GamePortDev equ $12000000 263 | 264 | ;------ keyboard.device 265 | AN_KeyboardDev equ $13000000 266 | 267 | ;------ trackdisk.device 268 | AN_TrackDiskDev equ $14000000 269 | AN_TDCalibSeek equ $14000001 ; calibrate: seek error 270 | AN_TDDelay equ $14000002 ; delay: error on timer wait 271 | 272 | ;------ timer.device 273 | AN_TimerDev equ $15000000 274 | AN_TMBadReq equ $15000001 ; bad request 275 | AN_TMBadSupply equ $15000002 ; power supply -- no 50/60hz ticks 276 | 277 | ;------ cia.resource 278 | AN_CIARsrc equ $20000000 279 | 280 | ;------ disk.resource 281 | AN_DiskRsrc equ $21000000 282 | AN_DRHasDisk equ $21000001 ; get unit: already has disk 283 | AN_DRIntNoAct equ $21000002 ; interrupt: no active unit 284 | 285 | ;------ misc.resource 286 | AN_MiscRsrc equ $22000000 287 | 288 | ;------ bootstrap 289 | AN_BootStrap equ $30000000 290 | AN_BootError equ $30000001 ; boot code returned an error 291 | 292 | ;------ workbench 293 | AN_Workbench equ $31000000 294 | AN_NoFonts equ $B1000001 295 | AN_WBBadStartupMsg1 equ $31000001 296 | AN_WBBadStartupMsg2 equ $31000002 297 | AN_WBBadIOMsg equ $31000003 ; Hacker code? 298 | AN_WBReLayoutToolMenu equ $B1010009 ; GadTools broke? 299 | 300 | ;------ DiskCopy 301 | AN_DiskCopy equ $32000000 302 | 303 | ;------ toolkit for Intuition 304 | AN_GadTools equ $33000000 305 | 306 | ;------ System utility library 307 | AN_UtilityLib equ $34000000 308 | 309 | ;------ For use by any application that needs it 310 | AN_Unknown equ $35000000 311 | 312 | ENDC ;EXEC_ALERTS_I 313 | -------------------------------------------------------------------------------- /include/hw.i: -------------------------------------------------------------------------------- 1 | 2 | IFND HARDWARE_HW_I 3 | HARDWARE_HW_I SET 1 4 | ** 5 | ** Filename: hw.i 6 | ** $Release: 1.3 $ 7 | ******************************************************************************* 8 | 9 | IFND HARDWARE_CUSTOM_I 10 | INCLUDE "hardware/custom.i" 11 | ENDC 12 | 13 | ******************************************************************************* 14 | * 15 | * This instruction for the copper will cause it to wait forever since 16 | * the wait command described in it will never happen. 17 | * 18 | COPPER_HALT equ $FFFFFFFE 19 | * 20 | ******************************************************************************* 21 | * 22 | * This is the offset in the 680x0 address space to the custom chip registers 23 | * It is the same as _custom when linking with AMIGA.lib 24 | * 25 | CUSTOM equ $DFF000 26 | * 27 | * Various control registers 28 | * 29 | DMACONR equ dmaconr ; Just capitalization... 30 | VPOSR equ vposr ; " " 31 | VHPOSR equ vhposr ; " " 32 | JOY0DAT equ joy0dat ; " " 33 | JOY1DAT equ joy1dat ; " " 34 | CLXDAT equ clxdat ; " " 35 | ADKCONR equ adkconr ; " " 36 | POT0DAT equ pot0dat ; " " 37 | POT1DAT equ pot1dat ; " " 38 | POTINP equ potinp ; " " 39 | SERDATR equ serdatr ; " " 40 | INTENAR equ intenar ; " " 41 | INTREQR equ intreqr ; " " 42 | REFPTR equ refptr ; " " 43 | VPOSW equ vposw ; " " 44 | VHPOSW equ vhposw ; " " 45 | SERDAT equ serdat ; " " 46 | SERPER equ serper ; " " 47 | POTGO equ potgo ; " " 48 | JOYTEST equ joytest ; " " 49 | STREQU equ strequ ; " " 50 | STRVBL equ strvbl ; " " 51 | STRHOR equ strhor ; " " 52 | STRLONG equ strlong ; " " 53 | DIWSTRT equ diwstrt ; " " 54 | DIWSTOP equ diwstop ; " " 55 | DDFSTRT equ ddfstrt ; " " 56 | DDFSTOP equ ddfstop ; " " 57 | DMACON equ dmacon ; " " 58 | INTENA equ intena ; " " 59 | INTREQ equ intreq ; " " 60 | * 61 | * Disk control registers 62 | * 63 | DSKBYTR equ dskbytr ; Just capitalization... 64 | DSKPT equ dskpt ; " " 65 | DSKPTH equ dskpt 66 | DSKPTL equ dskpt+$02 67 | DSKLEN equ dsklen ; " " 68 | DSKDAT equ dskdat ; " " 69 | DSKSYNC equ dsksync ; " " 70 | * 71 | * Blitter registers 72 | * 73 | BLTCON0 equ bltcon0 ; Just capitalization... 74 | BLTCON1 equ bltcon1 ; " " 75 | BLTAFWM equ bltafwm ; " " 76 | BLTALWM equ bltalwm ; " " 77 | BLTCPT equ bltcpt ; " " 78 | BLTCPTH equ bltcpt 79 | BLTCPTL equ bltcpt+$02 80 | BLTBPT equ bltbpt ; " " 81 | BLTBPTH equ bltbpt 82 | BLTBPTL equ bltbpt+$02 83 | BLTAPT equ bltapt ; " " 84 | BLTAPTH equ bltapt 85 | BLTAPTL equ bltapt+$02 86 | BLTDPT equ bltdpt ; " " 87 | BLTDPTH equ bltdpt 88 | BLTDPTL equ bltdpt+$02 89 | BLTSIZE equ bltsize ; " " 90 | BLTCMOD equ bltcmod ; " " 91 | BLTBMOD equ bltbmod ; " " 92 | BLTAMOD equ bltamod ; " " 93 | BLTDMOD equ bltdmod ; " " 94 | BLTCDAT equ bltcdat ; " " 95 | BLTBDAT equ bltbdat ; " " 96 | BLTADAT equ bltadat ; " " 97 | BLTDDAT equ bltddat ; " " 98 | * 99 | * Copper control registers 100 | * 101 | COPCON equ copcon ; Just capitalization... 102 | COPINS equ copins ; " " 103 | COPJMP1 equ copjmp1 ; " " 104 | COPJMP2 equ copjmp2 ; " " 105 | COP1LC equ cop1lc ; " " 106 | COP1LCH equ cop1lc 107 | COP1LCL equ cop1lc+$02 108 | COP2LC equ cop2lc ; " " 109 | COP2LCH equ cop2lc 110 | COP2LCL equ cop2lc+$02 111 | * 112 | * 113 | * Audio channel registers 114 | * 115 | ADKCON equ adkcon ; Just capitalization... 116 | 117 | AUD0LC equ aud0 118 | AUD0LCH equ aud0 119 | AUD0LCL equ aud0+$02 120 | AUD0LEN equ aud0+$04 121 | AUD0PER equ aud0+$06 122 | AUD0VOL equ aud0+$08 123 | AUD0DAT equ aud0+$0A 124 | 125 | AUD1LC equ aud1 126 | AUD1LCH equ aud1 127 | AUD1LCL equ aud1+$02 128 | AUD1LEN equ aud1+$04 129 | AUD1PER equ aud1+$06 130 | AUD1VOL equ aud1+$08 131 | AUD1DAT equ aud1+$0A 132 | 133 | AUD2LC equ aud2 134 | AUD2LCH equ aud2 135 | AUD2LCL equ aud2+$02 136 | AUD2LEN equ aud2+$04 137 | AUD2PER equ aud2+$06 138 | AUD2VOL equ aud2+$08 139 | AUD2DAT equ aud2+$0A 140 | 141 | AUD3LC equ aud3 142 | AUD3LCH equ aud3 143 | AUD3LCL equ aud3+$02 144 | AUD3LEN equ aud3+$04 145 | AUD3PER equ aud3+$06 146 | AUD3VOL equ aud3+$08 147 | AUD3DAT equ aud3+$0A 148 | * 149 | * 150 | * The bitplane registers 151 | * 152 | BPL1PT equ bplpt+$00 153 | BPL1PTH equ bplpt+$00 154 | BPL1PTL equ bplpt+$02 155 | BPL2PT equ bplpt+$04 156 | BPL2PTH equ bplpt+$04 157 | BPL2PTL equ bplpt+$06 158 | BPL3PT equ bplpt+$08 159 | BPL3PTH equ bplpt+$08 160 | BPL3PTL equ bplpt+$0A 161 | BPL4PT equ bplpt+$0C 162 | BPL4PTH equ bplpt+$0C 163 | BPL4PTL equ bplpt+$0E 164 | BPL5PT equ bplpt+$10 165 | BPL5PTH equ bplpt+$10 166 | BPL5PTL equ bplpt+$12 167 | BPL6PT equ bplpt+$14 168 | BPL6PTH equ bplpt+$14 169 | BPL6PTL equ bplpt+$16 170 | 171 | BPLCON0 equ bplcon0 ; Just capitalization... 172 | BPLCON1 equ bplcon1 ; " " 173 | BPLCON2 equ bplcon2 ; " " 174 | BPL1MOD equ bpl1mod ; " " 175 | BPL2MOD equ bpl2mod ; " " 176 | 177 | DPL1DATA equ bpldat+$00 178 | DPL2DATA equ bpldat+$02 179 | DPL3DATA equ bpldat+$04 180 | DPL4DATA equ bpldat+$06 181 | DPL5DATA equ bpldat+$08 182 | DPL6DATA equ bpldat+$0A 183 | * 184 | * 185 | * Sprite control registers 186 | * 187 | SPR0PT equ sprpt+$00 188 | SPR0PTH equ SPR0PT+$00 189 | SPR0PTL equ SPR0PT+$02 190 | SPR1PT equ sprpt+$04 191 | SPR1PTH equ SPR1PT+$00 192 | SPR1PTL equ SPR1PT+$02 193 | SPR2PT equ sprpt+$08 194 | SPR2PTH equ SPR2PT+$00 195 | SPR2PTL equ SPR2PT+$02 196 | SPR3PT equ sprpt+$0C 197 | SPR3PTH equ SPR3PT+$00 198 | SPR3PTL equ SPR3PT+$02 199 | SPR4PT equ sprpt+$10 200 | SPR4PTH equ SPR4PT+$00 201 | SPR4PTL equ SPR4PT+$02 202 | SPR5PT equ sprpt+$14 203 | SPR5PTH equ SPR5PT+$00 204 | SPR5PTL equ SPR5PT+$02 205 | SPR6PT equ sprpt+$18 206 | SPR6PTH equ SPR6PT+$00 207 | SPR6PTL equ SPR6PT+$02 208 | SPR7PT equ sprpt+$1C 209 | SPR7PTH equ SPR7PT+$00 210 | SPR7PTL equ SPR7PT+$02 211 | ; 212 | ; Note: SPRxDATB is defined as being +$06 from SPRxPOS. 213 | ; sd_datab should be defined as $06, however, in the 1.3 assembler 214 | ; include file hardware/custom.i it is incorrectly defined as $08. 215 | ; 216 | SPR0POS equ spr+$00 217 | SPR0CTL equ SPR0POS+sd_ctl 218 | SPR0DATA equ SPR0POS+sd_dataa 219 | SPR0DATB equ SPR0POS+$06 ; should use sd_datab ... 220 | 221 | SPR1POS equ spr+$08 222 | SPR1CTL equ SPR1POS+sd_ctl 223 | SPR1DATA equ SPR1POS+sd_dataa 224 | SPR1DATB equ SPR1POS+$06 ; should use sd_datab ... 225 | 226 | SPR2POS equ spr+$10 227 | SPR2CTL equ SPR2POS+sd_ctl 228 | SPR2DATA equ SPR2POS+sd_dataa 229 | SPR2DATB equ SPR2POS+$06 ; should use sd_datab ... 230 | 231 | SPR3POS equ spr+$18 232 | SPR3CTL equ SPR3POS+sd_ctl 233 | SPR3DATA equ SPR3POS+sd_dataa 234 | SPR3DATB equ SPR3POS+$06 ; should use sd_datab ... 235 | 236 | SPR4POS equ spr+$20 237 | SPR4CTL equ SPR4POS+sd_ctl 238 | SPR4DATA equ SPR4POS+sd_dataa 239 | SPR4DATB equ SPR4POS+$06 ; should use sd_datab ... 240 | 241 | SPR5POS equ spr+$28 242 | SPR5CTL equ SPR5POS+sd_ctl 243 | SPR5DATA equ SPR5POS+sd_dataa 244 | SPR5DATB equ SPR5POS+$06 ; should use sd_datab ... 245 | 246 | SPR6POS equ spr+$30 247 | SPR6CTL equ SPR6POS+sd_ctl 248 | SPR6DATA equ SPR6POS+sd_dataa 249 | SPR6DATB equ SPR6POS+$06 ; should use sd_datab ... 250 | 251 | SPR7POS equ spr+$38 252 | SPR7CTL equ SPR7POS+sd_ctl 253 | SPR7DATA equ SPR7POS+sd_dataa 254 | SPR7DATB equ SPR7POS+$06 ; should use sd_datab ... 255 | * 256 | * Color registers... 257 | * 258 | COLOR00 equ color+$00 259 | COLOR01 equ color+$02 260 | COLOR02 equ color+$04 261 | COLOR03 equ color+$06 262 | COLOR04 equ color+$08 263 | COLOR05 equ color+$0A 264 | COLOR06 equ color+$0C 265 | COLOR07 equ color+$0E 266 | COLOR08 equ color+$10 267 | COLOR09 equ color+$12 268 | COLOR10 equ color+$14 269 | COLOR11 equ color+$16 270 | COLOR12 equ color+$18 271 | COLOR13 equ color+$1A 272 | COLOR14 equ color+$1C 273 | COLOR15 equ color+$1E 274 | COLOR16 equ color+$20 275 | COLOR17 equ color+$22 276 | COLOR18 equ color+$24 277 | COLOR19 equ color+$26 278 | COLOR20 equ color+$28 279 | COLOR21 equ color+$2A 280 | COLOR22 equ color+$2C 281 | COLOR23 equ color+$2E 282 | COLOR24 equ color+$30 283 | COLOR25 equ color+$32 284 | COLOR26 equ color+$34 285 | COLOR27 equ color+$36 286 | COLOR28 equ color+$38 287 | COLOR29 equ color+$3A 288 | COLOR30 equ color+$3C 289 | COLOR31 equ color+$3E 290 | 291 | ******************************************************************************* 292 | ** 293 | ** 294 | ENDC ; HARDWARE_HW_I -------------------------------------------------------------------------------- /protracker.asm: -------------------------------------------------------------------------------- 1 | ;************************************************** 2 | ;* ----- Protracker V2.3A Playroutine ----- * 3 | ;************************************************** 4 | 5 | ; modified by h0ffman 6 | ; 7 | ; The intention of this replay is to provide an accurate 8 | ; ProTracker replayer with just a few issues fixed. 9 | ; Having used P61, LSP and the PT Replay by PHX, I've 10 | ; managed to find cases which those replayers don't 11 | ; support or sound weird. So.. I did this... 12 | ; 13 | ; Note that this is CIA only, although you could probably 14 | ; adapt it with a 3 stage copper interrupt. 15 | ; 16 | ; 17 | ; What's been fixed... 18 | ; 19 | ; 1. DMA Wait 20 | ; Now uses a three stage CIA interrupt. 21 | ; Stage 1 - mt_music (standard replay code) 22 | ; Stage 2 - enable DMA for any new samples to be played 23 | ; Stage 3 - set sample loop pointers 24 | ; 25 | ; 2. Volume clicks 26 | ; The original replay writes the volume register multiple 27 | ; times a tick. This has been moved to stage 2 CIA, when 28 | ; the DMA is enabled. Seemed to really clean up chip-tunes 29 | ; I tried out. 30 | ; 31 | ; 3. Channel variables 32 | ; On each call to mt_init, the channel variables are cleared. 33 | ; This ensures effect commands and values used in the previous 34 | ; playing module do not persist. 35 | ; 36 | ; 4. Minor optimisation 37 | ; If no finetune values are used, the period value comes straight 38 | ; from the pattern data saving a look-up on every bloody note! 39 | ; 40 | ; How to use.. 41 | ; check main.asm 42 | ; 43 | 44 | 45 | 46 | SHOW_RAS = 1 ; set to 1 to show raster time used 47 | DEFAULT_BPM = 125 ; well, I found this useful. 48 | 49 | n_note EQU 0 ; W 50 | n_cmd EQU 2 ; W 51 | n_cmdlo EQU 3 ; B 52 | n_start EQU 4 ; L 53 | n_length EQU 8 ; W 54 | n_loopstart EQU 10 ; L 55 | n_replen EQU 14 ; W 56 | n_period EQU 16 ; W 57 | n_finetune EQU 18 ; B 58 | n_volume EQU 19 ; B 59 | n_dmabit EQU 20 ; W 60 | n_toneportdirec EQU 22 ; B 61 | n_toneportspeed EQU 23 ; B 62 | n_wantedperiod EQU 24 ; W 63 | n_vibratocmd EQU 26 ; B 64 | n_vibratopos EQU 27 ; B 65 | n_tremolocmd EQU 28 ; B 66 | n_tremolopos EQU 29 ; B 67 | n_wavecontrol EQU 30 ; B 68 | n_glissfunk EQU 31 ; B 69 | n_sampleoffset EQU 32 ; B 70 | n_pattpos EQU 33 ; B 71 | n_loopcount EQU 34 ; B 72 | n_funkoffset EQU 35 ; B 73 | n_wavestart EQU 36 ; L 74 | n_reallength EQU 40 ; W 75 | n_realvolume EQU 44 ; W 76 | 77 | include "protracker_macro.asm" 78 | 79 | ;***************************************************************** 80 | ; 81 | ; CIA Driver 82 | ; Stolen from Arnaud Carr� (aka Leonard / OXYGENE) 83 | ; modified by h0ffman for original PT Replayer 84 | ; 85 | ;***************************************************************** 86 | 87 | ; d1: PAL(0) or NTSC(1) 88 | ; a0 = vector base 89 | CIA_Install: 90 | PUSHALL 91 | lea $78(a0),a0 92 | move.l a0,CIA_Vector 93 | move.w #DEFAULT_BPM,d0 94 | move.w d0,CIA_CurrentBPM 95 | move.w d0,CIA_MusicBPM 96 | move.w #(1<<13),$dff09a ; disable CIA interrupt 97 | lea .LSP_MainIrq(pc),a0 98 | move.l CIA_Vector(pc),a5 99 | move.l a0,(a5) 100 | 101 | lea $bfd000,a0 102 | move.b #$7f,$d00(a0) 103 | move.b #$10,$e00(a0) 104 | move.b #$10,$f00(a0) 105 | lsl.w #2,d1 106 | move.l .palClocks(pc,d1.w),d1 ; PAL or NTSC clock 107 | lea CIA_Clock(pc),a5 108 | move.l d1,(a5) 109 | divu.w d0,d1 110 | move.b d1,$400(a0) 111 | lsr.w #8,d1 112 | move.b d1,$500(a0) 113 | move.b #$83,$d00(a0) 114 | move.b #$11,$e00(a0) 115 | 116 | move.b #496&255,$600(a0) ; set timer b to 496 ( to set DMACON ) 117 | move.b #496>>8,$700(a0) 118 | 119 | move.w #(1<<13),$dff09c ; clear any req CIA 120 | move.w #$a000,$dff09a ; CIA interrupt enabled 121 | POPALL 122 | rts 123 | 124 | .palClocks: dc.l 1773447,1789773 125 | 126 | ; CIA Stage 1 - run mt_music 127 | 128 | .LSP_MainIrq: 129 | btst.b #0,$bfdd00 130 | beq.s .skipa 131 | RASON $f00 132 | PUSHALL 133 | bsr mt_music 134 | move.w CIA_MusicBPM(pc),d0 ; check if BMP changed in the middle of the music 135 | cmp.w CIA_CurrentBPM(pc),d0 136 | beq.s .noChg 137 | lea CIA_CurrentBPM(pc),a2 138 | move.w d0,(a2) ; current BPM 139 | move.l CIA_Clock(pc),d1 140 | divu.w d0,d1 141 | move.b d1,$bfd400 142 | lsr.w #8,d1 143 | move.b d1,$bfd500 144 | .noChg: lea .LSP_DmaconIrq(pc),a0 145 | move.l CIA_Vector(pc),a1 146 | move.l a0,(a1) 147 | move.b #$19,$bfdf00 ; start timerB, one shot 148 | POPALL 149 | RASOFF 150 | .skipa: move.w #$2000,$dff09c 151 | nop 152 | rte 153 | 154 | ; CIA Stage 2 - enable dma and load volume 155 | ; you could easily shove a volume control in here. 156 | 157 | 158 | .LSP_DmaconIrq: 159 | btst.b #1,$bfdd00 160 | beq.s .skipb 161 | 162 | RASON $0f0 163 | PUSHALL 164 | bsr mt_music2 165 | move.l CIA_Vector(pc),a0 166 | pea .LSP_PointerIrq(pc) 167 | move.l (a7)+,(a0) 168 | move.b #$19,$bfdf00 ; start timerB, one shot 169 | ;POPM d0/a0 170 | POPALL 171 | RASOFF 172 | .skipb: move.w #$2000,$dff09c 173 | nop 174 | rte 175 | 176 | ; CIA Stage 3 - load sample loop pointers 177 | ; this is also patched to instruments without notes, a very common chip music trick 178 | 179 | 180 | .LSP_PointerIrq: 181 | btst.b #1,$bfdd00 182 | beq.s .skipc 183 | RASON $00f 184 | PUSHALL 185 | bsr mt_music3 186 | move.l CIA_Vector(pc),a0 187 | pea .LSP_MainIrq(pc) 188 | move.l (a7)+,(a0) 189 | POPALL 190 | RASOFF 191 | .skipc: move.w #$2000,$dff09c 192 | nop 193 | rte 194 | 195 | CIA_Stop: 196 | move.b #$7f,$bfdd00 197 | move.w #$2000,$dff09a 198 | move.w #$2000,$dff09c 199 | move.w #$000f,$dff096 200 | rts 201 | 202 | 203 | CIA_Vector: dc.l 0 204 | CIA_Clock: dc.l 0 205 | CIA_CurrentBPM: dc.w 0 206 | CIA_MusicBPM: dc.w 0 207 | 208 | 209 | 210 | mt_init 211 | SF mt_Enable 212 | 213 | move.w #DEFAULT_BPM,CIA_MusicBPM 214 | lea mt_chan1temp,a4 215 | move.w #mt_chanend-mt_chan1temp-1,d7 216 | .clear 217 | clr.b (a4)+ 218 | dbra d7,.clear 219 | 220 | moveq #4-1,d7 221 | lea mt_chan1temp,a4 222 | move.w #$1,d0 223 | .dmaset 224 | move.w d0,n_dmabit(a4) 225 | lsl.w #1,d0 226 | lea mt_chan2temp-mt_chan1temp(a4),a4 227 | dbra d7,.dmaset 228 | 229 | MOVE.L A0,mt_SongDataPtr 230 | MOVE.L A0,A1 231 | LEA 952(A1),A1 232 | MOVEQ #127,D0 233 | MOVEQ #0,D1 234 | mtloop MOVE.L D1,D2 235 | SUBQ.W #1,D0 236 | mtloop2 MOVE.B (A1)+,D1 237 | CMP.B D2,D1 238 | BGT.S mtloop 239 | DBRA D0,mtloop2 240 | ADDQ.B #1,D2 241 | 242 | LEA mt_SampleStarts(PC),A1 243 | ASL.L #8,D2 244 | ASL.L #2,D2 245 | ADD.L #1084,D2 246 | ADD.L A0,D2 247 | MOVE.L D2,A2 248 | MOVEQ #30,D0 249 | mtloop3 CLR.L (A2) 250 | MOVE.L A2,(A1)+ 251 | MOVEQ #0,D1 252 | MOVE.W 42(A0),D1 253 | ASL.L #1,D1 254 | ADD.L D1,A2 255 | ADD.L #30,A0 256 | DBRA D0,mtloop3 257 | 258 | OR.B #2,$BFE001 259 | MOVE.B #6,mt_speed 260 | CLR.B mt_counter 261 | CLR.B mt_SongPos 262 | CLR.W mt_PatternPos 263 | mt_end CLR.W $DFF0A8 264 | CLR.W $DFF0B8 265 | CLR.W $DFF0C8 266 | CLR.W $DFF0D8 267 | MOVE.W #$F,$DFF096 268 | RTS 269 | 270 | 271 | ; 2nd stage cia, no dma wait fuckers!! 272 | 273 | mt_music2 274 | TST.B mt_Enable 275 | BEQ .exit 276 | 277 | MOVE.W mt_DMACONtemp(PC),D0 ; enable dma 278 | OR.W #$8000,D0 279 | MOVE.W D0,$DFF096 280 | lea $dff000,a0 281 | 282 | move.w mt_chan1temp+n_realvolume(pc),AUD0VOL(a0) 283 | move.w mt_chan2temp+n_realvolume(pc),AUD1VOL(a0) 284 | move.w mt_chan3temp+n_realvolume(pc),AUD2VOL(a0) 285 | move.w mt_chan4temp+n_realvolume(pc),AUD3VOL(a0) 286 | .exit 287 | rts 288 | 289 | ; 3rd stage cia, load loop pointers once dma is active 290 | mt_music3 291 | TST.B mt_Enable 292 | BEQ .exit 293 | 294 | MOVE.W mt_DMACONtemp(PC),D0 295 | or.w mt_LoadPointer(pc),d0 296 | LEA $DFF000,A5 297 | 298 | lsr.b #1,d0 299 | bcc .chan1 300 | LEA mt_chan1temp(PC),A6 301 | MOVE.L n_loopstart(A6),$A0(A5) 302 | MOVE.W n_replen(A6),$A4(A5) 303 | .chan1 304 | lsr.b #1,d0 305 | bcc .chan2 306 | LEA mt_chan2temp(PC),A6 307 | MOVE.L n_loopstart(A6),$B0(A5) 308 | MOVE.W n_replen(A6),$B4(A5) 309 | .chan2 310 | lsr.b #1,d0 311 | bcc .chan3 312 | LEA mt_chan3temp(PC),A6 313 | MOVE.L n_loopstart(A6),$C0(A5) 314 | MOVE.W n_replen(A6),$C4(A5) 315 | .chan3 316 | lsr.b #1,d0 317 | bcc .chan4 318 | LEA mt_chan4temp(PC),A6 319 | MOVE.L n_loopstart(A6),$D0(A5) 320 | MOVE.W n_replen(A6),$D4(A5) 321 | .chan4 322 | 323 | clr.w mt_DMACONtemp 324 | clr.w mt_LoadPointer 325 | .exit 326 | rts 327 | 328 | mt_music 329 | TST.B mt_Enable 330 | bne .play 331 | rts 332 | .play 333 | MOVEM.L D0-D4/A0-A6,-(SP) 334 | ADDQ.B #1,mt_counter 335 | MOVE.B mt_counter(PC),D0 336 | CMP.B mt_speed(PC),D0 337 | BLO.S mt_NoNewNote 338 | CLR.B mt_counter 339 | TST.B mt_PattDelTime2 340 | BEQ.S mt_GetNewNote 341 | BSR.S mt_NoNewAllChannels 342 | BRA mt_dskip 343 | 344 | mt_NoNewNote 345 | BSR.S mt_NoNewAllChannels 346 | BRA mt_NoNewPosYet 347 | 348 | mt_NoNewAllChannels 349 | LEA $DFF0A0,A5 350 | LEA mt_chan1temp(PC),A6 351 | BSR mt_CheckEfx 352 | LEA $DFF0B0,A5 353 | LEA mt_chan2temp(PC),A6 354 | BSR mt_CheckEfx 355 | LEA $DFF0C0,A5 356 | LEA mt_chan3temp(PC),A6 357 | BSR mt_CheckEfx 358 | LEA $DFF0D0,A5 359 | LEA mt_chan4temp(PC),A6 360 | BRA mt_CheckEfx 361 | 362 | mt_GetNewNote 363 | MOVE.L mt_SongDataPtr(PC),A0 364 | LEA 12(A0),A3 365 | LEA 952(A0),A2 ;pattpo 366 | LEA 1084(A0),A0 ;patterndata 367 | MOVEQ #0,D0 368 | MOVEQ #0,D1 369 | MOVE.B mt_SongPos(PC),D0 370 | MOVE.B (A2,D0.W),D1 371 | ASL.L #8,D1 372 | ASL.L #2,D1 373 | ADD.W mt_PatternPos(PC),D1 374 | CLR.W mt_DMACONtemp 375 | 376 | LEA $DFF0A0,A5 377 | LEA mt_chan1temp(PC),A6 378 | BSR.S mt_PlayVoice 379 | LEA $DFF0B0,A5 380 | LEA mt_chan2temp(PC),A6 381 | BSR.S mt_PlayVoice 382 | LEA $DFF0C0,A5 383 | LEA mt_chan3temp(PC),A6 384 | BSR.S mt_PlayVoice 385 | LEA $DFF0D0,A5 386 | LEA mt_chan4temp(PC),A6 387 | BSR.S mt_PlayVoice 388 | BRA mt_SetDMA 389 | 390 | mt_PlayVoice 391 | TST.L (A6) 392 | BNE.S mt_plvskip 393 | BSR mt_PerNop 394 | mt_plvskip 395 | MOVE.L (A0,D1.L),(A6) 396 | ADDQ.L #4,D1 397 | MOVEQ #0,D2 398 | MOVE.B n_cmd(A6),D2 399 | AND.B #$F0,D2 400 | LSR.B #4,D2 401 | MOVE.B (A6),D0 402 | AND.B #$F0,D0 403 | OR.B D0,D2 404 | TST.B D2 405 | BEQ mt_SetRegs 406 | move.w n_dmabit(A6),d3 407 | or.w d3,mt_LoadPointer 408 | MOVEQ #0,D3 409 | LEA mt_SampleStarts(PC),A1 410 | MOVE D2,D4 411 | SUBQ.L #1,D2 412 | ASL.L #2,D2 413 | MULU #30,D4 414 | MOVE.L (A1,D2.L),n_start(A6) 415 | MOVE.W (A3,D4.L),n_length(A6) 416 | MOVE.W (A3,D4.L),n_reallength(A6) 417 | MOVE.B 2(A3,D4.L),n_finetune(A6) 418 | MOVE.B 3(A3,D4.L),n_volume(A6) 419 | MOVE.W 4(A3,D4.L),D3 ; Get repeat 420 | TST.W D3 421 | BEQ.S mt_NoLoop 422 | MOVE.L n_start(A6),D2 ; Get start 423 | ASL.W #1,D3 424 | ADD.L D3,D2 ; Add repeat 425 | MOVE.L D2,n_loopstart(A6) 426 | MOVE.L D2,n_wavestart(A6) 427 | MOVE.W 4(A3,D4.L),D0 ; Get repeat 428 | ADD.W 6(A3,D4.L),D0 ; Add replen 429 | MOVE.W D0,n_length(A6) 430 | MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen 431 | MOVEQ #0,D0 432 | MOVE.B n_volume(A6),D0 433 | ;MOVE.W D0,8(A5) ; Set volume 434 | move.w d0,n_realvolume(a6) 435 | BRA.S mt_SetRegs 436 | 437 | mt_NoLoop 438 | MOVE.L n_start(A6),D2 439 | ADD.L D3,D2 440 | MOVE.L D2,n_loopstart(A6) 441 | MOVE.L D2,n_wavestart(A6) 442 | MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen 443 | MOVEQ #0,D0 444 | MOVE.B n_volume(A6),D0 445 | ;MOVE.W D0,8(A5) ; Set volume 446 | move.w d0,n_realvolume(a6) 447 | mt_SetRegs 448 | MOVE.W (A6),D0 449 | AND.W #$0FFF,D0 450 | BEQ mt_CheckMoreEfx ; If no note 451 | MOVE.W 2(A6),D0 452 | AND.W #$0FF0,D0 453 | CMP.W #$0E50,D0 454 | BEQ.S mt_DoSetFineTune 455 | MOVE.B 2(A6),D0 456 | AND.B #$0F,D0 457 | CMP.B #3,D0 ; TonePortamento 458 | BEQ.S mt_ChkTonePorta 459 | CMP.B #5,D0 460 | BEQ.S mt_ChkTonePorta 461 | CMP.B #9,D0 ; Sample Offset 462 | BNE.S mt_SetPeriod 463 | BSR mt_CheckMoreEfx 464 | BRA.S mt_SetPeriod 465 | 466 | mt_DoSetFineTune 467 | BSR mt_SetFineTune 468 | BRA.S mt_SetPeriod 469 | 470 | mt_ChkTonePorta 471 | BSR mt_SetTonePorta 472 | BRA mt_CheckMoreEfx 473 | 474 | mt_SetPeriod 475 | MOVEM.L D0-D1/A0-A1,-(SP) 476 | MOVE.W (A6),D1 477 | AND.W #$0FFF,D1 478 | tst.b n_finetune(A6) 479 | bne .ftlookup 480 | MOVE.W D1,n_period(A6) 481 | bra mt_perlookdone 482 | .ftlookup 483 | LEA mt_PeriodTable(PC),A1 484 | MOVEQ #0,D0 485 | MOVEQ #36,D7 486 | mt_ftuloop 487 | CMP.W (A1,D0.W),D1 488 | BHS.S mt_ftufound 489 | ADDQ.L #2,D0 490 | DBRA D7,mt_ftuloop 491 | mt_ftufound 492 | MOVEQ #0,D1 493 | MOVE.B n_finetune(A6),D1 494 | MULU #36*2,D1 495 | ADD.L D1,A1 496 | MOVE.W (A1,D0.W),n_period(A6) 497 | mt_perlookdone 498 | MOVEM.L (SP)+,D0-D1/A0-A1 499 | 500 | MOVE.W 2(A6),D0 501 | AND.W #$0FF0,D0 502 | CMP.W #$0ED0,D0 ; Notedelay 503 | BEQ mt_CheckMoreEfx 504 | 505 | MOVE.W n_dmabit(A6),$DFF096 506 | BTST #2,n_wavecontrol(A6) 507 | BNE.S mt_vibnoc 508 | CLR.B n_vibratopos(A6) 509 | mt_vibnoc 510 | BTST #6,n_wavecontrol(A6) 511 | BNE.S mt_trenoc 512 | CLR.B n_tremolopos(A6) 513 | mt_trenoc 514 | MOVE.L n_start(A6),(A5) ; Set start 515 | MOVE.W n_length(A6),4(A5) ; Set length 516 | MOVE.W n_period(A6),D0 517 | MOVE.W D0,6(A5) ; Set period 518 | MOVE.W n_dmabit(A6),D0 519 | OR.W D0,mt_DMACONtemp 520 | BRA mt_CheckMoreEfx 521 | 522 | mt_SetDMA 523 | ; off loaded to stage 2 and 3 524 | ; MOVE.W #DMAWait,D0 525 | ;mt_WaitDMA 526 | ; DBRA D0,mt_WaitDMA 527 | ; MOVE.W mt_DMACONtemp(PC),D0 528 | ; OR.W #$8000,D0 529 | ; MOVE.W D0,$DFF096 530 | ; MOVE.W #DMAWait,D0 531 | ;mt_WaitDMA2 532 | ; DBRA D0,mt_WaitDMA2 533 | ; 534 | ; LEA $DFF000,A5 535 | ; LEA mt_chan4temp(PC),A6 536 | ; MOVE.L n_loopstart(A6),$D0(A5) 537 | ; MOVE.W n_replen(A6),$D4(A5) 538 | ; LEA mt_chan3temp(PC),A6 539 | ; MOVE.L n_loopstart(A6),$C0(A5) 540 | ; MOVE.W n_replen(A6),$C4(A5) 541 | ; LEA mt_chan2temp(PC),A6 542 | ; MOVE.L n_loopstart(A6),$B0(A5) 543 | ; MOVE.W n_replen(A6),$B4(A5) 544 | ; LEA mt_chan1temp(PC),A6 545 | ; MOVE.L n_loopstart(A6),$A0(A5) 546 | ; MOVE.W n_replen(A6),$A4(A5) 547 | 548 | mt_dskip 549 | ADD.W #16,mt_PatternPos 550 | MOVE.B mt_PattDelTime,D0 551 | BEQ.S mt_dskc 552 | MOVE.B D0,mt_PattDelTime2 553 | CLR.B mt_PattDelTime 554 | mt_dskc TST.B mt_PattDelTime2 555 | BEQ.S mt_dska 556 | SUBQ.B #1,mt_PattDelTime2 557 | BEQ.S mt_dska 558 | SUB.W #16,mt_PatternPos 559 | mt_dska TST.B mt_PBreakFlag 560 | BEQ.S mt_nnpysk 561 | SF mt_PBreakFlag 562 | MOVEQ #0,D0 563 | MOVE.B mt_PBreakPos(PC),D0 564 | CLR.B mt_PBreakPos 565 | LSL.W #4,D0 566 | MOVE.W D0,mt_PatternPos 567 | mt_nnpysk 568 | CMP.W #1024,mt_PatternPos 569 | BLO.S mt_NoNewPosYet 570 | mt_NextPosition 571 | MOVEQ #0,D0 572 | MOVE.B mt_PBreakPos(PC),D0 573 | LSL.W #4,D0 574 | MOVE.W D0,mt_PatternPos 575 | CLR.B mt_PBreakPos 576 | CLR.B mt_PosJumpFlag 577 | ADDQ.B #1,mt_SongPos 578 | AND.B #$7F,mt_SongPos 579 | MOVE.B mt_SongPos(PC),D1 580 | MOVE.L mt_SongDataPtr(PC),A0 581 | CMP.B 950(A0),D1 582 | BLO.S mt_NoNewPosYet 583 | CLR.B mt_SongPos 584 | mt_NoNewPosYet 585 | TST.B mt_PosJumpFlag 586 | BNE.S mt_NextPosition 587 | MOVEM.L (SP)+,D0-D4/A0-A6 588 | RTS 589 | 590 | mt_CheckEfx 591 | BSR mt_UpdateFunk 592 | MOVE.W n_cmd(A6),D0 593 | AND.W #$0FFF,D0 594 | BEQ.S mt_PerNop 595 | MOVE.B n_cmd(A6),D0 596 | AND.B #$0F,D0 597 | BEQ.S mt_Arpeggio 598 | CMP.B #1,D0 599 | BEQ mt_PortaUp 600 | CMP.B #2,D0 601 | BEQ mt_PortaDown 602 | CMP.B #3,D0 603 | BEQ mt_TonePortamento 604 | CMP.B #4,D0 605 | BEQ mt_Vibrato 606 | CMP.B #5,D0 607 | BEQ mt_TonePlusVolSlide 608 | CMP.B #6,D0 609 | BEQ mt_VibratoPlusVolSlide 610 | CMP.B #$E,D0 611 | BEQ mt_E_Commands 612 | SetBack MOVE.W n_period(A6),6(A5) 613 | CMP.B #7,D0 614 | BEQ mt_Tremolo 615 | CMP.B #$A,D0 616 | BEQ mt_VolumeSlide 617 | mt_Return2 618 | RTS 619 | 620 | mt_PerNop 621 | MOVE.W n_period(A6),6(A5) 622 | RTS 623 | 624 | mt_Arpeggio 625 | MOVEQ #0,D0 626 | MOVE.B mt_counter(PC),D0 627 | DIVS #3,D0 628 | SWAP D0 629 | CMP.W #0,D0 630 | BEQ.S mt_Arpeggio2 631 | CMP.W #2,D0 632 | BEQ.S mt_Arpeggio1 633 | MOVEQ #0,D0 634 | MOVE.B n_cmdlo(A6),D0 635 | LSR.B #4,D0 636 | BRA.S mt_Arpeggio3 637 | 638 | mt_Arpeggio1 639 | MOVEQ #0,D0 640 | MOVE.B n_cmdlo(A6),D0 641 | AND.B #15,D0 642 | BRA.S mt_Arpeggio3 643 | 644 | mt_Arpeggio2 645 | MOVE.W n_period(A6),D2 646 | BRA.S mt_Arpeggio4 647 | 648 | mt_Arpeggio3 649 | ASL.W #1,D0 650 | MOVEQ #0,D1 651 | MOVE.B n_finetune(A6),D1 652 | MULU #36*2,D1 653 | LEA mt_PeriodTable(PC),A0 654 | ADD.L D1,A0 655 | MOVEQ #0,D1 656 | MOVE.W n_period(A6),D1 657 | MOVEQ #36,D7 658 | mt_arploop 659 | MOVE.W (A0,D0.W),D2 660 | CMP.W (A0),D1 661 | BHS.S mt_Arpeggio4 662 | ADDQ.L #2,A0 663 | DBRA D7,mt_arploop 664 | RTS 665 | 666 | mt_Arpeggio4 667 | MOVE.W D2,6(A5) 668 | RTS 669 | 670 | mt_FinePortaUp 671 | TST.B mt_counter 672 | BNE.S mt_Return2 673 | MOVE.B #$0F,mt_LowMask 674 | mt_PortaUp 675 | MOVEQ #0,D0 676 | MOVE.B n_cmdlo(A6),D0 677 | AND.B mt_LowMask(PC),D0 678 | MOVE.B #$FF,mt_LowMask 679 | SUB.W D0,n_period(A6) 680 | MOVE.W n_period(A6),D0 681 | AND.W #$0FFF,D0 682 | CMP.W #113,D0 683 | BPL.S mt_PortaUskip 684 | AND.W #$F000,n_period(A6) 685 | OR.W #113,n_period(A6) 686 | mt_PortaUskip 687 | MOVE.W n_period(A6),D0 688 | AND.W #$0FFF,D0 689 | MOVE.W D0,6(A5) 690 | RTS 691 | 692 | mt_FinePortaDown 693 | TST.B mt_counter 694 | BNE mt_Return2 695 | MOVE.B #$0F,mt_LowMask 696 | mt_PortaDown 697 | CLR.W D0 698 | MOVE.B n_cmdlo(A6),D0 699 | AND.B mt_LowMask(PC),D0 700 | MOVE.B #$FF,mt_LowMask 701 | ADD.W D0,n_period(A6) 702 | MOVE.W n_period(A6),D0 703 | AND.W #$0FFF,D0 704 | CMP.W #856,D0 705 | BMI.S mt_PortaDskip 706 | AND.W #$F000,n_period(A6) 707 | OR.W #856,n_period(A6) 708 | mt_PortaDskip 709 | MOVE.W n_period(A6),D0 710 | AND.W #$0FFF,D0 711 | MOVE.W D0,6(A5) 712 | RTS 713 | 714 | mt_SetTonePorta 715 | MOVE.L A0,-(SP) 716 | MOVE.W (A6),D2 717 | AND.W #$0FFF,D2 718 | MOVEQ #0,D0 719 | MOVE.B n_finetune(A6),D0 720 | MULU #36*2,D0 ;37? 721 | LEA mt_PeriodTable(PC),A0 722 | ADD.L D0,A0 723 | MOVEQ #0,D0 724 | mt_StpLoop 725 | CMP.W (A0,D0.W),D2 726 | BHS.S mt_StpFound 727 | ADDQ.W #2,D0 728 | CMP.W #36*2,D0 ;37? 729 | BLO.S mt_StpLoop 730 | MOVEQ #35*2,D0 731 | mt_StpFound 732 | MOVE.B n_finetune(A6),D2 733 | AND.B #8,D2 734 | BEQ.S mt_StpGoss 735 | TST.W D0 736 | BEQ.S mt_StpGoss 737 | SUBQ.W #2,D0 738 | mt_StpGoss 739 | MOVE.W (A0,D0.W),D2 740 | MOVE.L (SP)+,A0 741 | MOVE.W D2,n_wantedperiod(A6) 742 | MOVE.W n_period(A6),D0 743 | CLR.B n_toneportdirec(A6) 744 | CMP.W D0,D2 745 | BEQ.S mt_ClearTonePorta 746 | BGE mt_Return2 747 | MOVE.B #1,n_toneportdirec(A6) 748 | RTS 749 | 750 | mt_ClearTonePorta 751 | CLR.W n_wantedperiod(A6) 752 | RTS 753 | 754 | mt_TonePortamento 755 | MOVE.B n_cmdlo(A6),D0 756 | BEQ.S mt_TonePortNoChange 757 | MOVE.B D0,n_toneportspeed(A6) 758 | CLR.B n_cmdlo(A6) 759 | mt_TonePortNoChange 760 | TST.W n_wantedperiod(A6) 761 | BEQ mt_Return2 762 | MOVEQ #0,D0 763 | MOVE.B n_toneportspeed(A6),D0 764 | TST.B n_toneportdirec(A6) 765 | BNE.S mt_TonePortaUp 766 | mt_TonePortaDown 767 | ADD.W D0,n_period(A6) 768 | MOVE.W n_wantedperiod(A6),D0 769 | CMP.W n_period(A6),D0 770 | BGT.S mt_TonePortaSetPer 771 | MOVE.W n_wantedperiod(A6),n_period(A6) 772 | CLR.W n_wantedperiod(A6) 773 | BRA.S mt_TonePortaSetPer 774 | 775 | mt_TonePortaUp 776 | SUB.W D0,n_period(A6) 777 | MOVE.W n_wantedperiod(A6),D0 778 | CMP.W n_period(A6),D0 779 | BLT.S mt_TonePortaSetPer 780 | MOVE.W n_wantedperiod(A6),n_period(A6) 781 | CLR.W n_wantedperiod(A6) 782 | 783 | mt_TonePortaSetPer 784 | MOVE.W n_period(A6),D2 785 | MOVE.B n_glissfunk(A6),D0 786 | AND.B #$0F,D0 787 | BEQ.S mt_GlissSkip 788 | MOVEQ #0,D0 789 | MOVE.B n_finetune(A6),D0 790 | MULU #36*2,D0 791 | LEA mt_PeriodTable(PC),A0 792 | ADD.L D0,A0 793 | MOVEQ #0,D0 794 | mt_GlissLoop 795 | CMP.W (A0,D0.W),D2 796 | BHS.S mt_GlissFound 797 | ADDQ.W #2,D0 798 | CMP.W #36*2,D0 799 | BLO.S mt_GlissLoop 800 | MOVEQ #35*2,D0 801 | mt_GlissFound 802 | MOVE.W (A0,D0.W),D2 803 | mt_GlissSkip 804 | MOVE.W D2,6(A5) ; Set period 805 | RTS 806 | 807 | mt_Vibrato 808 | MOVE.B n_cmdlo(A6),D0 809 | BEQ.S mt_Vibrato2 810 | MOVE.B n_vibratocmd(A6),D2 811 | AND.B #$0F,D0 812 | BEQ.S mt_vibskip 813 | AND.B #$F0,D2 814 | OR.B D0,D2 815 | mt_vibskip 816 | MOVE.B n_cmdlo(A6),D0 817 | AND.B #$F0,D0 818 | BEQ.S mt_vibskip2 819 | AND.B #$0F,D2 820 | OR.B D0,D2 821 | mt_vibskip2 822 | MOVE.B D2,n_vibratocmd(A6) 823 | mt_Vibrato2 824 | MOVE.B n_vibratopos(A6),D0 825 | LEA mt_VibratoTable(PC),A4 826 | LSR.W #2,D0 827 | AND.W #$001F,D0 828 | MOVEQ #0,D2 829 | MOVE.B n_wavecontrol(A6),D2 830 | AND.B #$03,D2 831 | BEQ.S mt_vib_sine 832 | LSL.B #3,D0 833 | CMP.B #1,D2 834 | BEQ.S mt_vib_rampdown 835 | MOVE.B #255,D2 836 | BRA.S mt_vib_set 837 | mt_vib_rampdown 838 | TST.B n_vibratopos(A6) 839 | BPL.S mt_vib_rampdown2 840 | MOVE.B #255,D2 841 | SUB.B D0,D2 842 | BRA.S mt_vib_set 843 | mt_vib_rampdown2 844 | MOVE.B D0,D2 845 | BRA.S mt_vib_set 846 | mt_vib_sine 847 | MOVE.B 0(A4,D0.W),D2 848 | mt_vib_set 849 | MOVE.B n_vibratocmd(A6),D0 850 | AND.W #15,D0 851 | MULU D0,D2 852 | LSR.W #7,D2 853 | MOVE.W n_period(A6),D0 854 | TST.B n_vibratopos(A6) 855 | BMI.S mt_VibratoNeg 856 | ADD.W D2,D0 857 | BRA.S mt_Vibrato3 858 | mt_VibratoNeg 859 | SUB.W D2,D0 860 | mt_Vibrato3 861 | MOVE.W D0,6(A5) 862 | MOVE.B n_vibratocmd(A6),D0 863 | LSR.W #2,D0 864 | AND.W #$003C,D0 865 | ADD.B D0,n_vibratopos(A6) 866 | RTS 867 | 868 | mt_TonePlusVolSlide 869 | BSR mt_TonePortNoChange 870 | BRA mt_VolumeSlide 871 | 872 | mt_VibratoPlusVolSlide 873 | BSR.S mt_Vibrato2 874 | BRA mt_VolumeSlide 875 | 876 | mt_Tremolo 877 | MOVE.B n_cmdlo(A6),D0 878 | BEQ.S mt_Tremolo2 879 | MOVE.B n_tremolocmd(A6),D2 880 | AND.B #$0F,D0 881 | BEQ.S mt_treskip 882 | AND.B #$F0,D2 883 | OR.B D0,D2 884 | mt_treskip 885 | MOVE.B n_cmdlo(A6),D0 886 | AND.B #$F0,D0 887 | BEQ.S mt_treskip2 888 | AND.B #$0F,D2 889 | OR.B D0,D2 890 | mt_treskip2 891 | MOVE.B D2,n_tremolocmd(A6) 892 | mt_Tremolo2 893 | MOVE.B n_tremolopos(A6),D0 894 | LEA mt_VibratoTable(PC),A4 895 | LSR.W #2,D0 896 | AND.W #$001F,D0 897 | MOVEQ #0,D2 898 | MOVE.B n_wavecontrol(A6),D2 899 | LSR.B #4,D2 900 | AND.B #$03,D2 901 | BEQ.S mt_tre_sine 902 | LSL.B #3,D0 903 | CMP.B #1,D2 904 | BEQ.S mt_tre_rampdown 905 | MOVE.B #255,D2 906 | BRA.S mt_tre_set 907 | mt_tre_rampdown 908 | TST.B n_vibratopos(A6) 909 | BPL.S mt_tre_rampdown2 910 | MOVE.B #255,D2 911 | SUB.B D0,D2 912 | BRA.S mt_tre_set 913 | mt_tre_rampdown2 914 | MOVE.B D0,D2 915 | BRA.S mt_tre_set 916 | mt_tre_sine 917 | MOVE.B 0(A4,D0.W),D2 918 | mt_tre_set 919 | MOVE.B n_tremolocmd(A6),D0 920 | AND.W #15,D0 921 | MULU D0,D2 922 | LSR.W #6,D2 923 | MOVEQ #0,D0 924 | MOVE.B n_volume(A6),D0 925 | TST.B n_tremolopos(A6) 926 | BMI.S mt_TremoloNeg 927 | ADD.W D2,D0 928 | BRA.S mt_Tremolo3 929 | mt_TremoloNeg 930 | SUB.W D2,D0 931 | mt_Tremolo3 932 | BPL.S mt_TremoloSkip 933 | CLR.W D0 934 | mt_TremoloSkip 935 | CMP.W #$40,D0 936 | BLS.S mt_TremoloOk 937 | MOVE.W #$40,D0 938 | mt_TremoloOk 939 | ;MOVE.W D0,8(A5) ; Set volume 940 | move.w d0,n_realvolume(a6) 941 | MOVE.B n_tremolocmd(A6),D0 942 | LSR.W #2,D0 943 | AND.W #$003C,D0 944 | ADD.B D0,n_tremolopos(A6) 945 | RTS 946 | 947 | mt_SampleOffset 948 | MOVEQ #0,D0 949 | MOVE.B n_cmdlo(A6),D0 950 | BEQ.S mt_sononew 951 | MOVE.B D0,n_sampleoffset(A6) 952 | mt_sononew 953 | MOVE.B n_sampleoffset(A6),D0 954 | LSL.W #7,D0 955 | CMP.W n_length(A6),D0 956 | BGE.S mt_sofskip 957 | SUB.W D0,n_length(A6) 958 | LSL.W #1,D0 959 | ADD.L D0,n_start(A6) 960 | RTS 961 | mt_sofskip 962 | MOVE.W #$0001,n_length(A6) 963 | RTS 964 | 965 | mt_VolumeSlide 966 | MOVEQ #0,D0 967 | MOVE.B n_cmdlo(A6),D0 968 | LSR.B #4,D0 969 | TST.B D0 970 | BEQ.S mt_VolSlideDown 971 | mt_VolSlideUp 972 | ADD.B D0,n_volume(A6) 973 | CMP.B #$40,n_volume(A6) 974 | BMI.S mt_vsuskip 975 | MOVE.B #$40,n_volume(A6) 976 | mt_vsuskip 977 | MOVE.B n_volume(A6),D0 978 | ;MOVE.W D0,8(A5) ; Set volume 979 | move.w d0,n_realvolume(a6) 980 | RTS 981 | 982 | mt_VolSlideDown 983 | MOVEQ #0,D0 984 | MOVE.B n_cmdlo(A6),D0 985 | AND.B #$0F,D0 986 | mt_VolSlideDown2 987 | SUB.B D0,n_volume(A6) 988 | BPL.S mt_vsdskip 989 | CLR.B n_volume(A6) 990 | mt_vsdskip 991 | MOVE.B n_volume(A6),D0 992 | ;MOVE.W D0,8(A5) ; Set volume 993 | move.w d0,n_realvolume(a6) 994 | RTS 995 | 996 | mt_PositionJump 997 | MOVE.B n_cmdlo(A6),D0 998 | SUBQ.B #1,D0 999 | MOVE.B D0,mt_SongPos 1000 | mt_pj2 CLR.B mt_PBreakPos 1001 | ST mt_PosJumpFlag 1002 | RTS 1003 | 1004 | mt_VolumeChange 1005 | MOVEQ #0,D0 1006 | MOVE.B n_cmdlo(A6),D0 1007 | CMP.B #$40,D0 1008 | BLS.S mt_VolumeOk 1009 | MOVEQ #$40,D0 1010 | mt_VolumeOk 1011 | MOVE.B D0,n_volume(A6) 1012 | ;MOVE.W D0,8(A5) ; Set volume 1013 | move.w d0,n_realvolume(a6) 1014 | RTS 1015 | 1016 | mt_PatternBreak 1017 | MOVEQ #0,D0 1018 | MOVE.B n_cmdlo(A6),D0 1019 | MOVE.L D0,D2 1020 | LSR.B #4,D0 1021 | MULU #10,D0 1022 | AND.B #$0F,D2 1023 | ADD.B D2,D0 1024 | CMP.B #63,D0 1025 | BHI.S mt_pj2 1026 | MOVE.B D0,mt_PBreakPos 1027 | ST mt_PosJumpFlag 1028 | RTS 1029 | 1030 | mt_SetSpeed 1031 | MOVEQ #0,D0 1032 | MOVE.B 3(A6),D0 1033 | BEQ .stop ;mt_end 1034 | CLR.B mt_counter 1035 | CMP.B #32,D0 1036 | bhs .ciaset 1037 | MOVE.B D0,mt_speed 1038 | RTS 1039 | .ciaset 1040 | move.w d0,CIA_MusicBPM 1041 | rts 1042 | 1043 | .stop 1044 | sf mt_Enable 1045 | rts 1046 | 1047 | mt_CheckMoreEfx 1048 | BSR mt_UpdateFunk 1049 | MOVE.B 2(A6),D0 1050 | AND.B #$0F,D0 1051 | CMP.B #$9,D0 1052 | BEQ mt_SampleOffset 1053 | CMP.B #$B,D0 1054 | BEQ mt_PositionJump 1055 | CMP.B #$D,D0 1056 | BEQ.S mt_PatternBreak 1057 | CMP.B #$E,D0 1058 | BEQ.S mt_E_Commands 1059 | CMP.B #$F,D0 1060 | BEQ.S mt_SetSpeed 1061 | CMP.B #$C,D0 1062 | BEQ mt_VolumeChange 1063 | BRA mt_PerNop 1064 | 1065 | mt_E_Commands 1066 | MOVE.B n_cmdlo(A6),D0 1067 | AND.B #$F0,D0 1068 | LSR.B #4,D0 1069 | BEQ.S mt_FilterOnOff 1070 | CMP.B #1,D0 1071 | BEQ mt_FinePortaUp 1072 | CMP.B #2,D0 1073 | BEQ mt_FinePortaDown 1074 | CMP.B #3,D0 1075 | BEQ.S mt_SetGlissControl 1076 | CMP.B #4,D0 1077 | BEQ mt_SetVibratoControl 1078 | CMP.B #5,D0 1079 | BEQ mt_SetFineTune 1080 | CMP.B #6,D0 1081 | BEQ mt_JumpLoop 1082 | CMP.B #7,D0 1083 | BEQ mt_SetTremoloControl 1084 | CMP.B #9,D0 1085 | BEQ mt_RetrigNote 1086 | CMP.B #$A,D0 1087 | BEQ mt_VolumeFineUp 1088 | CMP.B #$B,D0 1089 | BEQ mt_VolumeFineDown 1090 | CMP.B #$C,D0 1091 | BEQ mt_NoteCut 1092 | CMP.B #$D,D0 1093 | BEQ mt_NoteDelay 1094 | CMP.B #$E,D0 1095 | BEQ mt_PatternDelay 1096 | CMP.B #$F,D0 1097 | BEQ mt_FunkIt 1098 | RTS 1099 | 1100 | mt_FilterOnOff 1101 | MOVE.B n_cmdlo(A6),D0 1102 | AND.B #1,D0 1103 | ASL.B #1,D0 1104 | AND.B #$FD,$BFE001 1105 | OR.B D0,$BFE001 1106 | RTS 1107 | 1108 | mt_SetGlissControl 1109 | MOVE.B n_cmdlo(A6),D0 1110 | AND.B #$0F,D0 1111 | AND.B #$F0,n_glissfunk(A6) 1112 | OR.B D0,n_glissfunk(A6) 1113 | RTS 1114 | 1115 | mt_SetVibratoControl 1116 | MOVE.B n_cmdlo(A6),D0 1117 | AND.B #$0F,D0 1118 | AND.B #$F0,n_wavecontrol(A6) 1119 | OR.B D0,n_wavecontrol(A6) 1120 | RTS 1121 | 1122 | mt_SetFineTune 1123 | MOVE.B n_cmdlo(A6),D0 1124 | AND.B #$0F,D0 1125 | MOVE.B D0,n_finetune(A6) 1126 | RTS 1127 | 1128 | mt_JumpLoop 1129 | TST.B mt_counter 1130 | BNE mt_Return2 1131 | MOVE.B n_cmdlo(A6),D0 1132 | AND.B #$0F,D0 1133 | BEQ.S mt_SetLoop 1134 | TST.B n_loopcount(A6) 1135 | BEQ.S mt_jumpcnt 1136 | SUBQ.B #1,n_loopcount(A6) 1137 | BEQ mt_Return2 1138 | mt_jmploop MOVE.B n_pattpos(A6),mt_PBreakPos 1139 | ST mt_PBreakFlag 1140 | RTS 1141 | 1142 | mt_jumpcnt 1143 | MOVE.B D0,n_loopcount(A6) 1144 | BRA.S mt_jmploop 1145 | 1146 | mt_SetLoop 1147 | MOVE.W mt_PatternPos(PC),D0 1148 | LSR.W #4,D0 1149 | MOVE.B D0,n_pattpos(A6) 1150 | RTS 1151 | 1152 | mt_SetTremoloControl 1153 | MOVE.B n_cmdlo(A6),D0 1154 | AND.B #$0F,D0 1155 | LSL.B #4,D0 1156 | AND.B #$0F,n_wavecontrol(A6) 1157 | OR.B D0,n_wavecontrol(A6) 1158 | RTS 1159 | 1160 | mt_RetrigNote 1161 | MOVE.L D1,-(SP) 1162 | MOVEQ #0,D0 1163 | MOVE.B n_cmdlo(A6),D0 1164 | AND.B #$0F,D0 1165 | BEQ.S mt_rtnend 1166 | MOVEQ #0,D1 1167 | MOVE.B mt_counter(PC),D1 1168 | BNE.S mt_rtnskp 1169 | MOVE.W (A6),D1 1170 | AND.W #$0FFF,D1 1171 | BNE.S mt_rtnend 1172 | MOVEQ #0,D1 1173 | MOVE.B mt_counter(PC),D1 1174 | mt_rtnskp 1175 | DIVU D0,D1 1176 | SWAP D1 1177 | TST.W D1 1178 | BNE.S mt_rtnend 1179 | mt_DoRetrig 1180 | ;MOVE.W n_dmabit(A6),$DFF096 ; Channel DMA off 1181 | move.w n_dmabit(a6),d0 1182 | move.w d0,$dff096 1183 | or.w d0,mt_DMACONtemp 1184 | MOVE.L n_start(A6),(A5) ; Set sampledata pointer 1185 | MOVE.W n_length(A6),4(A5) ; Set length 1186 | ; off loaded to stage 2 and 3 1187 | ; MOVE.W #DMAWait,D0 1188 | ;mt_rtnloop1 1189 | ; DBRA D0,mt_rtnloop1 1190 | ; MOVE.W n_dmabit(A6),D0 1191 | ; BSET #15,D0 1192 | ; MOVE.W D0,$DFF096 1193 | ; MOVE.W #DMAWait,D0 1194 | ;mt_rtnloop2 1195 | ; DBRA D0,mt_rtnloop2 1196 | ; MOVE.L n_loopstart(A6),(A5) 1197 | ; MOVE.L n_replen(A6),4(A5) 1198 | mt_rtnend 1199 | MOVE.L (SP)+,D1 1200 | RTS 1201 | 1202 | mt_VolumeFineUp 1203 | TST.B mt_counter 1204 | BNE mt_Return2 1205 | MOVEQ #0,D0 1206 | MOVE.B n_cmdlo(A6),D0 1207 | AND.B #$F,D0 1208 | BRA mt_VolSlideUp 1209 | 1210 | mt_VolumeFineDown 1211 | TST.B mt_counter 1212 | BNE mt_Return2 1213 | MOVEQ #0,D0 1214 | MOVE.B n_cmdlo(A6),D0 1215 | AND.B #$0F,D0 1216 | BRA mt_VolSlideDown2 1217 | 1218 | mt_NoteCut 1219 | MOVEQ #0,D0 1220 | MOVE.B n_cmdlo(A6),D0 1221 | AND.B #$0F,D0 1222 | CMP.B mt_counter(PC),D0 1223 | BNE mt_Return2 1224 | CLR.B n_volume(A6) 1225 | ;MOVE.W #0,8(A5) 1226 | clr.w n_realvolume(a6) 1227 | RTS 1228 | 1229 | mt_NoteDelay 1230 | MOVEQ #0,D0 1231 | MOVE.B n_cmdlo(A6),D0 1232 | AND.B #$0F,D0 1233 | CMP.B mt_counter,D0 1234 | BNE mt_Return2 1235 | MOVE.W (A6),D0 1236 | BEQ mt_Return2 1237 | MOVE.L D1,-(SP) 1238 | BRA mt_DoRetrig 1239 | 1240 | mt_PatternDelay 1241 | TST.B mt_counter 1242 | BNE mt_Return2 1243 | MOVEQ #0,D0 1244 | MOVE.B n_cmdlo(A6),D0 1245 | AND.B #$0F,D0 1246 | TST.B mt_PattDelTime2 1247 | BNE mt_Return2 1248 | ADDQ.B #1,D0 1249 | MOVE.B D0,mt_PattDelTime 1250 | RTS 1251 | 1252 | mt_FunkIt 1253 | TST.B mt_counter 1254 | BNE mt_Return2 1255 | MOVE.B n_cmdlo(A6),D0 1256 | AND.B #$0F,D0 1257 | LSL.B #4,D0 1258 | AND.B #$0F,n_glissfunk(A6) 1259 | OR.B D0,n_glissfunk(A6) 1260 | TST.B D0 1261 | BEQ mt_Return2 1262 | mt_UpdateFunk 1263 | MOVEM.L A0/D1,-(SP) 1264 | MOVEQ #0,D0 1265 | MOVE.B n_glissfunk(A6),D0 1266 | LSR.B #4,D0 1267 | BEQ.S mt_funkend 1268 | LEA mt_FunkTable(PC),A0 1269 | MOVE.B (A0,D0.W),D0 1270 | ADD.B D0,n_funkoffset(A6) 1271 | BTST #7,n_funkoffset(A6) 1272 | BEQ.S mt_funkend 1273 | CLR.B n_funkoffset(A6) 1274 | 1275 | MOVE.L n_loopstart(A6),D0 1276 | MOVEQ #0,D1 1277 | MOVE.W n_replen(A6),D1 1278 | ADD.L D1,D0 1279 | ADD.L D1,D0 1280 | MOVE.L n_wavestart(A6),A0 1281 | ADDQ.L #1,A0 1282 | CMP.L D0,A0 1283 | BLO.S mt_funkok 1284 | MOVE.L n_loopstart(A6),A0 1285 | mt_funkok 1286 | MOVE.L A0,n_wavestart(A6) 1287 | MOVEQ #-1,D0 1288 | SUB.B (A0),D0 1289 | MOVE.B D0,(A0) 1290 | mt_funkend 1291 | MOVEM.L (SP)+,A0/D1 1292 | RTS 1293 | 1294 | 1295 | mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128 1296 | 1297 | mt_VibratoTable 1298 | dc.b 0, 24, 49, 74, 97,120,141,161 1299 | dc.b 180,197,212,224,235,244,250,253 1300 | dc.b 255,253,250,244,235,224,212,197 1301 | dc.b 180,161,141,120, 97, 74, 49, 24 1302 | 1303 | mt_PeriodTable 1304 | ; Tuning 0, Normal 1305 | dc.w 856,808,762,720,678,640,604,570,538,508,480,453 1306 | dc.w 428,404,381,360,339,320,302,285,269,254,240,226 1307 | dc.w 214,202,190,180,170,160,151,143,135,127,120,113 1308 | ; Tuning 1 1309 | dc.w 850,802,757,715,674,637,601,567,535,505,477,450 1310 | dc.w 425,401,379,357,337,318,300,284,268,253,239,225 1311 | dc.w 213,201,189,179,169,159,150,142,134,126,119,113 1312 | ; Tuning 2 1313 | dc.w 844,796,752,709,670,632,597,563,532,502,474,447 1314 | dc.w 422,398,376,355,335,316,298,282,266,251,237,224 1315 | dc.w 211,199,188,177,167,158,149,141,133,125,118,112 1316 | ; Tuning 3 1317 | dc.w 838,791,746,704,665,628,592,559,528,498,470,444 1318 | dc.w 419,395,373,352,332,314,296,280,264,249,235,222 1319 | dc.w 209,198,187,176,166,157,148,140,132,125,118,111 1320 | ; Tuning 4 1321 | dc.w 832,785,741,699,660,623,588,555,524,495,467,441 1322 | dc.w 416,392,370,350,330,312,294,278,262,247,233,220 1323 | dc.w 208,196,185,175,165,156,147,139,131,124,117,110 1324 | ; Tuning 5 1325 | dc.w 826,779,736,694,655,619,584,551,520,491,463,437 1326 | dc.w 413,390,368,347,328,309,292,276,260,245,232,219 1327 | dc.w 206,195,184,174,164,155,146,138,130,123,116,109 1328 | ; Tuning 6 1329 | dc.w 820,774,730,689,651,614,580,547,516,487,460,434 1330 | dc.w 410,387,365,345,325,307,290,274,258,244,230,217 1331 | dc.w 205,193,183,172,163,154,145,137,129,122,115,109 1332 | ; Tuning 7 1333 | dc.w 814,768,725,684,646,610,575,543,513,484,457,431 1334 | dc.w 407,384,363,342,323,305,288,272,256,242,228,216 1335 | dc.w 204,192,181,171,161,152,144,136,128,121,114,108 1336 | ; Tuning -8 1337 | dc.w 907,856,808,762,720,678,640,604,570,538,508,480 1338 | dc.w 453,428,404,381,360,339,320,302,285,269,254,240 1339 | dc.w 226,214,202,190,180,170,160,151,143,135,127,120 1340 | ; Tuning -7 1341 | dc.w 900,850,802,757,715,675,636,601,567,535,505,477 1342 | dc.w 450,425,401,379,357,337,318,300,284,268,253,238 1343 | dc.w 225,212,200,189,179,169,159,150,142,134,126,119 1344 | ; Tuning -6 1345 | dc.w 894,844,796,752,709,670,632,597,563,532,502,474 1346 | dc.w 447,422,398,376,355,335,316,298,282,266,251,237 1347 | dc.w 223,211,199,188,177,167,158,149,141,133,125,118 1348 | ; Tuning -5 1349 | dc.w 887,838,791,746,704,665,628,592,559,528,498,470 1350 | dc.w 444,419,395,373,352,332,314,296,280,264,249,235 1351 | dc.w 222,209,198,187,176,166,157,148,140,132,125,118 1352 | ; Tuning -4 1353 | dc.w 881,832,785,741,699,660,623,588,555,524,494,467 1354 | dc.w 441,416,392,370,350,330,312,294,278,262,247,233 1355 | dc.w 220,208,196,185,175,165,156,147,139,131,123,117 1356 | ; Tuning -3 1357 | dc.w 875,826,779,736,694,655,619,584,551,520,491,463 1358 | dc.w 437,413,390,368,347,328,309,292,276,260,245,232 1359 | dc.w 219,206,195,184,174,164,155,146,138,130,123,116 1360 | ; Tuning -2 1361 | dc.w 868,820,774,730,689,651,614,580,547,516,487,460 1362 | dc.w 434,410,387,365,345,325,307,290,274,258,244,230 1363 | dc.w 217,205,193,183,172,163,154,145,137,129,122,115 1364 | ; Tuning -1 1365 | dc.w 862,814,768,725,684,646,610,575,543,513,484,457 1366 | dc.w 431,407,384,363,342,323,305,288,272,256,242,228 1367 | dc.w 216,203,192,181,171,161,152,144,136,128,121,114 1368 | 1369 | mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0,0 1370 | mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0,0 1371 | mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0,0 1372 | mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0,0 1373 | mt_chanend 1374 | mt_SampleStarts dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1375 | dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1376 | 1377 | mt_SongDataPtr dc.l 0 1378 | 1379 | mt_speed dc.b 6 1380 | mt_counter dc.b 0 1381 | mt_SongPos dc.b 0 1382 | mt_PBreakPos dc.b 0 1383 | mt_PosJumpFlag dc.b 0 1384 | mt_PBreakFlag dc.b 0 1385 | mt_LowMask dc.b 0 1386 | mt_PattDelTime dc.b 0 1387 | mt_PattDelTime2 dc.b 0,0 1388 | mt_PatternPos dc.w 0 1389 | mt_DMACONtemp dc.w 0 1390 | mt_LoadPointer dc.w 0 1391 | mt_Enable dc.b 0 1392 | even --------------------------------------------------------------------------------