From 09358d6992a3c6d1ca06d7e4c37ec05af9b4cd2e Mon Sep 17 00:00:00 2001 From: Daniel Tremblay Date: Tue, 13 Sep 2022 23:22:12 +0200 Subject: [PATCH] Release 0.4.0 ------------- Added FAT32 support. Added Vicky II display format. --- GABE_Control_Registers_def.asm | 46 +- OPL2_Library.asm | 2 +- README.md | 16 +- Rad_Player.asm | 2 +- SDOS.asm | 154 +- base.asm | 44 + boot-info.asm | 38 +- bpm-to-timer-count.xlsx | Bin 11422 -> 12981 bytes c256-track-screenshot.png | Bin 53335 -> 194222 bytes display.asm | 25 +- display_func.asm | 29 +- file_load.asm | 4 +- interrupt_def.asm | 4 +- macros_inc.asm | 26 +- release-notes.txt | 9 +- sdcard.asm | 356 -- tracker.asm | 51 +- tracker.hex | 464 +-- tracker.lst | 6244 ++++++++++++++++---------------- 19 files changed, 3704 insertions(+), 3810 deletions(-) create mode 100644 base.asm delete mode 100644 sdcard.asm diff --git a/GABE_Control_Registers_def.asm b/GABE_Control_Registers_def.asm index ee12399..0bd614b 100644 --- a/GABE_Control_Registers_def.asm +++ b/GABE_Control_Registers_def.asm @@ -5,10 +5,26 @@ GABE_MSTR_CTRL = $AFE880 GABE_CTRL_PWR_LED = $01 ; Controls the LED in the Front of the case (Next to the reset button) GABE_CTRL_SDC_LED = $02 ; Controls the LED in the Front of the Case (Next to SDCard) +GABE_CTRL_STS_LED0 = $04 ; Control Status LED0 (General Use) - C256 Foenix U Only +GABE_CTRL_STS_LED1 = $08 ; Control Status LED0 (General Use) - C256 Foenix U Only GABE_CTRL_BUZZER = $10 ; Controls the Buzzer GABE_CTRL_WRM_RST = $80 ; Warm Reset (needs to Setup other registers) -GABE_NOTUSED = $AFE881 ; Reserved for future use +GABE_LED_FLASH_CTRL = $AFE881 ; Flashing LED Control +GABE_LED0_FLASH_CTRL = $01 ; 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +GABE_LED1_FLASH_CTRL = $02 ; 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED1 to manually control) + +GABE_LD0_FLASH_FRQ0 = $10 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +GABE_LD0_FLASH_FRQ1 = $20 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +; 00 - 1Hz +; 01 - 2hz +; 10 - 4hz +; 11 - 5hz +GABE_LD1_FLASH_FRQ0 = $40 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +GABE_LD1_FLASH_FRQ1 = $80 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) + + + GABE_RST_AUTH0 = $AFE882 ; Must Contain the BYTE $AD for Reset to Activate GABE_RST_AUTH1 = $AFE883 ; Must Contain the BYTE $DE for Reset to Activate @@ -31,14 +47,30 @@ GABE_RNG_CTRL_DV = $02 ; After Setting the Seed Value, Toggle that Bit fo GABE_SYS_STAT = $AFE887 ; GABE_SYS_STAT_MID0 = $01 ; Machine ID -- LSB -GABE_SYS_STAT_MID1 = $02 ; Machine ID -- MSB -GABE_SYS_STAT_EXP = $08 ; if Zero, there is an Expansion Card Preset -GABE_SYS_STAT_CPUA = $40 ; Indicates the (8bit/16bit) Size of the Accumulator -GABE_SYS_STAT_CPUX = $80 ; Indicates the (8bit/16bit) Size of the Accumulator +GABE_SYS_STAT_MID1 = $02 ; Machine ID -- +GABE_SYS_STAT_MID2 = $04 ; Machine ID -- MSB +;Bit 2, Bit 1, Bit 0 +;$000: FMX +;$100: FMX (Future C5A) +;$001: U 2Meg +;$101: U+ 4Meg U+ +;$010: TBD (Reserved) +;$110: TBD (Reserved) +;$011: A2560 Dev +;$111: A2560 Keyboard +GABE_SYS_STAT_EXP = $10 ; if Zero, there is an Expansion Card Preset +GABE_SYS_STAT_CPUA = $40 ; Indicates the (8bit/16bit) Size of the Accumulator - Not Implemented +GABE_SYS_STAT_CPUX = $80 ; Indicates the (8bit/16bit) Size of the Accumulator - Not Implemented -; Machine ID +GABE_SUBVERSION_LO = $AFE88A +GABE_SUBVERSION_HI = $AFE88B +GABE_VERSION_LO = $AFE88C +GABE_VERSION_HI = $AFE88D +GABE_MODEL_LO = $AFE88E +GABE_MODEL_HI = $AFE88F +; OLD Machine ID Definition - Deprecated ; $00 = FMX - Development Platform ; $01 = C256 Foenix - Dev Platform ; $10 = C256 Foenix - User Version (65C816) -; $11 = TBD \ No newline at end of file +; $11 = TBD diff --git a/OPL2_Library.asm b/OPL2_Library.asm index 9169681..f654e42 100644 --- a/OPL2_Library.asm +++ b/OPL2_Library.asm @@ -58,7 +58,7 @@ OPL2_TONE_TESTING_L2 RTL -OPL2_INIT +OPL3_INIT .as setal ; Just Making sure all the necessary variables are cleared before doing anything diff --git a/README.md b/README.md index 0396f27..e2f19c4 100644 --- a/README.md +++ b/README.md @@ -7,14 +7,26 @@ Go to https://sourceforge.net/projects/tass64/ to get it. I'm currently using version *64tass Turbo Assembler Macro V1.54.1900* The model I'm using is RAD Tracker https://www.3eality.com/productions/reality-adlib-tracker. -The C256 Tracker is only able to play version 1.1 RAD files. +The C256 Tracker is only able to play version _1.1_ RAD files. + +Special Keys: +: start playing the song from the beggining +: start playing from current position in pattern +<=>: next pattern +<->: previous pattern +<;>: slow down (this uses the BPM algorithm, not the Speed parameter) +<'>: speed up (this uses the BPM algorithm, not the Speed parameter) +: read SD Card for files. In the menu, use up-arrow/down-arrow to navigate. to select a file. +<[>: Previous Instrument +<]>: Next Instrument +: play notes high +: play nodes low Todo List: * Implementation of RAD version 2.0. * Creating and Editing files. * Some effects are still not implemented. * Writing to SD Card. - * Reading from FAT12 SD Cards. You will need the C256 Foenix IDE to code and debug: https://github.com/Trinity-11/FoenixIDE. diff --git a/Rad_Player.asm b/Rad_Player.asm index 7d12641..d097159 100644 --- a/Rad_Player.asm +++ b/Rad_Player.asm @@ -30,7 +30,7 @@ TuneInfo .dstruct SongData ; We are assuming that the RAD File is already Loaded Somewhere ; ************************************************************************************************ RAD_INIT_PLAYER - JSL OPL2_INIT ; Init OPL2 + JSL OPL3_INIT ; Init OPL3 JSR RAD_ALL_NOTES_OFF ; zero the pattern memory diff --git a/SDOS.asm b/SDOS.asm index 8da2482..2330edd 100644 --- a/SDOS.asm +++ b/SDOS.asm @@ -6,6 +6,12 @@ .include "GABE_Control_Registers_def.asm" .include "ch376s_inc.asm" +; pointers to data +SD_DATA = $0080 ; 3 bytes - used indirect addressing +SD_TMP_DATA = $0083 ; 3 bytes - used indirect addressing +SD_DATA_FAT_PAGE = $0086 ; 2 bytes - last FAT page that was loaded +SD_MULT_AREA = $0088 ; 4 bytes + ; File System Offsets SD_FIRST_SECTOR = $5F00 ; 4 bytes SD_FAT_OFFSET = $5F04 ; 4 bytes @@ -13,21 +19,18 @@ SD_ROOT_OFFSET = $5F08 ; 4 bytes SD_DATA_OFFSET = $5F0C ; 4 bytes SD_RESERVED_SECTORS = $5F10 ; 2 bytes -SD_SECTORS_PER_FAT = $5F12 ; 2 bytes -SD_BYTES_PER_SECTOR = $5F14 ; 2 bytes -SD_FAT_COUNT = $5F16 ; 2 bytes -SD_SECTORS = $5F18 ; 4 bytes -SD_ROOT_ENTRIES = $5F1C ; 2 bytes +SD_SECTORS_PER_FAT = $5F12 ; 4 bytes - changed to 4 to allow FAT32 partitons +SD_BYTES_PER_SECTOR = $5F16 ; 2 bytes +SD_FAT_COUNT = $5F18 ; 2 bytes +SD_SECTORS = $5F1A ; 4 bytes +SD_ROOT_ENTRIES = $5F1E ; 2 bytes SD_DIR_OFFSET = $5F20 ; 2 bytes - use this to read the root directory -SD_NEXT_CLUSTER = $5F22 ; 2 bytes - use this to point to the next file cluster in the FAT +SD_NEXT_CLUSTER_NU = $5F22 ; 2 bytes - use this to point to the next file cluster in the FAT SD_SECTORS_PER_CLUSTER = $5F24 ; 2 byte -SD_FAT16 = $5F26 ; 1 byte - write 1 for FAT16, 0 for FAT12 +SD_FAT16_32 = $5F26 ; 1 byte - write 2 for FAT32, 1 for FAT16, 0 for FAT12 CLUSTER_PTR = $5F27 ; 2 bytes LOG_CLUSTER_PTR = $5F29 ; 4 bytes -SD_DATA = $0080 ; 3 bytes - used indirect addressing -SD_TMP_DATA = $0083 ; 3 bytes - used indirect addressing -SD_DATA_FAT_PAGE = $0086 ; 2 bytes - last FAT page that was loaded -SD_MULT_AREA = $0088 ; 4 bytes +; store cluster data here SD_BLK_BEGIN = $6000 ; 512 bytes SD_BTSCT_BEGIN = $6200 ; 512 bytes SD_ROOT_BEGIN = $6400 ; 512 bytes @@ -73,7 +76,6 @@ ISDOS_INIT setal LDA #0 STA SD_ROOT_OFFSET - STA SD_NEXT_CLUSTER setas ; SD Card is not present @@ -134,7 +136,7 @@ CALC_OFFSET_BYTES ; Affects: ; None ;****************************************************************************** -ISDOS_READ_MBR_BOOT +ISDOS_READ_MBR_AND_BOOT_SECTOR .as LDA SDCARD_PRSNT_MNT ; this must be non-zero BNE RMBR_CARD_PRESENT @@ -190,7 +192,7 @@ ISDOS_READ_MBR_BOOT LDA #0 STA SD_DATA + 2 - ; read the FAT Boot Sector - this overwrites the MBR record + ; read the Boot Sector setas JSL ISDOS_READ_BLOCK @@ -240,7 +242,7 @@ ISDOS_READ_MBR_BOOT BCS SD_SMALL_SECTORS ; number of sectors is more than fat12 can handle setas LDA #0 - STA SD_FAT16 + STA SD_FAT16_32 setal BRA SD_FAT12 @@ -250,17 +252,34 @@ ISDOS_READ_MBR_BOOT STA SD_SECTORS LDA SD_BTSCT_BEGIN,X + $22 STA SD_SECTORS + 2 + LDA #$FFFF + STA SD_ROOT_ENTRIES SD_SMALL_SECTORS setas LDA #1 - STA SD_FAT16 + STA SD_FAT16_32 setal SD_FAT12 LDA SD_BTSCT_BEGIN,X + $E STA SD_RESERVED_SECTORS LDA SD_BTSCT_BEGIN,X + $16 + BEQ SD_FAT32_SECTORS ; if sectors per FAT is 0, then this is a FAT32 partition STA SD_SECTORS_PER_FAT - + LDA #0 + STA SD_SECTORS_PER_FAT + 2 + BRA SD_COMPUTE_OFFSETS + + SD_FAT32_SECTORS + setas + LDA #2 ; identify the FAT32 partition + STA SD_FAT16_32 + setal + LDA SD_BTSCT_BEGIN,X + $24 + STA SD_SECTORS_PER_FAT + LDA SD_BTSCT_BEGIN,X + $26 + STA SD_SECTORS_PER_FAT+2 + + SD_COMPUTE_OFFSETS JSR COMPUTE_FAT_ROOT_DATA_OFFSETS RMBR_DONE RTL @@ -719,7 +738,7 @@ ISDOS_PARSE_ROOT_DIR ; ***************************************************************************** ; * Load the FAT table -; * A must contain the sector to read +; * 'A' must contain the sector to read ; ***************************************************************************** ISDOS_READ_FAT_SECTOR .al @@ -769,8 +788,8 @@ ISDOS_READ_FAT_SECTOR ; ***************************************************************************** ; * Load Data Cluster -; * A must contain the cluster to read; -; * subsctract 2 and then multiplied by sectors by cluster. +; * 'A' must contain the cluster to read +; * substract 2 and then multiplied by sectors by cluster. ; ***************************************************************************** ISDOS_READ_DATA_CLUSTER .al @@ -783,10 +802,24 @@ ISDOS_READ_DATA_CLUSTER RTL SDR_CARD_PRESENT + ; if FAT32, then add 32 pages to the cluster + LDA SD_FAT16_32 + AND #3 + CMP #2 + BEQ SDR_FAT32 + PLA ; offset by 2 and multiply by sectors by cluster SEC SBC #2 + BRA SDR_FAT_ADJ_CONTINUE + + SDR_FAT32 + PLA + SEC + SBC #6 + + SDR_FAT_ADJ_CONTINUE STA UNSIGNED_MULT_A LDA SD_SECTORS_PER_CLUSTER STA UNSIGNED_MULT_B @@ -853,7 +886,7 @@ ISDOS_READ_DATA_CLUSTER ; ***************************************************************************** -; * A contains the cluster to start at. +; * 'A' contains the cluster to start at. ; * SD_DATA must contain the pointer to write file data to. ; ***************************************************************************** ISDOS_READ_FILE @@ -874,18 +907,19 @@ ISDOS_READ_FILE JSL ISDOS_READ_DATA_CLUSTER - LDA SD_FAT16 - AND #$1 + LDA SD_FAT16_32 + AND #$3 ASL TAX JSR (READ_FAT_TABLE,X) - ; the last command is a compare + ; the last command in the subroutine is a compare BNE SD_CLUSTER_LOOP RTL READ_FAT_TABLE .word <>FAT12_GET_NEXT_CLUSTER .word <>FAT16_GET_NEXT_CLUSTER + .word <>FAT32_GET_NEXT_CLUSTER ; ***************************************************************************** ; * Read the FAT12 to determine the next cluster to read. @@ -916,7 +950,7 @@ FAT12_GET_NEXT_CLUSTER CMP #$FFF RTS - .comment + .comment - what is this??? ; maintain the location of file pointer LDA SD_DATA STA SD_TMP_DATA @@ -939,14 +973,15 @@ FAT12_GET_NEXT_CLUSTER LDA #$FFF STA CLUSTER_PTR + RTS - .endc + .endc ; ***************************************************************************** ; * Read the FAT16 to determine the next cluster to read. ; ***************************************************************************** FAT16_GET_NEXT_CLUSTER - + .al ; read the FAT page to read LDA CLUSTER_PTR XBA @@ -954,7 +989,7 @@ FAT16_GET_NEXT_CLUSTER ; avoid reloading the page CMP SD_DATA_FAT_PAGE - BEQ SKIP_FAT_LOADING + BEQ SKIP_FAT16_LOADING PHA ; ************************************** @@ -982,7 +1017,7 @@ FAT16_GET_NEXT_CLUSTER STA SD_DATA + 2 ; *************************************** - SKIP_FAT_LOADING + SKIP_FAT16_LOADING ; now read the 16-bit value LDA CLUSTER_PTR AND #$FF @@ -990,8 +1025,64 @@ FAT16_GET_NEXT_CLUSTER TAY LDA FAT_DATA,Y STA CLUSTER_PTR - CMP #$FFFF + CMP #$FFFF ; the branch instruction occurs upon return + RTS + +; ***************************************************************************** +; * Read the FAT32 to determine the next cluster to read. +; * The Foenix machine allows maximum 2GB SD Cards - so only the first two byes\ +; * of the FAT table need to be read. But one still needs to increase the +; * CLUSTER_PTR by 4 instead of 2. +; ***************************************************************************** +FAT32_GET_NEXT_CLUSTER + .al + ; read the FAT page to read + LDA CLUSTER_PTR + XBA + AND #$FF + + ; avoid reloading the page + CMP SD_DATA_FAT_PAGE + BEQ SKIP_FAT32_LOADING + + PHA + ; ************************************** + ; maintain the location of file pointer + LDA SD_DATA + STA SD_TMP_DATA + LDA SD_DATA + 2 + STA SD_TMP_DATA + 2 + + ; TODO load the FAT table + ; TODO find the next sector + LDA #FAT_DATA + STA SD_DATA + LDA #0 + STA SD_DATA + 2 + + ; load the FAT page + PLA + STA SD_DATA_FAT_PAGE + JSL ISDOS_READ_FAT_SECTOR + + LDA SD_TMP_DATA + STA SD_DATA + LDA SD_TMP_DATA + 2 + STA SD_DATA + 2 + ; *************************************** + + SKIP_FAT32_LOADING + ; now read the 16-bit value + LDA CLUSTER_PTR + AND #$FF + ASL A ; multiply by 4 + ASL A + TAY + LDA FAT_DATA,Y ; check for end of file + STA CLUSTER_PTR + CMP #$FFFF ; the branch instruction occurs upon return RTS + ; ***************************************************************************** ; * Add MBR offset and Reserved Sectors @@ -1014,7 +1105,7 @@ COMPUTE_FAT_ROOT_DATA_OFFSETS LDA SD_FIRST_SECTOR + 2 STA ADDER_B + 2 - ; result is 32 bites + ; result is 32 bytes LDA ADDER_R STA SD_FAT_OFFSET LDA ADDER_R + 2 @@ -1025,6 +1116,7 @@ COMPUTE_FAT_ROOT_DATA_OFFSETS STA UNSIGNED_MULT_A LDA SD_SECTORS_PER_FAT STA UNSIGNED_MULT_B + LDA UNSIGNED_MULT_RESULT STA SD_MULT_AREA LDA UNSIGNED_MULT_RESULT + 2 diff --git a/base.asm b/base.asm new file mode 100644 index 0000000..97355b5 --- /dev/null +++ b/base.asm @@ -0,0 +1,44 @@ +* = HRESET + CLC + XCE ; go into native mode + SEI ; ignore interrupts + JML TRACKER + +* = HIRQ ; IRQ handler. +RHIRQ + setaxl + PHB + PHD + PHA + PHX + PHY + ; + ; todo: look up IRQ triggered and do stuff + ; + JSL IRQ_HANDLER + + PLY + PLX + PLA + PLD + PLB + RTI + +; Interrupt Vectors +* = VECTORS_BEGIN +JUMP_READY JML TRACKER ; Kernel READY routine. Rewrite this address to jump to a custom kernel. +RVECTOR_COP .addr HCOP ; FFE4 +RVECTOR_BRK .addr HBRK ; FFE6 +RVECTOR_ABORT .addr HABORT ; FFE8 +RVECTOR_NMI .addr HNMI ; FFEA + .word $0000 ; FFEC +RVECTOR_IRQ .addr HIRQ ; FFEE + +RRETURN JML TRACKER + +RVECTOR_ECOP .addr HCOP ; FFF4 +RVECTOR_EBRK .addr HBRK ; FFF6 +RVECTOR_EABORT .addr HABORT ; FFF8 +RVECTOR_ENMI .addr HNMI ; FFFA +RVECTOR_ERESET .addr HRESET ; FFFC +RVECTOR_EIRQ .addr HIRQ ; FFFE diff --git a/boot-info.asm b/boot-info.asm index e1d109c..f7bd1c3 100644 --- a/boot-info.asm +++ b/boot-info.asm @@ -14,7 +14,7 @@ partentryrec .struct .ends bootrec .struct - void .fill 446 ; 16 lines + void .fill 446 ; 16 lines ; offset $1BE partition1 .dstruct partentryrec partition2 .dstruct partentryrec partition3 .dstruct partentryrec @@ -32,27 +32,27 @@ bootsector .struct .ends biosparamblock .struct - .fill 2 ; bytes per second - should be 512 - .fill 1 ; sectors per cluster - .fill 2 ; reserved sectors - .fill 1 ; Number of FATs - should be 2 - .fill 2 ; Root Entries - .fill 2 ; small sectors - 0 with large sectors set. - .fill 1 ; media type - $F8 hard disk - .fill 2 ; sectors per FAT - .fill 2 ; sectors per track - .fill 2 ; number of heades - .fill 4 ; hidden sectors - .fill 4 ; large sectors + .fill 2 ; bytes per sector - should be 512 ; offset 0x0B + .fill 1 ; sectors per cluster ; offset 0x0D + .fill 2 ; reserved sectors ; offset 0x0E + .fill 1 ; Number of FATs - should be 2 ; offset 0x10 + .fill 2 ; Root Entries ; offset 0x11 + .fill 2 ; small sectors - 0 with large sectors set. ; offset 0x13 + .fill 1 ; media type - $F8 hard disk ; offset 0x15 + .fill 2 ; sectors per FAT ; offset 0x16 + .fill 2 ; sectors per track ; offset 0x18 + .fill 2 ; number of heads ; offset 0x1A + .fill 4 ; hidden sectors ; offset 0x1C + .fill 4 ; large sectors ; offset 0x20 .ends extendedbiosprm .struct - .fill 1 ; physical disk number - floppies start at $0, hard disks at $80 - .fill 1 ; current heades - .fill 1 ; signature $28 or $29 - .fill 4 ; volume serial number - .fill 11 ; volume label - .fill 8 ; system id - FAT12 or FAT16 depending on format + .fill 4 ; logical sectors per FAT ; offset 0x24 + .fill 2 ; drive description ; offset 0x28 + .fill 2 ; version ; offset 0x2A + .fill 4 ; cluster number of root directory start ; offset 0x2C + .fill 2 ; Logical sector number of FS Information Sector ; offset 0x30 + .fill 2 ; first logical sector number of a copy of the three FAT32 boot sectors ; offset 0x32 .ends \ No newline at end of file diff --git a/bpm-to-timer-count.xlsx b/bpm-to-timer-count.xlsx index 78f3a27297ff2f0d6baf704d18e7a363c30192eb..f278765b8740b23f44095cd9ba9f4fc7614f8dba 100644 GIT binary patch delta 7602 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

Y2mYu}Baa+oY99Z2*Jq zwd6ZvF#I!|7?<=e>K5bwx%re zOWDed(EY9;MNY>4F}Yo1P4>Xd_RD-6xoW$dNPv+P zNb87|{rDSU!r$?j;9rC-%@LL|*5)=2f9%>VY56w~k%axjL+8&#N$-QD#so!I9?_UR zPU4&ut>%(nUMfB@Q=g|KdOmcyS9`mi{ByXCfyS19FAIC%m8)`Md6-N|EZA?peF36n zk*`cs>@ZTCWjZi&`s2zLFn}6!rWQ~3Fk5Snyh>FYHhA?z{xs=5E=%4X_kQ;b6nQI3 z&F4y?`D%_jn^F=wm>LCMT+$qyd;E0A|9K4`*YP|bM%S)Jds0kGHHHy# zKI!JSr*qjf7i`P83seR8C{(C8fC`5K~t_7LNysm!nxXvZ>KFqyNDuz$3h zeShM~<}v9IPrt-PTy*ZKig#g`;QW=WaS>&L`ZE>HCnr$dXWq{kENd7n#9MD~37jQh zRIZyR!DSdhed|2B%M&nw=|zbDb1Nz8xFaU48Ezpo2pL7B;u8fD=@#}FqX%v8EgFX|Rp#b^4tJ3p*B#ge zZ4`5i?^|t}CkJF3x%)-V2S262N^(ozaP!pL>cl9Lk@Ji^=PHMV4Qy|X^k=ez4X z3qT5+m;qQZSexX(0<$y2w}VN1rGKbv*N)1wwjhgar&j|$jQv&^a%pe`vASf2dQZ`Pizg2P&i2Se0?^!+$vIK_$iO{zp27sg*Oby26krQ|3<053Ia_3WY_;o%tCgsQ2_s8 z_rGg}nEzS(A8!92xn4sB1(ox68uR~prvD|Bznd~Y{b$p^^n%3XApX~Mk+dA7s28kA uAr5giUk(rm=4h$m;^^ecZSLgshlMm$z`r|zfBqP7L9pLlKQZn<(*FS|fBKpL delta 6017 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 SNJ9by00CbfFhkt`fc^_9y*-Hl diff --git a/c256-track-screenshot.png b/c256-track-screenshot.png index f1872caec2f3feb5eee234b1c2f1286ef6a9ab8b..c740e51865fdcd50768529d266b1ffe197afa78b 100644 GIT binary patch literal 194222 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%0Dd+lCu5O0 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

cMr&}G2zHxW26q>PM{IN*!QqnIA;|klOHDmn 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 z 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

dZcwkB$FZJs=`39y0W5q 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 |$nIsAH+dGZ*<BY|3 zBZcfawsku}DQunV2GPPKFZPm!nAWT3;19=4+=>Nb;j(5s_3@#n^-|Q zx^?dws<vGfEntA5gn5&xK1QMr>aJvn8>tKl|-h~+KO+@eU_84`Pe&r?2{(BF{ zyqUwCg!+q|he=1iF~8$}K1)iSYy7#a;Y3biyi%_AD058M%@5XJPd;6LVj-lX@7-9~ zS>L;z!8+TA2eu_Yy!lL9CH_*|fK%6v1ezkAj7>~Uj^39l-iI(hyJdOIeuA4_=5}1h z<`2%J$HHFpx?CEPZZ0;#Xgq@9DLf}?Lvsj34tx2ncL+$H}8L;@QfPv19HcOQJv0aMU1%GnN97lxMtg) z6(v1ko(q~hJXkF}{$ruauPDiwMgGhkEm~ahy2@W2JRtm*S3Rz8m#?_I zfmLYzx!S(;Dl6k`YL8hz_okY+M{4>$2XLx#o)TXeXpe1DIWT_k+P(SiizmN&Z!FUB zO)Ltvzw_$jDY0A3RaXu<=5XqZy-c6sn;z0}tl}o!#LO!&Fw(*B_2fLikPh!i`C~5P zPK9TR@RSS{xtZx#CoQ$FoeP?F_u9zg{7qB;!M81HO`dHbfjbwPlhT~k`};zq4Fn9g zm0}0{pSiIJhwq{FLmb(2m9Y`sd#=u$3m0v4CgJ%Sw=WN@aPh|*ReMJQ(oXnHH`iEO zObMJ+qDUnxH%S)Xx+#i&HtA}B14nIbEtyuj=)`8eZu9fw#On7C8d_eq-mY~)XNTQ= z?hLot>(X})Kgcp__+CA5@kRBCk{Gt`ue*X0do{^kXcot;`lzQl*irmW?v-&_#Z7>D zs@M3YPv5CAysZCADJjvlm*0k%07QcWU5!W;FQi)GgwW6nR#dSWbdg-+blSvFz( zV#=A0N6A{`jhloH?uZQ7_ht6SRW664_qQYu>OH@GC^4#ZkHvnalK4whURG-!kiI|2 zq^QG%6ZcX++i*EQ^kCu_ z-S!I^6D*G`Iy}7$h17vU%@kr+S1dJ9n&+g@Szd3eBuql~umEF;V85N#+-mwpPCUxD4x?|fr_i&KC zGVjgzIq}b@Dyy;8G8K2lNKVK-2;U@o(~wim;y@r*X7_ax`W;7g4As4kX!9LQ+?*VL zf!a*;#XZj*MjM`7x2evE(%5-cW!;vS;i)f-In+fD?R~X|vZD6o*yB?*ZvCt690VOs z+_zrv)aSx|yUm^I_l}Rt=<#Qpr}EEyv`5B^lcr*o1@FB+;qd9op?eEvXkke9^UlpM zo5g&uiq3wudq#;t-k@&FB;CSHkxLvCsr8YU2c?8bpZ1rkmn7ZP9?z>)QE0oIS#vJw z?baK8x1_o`3^XfwBST|J#!DL%c#4IeLQp+&IhcABp^ei5AlzsVL*)g`Raz8i(wCbm`!D`?(4khA$;N6GiTwDck#$FKC5)72S7`c+R#p zJ|V7#Iw&=vr{>lP$|sDKc@KLTkK1dS#eSKY4qv^er?Tc2-(lzd6nddXME5)+V$@tl zK?Q?eCb9nx?W2(mU)>Ts2e&yZw*OEyu|8_)O@83?*=}u;)m-7GBb^4c7Mw4b?7uzu zWbwFkO<2#X(kz)w3-<>$+B=n|`^p~NDHb>Gae92Q`teQ5!%bi8bIRUXo*B?dtL2uo z?O*LutB`b^U@-@EnG3$Nu}fyN0ZN(CA`@jZU6Kn*(by5J>mb*(W_;@G4^8c zS28F|G$(&4`|8fD$n5|Z(-Y>g?`1!%rZ)*aqg%a+#yj=XJ`VpM&zY2O_LuM^7LHPB z255Di?D45qf0ip3*;)RyNIKYCO8&k(ed2dhn}mpBle@F)wp8HaTwd;=|LlnKHTkY^ zobmSb;MtRo&EGvW_d8DN>IQmO@jF#MTd#T3I@DU&=+(f5yGbUqLtmY@I2xT)j1wg9 zrO^vFudhngjA?f4!xpDKFZ)~BU0qrWr#KItE zePSHVQ!j%Pl~Kv{hOSLjQeSe42KFDyF3tR*Eb{55ocP6&k?;7m8oC_(sq1(})6t0w zGy`57-rlA~q1GzJnT{taOxiEp%{zErkWDN`*;?c7p+0kxF5*>w>ZT{%YgOrJo~Ywu zYL&BYb6ZneA9&Tduqx+K>1BVOLi!kb&16~jFU3izJ%idDpBhix`E=4gl`6rQxSBtJ zJM^S=-%bsI7otjOSB!4l%lI+$MJr|OP|Pi=3%o_AL_U=gaY&h5urz)54>SEvt8>~U z9EY>aS>uRQKguNsB&{z#5`L{lrRUI%*^^WS$4a8ODA_C(JU1D=At`@mZT=`)?pVI( zKEC)l4^3@r<9e^}T&Vwa=*!(;-+9LgippTEgLY#*Biqtd46R!Y z7wokR^XIixIB|L0xrVX2YA3en#%*ENorI4#?#x+xpj~V3%xUhe)y{V(`R;wIj4Dzl zK4sWiOQd7I_U*u>E{~hf9FE2jg{j3u!pG-OrX+KJoW<@H{UegT9V3i++wU;x-yAy2 zHZw2?ACvjdj+SL+SIk_Q)SBv$Odq=2&6$r2aM&x-0mb!zzNBs!GySV zd^!teihQ;}mrWM_WX{k)cOG-)Q1Yn^W@$LfhVy(l&xW%soTlL<8BUVXBppq&V3q{) zbhyZdQ9fMc!Cd9$PrxOcuK9c$M7uEFgF(DQyWo~DR&2gx^IUPU45Bp{#v2d~Gdf$M z5iC}Gv1ALVWo(i1DB~gvWgf_!#~F)Kf1YTjPzd4`kCr?llchgj`ZEww;0jSzL4<1_ zL>b7VgvAky7y25rSP*@~*o$Ld2wzBFBuu1CW?ZhASovb*#Y->B2T?YN(m|AXaiY~E zlai6LV#1_gGS-X?g{BI+pf(qaf)S5n9*aQ8P$VOnjFWVnW;bbmL)XM|skwTc?Z7wb z?ibCs3AlZmY;Kd)t;~Os$uCmgCgL`UZrkvisjdN0 zg4;0JgbA+OFjZ{`xmdC|_v0K_-N-;Ru%TS!fhHPUNx&5sD|q8#qXt0IJ$?b4Uc11yl=&8xD^&)p}xK&qH}fL_1WH zV<-+#)+X2sm}6e#WIswyqxAk}`QO)@PjB~s-tPY#FaHRVUzxo3#EHq1FZMVL*i)=_ zh}FjKBVv5uY6p*ja*pXALq$Zx*<5L(NgXjSN%6WXkY6RjOz=J%) zWF$^wakvqOH)8iL*-W$bELYd}GJhws+bDYz<*(z_I9?BNe^!g5wi2%bOy3h5Pl9_- z9z1#U1o7a@y`St^a$xC^B`21geR=l99hPo@r2~_rHi4lcGrOOJH* zFikK$cn(v6p{y=>!W8!y{=+1}3%esEcJU@eIGf2_{%MW~Y2-e4NeHw1g z;pQ&f+z0D>zPe|t5B~DrTi$v3d61t5%cEj$=q({p)C%CemqY&pTYh9{s5H)l^rWYc z49^hq)vv+&H@^DF;5Ng8V2L&ZOh4QCV0r)t>3*PQq^*>pzJkgA|I`Nn4!YIC8vpsd_card_tester - JSR DISPLAY_MSG - ; initialize the SD Card - JSL ISDOS_INIT - JSL ISDOS_READ_MBR_BOOT - ; read the root sectors - JSL ISDOS_DISPLAY_ROOT_DIR - - ; These are temporary sub-routines to help me debug - ; READ the First FAT Sectors - setal - LDA #$6600 ; store the block at SD_DATA - STA SD_DATA - LDA #0 - JSL ISDOS_READ_FAT_SECTOR - - LDA #$6800 ; store the block at SD_DATA - STA SD_DATA - LDA #1 - JSL ISDOS_READ_FAT_SECTOR - - LDA #$6A00 ; store the block at SD_DATA - STA SD_DATA - LDA #4 - JSL ISDOS_READ_FILE - - LDA #$6A00 ; read file may change SD_DATA pointer - STA SD_DATA - setas - JSR DISPLAY_BLOCK - - SDCARD_DONE - BRL SDCARD_DONE - - - - -CLEAR_DISPLAY - .as - .xl - setal - LDA #SCREEN_WIDTH - STA COLS_PER_LINE - LDA #64 - STA LINES_MAX - - ; set the visible display size - 80 x 60 - LDA #80 - STA COLS_VISIBLE - LDA #60 - STA LINES_VISIBLE - setas - LDA #16 - STA BORDER_X_SIZE - STA BORDER_Y_SIZE - - ; set the border to purple - LDA #$80 - STA BORDER_COLOR_R - LDA #0 - STA BORDER_COLOR_B - STA BORDER_COLOR_G - - ; set the text color to 2 - LDA #$20 - STA CURCOLOR - - ; reset the position of the cursor to 0,0 - LDX #0 - LDY #0 - JSL LOCATE - - ; enable the border - LDA #Border_Ctrl_Enable - STA BORDER_CTRL_REG - - ; enable text display - LDA #Mstr_Ctrl_Text_Mode_En - STA MASTER_CTRL_REG_L - - setal - LDA #$60FF - STA FG_CHAR_LUT_PTR + 8; - STA BG_CHAR_LUT_PTR + 8; - LDA #$0080 - STA FG_CHAR_LUT_PTR + 10; - STA BG_CHAR_LUT_PTR + 10; - - LDA #<>CS_TEXT_MEM_PTR ; store the initial screen buffer location - STA SCREENBEGIN - STA CURSORPOS - setas - LDA #`CS_TEXT_MEM_PTR - STA SCREENBEGIN+2 - STA CURSORPOS+2 - - - setdbr $af - LDX #0 - LDY #0 - LDA #$20 - CD_CLEAR_LOOP - STA #$A000,b,X - STA #$C000,b,X - INX - CPX #$2000 - BNE CD_CLEAR_LOOP - setdbr $0 - - RTL - -.include "SDOS.asm" - -; ***************************************************************************** -; * Output text to screen - temporary until SDOS is finished -; * X contains the address of the message in the bank -; ***************************************************************************** -DISPLAY_MSG - .as - .xl - LDA #`sd_card_tester - PHB - PHA - PLB - JSL PUTS - PLB - RTS - - -; ***************************************************************************** -; * Display a block of data at SD_BLK_BEGIN (512 bytes) -; ***************************************************************************** -BLANK = 0 -DISPLAY_BLOCK - .as - .xl - PHB - LDA #$AF - PHA - PLB - - LDA #32 ; 32 x 16 is 512 bytes - STA LINE_COUNTER - - LDX SD_DATA - LDY CURSORPOS - DB_LINE_LOOP - LDA #0 - XBA - DB_LOOP - LDA 0, X - JSR DISPLAY_HEX - - ; display a blank - LDA #BLANK - STA #0,b,Y - INY - - INX - TXA - AND #$F - CMP #8 - BNE SKIP_COL - - ; every 8th column display an extra blank - LDA #BLANK - STA #0,b,Y - INY - SKIP_COL - TXA - AND #$F - BNE DB_LOOP - - setal - TYA - AND #$FF80 - CLC - ADC #$80 - TAY - setas - DEC LINE_COUNTER - BNE DB_LINE_LOOP - - PLB - RTL - -; ***************************************************************************** -; * Only display the 4 MBR Partition Records -; ***************************************************************************** -DISPLAY_PARTITION_RECS - .as - .xl - PHB - LDA #$AF - PHA - PLB - - LDA #5 ; display signature and 4 partition lines - STA LINE_COUNTER - - LDX #0 - DPR_LINE_LOOP - LDA #0 - XBA - DPR_LOOP - ; the partition tables start at byte 466 - LDA @lSD_BLK_BEGIN+430,X - JSR DISPLAY_HEX - - ; display a blank - LDA #BLANK - STA #0,b,Y - INY - - INX - TXA - AND #$F - CMP #8 - BNE DPR_SKIP_COL - - ; every 8th column display an extra blank - LDA #BLANK - STA #0,b,Y - INY - DPR_SKIP_COL - TXA - AND #$F - BNE DPR_LOOP - - setal - TYA - AND #$FF80 - CLC - ADC #$80 - TAY - setas - DEC LINE_COUNTER - BNE DPR_LINE_LOOP - - PLB - RTL - -; ***************************************************************************** -; * Display a Hex value -; * Accumulator A contains the value to display -; * Bank must be $AF -; * Y is the screen offset -; ***************************************************************************** -HEX_VALUES .text '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' -DISPLAY_HEX - .as - .xl - setal - PHX - - PHA - AND #$F0 - LSR - LSR - LSR - LSR - AND #$F - - ; display the first character in hex - tax - LDA @lHEX_VALUES,X - STA #0,b,Y - INY - - ; display the second character in hex - PLA - AND #$F - tax - LDA @lHEX_VALUES,X - STA #0,b,Y - INY - - PLX - setas - - RTS - -; ***************************************************************************** -; * Handle interrupts -; ***************************************************************************** -IRQ_HANDLER - .as - .xl - RTL \ No newline at end of file diff --git a/tracker.asm b/tracker.asm index 4d90e0d..0a83d25 100644 --- a/tracker.asm +++ b/tracker.asm @@ -33,49 +33,7 @@ CHAR_COPY = $81 ORDER_EDITOR_SCR = SCREEN_WIDTH * 7 + 53 PTRN_EDITOR_SCR = SCREEN_WIDTH * 27 + 4 -* = HRESET - CLC - XCE ; go into native mode - SEI ; ignore interrupts - JML TRACKER - -* = HIRQ ; IRQ handler. -RHIRQ setaxl - PHB - PHD - PHA - PHX - PHY - ; - ; todo: look up IRQ triggered and do stuff - ; - JSL IRQ_HANDLER - - PLY - PLX - PLA - PLD - PLB - RTI - -; Interrupt Vectors -* = VECTORS_BEGIN -JUMP_READY JML TRACKER ; Kernel READY routine. Rewrite this address to jump to a custom kernel. -RVECTOR_COP .addr HCOP ; FFE4 -RVECTOR_BRK .addr HBRK ; FFE6 -RVECTOR_ABORT .addr HABORT ; FFE8 -RVECTOR_NMI .addr HNMI ; FFEA - .word $0000 ; FFEC -RVECTOR_IRQ .addr HIRQ ; FFEE - -RRETURN JML TRACKER - -RVECTOR_ECOP .addr HCOP ; FFF4 -RVECTOR_EBRK .addr HBRK ; FFF6 -RVECTOR_EABORT .addr HABORT ; FFF8 -RVECTOR_ENMI .addr HNMI ; FFFA -RVECTOR_ERESET .addr HRESET ; FFFC -RVECTOR_EIRQ .addr HIRQ ; FFFE +.include "base.asm" * = $381000 @@ -138,9 +96,8 @@ TRACKER JSL IOPL2_TONE_TEST JSR ENABLE_IRQS - JSL OPL2_INIT - - CLI + JSL OPL3_INIT + JSR INIT_TIMER0 ; TIMER0 is setup for 50hz ; we allow input of data via MIDI JSR INIT_MIDI @@ -148,6 +105,8 @@ TRACKER JSR DISPLAY_ORDERS JSR DISPLAY_PATTERN + CLI + ALWAYS NOP NOP diff --git a/tracker.hex b/tracker.hex index fffc029..e26bf76 100644 --- a/tracker.hex +++ b/tracker.hex @@ -1,9 +1,9 @@ :1700600000000000000000000000170001010101000000000000006E :020000040038C2 :1A0F000000000000003031323334353637383941424344454600007D0101B6 -:07FF000018FB785CD36338A5 +:07FF000018FB785C3B64383C :11FF6000C2308B0B48DA5A22A451387AFA682BAB404B -:20FFE0005CD3633810FF20FF30FF40FF000060FF5CD3633810FF20FF30FF40FF00FF60FF78 +:20FFE0005C3B643810FF20FF30FF40FF000060FF5C3B643810FF20FF30FF40FF00FF60FFA6 :201000006B0181019801B001CA01E50102022002410263028702AE0200010208090A1011A1 :20102000120304050B0C0D131415101314121511100804020120406080E0C000244FF20B54 :20104000000E3100520B004143434F52444E2020200031436E17010222058B0C0242414714 @@ -352,7 +352,7 @@ :203BE0000000000000000000000000000000000000000000000000000000000000000000C5 :203C000000000000000000000000000000000000000000000000000000000000000000C2E2 :203C2000C200000000000000000000000000000000000000004332353620466F656E697859 -:203C400020547261636B6572000000005B56657273696F6E20302E332E315D0000000000CA +:203C400020547261636B6572000000005B56657273696F6E20302E342E305D0000000000CA :203C6000000000000000000000000000000000C2C2000000000000000000000000000000C0 :203C8000000000000000000000000000000000000000000000000000000000000000000024 :203CA00000000000000000000000000000000000000000000000000000000000000000C242 @@ -528,244 +528,248 @@ :2051E0008D4001202B55E220AD4101F04BAD41012901C901D0068D4101204252AD410129C1 :2052000008C908D0068D410120AA55AD41012910C910D0068D410120AB55AD41012920C92A :2052200020D0068D4101200D55AD41012940C940D0068D410120AC55E220AD4201F000C25C -:20524000306BA20000AF6010AF8D880FC210A0460020B157C901D00FAF150F38C902D007E9 -:2052600022476A384CE953C91AD008C66A204E654CE953C91BD008E66A204E654CE953C925 -:205280000CD01FAF150F38290FD014AF180F38C901F00CF838E9018F180F38D82061584C13 +:20524000306BA20000AF6010AF8D880FC210A0460020A357C901D00FAF150F38C902D007F7 +:2052600022B26A384CE953C91AD008C66A20B9654CE953C91BD008E66A20B9654CE953C9E4 +:205280000CD01FAF150F38290FD014AF180F38C901F00CF838E9018F180F38D82053584C21 :2052A000E953C90DD01FAF150F38290FD014AF180F38C930F00CF81869018F180F38D82063 -:2052C00061584CE953C927D00BAF170F38C904F0F13A800DC928D016AF170F38C9F0F0E2D1 -:2052E0001A8F170F3820C95A20C1644CE953C929D01CA900EBAF150F384829304A4AAA68D3 -:205300005FCD5A388F150F3820D65A4CE953C92AD003822C01C9AAD003823001C91DD003E5 +:2052C00053584CE953C927D00BAF170F38C904F0F13A800DC928D016AF170F38C9F0F0E2DF +:2052E0001A8F170F3820BB5A202C654CE953C929D01CA900EBAF150F384829304A4AAA6875 +:205300005FBF5A388F150F3820C85A4CE953C92AD003822C01C9AAD003823001C91DD00301 :20532000823401C99DD003823801C938D003823C01C9B8D003824001C948D01848AF150F04 -:2053400038290FD00320EC54C902D004226B5C38684CE953C950D01848AF150F38290FD09E -:205360000320A154C902D00422525C38684CE9532980C980D00AA900853220C636820001B3 +:2053400038290FD00320EC54C902D004225D5C38684CE953C950D01848AF150F38290FD0AC +:205360000320A154C902D00422445C38684CE9532980C980D00AA900853220C636820001C1 :20538000AD880FE210AAAD870F2910C910F026AD870F2920C920F024AD870F2940C940F094 -:2053A00035C210AD880F207168E210AE880FBF003938823400BF803938822D00BF003A38FC -:2053C000F027C902D00EAF150F38290FC902F004223A69388013BF803A38F00D290F20BBBA -:2053E00068C210206D5BE21060C210A04A0020B157C90DD01F48AF150F38F01BC902F0393E -:20540000AF4C010009048F4C0100A9008F150F3820976C684C8054AD870FD0062079642032 -:205420006158A9018F150F3820B56CAF4C010029FB8F4C0100684C805468220F6A384C8052 +:2053A00035C210AD880F20DC68E210AE880FBF003938823400BF803938822D00BF003A3891 +:2053C000F027C902D00EAF150F38290FC902F00422A569388013BF803A38F00D290F2026E4 +:2053E00069C210205F5BE21060C210A04A0020A357C90DD01F48AF150F38F01BC902F03959 +:20540000AF4C010009048F4C0100A9008F150F3820026D684C8054AD870FD00620E464205B +:205420005358A9018F150F3820206DAF4C010029FB8F4C0100684C805468227A6A384C8089 :2054400054AD870F09108D870F4C8054AD870F29EF8D870F4C8054AD870F09208D870F4CE0 :205460008054AD870F29DF8D870F4C8054AD870F09408D870F4C8054AD870F29BF8D870FAD -:20548000AF6410AF2901C901D0034C455260AF150F382901F045AF160F381ACF696A38D0F6 +:20548000AF6410AF2901C901D0034C455260AF150F382901F045AF160F381ACFD46A38D08B :2054A0003CA56C8903D00CAF80E8AF29FD09028F80E8AF18F8E66CAF190F386901C965D0C1 -:2054C00007A901646C209A64D88F190F38206158AF150F382901F00320B56CA9008F160FC7 +:2054C00007A901646C200565D88F190F38205358AF150F382901F00320206DA9008F160FFD :2054E00038AF80E8AF29FD8F80E8AF6038F8C66CAF190F38E901D006A93F856CA964D88F04 -:20550000190F38206158A9008F160F386048C210AF3113AF85612980C980F00DAF3013AF2B +:20550000190F38205358A9008F160F386048C210AF3113AF85612980C980F00DAF3013AF39 :2055200020D955A561C980D0E76860AF6010AF48A20000E210A6E0D00629078F000F3868DB :205540009F0607AFE8E003D02CAF0207AF85E1AF0307AF85E2AF0407AF85E3AF0507AF85CD -:20556000E418AF000F38C210A03C0020B157E210207A55A20086E0C21060E220AF000F3850 +:20556000E418AF000F38C210A03C0020A357E210207A55A20086E0C21060E220AF000F385E :20558000F026C22018AF0207AF4A4A4A851A8F1400AF18AF0407AF4A4A4A851C8F1600AF71 :2055A000E220A9038F1000AF60606060606B48E22064606466A9058F3011AFA93F8F3113E4 -:2055C000AFA06603AF3013AF20B157C8C8AF3113AF2980C980D0ED6860C2104810164829F0 -:2055E0000F85636829704A4A4A8562C90ED01120C256800C48E210A562AA68FC2869C210C0 -:205600006860A66095648A1A8560C902D0716460A9008527C210A562A0020420B157A56465 -:205620008F120100A0040420B157A9008F1101008F130100A90C8F10010038AF140100E9D1 -:20564000028531A0080420B157AF1601008530A00A0420B157A565A00C0420B157C900D0F2 -:205660000F8532A9FFA00E0420B15720C636800FA9018532C22020F53722013238E220E237 -:205680001060A66095648A1A8560C902D01CC210A562A0A20420B157A564A0A40420B1579B -:2056A000A565A0A60420B15764606048C210A562A0F20420B15768A0F40420B157A9108505 -:2056C0006260C210AF6600001AC903D002A900A0420520B1578F6600006060A9508511A9C4 -:2056E000408515A950850FA93C8513A9008F0800AF8F0900AFE220A9208F0500AF8F0700EC -:20570000AFA9008F0600AFA9018F0400AFA9018F0000AFC220A900A0850C8517E220A9AF67 -:20572000850E8519C230A9BF08A2803BA000A054AF38A90008A28045A0008054AF38A9FFE3 -:20574000608F481FAF8F881FAFA980008F4A1FAF8F8A1FAFA920808F4C1FAF8F8C1FAFA924 -:2057600010008F4E1FAF8F8E1FAFA9CCCC8F501FAF8F901FAFA9CC008F521FAF8F921FAF95 -:20578000A922DD8F541FAF8F941FAFA9DD008F561FAF8F961FAFA20014E220A9209FFFBFB5 -:2057A000AFCAD0F9A0E00B20795A20D65A206D5B6048DA5A8F010F3829F04A4A4A4AE2100B -:2057C000AABF050F388F030F38AF010F38290FAABF050F388F040F38C2307AAF030F389781 -:2057E0000CA93030BB9F00C0AFE220FA6860DAC900F025A94F970CA930BB9F00C0AFC8A9A1 -:205800006E970CA930BB9F00C0AFC8A920970CA930BB9F00C0AF8023A94F970CA930BB9F8E -:2058200000C0AFC8A966970CA930BB9F00C0AFC8A966970CA930BB9F00C0AFFA60A90A8F25 -:20584000010F38A767970CE667D002E668A930BB9F00C0AFC8AF010F383A8F010F38D0E3BD -:20586000608B0BA9398572AF180F38A0430720B1573A8F0001009C0101C220A901078F02AD -:205880000100AF0401001A8570E220AF190F38A0370720B157A920856EA0C0A8A56CC90A85 -:2058A000B02F38A909E56CF015856DC220A94F00A2404454AF38E220C66EC66DD0EDC22094 -:2058C000A94F00A2504354AF38E220C66EA901800538A56CE909856DA90048ABA91C8F00DE -:2058E00001009C01019C0301A56D3A8F020100C220AF0401008573E220A56D2903F015C2F6 -:2059000020A94F00A2E04454AF38E220209359C66E4C2659C220A94F00A2904454AF38E2F4 -:2059200020209359C66EE66DA56DC941F006A56ED0A6F022C220A94F00A2F04354AF38E23B -:2059400020A56EF011C220A94F00A2404454AF38E220C66ED0EF2BAB60A00000A26307B74A -:20596000515A9B970CE87AC8C00800D008A92E5A9B970CE87AC00B00D0E59BC8C8A9769742 -:205980000CC8AF676A388902D004A9318002A932970C605ADAA90985F7C2209838E950A0F5 -:2059A000AAE220A473C8644EB770E8C8C900D004E8E8800320555A2A900BA9315A9B970CDD -:2059C0007AA910854EE8B770C820E259C900D004E8E88005B77020345AC8E8C6F7D0C7FACA -:2059E0007A605A489BA20000EBA900EB29F0D009A54ED003C8800EA9004A4A4A4AAABF0522 -:205A00000F38970CC868290FF007AABF050F38970CC8BB7A605A489B29F04A4A4A4AAABFA1 -:205A2000050F38970CC868290FAABF050F38970CC8BB7A60482907856F6829F8184A4A4A6F -:205A40008576F8F00918A9006908C676D0FA656F20155AD8605A48489BC220290F00AAE25C -:205A600020BF5A6A38970CC86829704A4A4A4A186930970CC8BB687A608BA9AF48ABA90916 -:205A8000856DA9429900C0C89900C0C89900C0C8A9529900C0C89900C0C8A9429900C0C87D -:205AA0009900C0C89900C0C8C8C66DD0D5AB605AAF696A38A0580720B157AF6A6A38F0070C -:205AC000A92AA05707970C7A6060402020102040203020204020A900EBAF150F3829304AF6 -:205AE0004A4848AABFCA5A38A20A00A09621970CC8CAD0FAA0E421970C68AABFCB5A38A2ED -:205B00000500A0C521970CC8CAD0FA68AABFCC5A38A20900A02128970CC8C8C8C8C8970C0A -:205B2000C8C8C8C8CAD0F0206D5B60AF686A38F03BC90E9002A90E856DA20000A06502C212 -:205B400020A924FC85F0A9390085F2E2208A20B157C8C8C85A9BB7F01A7A20B157E8C22060 -:205B60009818694D00A8E220C66DD0E160A20900A06B28BFB16838F006A940970C8004A934 -:205B800020970C888888888888888888CAD0E4605AA41A970CC8841A7A6BC220A51A29E0EC -:205BA000FF18696F00851AE2206B8B4808E220A90048AB2868BD0000F00722905B38E88080 -:205BC000F4AB605AA00B00B751C910D023A9E022905B38A00000B75122905B38C8C00800A2 -:205BE000D0F4A92022905B38C8C01100D0F48033A92022905B38A00000B75122905B38C800 -:205C0000C00800D0F4A92E22905B38B75122905B38C8C00B00D0F4A92022905B38C8C01092 -:205C200000D0F47A6B48C230A900C08517AD1F038D0001A950008D0201AD040118698F03D1 -:205C4000A8E220A9AF8519A21200689717C8CAD0FA6B18AD1F031AC926B00FA95022255CC8 -:205C600038EE1F03A90522255C386B18AD1F033A30F8A95022255C38CE1F03A90522255C8A -:205C8000386BAF80E8AF29FD09028F80E8AFC220A900008D085F8D225FE220853FA9018F38 -:205CA00002EAAFA9018F03EAAFAF04EAAF2901C901F0F6AF05EAAFF008A2916220AA5B80CF -:205CC00006A901853F8000AF80E8AF29FD8F80E8AF6BA58A0A858B18A5880A85899002E6B5 -:205CE0008BE2206488C22060A53FD0016BC220A900608580A900008582A900008F07EAAF51 -:205D00008F09EAAFE22022D25D38AF05EAAFF0016BC220ADFE61C955AAF0016BC220A2BECA -:205D200001BD08608588BD0A60858A20D25CA5888D005F8F07EAAFA58A8D025F8F09EAAF16 -:205D4000A900628580A900008582E22022D25D38AF05EAAFF0016BC220A20000BD0B628D14 -:205D6000145FE220BD0D628D245FA9008D255FC220BD106229FF008D165FBD11628D1C5F45 -:205D8000BD1362F0288D185FA900008D1A5FAD185F8D1201AD245F8D1001AD1401C9F70FE3 -:205DA000B017E220A9008D265FC2208015BD20628D185FBD22628D1A5FE220A9018D265FA0 -:205DC000C220BD0E628D105FBD16628D125F20C1616B5AAF80E8AF29FD09028F80E8AFA53C -:205DE0003FD002802DA9028F02EAAFA9018F03EAAFAF04EAAF2901C901F0F6AF05EAAFF0D8 -:205E000002800FA00000AF10EAAF9780C8C00002D0F4A9018F14EAAFAF80E8AF29FD8F80B3 -:205E2000E8AF7A6B48A00000B78022181000C8C00800F007C00B00D0EF800E68488918D0BD -:205E4000E7A92E2218100080DF688918D03BA9388B48ABA2C063221C1000ABA01B00B780B8 -:205E600022801000A01A00B78022801000A9388B48ABA2CB63221C1000ABA01F00B780228D -:205E800080100088C01B00D0F4A90D2218100060A53FD0016BC220A900008D205FA9006427 -:205EA0008580A900008582AD205F0AEB8D2001A900008D2201AD085F8D2401AD0A5F8D2676 -:205EC00001AD28018F07EAAFAD2A018F09EAAFE22022D25D38AF05EAAFF008A2316320AAE3 -:205EE0005B806AA780D0045C4D5F38C9E5F035A00B00B780C90FD0045C785F388902F002D9 -:205F000080228908F0045C635F388910F0045C4E5F3848A9388B48ABA2B263221C1000ABDF -:205F20006820245EC220A58029E001C9E001D00FAD205F1ACD1C5FB0148D205F4C9D5EA573 -:205F400080186920008580E2205CE35E386B48A9388B48ABA2A463221C1000AB6820245E86 -:205F60004C245F48A9388B48ABA28863221C1000AB6820245E4C245F4C245FA00B00C910F9 -:205F8000F002A9019751A00000A20B00B7809751C8CAD0F8C220A01A00B780A0100097514C -:205FA000A01C00B780A00C009751A01E00B780A00E009751A551186912008551E22060A569 -:205FC0003FD0016BC220A900008D205FA900648580A900008582AD205F0AEB8D2001A90075 -:205FE000008D2201AD085F8D2401AD0A5F8D2601AD28018F07EAAFAD2A018F09EAAFE22051 -:2060000022D25D38AF05EAAFF0045C6A6038A780D0045C6A6038C9E5F027A00B00B780C98F -:206020000FD0045C4160388902F00280148908F0045C4160388910F005207B5F8003207BD7 -:206040005FC220A58029E001C9E001D00FAD205F1ACD1C5FB0148D205F4CCC5FA5801869CC -:2060600020008580E2205C0E60386B48A53F29FF00D002686B688588A90000858A20D25C18 -:20608000A5888D2001A58A8D2201AD045F8D2401AD065F8D2601AD28018F07EAAFAD2A01E1 -:2060A0008F09EAAFE22022D25D38AF05EAAFF008A2126320AA5B8000C2206B48A53F29FF82 -:2060C00000D002686B6838E902008D0001AD245F8D0201AD040148A200008588A90000856B -:2060E0008A20D25CA5888D2001A58A8D2201AD0C5F8D2401AD0E5F8D2601AD28018F07EA20 -:20610000AFAD2A018F09EAAFE22022D25D38AF05EAAFF00AA9FF8D275F8D285F8017C220AD -:20612000A5801869000285809002E682681A48E8EC245FD0A5C220686B48A53F29FF00D049 -:2061400002686B688D275F22BB6038AD265F2901000AAAFC5961D0EF6B5D618261AD275FB6 -:206160004A900E186D275FA8B900664A4A4A4A800A6D275FA8B9006629FF0F8D275FC9FFE7 -:206180000F60AD275FEB29FF00C586F02248A5808583A5828585A900668580A90000858283 -:2061A000688586226B6038A5838580A5858582AD275F29FF000AA8B900668D275FC9FFFFE3 -:2061C00060AD105F8588A90000858A20D25CA5888D2001A58A8D2201AD005F8D2401AD0209 -:2061E0005F8D2601AD28018D045FAD2A018D065FAD165F8D0001AD125F8D0201AD04018567 -:2062000088AD0601858A20D25CA5888D2001A58A8D2201AD045F8D2401AD065F8D2601ADF6 -:2062200028018D085FAD2A018D0A5FAD085F8D2001AD0A5F8D2201A920008588A9000085E7 -:206240008A20D25CA5888D2401A58A8D2601AD28018D0C5FAD2A018D0E5F603030202D20D7 -:2062600057656C636F6D6520746F2074686520534443617264205465737465720D003031B8 -:20628000202D20436172642050726573656E740D003031202D204E4F2053444341524420AD -:2062A00050524553454E540D003032202D2043616E27742072656164204D4252202D204EBC -:2062C0006F20436172642070726573656E740D003033202D204572726F7220647572696E6B -:2062E000672072656164206F7065726174696F6E0D003034202D204572726F72207265614A -:2063000064696E6720426F6F7420736563746F720D003035202D204572726F722072656136 -:2063200064696E672046415420736563746F720D003035202D204572726F7220726561646B -:20634000696E6720526F6F7420736563746F720D003035202D204572726F722072656164E6 -:20636000696E67204461746120736563746F720D00496E76616C6964204D4252205369677D -:206380006E61747572650D00566F6C756D65204E616D653A200056464154204E616D6520FC -:2063A000203A20004469726563746F727920203A200046696C656E616D652020203A200039 -:2063C0002C20436C75737465723A002C2053697A653A00A9FF8F4801008F4901008F4A0101 -:2063E00000A9FF8F4C01008F4D01008F4E010020DB56202C6720C367203764207964A93877 -:206400008569A9428F6A0000A20000A900EBDABF181038AA204E65FAE8E00900D0ED2279DB -:20642000303820586422B130385820AE55202B5B206158EAEA80FC48A9E98F1200AFA900C0 -:206440008F1000AFC230A900008F1400AFA900008F1600AFE2206860AF40010029848F40CE -:206460000100AF41010029A18F410100A97B8F4C0100A95E8F4D010060A9008F150F388532 -:2064800048646C6449A9018F190F38A648BF24FC391A8F180F3820AF5A6048A900EBAF4834 -:2064A00000001ACF686A38D002A9008F480000AAA0900120B157BF24FC391A8F180F38680C -:2064C000608BA90048ABA9038D00019C01019C030138AF170F38E9048D0201C220AD040167 -:2064E000AAE220A9008D61018D62018D6301BF00003A8D6501BF01003A8D6601BF02003AA2 -:206500008D6701A9018D6401A90B8D6001AB608BA90048ABE220A9008D61018D62018D639C -:2065200001A9018D6401A90B8D6001AB60A9808F04E6AF204765A9108F02E6AF8F03E6AFEE -:20654000A9038F04E6AF60A23002CAD0FD60AF6A00008F000100A9008F0101008F030100C6 -:20656000A9168F020100C220AF04010018693B108567E220AF6A0000A0A30120B157A767E7 -:20658000D04BE667D002E66820CE65E667D002E668203E66E667D002E668207866E667D067 -:2065A00002E66820B466E667D002E668DAA62720F066FAE667D002E668200C67C220A567DF -:2065C0006906008567E220A0A801203D5860A767484848489F20E7AF2980A03D0220EE5790 -:2065E000682940A08D0220EE57682920A0DD0220EE57682910A02D0320EE5768290FA07E0D -:206600000320B157A00600B767484848489F23E7AF2980A0570220EE57682940A0A70220D2 -:20662000EE57682920A0F70220EE57682910A0470320EE5768290FA0980320B15760A76705 -:20664000489F40E7AF29C02A2A2AA0CE0320B15768293FA01E0420B157A00600B767489F18 -:2066600043E7AF29C02A2A2AA0E80320B15768293FA0380420B15760A767489F60E7AF29DF -:20668000F04A4A4A4AA06E0420B15768290FA0BE0420B157A00600B767489F63E7AF29F0C1 -:2066A0004A4A4A4AA0880420B15768290FA0D80420B15760A767489F80E7AF29F04A4A4AB8 -:2066C0004AA00E0520B15768290FA05E0520B157A00600B767489F83E7AF29F04A4A4A4AC5 -:2066E000A0280520B15768290FA0780520B15760A7674809F09FC0E7AF290E4AA06806206D -:20670000B157682901A0B80620B15760A7679FE0E7AF2907A0AE0520B157A00500B7679FC9 -:20672000E3E7AF2907A0C80520B157600B48DA0818E220A9008D870F20DA67A9AA8F6410E9 -:20674000AF20E567AF6010AFC955F003826F00A9AB8F6410AF20E567AF6010AFC900F00352 -:20676000825B00A9608F6410AF20DA67A9698F6010AF20DA67A9FF8F6010AFA2FFFFCAEA55 -:20678000EAEAEAEAEAEAEAE00000D0F220E567AF6010AF20DA67A9F48F6010AF20E567AFF0 -:2067A0006010AFC9FAD0EC20F067AF40010029808F400100AF41010029018F41010028FA4D -:2067C000682B60C230A2804DA90001A0000554AF38E220A9018F0007AF60AF6410AF29028D -:2067E000C902F0F660AF6410AF2901C901D0F66020DA67A9A88F6410AF20DA67A9A98F6492 -:2068000010AF20E567AF6010AFC900D0EC20DA67A9208F6410AF20E567AF6010AF09024891 -:2068200020DA67A9608F6410AF20DA67688F6010AFA9F6205668206968A9E820566820695F -:2068400068A900205668206968A9F4205668206968A90085E0604820DA67A9D48F6410AFA6 -:2068600020DA67688F6010AF6020E567AF6010AF6048DAE210AA3035BFC86838C210A09655 -:206880000020B1578F300000302329704A4A4A4A8F310000AF300000290F8F300000A900BE -:2068A0008F27000020F53722013238E220C210FA6860010101010101010101AACABFB2685D -:2068C0003849019FB268386080808031338036383A804180808080802C32343537393B3CEA -:2068E0004280808080808021238026282A808080808080801C22242527292B808080808018 -:20690000808080808080808080808080808080808080808080808080808080808080808077 -:2069200080808080808080800256025682568256AB56AB568256C256DA56C210A9028F15B4 -:206940000F3822825C38A9008D1F03A934855364526451205F69208A6920D069E2106BA9E6 -:2069600000A00004975188D0FBA53FF01C22E85C3822BF5F38C220A900668580A90000850E -:20698000828586226B6038E22060C230A900A0850CA900C08517E220A9AF850E8519A03EA9 -:2069A00003A9288580A28F03861AA20000A9148581BF804E38970CA9509717C8E8C681D0EF -:2069C000F0C2209818693C00A8E220C680D0DE6064516452A9348553A20000A00B00B7511D -:2069E000F02422C35B38C220A51A18693E00851AA5516912008551C98004B00AE8E02600D0 -:206A0000F004E22080D5E220A90522255C3860A900EBAD1F03C2308D0001A912008D020112 -:206A2000AD04018551A900808580A937008582A01000B75122396138E22022B13038226B43 -:206A40006A3822476A386B20796420DB56205959206158202B5B20AF5A6B439044914546B8 -:206A6000924793419442430000060022B1303820976CA20000A9009F000039E8D0F9C23026 -:206A8000A900808508A93700850AE220A01000B708C910D00522F76A386BC921D00422A309 -:206AA0006A386BA9028F676A3820B06A20826B6BA01100B7088940F017A9018F6A6A38A9A6 -:206AC0000F8D6501A9018D6601A90C8D670180238920F00AC8C220B708E220C88015A900B5 -:206AE0008F6A6A38A9988D6501A95E8D6601A9048D6701200F6560A9018F676A3820156B54 -:206B000020956B20BA6B20B06A6B0701080209030A04050B06C8B708291F8F696A38B70801 -:206B20002980F007C8B708C900D0F9C8A93885F2E220B708F04AC2203A8F000100A9160016 -:206B40008F020100AF04010018693B1085F0A90000E220C8644E87F0A64EBF0A6B38AAB751 -:206B6000085A9B97F07AC8E64EA54EC90B90E95AA00C00A92097F0C8C01600D0F87A80B075 -:206B8000C860B708C8C900D0F9A93885F2E220B708F000C860B7088F686A38AAC8C220A92E -:206BA00024FC85F0A9390085F2E220B708C887F0E6F0B002E6F1CAD0F26064F3A93985F6E8 -:206BC000C220B708F01F5AA8A5F329FF008F000100A901078F020100AF0401001A85F4E247 -:206BE0002020F26B7AC8C8E220E6F3A5F3C920D0CF60B7088F420000C8C220297F008F0022 -:206C00000100A91C008F020100AF0401001A8FFA0000E220A6FAB708C88FF90000290F8F4D -:206C2000F70000C2208A1865F765F765F7AAE220B7085A9B97F47AC8E8B7085A9B97F47AF7 -:206C4000C8E8290FF009B7085A9B97F47AC8E8AFF9000010BFAF4200001097605ADAA21293 -:206C600000A00000A92D970CC8CAD0FAFA7A605AA5F620B157C8C8A5F520B157C8C8A5F433 -:206C800020B1577A604848E2206820B15788886820B157C22068605AC220A900E7852CA960 -:206CA000AF00852EE220A0A000A900972CC8C0B900D0F87A605A205C6CC220AF180F382986 -:206CC000FF003A8F000100A901078F020100AF0401001A85F4E220A93985F6A0A000206F33 -:206CE0006CC220A56C297F008F000100A91C008F020100AF0401001AA0520020856CA8A984 -:206D00000000E22064288F270000AABFB26838D005C8C8C88058B7F4297F20D56EB7F429E5 -:206D2000804A4A4A854EC8B7F429F04A4A4A4A654EF0143A8F6A00005AA627A900EBBF18F2 -:206D40001038AA204E657AAF300000F011C90FF02BC2205A20F537220132387AE220A900E7 -:206D6000EBB7F4C8290FF0050AAAFC8D6DC8A900EBAF2700001AC909D08C7A60AF270000B4 -:206D80001869B0852CA900872CC8C880E1AD6D206E206EAD6DAD6DAD6DAD6DAD6DAD6DAD45 -:206DA0006DAE6DAD6D966E056EAD6D166E605AB7F4854CC220A900E7852CA9AF00852EE2D6 -:206DC00030A527AABF181038186940A8B72C48293F18654CC9409002A93F293F854E6829DA -:206DE000C0054E972CC8C8C8B72C48293F18654CC9409002A93F293F854E6829C0054E9710 -:206E00002CC2107A60B7F43A856CA9008F190F38209A647A7A60B7F48F696A3820AF5A60EC -:206E20005A4A8550B7F4854CC220A900E7852CA9AF00852EE230A5271869A0A8B72CC210D3 -:206E4000BBA05A0020B1579BE2104898186910A8B72C854EC210BBA0A80020B1572903A030 -:206E6000580020B1579BEB68AAA5508902F00AC2208A38E54CE2208008C2208A18654CE20A -:206E800020E210EB2903054E972C9838E910A8EB972CC2107A605AC220A900E7852CA9AF13 -:206EA00000852EE220B7F4297FF0013A493F854EE210A627BF181038186940A8B72C29C031 -:206EC00018654E972CC8C8C8B72C29C018654E972CC2107A605A4848AF2700000AA868F0FC -:206EE0000320B15729704A4A4A4A8F31000068290F8F3000007A605AE220A9018526C2201A -:206F0000A93800850AA53229FF003A0A0A0A0A18693B108508C220A9200022F53738E22014 -:206F2000A00000B708872CC220A9400022F53738E220A00200B708872CC220A9600022F5D6 -:206F40003738E220A00400B708872CC220A9800022F53738E220A00600B708872CC220A974 -:206F6000E00022F53738E220A00900B708290F872CA9008526C220A9200022F53738E220CF -:206F8000A00100B708872CC220A9400022F53738E220A00300B708872CC220A9600022F574 -:206FA0003738E220A00500B708872CC220A9800022F53738E220A07100B708872CC220A9A8 -:206FC000E00022F53738E220A00900B70829F04A4A4A4A872CA52718290F69C0852AA90050 -:1C6FE000852BC23018A900E7652A852CA9AF00852EE220A00800B708872C7A600A +:2055C000AFA06603AF3013AF20A357C8C8AF3113AF2980C980D0ED6860C2104810164829FE +:2055E0000F85636829704A4A4A8562C90ED01120C256800C48E210A562AA68FC9369C21055 +:205600006860A66095648A1A8560C902D0716460A9008527C210A562A0020420A357A56473 +:205620008F120100A0040420A357A9008F1101008F130100A90C8F10010038AF140100E9DF +:20564000028531A0080420A357AF1601008530A00A0420A357A565A00C0420A357C900D01C +:205660000F8532A9FFA00E0420A35720C636800FA9018532C22020F53722013238E220E245 +:205680001060A66095648A1A8560C902D01CC210A562A0A20420A357A564A0A40420A357B7 +:2056A000A565A0A60420A35764606048C210A562A0F20420A35768A0F40420A357A910852F +:2056C0006260C210AF6600001AC903D002A900A0420520A3578F6600006060A9008F0800CA +:2056E000AF8F0900AFE220A9208F0500AF8F0700AFA9008F0600AF8F0400AF8F0100AFA94A +:20570000018F0000AFC220A900A0850C8517E220A9AF850E8519C230A9BF08A2803BA00008 +:20572000A054AF38A90008A28045A0008054AF38A9FF608F481FAF8F881FAFA980008F4A87 +:205740001FAF8F8A1FAFA920808F4C1FAF8F8C1FAFA910008F4E1FAF8F8E1FAFA9CCCC8F9A +:20576000501FAF8F901FAFA9CC008F521FAF8F921FAFA922DD8F541FAF8F941FAFA9DD003B +:205780008F561FAF8F961FAFA20014E220A9209FFFBFAFCAD0F9A0E00B206B5A20C85A2071 +:2057A0005F5B6048DA5A8F010F3829F04A4A4A4AE210AABF050F388F030F38AF010F38299B +:2057C0000FAABF050F388F040F38C2307AAF030F38970CA93030BB9F00C0AFE220FA68608D +:2057E000DAC900F025A94F970CA930BB9F00C0AFC8A96E970CA930BB9F00C0AFC8A9209768 +:205800000CA930BB9F00C0AF8023A94F970CA930BB9F00C0AFC8A966970CA930BB9F00C08D +:20582000AFC8A966970CA930BB9F00C0AFFA60A90A8F010F38A767970CE667D002E668A9F2 +:2058400030BB9F00C0AFC8AF010F383A8F010F38D0E3608B0BA9398572AF180F38A0430705 +:2058600020A3573A8F0001009C0101C220A901078F020100AF0401001A8570E220AF190FE5 +:2058800038A0370720A357A920856EA0C0A8A56CC90AB02F38A909E56CF015856DC220A994 +:2058A0004F00A2404454AF38E220C66EC66DD0EDC220A94F00A2504354AF38E220C66EA9E9 +:2058C00001800538A56CE909856DA90048ABA91C8F0001009C01019C0301A56D3A8F020108 +:2058E00000C220AF0401008573E220A56D2903F015C220A94F00A2E04454AF38E220208553 +:2059000059C66E4C1859C220A94F00A2904454AF38E220208559C66EE66DA56DC941F00619 +:20592000A56ED0A6F022C220A94F00A2F04354AF38E220A56EF011C220A94F00A240445478 +:20594000AF38E220C66ED0EF2BAB60A00000A26307B7515A9B970CE87AC8C00800D008A976 +:205960002E5A9B970CE87AC00B00D0E59BC8C8A976970CC8AFD26A388902D004A9318002EC +:20598000A932970C605ADAA90985F7C2209838E950A0AAE220A473C8644EB770E8C8C9005F +:2059A000D004E8E8800320475A2A900BA9315A9B970C7AA910854EE8B770C820D459C900D5 +:2059C000D004E8E88005B77020265AC8E8C6F7D0C7FA7A605A489BA20000EBA900EB29F088 +:2059E000D009A54ED003C8800EA9004A4A4A4AAABF050F38970CC868290FF007AABF050FAD +:205A000038970CC8BB7A605A489B29F04A4A4A4AAABF050F38970CC868290FAABF050F385B +:205A2000970CC8BB7A60482907856F6829F8184A4A4A8576F8F00918A9006908C676D0FA57 +:205A4000656F20075AD8605A48489BC220290F00AAE220BFC56A38970CC86829704A4A4AFE +:205A60004A186930970CC8BB687A608BA9AF48ABA909856DA9429900C0C89900C0C8990083 +:205A8000C0C8A9529900C0C89900C0C8A9429900C0C89900C0C89900C0C8C8C66DD0D5ABA8 +:205AA000605AAFD46A38A0580720A357AFD56A38F007A92AA05707970C7A60604020201093 +:205AC0002040203020204020A900EBAF150F3829304A4A4848AABFBC5A38A20A00A09621A0 +:205AE000970CC8CAD0FAA0E421970C68AABFBD5A38A20500A0C521970CC8CAD0FA68AABF42 +:205B0000BE5A38A20900A02128970CC8C8C8C8C8970CC8C8C8C8CAD0F0205F5B60AFD36AA3 +:205B200038F03BC90E9002A90E856DA20000A06502C220A924FC85F0A9390085F2E2208A42 +:205B400020A357C8C8C85A9BB7F01A7A20A357E8C2209818694D00A8E220C66DD0E160A2C9 +:205B60000900A06B28BF1C6938F006A940970C8004A920970C888888888888888888CAD099 +:205B8000E4605AA41A970CC8841A7A6BC220A51A29E0FF18696F00851AE2206B8B4808E259 +:205BA00020A90048AB2868BD0000F00722825B38E880F4AB605AA00B00B751C910D023A9C5 +:205BC000E022825B38A00000B75122825B38C8C00800D0F4A92022825B38C8C01100D0F41E +:205BE0008033A92022825B38A00000B75122825B38C8C00800D0F4A92E22825B38B7512287 +:205C0000825B38C8C00B00D0F4A92022825B38C8C01000D0F47A6B48C230A900C08517ADEB +:205C20001F038D0001A950008D0201AD040118698F03A8E220A9AF8519A21200689717C834 +:205C4000CAD0FA6B18AD1F031AC926B00FA95022175C38EE1F03A90522175C386B18AD1FF6 +:205C6000033A30F8A95022175C38CE1F03A90522175C386BAF80E8AF29FD09028F80E8AF86 +:205C8000C220A900008D085FE220853FA9018F02EAAFA9018F03EAAFAF04EAAF2901C901D6 +:205CA000F0F6AF05EAAFF008A2F962209C5B8006A901853F8000AF80E8AF29FD8F80E8AF9F +:205CC0006BA58A0A858B18A5880A85899002E68BE2206488C22060A53FD0016BC220A900D5 +:205CE000608580A900008582A900008F07EAAF8F09EAAFE22022E65D38AF05EAAFF0016B3E +:205D0000C220ADFE61C955AAF0016BC220A2BE01BD08608588BD0A60858A20C15CA5888DCF +:205D2000005F8F07EAAFA58A8D025F8F09EAAFA900628580A900008582E22022E65D38AF79 +:205D400005EAAFF0016BC220A20000BD0B628D165FE220BD0D628D245FA9008D255FC220BF +:205D6000BD106229FF008D185FBD11628D1E5FBD1362F0288D1A5FA900008D1C5FAD1A5F67 +:205D80008D1201AD245F8D1001AD1401C9F70FB01DE220A9008D265FC220801BBD20628D31 +:205DA0001A5FBD22628D1C5FA9FFFF8D1E5FE220A9018D265FC220BD0E628D105FBD166272 +:205DC000F00B8D125FA900008D145F8015E220A9028D265FC220BD24628D125FBD26628DD8 +:205DE000145F2029626B5AAF80E8AF29FD09028F80E8AFA53FD002802DA9028F02EAAFA942 +:205E0000018F03EAAFAF04EAAF2901C901F0F6AF05EAAFF002800FA00000AF10EAAF978053 +:205E2000C8C00002D0F4A9018F14EAAFAF80E8AF29FD8F80E8AF7A6B48A00000B78022185E +:205E40001000C8C00800F007C00B00D0EF800E68488918D0E7A92E2218100080DF68891802 +:205E6000D03BA9388B48ABA22864221C1000ABA01B00B78022801000A01A00B7802280104A +:205E800000A9388B48ABA23364221C1000ABA01F00B7802280100088C01B00D0F4A90D22CA +:205EA00018100060A53FD0016BC220A900008D205FA900648580A900008582AD205F0AEBC0 +:205EC0008D2001A900008D2201AD085F8D2401AD0A5F8D2601AD28018F07EAAFAD2A018FBF +:205EE00009EAAFE22022E65D38AF05EAAFF008A29963209C5B806AA780D0045C615F38C965 +:205F0000E5F035A00B00B780C90FD0045C8C5F388902F00280228908F0045C775F388910C3 +:205F2000F0045C625F3848A9388B48ABA21A64221C1000AB6820385EC220A58029E001C960 +:205F4000E001D00FAD205F1ACD1E5FB0148D205F4CB15EA580186920008580E2205CF75E48 +:205F6000386B48A9388B48ABA20C64221C1000AB6820385E4C385F48A9388B48ABA2F0632F +:205F8000221C1000AB6820385E4C385F4C385FA00B00C910F002A9019751A00000A20B00CF +:205FA000B7809751C8CAD0F8C220A01A00B780A010009751A01C00B780A00C009751A01EB8 +:205FC00000B780A00E009751A551186912008551E22060A53FD0016BC220A900008D205F7C +:205FE000A900648580A900008582AD205F0AEB8D2001A900008D2201AD085F8D2401AD0A3A +:206000005F8D2601AD28018F07EAAFAD2A018F09EAAFE22022E65D38AF05EAAFF0045C7EA5 +:206020006038A780D0045C7E6038C9E5F027A00B00B780C90FD0045C5560388902F00280C2 +:20604000148908F0045C5560388910F005208F5F8003208F5FC220A58029E001C9E001D0A6 +:206060000FAD205F1ACD1E5FB0148D205F4CE05FA580186920008580E2205C2260386B4890 +:20608000A53F29FF00D002686B688588A90000858A20C15CA5888D2001A58A8D2201AD047A +:2060A0005F8D2401AD065F8D2601AD28018F07EAAFAD2A018F09EAAFE22022E65D38AF05A8 +:2060C000EAAFF008A27A63209C5B8000C2206B48A53F29FF00D002686BAD265F290300C9AC +:2060E0000200F0076838E9020080056838E906008D0001AD245F8D0201AD040148A200001E +:206100008588A90000858A20C15CA5888D2001A58A8D2201AD0C5F8D2401AD0E5F8D26012B +:20612000AD28018F07EAAFAD2A018F09EAAFE22022E65D38AF05EAAFF00AA9FF8D275F8D23 +:20614000285F8017C220A5801869000285809002E682681A48E8EC245FD0A5C220686B4805 +:20616000A53F29FF00D002686B688D275F22CF6038AD265F2903000AAAFC7F61D0EF6B85CD +:2061800061AA61E961AD275F4A900E186D275FA8B900664A4A4A4A800A6D275FA8B90066F0 +:2061A00029FF0F8D275FC9FF0F60AD275FEB29FF00C586F02248A5808583A5828585A9006C +:2061C000668580A900008582688586227F6038A5838580A5858582AD275F29FF000AA8B9D4 +:2061E00000668D275FC9FFFF60AD275FEB29FF00C586F02248A5808583A5828585A90066A7 +:206200008580A900008582688586227F6038A5838580A5858582AD275F29FF000A0AA8B9EF +:2062200000668D275FC9FFFF60AD105F8588A90000858A20C15CA5888D2001A58A8D2201E6 +:20624000AD005F8D2401AD025F8D2601AD28018D045FAD2A018D065FAD185F8D0001AD12BD +:206260005F8D0201AD04018588AD0601858A20C15CA5888D2001A58A8D2201AD045F8D24F5 +:2062800001AD065F8D2601AD28018D085FAD2A018D0A5FAD085F8D2001AD0A5F8D2201A96E +:2062A00020008588A90000858A20C15CA5888D2401A58A8D2601AD28018D0C5FAD2A018DC7 +:2062C0000E5F603030202D2057656C636F6D6520746F2074686520534443617264205465EA +:2062E000737465720D003031202D20436172642050726573656E740D003031202D204E4F12 +:20630000205344434152442050524553454E540D003032202D2043616E2774207265616426 +:20632000204D4252202D204E6F20436172642070726573656E740D003033202D2045727271 +:206340006F7220647572696E672072656164206F7065726174696F6E0D003034202D2045E3 +:2063600072726F722072656164696E6720426F6F7420736563746F720D003035202D2045D6 +:2063800072726F722072656164696E672046415420736563746F720D003035202D204572FD +:2063A000726F722072656164696E6720526F6F7420736563746F720D003035202D20457286 +:2063C000726F722072656164696E67204461746120736563746F720D00496E76616C696452 +:2063E000204D4252205369676E61747572650D00566F6C756D65204E616D653A20005646AE +:206400004154204E616D6520203A20004469726563746F727920203A200046696C656E610E +:206420006D652020203A20002C20436C75737465723A002C2053697A653A00A9FF8F4801C7 +:20644000008F4901008F4A0100A9FF8F4C01008F4D01008F4E010020DB56209767202E6825 +:2064600020A26420E464A9388569A9428F6A0000A20000A900EBDABF181038AA20B965FACA +:20648000E8E00900D0ED2279303820C36422B13038207A6520AE55201D5B20535858EAEA38 +:2064A00080FC48A9E98F1200AFA9008F1000AFC230A900008F1400AFA900008F1600AFE273 +:2064C000206860AF40010029848F400100AF41010029A18F410100A97B8F4C0100A95E8F45 +:2064E0004D010060A9008F150F388548646C6449A9018F190F38A648BF24FC391A8F180FA1 +:206500003820A15A6048A900EBAF4800001ACFD36A38D002A9008F480000AAA0900120A3A7 +:2065200057BF24FC391A8F180F3868608BA90048ABA9038D00019C01019C030138AF170F70 +:2065400038E9048D0201C220AD0401AAE220A9008D61018D62018D6301BF00003A8D6501E1 +:20656000BF01003A8D6601BF02003A8D6701A9018D6401A90B8D6001AB608BA90048ABE2EB +:2065800020A9008D61018D62018D6301A9018D6401A90B8D6001AB60A9808F04E6AF20B2F6 +:2065A00065A9108F02E6AF8F03E6AFA9038F04E6AF60A23002CAD0FD60AF6A00008F0001C8 +:2065C00000A9008F0101008F030100A9168F020100C220AF04010018693B108567E220AF9E +:2065E0006A0000A0A30120A357A767D04BE667D002E668203966E667D002E66820A966E6FC +:2066000067D002E66820E366E667D002E668201F67E667D002E668DAA627205B67FAE6673A +:20662000D002E668207767C220A5676906008567E220A0A801202F5860A767484848489FD4 +:2066400020E7AF2980A03D0220E057682940A08D0220E057682920A0DD0220E05768291026 +:20666000A02D0320E05768290FA07E0320A357A00600B767484848489F23E7AF2980A0573C +:206680000220E057682940A0A70220E057682920A0F70220E057682910A0470320E0576845 +:2066A000290FA0980320A35760A767489F40E7AF29C02A2A2AA0CE0320A35768293FA01EA2 +:2066C0000420A357A00600B767489F43E7AF29C02A2A2AA0E80320A35768293FA038042040 +:2066E000A35760A767489F60E7AF29F04A4A4A4AA06E0420A35768290FA0BE0420A357A02C +:206700000600B767489F63E7AF29F04A4A4A4AA0880420A35768290FA0D80420A35760A7B1 +:2067200067489F80E7AF29F04A4A4A4AA00E0520A35768290FA05E0520A357A00600B76766 +:20674000489F83E7AF29F04A4A4A4AA0280520A35768290FA0780520A35760A7674809F08B +:206760009FC0E7AF290E4AA0680620A357682901A0B80620A35760A7679FE0E7AF2907A01E +:20678000AE0520A357A00500B7679FE3E7AF2907A0C80520A357600B48DA0818E220A90042 +:2067A0008D870F204568A9AA8F6410AF205068AF6010AFC955F003826F00A9AB8F6410AF36 +:2067C000205068AF6010AFC900F003825B00A9608F6410AF204568A9698F6010AF20456865 +:2067E000A9FF8F6010AFA2FFFFCAEAEAEAEAEAEAEAEAE00000D0F2205068AF6010AF2045DC +:2068000068A9F48F6010AF205068AF6010AFC9FAD0EC205B68AF40010029808F400100AFA5 +:2068200041010029018F41010028FA682B60C230A2804DA90001A0000554AF38E220A9016F +:206840008F0007AF60AF6410AF2902C902F0F660AF6410AF2901C901D0F660204568A9A87B +:206860008F6410AF204568A9A98F6410AF205068AF6010AFC900D0EC204568A9208F6410D1 +:20688000AF205068AF6010AF090248204568A9608F6410AF204568688F6010AFA9F620C165 +:2068A0006820D468A9E820C16820D468A90020C16820D468A9F420C16820D468A90085E040 +:2068C0006048204568A9D48F6410AF204568688F6010AF60205068AF6010AF6048DAE210B7 +:2068E000AA3035BF336938C210A0960020A3578F300000302329704A4A4A4A8F310000AF92 +:20690000300000290F8F300000A9008F27000020F53722013238E220C210FA68600101017F +:20692000010101010101AACABF1D693849019F1D69386080808031338036383A804180808C +:206940008080802C32343537393B3C4280808080808021238026282A808080808080801CEF +:2069600022242527292B808080808080808080808080808080808080808080808080808031 +:20698000808080808080808080808080808080808080800256025682568256AB56AB568293 +:2069A00056C256DA56C210A9028F150F3822745C38A9008D1F03A93485536452645120CA45 +:2069C0006920F569203B6AE2106BA900A00004975188D0FBA53FF01C22D75C3822D35F381D +:2069E000C220A900668580A9000085828586227F6038E22060C230A900A0850CA900C08591 +:206A000017E220A9AF850E8519A03E03A9288580A28F03861AA20000A9148581BF804E381F +:206A2000970CA9509717C8E8C681D0F0C2209818693C00A8E220C680D0DE6064516452A90C +:206A4000348553A20000A00B00B751F02422B55B38C220A51A18693E00851AA551691200E7 +:206A60008551C98004B00AE8E02600F004E22080D5E220A90522175C3860A900EBAD1F03C0 +:206A8000C2308D0001A912008D0201AD04018551A900808580A937008582A01000B75122B4 +:206AA0005F6138E22022B1303822D66A3822B26A386B20E46420DB56204B59205358201DA1 +:206AC0005B20A15A6B439044914546924793419442430000060022B1303820026DA200006A +:206AE000A9009F000039E8D0F9C230A900808508A93700850AE220A01000B708C910D0052E +:206B000022626B386BC921D004220E6B386BA9028FD26A38201B6B20ED6B6BA01100B70840 +:206B20008940F017A9018FD56A38A90F8D6501A9018D6601A90C8D670180238920F00AC8D4 +:206B4000C220B708E220C88015A9008FD56A38A9988D6501A95E8D6601A9048D6701207A1B +:206B60006560A9018FD26A3820806B20006C20256C201B6B6B0701080209030A04050B0608 +:206B8000C8B708291F8FD46A38B7082980F007C8B708C900D0F9C8A93885F2E220B708F0D8 +:206BA0004AC2203A8F000100A916008F020100AF04010018693B1085F0A90000E220C864C2 +:206BC0004E87F0A64EBF756B38AAB7085A9B97F07AC8E64EA54EC90B90E95AA00C00A920BB +:206BE00097F0C8C01600D0F87A80B0C860B708C8C900D0F9A93885F2E220B708F000C8608C +:206C0000B7088FD36A38AAC8C220A924FC85F0A9390085F2E220B708C887F0E6F0B002E658 +:206C2000F1CAD0F26064F3A93985F6C220B708F01F5AA8A5F329FF008F000100A901078F81 +:206C4000020100AF0401001A85F4E220205D6C7AC8C8E220E6F3A5F3C920D0CF60B7088F4C +:206C6000420000C8C220297F008F000100A91C008F020100AF0401001A8FFA0000E220A69A +:206C8000FAB708C88FF90000290F8FF70000C2208A1865F765F765F7AAE220B7085A9B979E +:206CA000F47AC8E8B7085A9B97F47AC8E8290FF009B7085A9B97F47AC8E8AFF9000010BF3C +:206CC000AF4200001097605ADAA21200A00000A92D970CC8CAD0FAFA7A605AA5F620A3577C +:206CE000C8C8A5F520A357C8C8A5F420A3577A604848E2206820A35788886820A357C220AB +:206D000068605AC220A900E7852CA9AF00852EE220A0A000A900972CC8C0B900D0F87A6092 +:206D20005A20C76CC220AF180F3829FF003A8F000100A901078F020100AF0401001A85F43A +:206D4000E220A93985F6A0A00020DA6CC220A56C297F008F000100A91C008F020100AF04F9 +:206D600001001AA0520020F06CA8A90000E22064288F270000AABF1D6938D005C8C8C88021 +:206D800058B7F4297F20406FB7F429804A4A4A854EC8B7F429F04A4A4A4A654EF0143A8F40 +:206DA0006A00005AA627A900EBBF181038AA20B9657AAF300000F011C90FF02BC2205A20FE +:206DC000F537220132387AE220A900EBB7F4C8290FF0050AAAFCF86DC8A900EBAF27000003 +:206DE0001AC909D08C7A60AF2700001869B0852CA900872CC8C880E1186E8B6E8B6E186E6E +:206E0000186E186E186E186E186E186E196E186E016F706E186E816E605AB7F4854CC22066 +:206E2000A900E7852CA9AF00852EE230A527AABF181038186940A8B72C48293F18654CC9D1 +:206E4000409002A93F293F854E6829C0054E972CC8C8C8B72C48293F18654CC9409002A9DE +:206E60003F293F854E6829C0054E972CC2107A60B7F43A856CA9008F190F382005657A7A99 +:206E800060B7F48FD46A3820A15A605A4A8550B7F4854CC220A900E7852CA9AF00852EE262 +:206EA00030A5271869A0A8B72CC210BBA05A0020A3579BE2104898186910A8B72C854EC26B +:206EC00010BBA0A80020A3572903A0580020A3579BEB68AAA5508902F00AC2208A38E54C60 +:206EE000E2208008C2208A18654CE220E210EB2903054E972C9838E910A8EB972CC2107A47 +:206F0000605AC220A900E7852CA9AF00852EE220B7F4297FF0013A493F854EE210A627BF30 +:206F2000181038186940A8B72C29C018654E972CC8C8C8B72C29C018654E972CC2107A60D0 +:206F40005A4848AF2700000AA868F00320A35729704A4A4A4A8F31000068290F8F3000006A +:206F60007A605AE220A9018526C220A93800850AA53229FF003A0A0A0A0A18693B1085087A +:206F8000C220A9200022F53738E220A00000B708872CC220A9400022F53738E220A00200B7 +:206FA000B708872CC220A9600022F53738E220A00400B708872CC220A9800022F53738E263 +:206FC00020A00600B708872CC220A9E00022F53738E220A00900B708290F872CA9008526DF +:206FE000C220A9200022F53738E220A00100B708872CC220A9400022F53738E220A0030055 +:20700000B708872CC220A9600022F53738E220A00500B708872CC220A9800022F53738E201 +:2070200020A07100B708872CC220A9E00022F53738E220A00900B70829F04A4A4A4A872C5E +:20704000A52718290F69C0852AA900852BC23018A900E7652A852CA9AF00852EE220A00854 +:0770600000B708872C7A60DD :020000040039C1 :200000000101000000000000000000000000000000000000000000000000000000020000DC :200020000000000000000000000000000000000000000000000000000003000000000000BD diff --git a/tracker.lst b/tracker.lst index 736fdce..b88fa69 100644 --- a/tracker.lst +++ b/tracker.lst @@ -1,7 +1,7 @@ -; 64tass Turbo Assembler Macro V1.54.1900 listing file +; 64tass Turbo Assembler Macro V1.55.2200 listing file ; 64tass.exe --long-address -x --intel-hex -o tracker.hex --list tracker.lst tracker.asm -; Fri Aug 28 01:06:30 2020 +; Tue Sep 13 22:53:35 2022 ;Offset ;Hex ;Monitor ;Source @@ -744,7 +744,7 @@ =$000144 INT_POL_REG0 = $000144 ; =$000145 INT_POL_REG1 = $000145 ; =$000146 INT_POL_REG2 = $000146 ; -=$000147 INT_POL_REG7 = $000147 ; FMX Model +=$000147 INT_POL_REG3 = $000147 ; FMX Model =$000148 INT_EDGE_REG0 = $000148 ; =$000149 INT_EDGE_REG1 = $000149 ; =$00014a INT_EDGE_REG2 = $00014A ; @@ -768,7 +768,7 @@ =$10 FNX1_INT04_COM1 = $10 ;Serial Port 1 =$20 FNX1_INT05_MPU401 = $20 ;Midi Controller Interrupt =$40 FNX1_INT06_LPT = $40 ;Parallel Port -=$80 FNX1_INT07_SDCARD = $80 ;SD Card Controller Interrupt (CH376S) +=$80 FNX1_INT07_SDCARD = $80 ;SD Card Controller Interrupt (CH376S) =$01 FNX2_INT00_OPL3 = $01 ;OPl3 =$02 FNX2_INT01_GABE_INT0 = $02 ;GABE (INT0) - TBD =$04 FNX2_INT02_GABE_INT1 = $04 ;GABE (INT1) - TBD @@ -809,10 +809,13 @@ =$81 CHAR_COPY = $81 =613 ORDER_EDITOR_SCR = SCREEN_WIDTH * 7 + 53 =2164 PTRN_EDITOR_SCR = SCREEN_WIDTH * 27 + 4 + +;****** Processing file: base.asm + .38ff00 18 clc CLC .38ff01 fb xce XCE ; go into native mode .38ff02 78 sei SEI ; ignore interrupts -.38ff03 5c d3 63 38 jmp $3863d3 JML TRACKER +.38ff03 5c 3b 64 38 jmp $38643b JML TRACKER .38ff60 RHIRQ .38ff60 c2 30 rep #$30 REP #$30 ; set A&X long .38ff62 8b phb PHB @@ -827,14 +830,14 @@ .38ff6e 2b pld PLD .38ff6f ab plb PLB .38ff70 40 rti RTI -.38ffe0 5c d3 63 38 jmp $3863d3 JUMP_READY JML TRACKER ; Kernel READY routine. Rewrite this address to jump to a custom kernel. +.38ffe0 5c 3b 64 38 jmp $38643b JUMP_READY JML TRACKER ; Kernel READY routine. Rewrite this address to jump to a custom kernel. >38ffe4 10 ff RVECTOR_COP .addr HCOP ; FFE4 >38ffe6 20 ff RVECTOR_BRK .addr HBRK ; FFE6 >38ffe8 30 ff RVECTOR_ABORT .addr HABORT ; FFE8 >38ffea 40 ff RVECTOR_NMI .addr HNMI ; FFEA >38ffec 00 00 .word $0000 ; FFEC >38ffee 60 ff RVECTOR_IRQ .addr HIRQ ; FFEE -.38fff0 5c d3 63 38 jmp $3863d3 RRETURN JML TRACKER +.38fff0 5c 3b 64 38 jmp $38643b RRETURN JML TRACKER >38fff4 10 ff RVECTOR_ECOP .addr HCOP ; FFF4 >38fff6 20 ff RVECTOR_EBRK .addr HBRK ; FFF6 >38fff8 30 ff RVECTOR_EABORT .addr HABORT ; FFF8 @@ -842,6 +845,9 @@ >38fffc 00 ff RVECTOR_ERESET .addr HRESET ; FFFC >38fffe 60 ff RVECTOR_EIRQ .addr HIRQ ; FFFE +;****** Return to file: tracker.asm + + ;****** Processing file: OPL2_library.asm @@ -2009,7 +2015,7 @@ .3830ab e0 08 00 cpx #$0008 CPX #8 .3830ae d0 d0 bne $383080 BNE OPL2_TONE_TESTING_L1 .3830b0 6b rtl RTL -.3830b1 OPL2_INIT +.3830b1 OPL3_INIT .3830b1 c2 20 rep #$20 REP #$20 ; set A long .3830b3 a9 00 00 lda #$0000 LDA #$0000 .3830b6 85 28 sta $28 STA OPL2_REG_REGION @@ -3157,6 +3163,7 @@ ;****** Processing file: display.asm =80 SCREEN_WIDTH = 80 +=64 MUSICAL_LINES_PER_BAR = 64 .383b80 TRACKER_SCREEN >383b80 d5 line1 .byte $D5 >383b81 c3 c3 c3 c3 c3 c3 c3 c3 .fill SCREEN_WIDTH - 2, $C3 @@ -3176,8 +3183,8 @@ >383c35 43 32 35 36 20 46 6f 65 .text 'C256 Foenix Tracker' ; 19 characters >383c3d 6e 69 78 20 54 72 61 63 6b 65 72 >383c48 00 00 00 00 .fill 4, 0 ->383c4c 5b 56 65 72 73 69 6f 6e .text '[Version 0.3.1]' ; 15 characters ->383c54 20 30 2e 33 2e 31 5d +>383c4c 5b 56 65 72 73 69 6f 6e .text '[Version 0.4.0]' ; 15 characters +>383c54 20 30 2e 34 2e 30 5d >383c5b 00 00 00 00 00 00 00 00 .fill (SCREEN_WIDTH - 40) / 2, 0 >383c63 00 00 00 00 00 00 00 00 00 00 00 00 >383c6f c2 .byte $c2 @@ -3217,7 +3224,7 @@ >383d4b c2 .byte $c2 >383d4c 00 .fill 1,0 >383d4d 4d 49 44 49 .text 'MIDI' ->383d51 00 00 00 00 00 00 00 00 .fill 14,0 +>383d51 00 00 00 00 00 00 00 00 .fill SCREEN_WIDTH -66,0 >383d59 00 00 00 00 00 00 >383d5f c2 .byte $c2 >383d60 ab line7 .byte $ab @@ -3651,7 +3658,7 @@ >3842db 00 00 .fill 2, 0 >3842dd 46 69 6c 65 3a 20 20 20 .text 'File: ' ; 17 chars >3842e5 20 20 20 20 20 20 20 20 20 ->3842ee 00 00 00 00 00 00 00 00 .fill 17, 0 +>3842ee 00 00 00 00 00 00 00 00 .fill SCREEN_WIDTH - 63, 0 >3842f6 00 00 00 00 00 00 00 00 00 >3842ff c2 .byte $c2 >384300 ca line25 .byte $ca @@ -3668,7 +3675,7 @@ >38432a b1 .byte $b1 >38432b c3 c3 c3 c3 c3 c3 c3 c3 .fill 8, $C3 >384333 c3 .byte $c3 ->384334 c3 c3 c3 c3 c3 c3 c3 c3 .fill 27, $C3 +>384334 c3 c3 c3 c3 c3 c3 c3 c3 .fill SCREEN_WIDTH - 53, $C3 >38433c c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 c3 >38434c c3 c3 c3 >38434f cb .byte $cb @@ -3690,6 +3697,7 @@ >38438f c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 >384397 b2 .byte $b2 >384398 c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 +>3843a0 .fill SCREEN_WIDTH - 80, 0 .3843a0 line27 >3843a0 20 2d 20 31 20 20 2d 20 .text ' - ',col,' - ' >3843a8 c2 .byte $c2 @@ -3708,6 +3716,7 @@ >3843df 20 2d 20 38 20 20 2d 20 .text ' - ',col,' - ' >3843e7 c2 .byte $c2 >3843e8 20 2d 20 39 20 20 2d 20 .text ' - 9 - ' +>3843f0 .fill SCREEN_WIDTH - 80, 0 .3843f0 btm_line >3843f0 c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 >3843f8 b1 .byte $b1 @@ -3726,11 +3735,13 @@ >38442f c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 >384437 b1 .byte $b1 >384438 c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 +>384440 .fill SCREEN_WIDTH - 80, 0 .384440 blank_line >384440 20 20 20 20 20 20 20 20 .fill 80, $20 >384448 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ; ...repeated 3 times (48 bytes)... >384488 20 20 20 20 20 20 20 20 +>384490 .fill SCREEN_WIDTH - 80, 0 .384490 tick_line >384490 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' >384498 db .byte $db @@ -3749,6 +3760,7 @@ >3844cf 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' >3844d7 db .byte $db >3844d8 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' +>3844e0 .fill SCREEN_WIDTH - 80, 0 .3844e0 untick_line >3844e0 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' >3844e8 c2 .byte $c2 @@ -3767,6 +3779,7 @@ >38451f 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' >384527 c2 .byte $c2 >384528 2d 2d 2d 20 2d 2d 2d 2d .text '--- ----' +>384530 .fill SCREEN_WIDTH - 80, 0 .384530 line60 >384530 c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 >384538 b1 .byte $b1 @@ -3785,6 +3798,7 @@ >38456f c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 >384577 b1 .byte $b1 >384578 c3 c3 c3 c3 c3 c3 c3 c3 .fill 8,$c3 +>384580 .fill SCREEN_WIDTH - 80, 0 .384580 FNXFONT >384580 00 00 00 00 00 00 00 00 .binary "Font/FOENIX-CHARACTER-ASCII-2.bin", 0, 2048 >384588 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 @@ -4196,25 +4210,25 @@ .385249 8d 88 0f sta $0f88 STA KEYBOARD_SC_TMP ; Save Code Immediately .38524c c2 10 rep #$10 REP #$10 ; set X long .38524e a0 46 00 ldy #$0046 LDY #70 -.385251 20 b1 57 jsr $3857b1 JSR WRITE_HEX ; print the HEX key code at column 70 on the top line +.385251 20 a3 57 jsr $3857a3 JSR WRITE_HEX ; print the HEX key code at column 70 on the top line .385254 c9 01 cmp #$01 CMP #1 ; ESC .385256 d0 0f bne $385267 BNE NOT_ESCAPE .385258 af 15 0f 38 lda $380f15 LDA STATE_MACHINE .38525c c9 02 cmp #$02 CMP #2 .38525e d0 07 bne $385267 BNE NOT_ESCAPE -.385260 22 47 6a 38 jsl $386a47 JSL EXIT_FILE +.385260 22 b2 6a 38 jsl $386ab2 JSL EXIT_FILE .385264 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .385267 NOT_ESCAPE .385267 c9 1a cmp #$1a CMP #$1A ; left bracket .385269 d0 08 bne $385273 BNE NOT_LEFT_BRACKET .38526b c6 6a dec $6a DEC INSTR_NUMBER -.38526d 20 4e 65 jsr $38654e JSR LOAD_INSTRUMENT ; X is already set to 0 +.38526d 20 b9 65 jsr $3865b9 JSR LOAD_INSTRUMENT ; X is already set to 0 .385270 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .385273 NOT_LEFT_BRACKET .385273 c9 1b cmp #$1b CMP #$1B ; right bracket .385275 d0 08 bne $38527f BNE NOT_RIGHT_BRACKET .385277 e6 6a inc $6a INC INSTR_NUMBER -.385279 20 4e 65 jsr $38654e JSR LOAD_INSTRUMENT ; X is already set to 0 +.385279 20 b9 65 jsr $3865b9 JSR LOAD_INSTRUMENT ; X is already set to 0 .38527c 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .38527f NOT_RIGHT_BRACKET .38527f c9 0c cmp #$0c CMP #$0C ; minus @@ -4230,7 +4244,7 @@ .385295 e9 01 sbc #$01 SBC #1 .385297 8f 18 0f 38 sta $380f18 STA PATTERN_NUM .38529b d8 cld CLD ; switch out of decimal -.38529c 20 61 58 jsr $385861 JSR DISPLAY_PATTERN +.38529c 20 53 58 jsr $385853 JSR DISPLAY_PATTERN .38529f MINUS_DONE .38529f 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .3852a2 NOT_MINUS @@ -4247,7 +4261,7 @@ .3852b8 69 01 adc #$01 ADC #1 .3852ba 8f 18 0f 38 sta $380f18 STA PATTERN_NUM .3852be d8 cld CLD ; switch out of decimal -.3852bf 20 61 58 jsr $385861 JSR DISPLAY_PATTERN +.3852bf 20 53 58 jsr $385853 JSR DISPLAY_PATTERN .3852c2 PLUS_DONE .3852c2 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .3852c5 BPM_KEYS @@ -4267,8 +4281,8 @@ .3852e0 1a inc a INC A .3852e1 SETUP_TIMER .3852e1 8f 17 0f 38 sta $380f17 STA BPM -.3852e5 20 c9 5a jsr $385ac9 JSR DISPLAY_BPM -.3852e8 20 c1 64 jsr $3864c1 JSR INIT_TIMER0_BPM +.3852e5 20 bb 5a jsr $385abb JSR DISPLAY_BPM +.3852e8 20 2c 65 jsr $38652c JSR INIT_TIMER0_BPM .3852eb 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .3852ee TRY_GRAVE .3852ee c9 29 cmp #$29 CMP #$29 @@ -4282,9 +4296,9 @@ .3852fd 4a lsr a LSR .3852fe aa tax TAX .3852ff 68 pla PLA -.385300 5f cd 5a 38 eor $385acd,x EOR HL_CLR_TABLE+3,X +.385300 5f bf 5a 38 eor $385abf,x EOR HL_CLR_TABLE+3,X .385304 8f 15 0f 38 sta $380f15 STA STATE_MACHINE -.385308 20 d6 5a jsr $385ad6 JSR HIGHLIGHT_MODE +.385308 20 c8 5a jsr $385ac8 JSR HIGHLIGHT_MODE .38530b 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN .38530e SPECIAL_KEYS .38530e c9 2a cmp #$2a CMP #$2A ; Left Shift Pressed @@ -4321,7 +4335,7 @@ .385348 UP_WRONG_STATE .385348 c9 02 cmp #$02 CMP #2 .38534a d0 04 bne $385350 BNE UP_WRG_DONE -.38534c 22 6b 5c 38 jsl $385c6b JSL SELECT_PREVIOUS_FILE +.38534c 22 5d 5c 38 jsl $385c5d JSL SELECT_PREVIOUS_FILE .385350 UP_WRG_DONE .385350 68 pla PLA .385351 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN @@ -4336,7 +4350,7 @@ .385364 DOWN_WRONG_STATE .385364 c9 02 cmp #$02 CMP #2 .385366 d0 04 bne $38536c BNE DOWN_WRG_DONE -.385368 22 52 5c 38 jsl $385c52 JSL SELECT_NEXT_FILE +.385368 22 44 5c 38 jsl $385c44 JSL SELECT_NEXT_FILE .38536c DOWN_WRG_DONE .38536c 68 pla PLA .38536d 4c e9 53 jmp $3853e9 JMP KB_WR_2_SCREEN @@ -4367,7 +4381,7 @@ .38539f f0 35 beq $3853d6 BEQ ALT_KEY_ON .3853a1 c2 10 rep #$10 REP #$10 ; set X long .3853a3 ad 88 0f lda $0f88 LDA KEYBOARD_SC_TMP -.3853a6 20 71 68 jsr $386871 JSR PLAY_TRACKER_NOTE +.3853a6 20 dc 68 jsr $3868dc JSR PLAY_TRACKER_NOTE .3853a9 e2 10 sep #$10 SEP #$10 ; set X short .3853ab ae 88 0f ldx $0f88 LDX KEYBOARD_SC_TMP .3853ae bf 00 39 38 lda $383900,x LDA @lScanCode_Press_Set1, x @@ -4382,21 +4396,21 @@ .3853ca 29 0f and #$0f AND #$F .3853cc c9 02 cmp #$02 CMP #2 .3853ce f0 04 beq $3853d4 BEQ CONTINUE_KEY -.3853d0 22 3a 69 38 jsl $38693a JSL LOAD_FILE_DISPLAY +.3853d0 22 a5 69 38 jsl $3869a5 JSL LOAD_FILE_DISPLAY .3853d4 CONTINUE_KEY .3853d4 80 13 bra $3853e9 BRA KB_WR_2_SCREEN .3853d6 bf 80 3a 38 lda $383a80,x ALT_KEY_ON LDA @lScanCode_Alt_Set1, x .3853da f0 0d beq $3853e9 BEQ KB_WR_2_SCREEN .3853dc 29 0f and #$0f AND #$F -.3853de 20 bb 68 jsr $3868bb JSR TOGGLE_CHANNEL +.3853de 20 26 69 jsr $386926 JSR TOGGLE_CHANNEL .3853e1 c2 10 rep #$10 REP #$10 ; set X long -.3853e3 20 6d 5b jsr $385b6d JSR DISPLAY_ACTIVE_CHANNELS +.3853e3 20 5f 5b jsr $385b5f JSR DISPLAY_ACTIVE_CHANNELS .3853e6 e2 10 sep #$10 SEP #$10 ; set X short .3853e8 60 rts RTS ; early exit .3853e9 KB_WR_2_SCREEN .3853e9 c2 10 rep #$10 REP #$10 ; set X long .3853eb a0 4a 00 ldy #$004a LDY #74 -.3853ee 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3853ee 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3853f1 c9 0d cmp #$0d CMP #$0D ; Enter Key Pressed .3853f3 d0 1f bne $385414 BNE KB_CHECK_B_DONE_R .3853f5 48 pha PHA @@ -4410,19 +4424,19 @@ .385406 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 .38540a a9 00 lda #$00 LDA #0 ; record mode .38540c 8f 15 0f 38 sta $380f15 STA STATE_MACHINE -.385410 20 97 6c jsr $386c97 JSR RAD_ALL_NOTES_OFF +.385410 20 02 6d jsr $386d02 JSR RAD_ALL_NOTES_OFF .385413 68 pla PLA .385414 KB_CHECK_B_DONE_R .385414 4c 80 54 jmp $385480 JMP KB_CHECK_B_DONE .385417 START_SOF .385417 ad 87 0f lda $0f87 LDA KEYBOARD_SC_FLG .38541a d0 06 bne $385422 BNE CONTINUE_FROM_CURRENT_LOCATION -.38541c 20 79 64 jsr $386479 JSR RESET_STATE_MACHINE -.38541f 20 61 58 jsr $385861 JSR DISPLAY_PATTERN +.38541c 20 e4 64 jsr $3864e4 JSR RESET_STATE_MACHINE +.38541f 20 53 58 jsr $385853 JSR DISPLAY_PATTERN .385422 CONTINUE_FROM_CURRENT_LOCATION .385422 a9 01 lda #$01 LDA #1 .385424 8f 15 0f 38 sta $380f15 STA STATE_MACHINE -.385428 20 b5 6c jsr $386cb5 JSR RAD_PLAYNOTES +.385428 20 20 6d jsr $386d20 JSR RAD_PLAYNOTES .38542b af 4c 01 00 lda $00014c LDA @lINT_MASK_REG0 .38542f 29 fb and #$fb AND #~(FNX0_INT02_TMR0) .385431 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 @@ -4430,7 +4444,7 @@ .385436 4c 80 54 jmp $385480 JMP KB_CHECK_B_DONE .385439 GO_LOAD_FILE .385439 68 pla PLA -.38543a 22 0f 6a 38 jsl $386a0f JSL READ_FILE +.38543a 22 7a 6a 38 jsl $386a7a JSL READ_FILE .38543e 4c 80 54 jmp $385480 JMP KB_CHECK_B_DONE .385441 ad 87 0f lda $0f87 KB_SET_SHIFT LDA KEYBOARD_SC_FLG .385444 09 10 ora #$10 ORA #$10 @@ -4470,7 +4484,7 @@ .385494 f0 45 beq $3854db BEQ EDIT_MODE .385496 af 16 0f 38 lda $380f16 LDA @lTICK .38549a 1a inc a INC A -.38549b cf 69 6a 38 cmp $386a69 CMP @lTuneInfo.InitialSpeed +.38549b cf d4 6a 38 cmp $386ad4 CMP @lTuneInfo.InitialSpeed .38549f d0 3c bne $3854dd BNE TICK_DONE .3854a1 INCR_LINE .3854a1 a5 6c lda $6c LDA LINE_NUM_HEX @@ -4490,15 +4504,15 @@ .3854bf d0 07 bne $3854c8 BNE INCR_DONE .3854c1 a9 01 lda #$01 LDA #1 .3854c3 64 6c stz $6c STZ LINE_NUM_HEX -.3854c5 20 9a 64 jsr $38649a JSR INCREMENT_ORDER +.3854c5 20 05 65 jsr $386505 JSR INCREMENT_ORDER .3854c8 INCR_DONE .3854c8 d8 cld CLD .3854c9 8f 19 0f 38 sta $380f19 STA @lLINE_NUM_DEC -.3854cd 20 61 58 jsr $385861 JSR DISPLAY_PATTERN +.3854cd 20 53 58 jsr $385853 JSR DISPLAY_PATTERN .3854d0 af 15 0f 38 lda $380f15 LDA STATE_MACHINE .3854d4 29 01 and #$01 AND #1 .3854d6 f0 03 beq $3854db BEQ EDIT_MODE -.3854d8 20 b5 6c jsr $386cb5 JSR RAD_PLAYNOTES +.3854d8 20 20 6d jsr $386d20 JSR RAD_PLAYNOTES .3854db EDIT_MODE .3854db a9 00 lda #$00 LDA #0 ; reset the tick to 0 .3854dd TICK_DONE @@ -4520,7 +4534,7 @@ .3854fe DECR_DONE .3854fe d8 cld CLD .3854ff 8f 19 0f 38 sta $380f19 STA @lLINE_NUM_DEC -.385503 20 61 58 jsr $385861 JSR DISPLAY_PATTERN +.385503 20 53 58 jsr $385853 JSR DISPLAY_PATTERN .385506 a9 00 lda #$00 LDA #0 ; reset the tick to 0 .385508 8f 16 0f 38 sta $380f16 STA @lTICK .38550c 60 rts RTS @@ -4567,7 +4581,7 @@ .385562 af 00 0f 38 lda $380f00 LDA MOUSE_BUTTONS_REG .385566 c2 10 rep #$10 REP #$10 ; set X long .385568 a0 3c 00 ldy #$003c LDY #60 -.38556b 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.38556b 20 a3 57 jsr $3857a3 JSR WRITE_HEX .38556e e2 10 sep #$10 SEP #$10 ; set X short .385570 20 7a 55 jsr $38557a JSR MOUSE_BUTTON_HANDLER .385573 a2 00 ldx #$00 LDX #$00 @@ -4630,7 +4644,7 @@ .3855bd 8f 31 13 af sta $af1331 STA @lMIDI_STATUS_REG .3855c1 a0 66 03 ldy #$0366 LDY #10 * SCREEN_WIDTH + 70 .3855c4 af 30 13 af lda $af1330 MORE_DATA LDA @lMIDI_DATA_REG -.3855c8 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3855c8 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3855cb c8 iny INY .3855cc c8 iny INY .3855cd af 31 13 af lda $af1331 LDA @lMIDI_STATUS_REG @@ -4663,7 +4677,7 @@ .3855f7 a5 62 lda $62 LDA MIDI_CTRL .3855f9 aa tax TAX .3855fa 68 pla PLA -.3855fb fc 28 69 jsr ($386928,x) JSR (MIDI_COMMAND_TABLE,X) +.3855fb fc 93 69 jsr ($386993,x) JSR (MIDI_COMMAND_TABLE,X) .3855fe c2 10 rep #$10 REP #$10 ; set X long .385600 RECEIVE_MIDI_DATA_DONE .385600 68 pla PLA @@ -4683,11 +4697,11 @@ .385614 c2 10 rep #$10 REP #$10 ; set X long .385616 a5 62 lda $62 LDA MIDI_CTRL .385618 a0 02 04 ldy #$0402 LDY #12*SCREEN_WIDTH + 66 -.38561b 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.38561b 20 a3 57 jsr $3857a3 JSR WRITE_HEX .38561e a5 64 lda $64 LDA MIDI_DATA1 .385620 8f 12 01 00 sta $000112 STA @lD0_OPERAND_B .385624 a0 04 04 ldy #$0404 LDY #12*SCREEN_WIDTH + 68 -.385627 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.385627 20 a3 57 jsr $3857a3 JSR WRITE_HEX .38562a a9 00 lda #$00 LDA #0 .38562c 8f 11 01 00 sta $000111 STA @lD0_OPERAND_A + 1 .385630 8f 13 01 00 sta $000113 STA @lD0_OPERAND_B + 1 @@ -4698,20 +4712,20 @@ .38563f e9 02 sbc #$02 SBC #2 .385641 85 31 sta $31 STA OPL2_OCTAVE .385643 a0 08 04 ldy #$0408 LDY #12*SCREEN_WIDTH + 72 -.385646 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.385646 20 a3 57 jsr $3857a3 JSR WRITE_HEX .385649 af 16 01 00 lda $000116 LDA @lD0_REMAINDER .38564d 85 30 sta $30 STA OPL2_NOTE .38564f a0 0a 04 ldy #$040a LDY #12*SCREEN_WIDTH + 74 -.385652 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.385652 20 a3 57 jsr $3857a3 JSR WRITE_HEX .385655 a5 65 lda $65 LDA MIDI_DATA2 .385657 a0 0c 04 ldy #$040c LDY #12*SCREEN_WIDTH + 76 -.38565a 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.38565a 20 a3 57 jsr $3857a3 JSR WRITE_HEX .38565d c9 00 cmp #$00 CMP #0 .38565f d0 0f bne $385670 BNE PLAY_NOTE_ON ; otherwise, turn note on .385661 85 32 sta $32 STA OPL2_PARAMETER0 .385663 a9 ff lda #$ff LDA #$FF .385665 a0 0e 04 ldy #$040e LDY #12*SCREEN_WIDTH + 78 -.385668 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.385668 20 a3 57 jsr $3857a3 JSR WRITE_HEX .38566b 20 c6 36 jsr $3836c6 JSR OPL2_SET_KEYON .38566e 80 0f bra $38567f BRA MORE_NOTE_DATA_NEEDED .385670 PLAY_NOTE_ON @@ -4737,13 +4751,13 @@ .38568e c2 10 rep #$10 REP #$10 ; set X long .385690 a5 62 lda $62 LDA MIDI_CTRL .385692 a0 a2 04 ldy #$04a2 LDY #14*SCREEN_WIDTH + 66 -.385695 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.385695 20 a3 57 jsr $3857a3 JSR WRITE_HEX .385698 a5 64 lda $64 LDA MIDI_DATA1 .38569a a0 a4 04 ldy #$04a4 LDY #14*SCREEN_WIDTH+68 -.38569d 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.38569d 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3856a0 a5 65 lda $65 LDA MIDI_DATA2 .3856a2 a0 a6 04 ldy #$04a6 LDY #14*SCREEN_WIDTH+70 -.3856a5 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3856a5 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3856a8 64 60 stz $60 STZ MIDI_COUNTER .3856aa MORE_CTRL_DATA_NEEDED .3856aa 60 rts RTS @@ -4753,10 +4767,10 @@ .3856ac c2 10 rep #$10 REP #$10 ; set X long .3856ae a5 62 lda $62 LDA MIDI_CTRL .3856b0 a0 f2 04 ldy #$04f2 LDY #15*SCREEN_WIDTH + 66 -.3856b3 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3856b3 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3856b6 68 pla PLA .3856b7 a0 f4 04 ldy #$04f4 LDY #15*SCREEN_WIDTH + 68 -.3856ba 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3856ba 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3856bd a9 10 lda #$10 LDA #16 .3856bf 85 62 sta $62 STA MIDI_CTRL .3856c1 60 rts RTS @@ -4769,7 +4783,7 @@ .3856cd a9 00 lda #$00 LDA #0 .3856cf DISPLAY_COUNTER .3856cf a0 42 05 ldy #$0542 LDY #16*SCREEN_WIDTH + 66 -.3856d2 20 b1 57 jsr $3857b1 JSR WRITE_HEX +.3856d2 20 a3 57 jsr $3857a3 JSR WRITE_HEX .3856d5 8f 66 00 00 sta $000066 STA @lTIMING_CNTR .3856d9 60 rts RTS .3856da INVALID_COMMAND @@ -4781,797 +4795,789 @@ ;****** Processing file: display_func.asm .3856db DRAW_DISPLAY -.3856db a9 50 lda #$50 LDA #SCREEN_WIDTH -.3856dd 85 11 sta $11 STA COLS_PER_LINE -.3856df a9 40 lda #$40 LDA #64 -.3856e1 85 15 sta $15 STA LINES_MAX -.3856e3 a9 50 lda #$50 LDA #80 -.3856e5 85 0f sta $0f STA COLS_VISIBLE -.3856e7 a9 3c lda #$3c LDA #60 -.3856e9 85 13 sta $13 STA LINES_VISIBLE -.3856eb a9 00 lda #$00 LDA #0 -.3856ed 8f 08 00 af sta $af0008 STA BORDER_X_SIZE -.3856f1 8f 09 00 af sta $af0009 STA BORDER_Y_SIZE -.3856f5 e2 20 sep #$20 SEP #$20 ; set A short -.3856f7 a9 20 lda #$20 LDA #$20 -.3856f9 8f 05 00 af sta $af0005 STA BORDER_COLOR_B -.3856fd 8f 07 00 af sta $af0007 STA BORDER_COLOR_R -.385701 a9 00 lda #$00 LDA #0 -.385703 8f 06 00 af sta $af0006 STA BORDER_COLOR_G -.385707 a9 01 lda #$01 LDA #Border_Ctrl_Enable -.385709 8f 04 00 af sta $af0004 STA BORDER_CTRL_REG -.38570d a9 01 lda #$01 LDA #Mstr_Ctrl_Text_Mode_En -.38570f 8f 00 00 af sta $af0000 STA MASTER_CTRL_REG_L -.385713 c2 20 rep #$20 REP #$20 ; set A long -.385715 a9 00 a0 lda #$a000 LDA #<>CS_TEXT_MEM_PTR ; store the initial screen buffer location -.385718 85 0c sta $0c STA SCREENBEGIN -.38571a 85 17 sta $17 STA CURSORPOS -.38571c e2 20 sep #$20 SEP #$20 ; set A short -.38571e a9 af lda #$af LDA #`CS_TEXT_MEM_PTR -.385720 85 0e sta $0e STA SCREENBEGIN+2 -.385722 85 19 sta $19 STA CURSORPOS+2 -.385724 c2 30 rep #$30 REP #$30 ; set A&X long -.385726 a9 bf 08 lda #$08bf LDA #SCREEN_WIDTH*28-1 -.385729 a2 80 3b ldx #$3b80 LDX #<>TRACKER_SCREEN -.38572c a0 00 a0 ldy #$a000 LDY #<>CS_TEXT_MEM_PTR -.38572f 54 af 38 mvn $38,$af MVN #`TRACKER_SCREEN,#$AF -.385732 a9 00 08 lda #$0800 LDA #256 * 8 -.385735 a2 80 45 ldx #$4580 LDX #<>FNXFONT -.385738 a0 00 80 ldy #$8000 LDY #<>FONT_MEMORY_BANK0 -.38573b 54 af 38 mvn $38,$af MVN #`FNXFONT,#$AF -.38573e a9 ff 60 lda #$60ff LDA #$60FF -.385741 8f 48 1f af sta $af1f48 STA FG_CHAR_LUT_PTR + 8; -.385745 8f 88 1f af sta $af1f88 STA BG_CHAR_LUT_PTR + 8; -.385749 a9 80 00 lda #$0080 LDA #$0080 -.38574c 8f 4a 1f af sta $af1f4a STA FG_CHAR_LUT_PTR + 10; -.385750 8f 8a 1f af sta $af1f8a STA BG_CHAR_LUT_PTR + 10; -.385754 a9 20 80 lda #$8020 LDA #$8020 -.385757 8f 4c 1f af sta $af1f4c STA FG_CHAR_LUT_PTR + 12; -.38575b 8f 8c 1f af sta $af1f8c STA BG_CHAR_LUT_PTR + 12; -.38575f a9 10 00 lda #$0010 LDA #$0010 -.385762 8f 4e 1f af sta $af1f4e STA FG_CHAR_LUT_PTR + 14; -.385766 8f 8e 1f af sta $af1f8e STA BG_CHAR_LUT_PTR + 14; -.38576a a9 cc cc lda #$cccc LDA #$CCCC -.38576d 8f 50 1f af sta $af1f50 STA FG_CHAR_LUT_PTR + 16; -.385771 8f 90 1f af sta $af1f90 STA BG_CHAR_LUT_PTR + 16; -.385775 a9 cc 00 lda #$00cc LDA #$00CC -.385778 8f 52 1f af sta $af1f52 STA FG_CHAR_LUT_PTR + 18; -.38577c 8f 92 1f af sta $af1f92 STA BG_CHAR_LUT_PTR + 18; -.385780 a9 22 dd lda #$dd22 LDA #$DD22 -.385783 8f 54 1f af sta $af1f54 STA FG_CHAR_LUT_PTR + 20; -.385787 8f 94 1f af sta $af1f94 STA BG_CHAR_LUT_PTR + 20; -.38578b a9 dd 00 lda #$00dd LDA #$00DD -.38578e 8f 56 1f af sta $af1f56 STA FG_CHAR_LUT_PTR + 22; -.385792 8f 96 1f af sta $af1f96 STA BG_CHAR_LUT_PTR + 22; -.385796 a2 00 14 ldx #$1400 LDX #SCREEN_WIDTH*64 -.385799 e2 20 sep #$20 SEP #$20 ; set A short -.38579b a9 20 lda #$20 LDA #$20 -.38579d SETTEXTCOLOR -.38579d 9f ff bf af sta $afbfff,x STA CS_COLOR_MEM_PTR-1,X -.3857a1 ca dex DEX -.3857a2 d0 f9 bne $38579d BNE SETTEXTCOLOR -.3857a4 a0 e0 0b ldy #$0be0 LDY #38 * SCREEN_WIDTH -.3857a7 20 79 5a jsr $385a79 JSR REVERSE_LUT -.3857aa 20 d6 5a jsr $385ad6 JSR HIGHLIGHT_MODE -.3857ad 20 6d 5b jsr $385b6d JSR DISPLAY_ACTIVE_CHANNELS -.3857b0 60 rts RTS -.3857b1 WRITE_HEX -.3857b1 48 pha PHA -.3857b2 da phx PHX -.3857b3 5a phy PHY -.3857b4 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE -.3857b8 29 f0 and #$f0 AND #$F0 -.3857ba 4a lsr a lsr A -.3857bb 4a lsr a lsr A -.3857bc 4a lsr a lsr A -.3857bd 4a lsr a lsr A -.3857be e2 10 sep #$10 SEP #$10 ; set X short -.3857c0 aa tax TAX -.3857c1 bf 05 0f 38 lda $380f05,x LDA HEX_MAP,X -.3857c5 8f 03 0f 38 sta $380f03 STA @lLOW_NIBBLE -.3857c9 af 01 0f 38 lda $380f01 LDA @lTEMP_STORAGE -.3857cd 29 0f and #$0f AND #$0F -.3857cf aa tax TAX -.3857d0 bf 05 0f 38 lda $380f05,x LDA HEX_MAP,X -.3857d4 8f 04 0f 38 sta $380f04 STA @lHIGH_NIBBLE -.3857d8 c2 30 rep #$30 REP #$30 ; set A&X long -.3857da 7a ply PLY -.3857db af 03 0f 38 lda $380f03 LDA @lLOW_NIBBLE -.3857df 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.3857e1 a9 30 30 lda #$3030 LDA #$3030 -.3857e4 bb tyx TYX -.3857e5 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.3857e9 e2 20 sep #$20 SEP #$20 ; set A short -.3857eb fa plx PLX -.3857ec 68 pla PLA -.3857ed 60 rts RTS -.3857ee WRITE_OFF_ON -.3857ee da phx PHX -.3857ef c9 00 cmp #$00 CMP #0 -.3857f1 f0 25 beq $385818 BEQ DISPLAY_OFF -.3857f3 a9 4f lda #$4f LDA #'O' -.3857f5 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.3857f7 a9 30 lda #$30 LDA #$30 -.3857f9 bb tyx TYX -.3857fa 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.3857fe c8 iny INY -.3857ff a9 6e lda #$6e LDA #'n' -.385801 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385803 a9 30 lda #$30 LDA #$30 -.385805 bb tyx TYX -.385806 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.38580a c8 iny INY -.38580b a9 20 lda #$20 LDA #$20 -.38580d 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.38580f a9 30 lda #$30 LDA #$30 -.385811 bb tyx TYX -.385812 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.385816 80 23 bra $38583b BRA ON_OFF_DONE -.385818 DISPLAY_OFF -.385818 a9 4f lda #$4f LDA #'O' -.38581a 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.38581c a9 30 lda #$30 LDA #$30 -.38581e bb tyx TYX -.38581f 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.385823 c8 iny INY -.385824 a9 66 lda #$66 LDA #'f' -.385826 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385828 a9 30 lda #$30 LDA #$30 -.38582a bb tyx TYX -.38582b 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.38582f c8 iny INY -.385830 a9 66 lda #$66 LDA #'f' -.385832 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385834 a9 30 lda #$30 LDA #$30 -.385836 bb tyx TYX -.385837 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.38583b ON_OFF_DONE -.38583b fa plx PLX -.38583c 60 rts RTS -.38583d WRITE_INSTRUMENT_NAME -.38583d a9 0a lda #$0a LDA #10 -.38583f 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE -.385843 WRITE_CHAR -.385843 a7 67 lda [$67] LDA [INSTR_ADDR] -.385845 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385847 e6 67 inc $67 INC INSTR_ADDR -.385849 d0 02 bne $38584d BNE WRITE_CONTINUE -.38584b e6 68 inc $68 INC INSTR_ADDR + 1 -.38584d WRITE_CONTINUE -.38584d a9 30 lda #$30 LDA #$30 -.38584f bb tyx TYX -.385850 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X -.385854 c8 iny INY -.385855 af 01 0f 38 lda $380f01 LDA @lTEMP_STORAGE -.385859 3a dec a DEC A -.38585a 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE -.38585e d0 e3 bne $385843 BNE WRITE_CHAR -.385860 60 rts RTS -.385861 DISPLAY_PATTERN -.385861 8b phb PHB -.385862 0b phd PHD -.385863 a9 39 lda #$39 LDA #`PATTERNS -.385865 85 72 sta $72 STA PTRN_ADDR + 2 -.385867 af 18 0f 38 lda $380f18 LDA PATTERN_NUM ; this is a BCD value so it won't work once values are above 9 -.38586b a0 43 07 ldy #$0743 LDY #23*SCREEN_WIDTH + 19 -.38586e 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.385871 3a dec a DEC A ; use 0 based offsets -.385872 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.385876 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 -.385879 c2 20 rep #$20 REP #$20 ; set A long -.38587b a9 01 07 lda #$0701 LDA #PATTERN_BYTES ; this is the pattern size -.38587e 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.385882 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.385886 1a inc a INC A ; skip the pattern # byte -.385887 85 70 sta $70 STA PTRN_ADDR -.385889 e2 20 sep #$20 SEP #$20 ; set A short -.38588b af 19 0f 38 lda $380f19 LDA LINE_NUM_DEC -.38588f a0 37 07 ldy #$0737 LDY #23*SCREEN_WIDTH + 7 -.385892 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.385895 a9 20 lda #$20 LDA #32 -.385897 85 6e sta $6e STA REM_LINES -.385899 a0 c0 a8 ldy #$a8c0 LDY #<>CS_TEXT_MEM_PTR + SCREEN_WIDTH * 28 ; top of the pattern display -.38589c a5 6c lda $6c LDA LINE_NUM_HEX -.38589e c9 0a cmp #$0a CMP #10 -.3858a0 b0 2f bcs $3858d1 BCS DRAW_DATA ; if line# is greater than 10, skip blank lines and topline -.3858a2 DRAW_BLANK_LINES -.3858a2 38 sec SEC -.3858a3 a9 09 lda #$09 LDA #9 -.3858a5 e5 6c sbc $6c SBC LINE_NUM_HEX -.3858a7 f0 15 beq $3858be BEQ DRAW_TOP_LINE -.3858a9 85 6d sta $6d STA TAB_COUNTER -.3858ab BLANKS_LOOP -.3858ab c2 20 rep #$20 REP #$20 ; set A long -.3858ad a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.3858b0 a2 40 44 ldx #$4440 LDX #<>blank_line -.3858b3 54 af 38 mvn $38,$af MVN #`blank_line,#$AF -.3858b6 e2 20 sep #$20 SEP #$20 ; set A short -.3858b8 c6 6e dec $6e DEC REM_LINES -.3858ba c6 6d dec $6d DEC TAB_COUNTER -.3858bc d0 ed bne $3858ab BNE BLANKS_LOOP -.3858be DRAW_TOP_LINE -.3858be c2 20 rep #$20 REP #$20 ; set A long -.3858c0 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.3858c3 a2 50 43 ldx #$4350 LDX #<>top_line -.3858c6 54 af 38 mvn $38,$af MVN #`top_line,#$AF -.3858c9 e2 20 sep #$20 SEP #$20 ; set A short -.3858cb c6 6e dec $6e DEC REM_LINES -.3858cd a9 01 lda #$01 LDA #1 -.3858cf 80 05 bra $3858d6 BRA MOD_TOP_LINE -.3858d1 DRAW_DATA -.3858d1 38 sec SEC -.3858d2 a5 6c lda $6c LDA LINE_NUM_HEX -.3858d4 e9 09 sbc #$09 SBC #9 -.3858d6 MOD_TOP_LINE -.3858d6 85 6d sta $6d STA TAB_COUNTER -.3858d8 TRIPLET -.3858d8 a9 00 lda #$00 LDA #0 -.3858da 48 pha PHA -.3858db ab plb PLB -.3858dc a9 1c lda #$1c LDA #LINE_BYTES -.3858de 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.3858e2 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 -.3858e5 9c 03 01 stz $0103 STZ UNSIGNED_MULT_B + 1 -.3858e8 a5 6d lda $6d LDA TAB_COUNTER -.3858ea 3a dec a DEC A ; use zero based offset -.3858eb 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.3858ef c2 20 rep #$20 REP #$20 ; set A long -.3858f1 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.3858f5 85 73 sta $73 STA LINE_ADDR -.3858f7 e2 20 sep #$20 SEP #$20 ; set A short -.3858f9 a5 6d lda $6d LDA TAB_COUNTER -.3858fb 29 03 and #$03 AND #3 -.3858fd f0 15 beq $385914 BEQ draw_tick_line -.3858ff c2 20 rep #$20 REP #$20 ; set A long -.385901 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.385904 a2 e0 44 ldx #$44e0 LDX #<>untick_line -.385907 54 af 38 mvn $38,$af MVN #`untick_line,#$AF -.38590a e2 20 sep #$20 SEP #$20 ; set A short -.38590c 20 93 59 jsr $385993 JSR DRAW_LINE_DATA -.38590f c6 6e dec $6e DEC REM_LINES -.385911 4c 26 59 jmp $385926 JMP next_line -.385914 draw_tick_line -.385914 c2 20 rep #$20 REP #$20 ; set A long -.385916 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.385919 a2 90 44 ldx #$4490 LDX #<>tick_line -.38591c 54 af 38 mvn $38,$af MVN #`tick_line,#$AF -.38591f e2 20 sep #$20 SEP #$20 ; set A short -.385921 20 93 59 jsr $385993 JSR DRAW_LINE_DATA -.385924 c6 6e dec $6e DEC REM_LINES -.385926 next_line -.385926 e6 6d inc $6d INC TAB_COUNTER -.385928 a5 6d lda $6d LDA TAB_COUNTER -.38592a c9 41 cmp #$41 CMP #65 -.38592c f0 06 beq $385934 BEQ DRAW_BOTTOM_BAR -.38592e a5 6e lda $6e LDA REM_LINES -.385930 d0 a6 bne $3858d8 BNE TRIPLET -.385932 f0 22 beq $385956 BEQ DRAW_LINE_DONE -.385934 DRAW_BOTTOM_BAR -.385934 c2 20 rep #$20 REP #$20 ; set A long -.385936 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.385939 a2 f0 43 ldx #$43f0 LDX #<>btm_line -.38593c 54 af 38 mvn $38,$af MVN #`btm_line,#$AF -.38593f e2 20 sep #$20 SEP #$20 ; set A short -.385941 a5 6e lda $6e LDA REM_LINES -.385943 f0 11 beq $385956 BEQ DRAW_LINE_DONE -.385945 BLANKS_BTM_LOOP -.385945 c2 20 rep #$20 REP #$20 ; set A long -.385947 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 -.38594a a2 40 44 ldx #$4440 LDX #<>blank_line -.38594d 54 af 38 mvn $38,$af MVN #`blank_line,#$AF -.385950 e2 20 sep #$20 SEP #$20 ; set A short -.385952 c6 6e dec $6e DEC REM_LINES -.385954 d0 ef bne $385945 BNE BLANKS_BTM_LOOP -.385956 DRAW_LINE_DONE -.385956 2b pld PLD -.385957 ab plb PLB -.385958 60 rts RTS -.385959 DISPLAY_FILENAME -.385959 a0 00 00 ldy #$0000 LDY #0 -.38595c a2 63 07 ldx #$0763 LDX #23*SCREEN_WIDTH + 51 -.38595f DF_LOOP -.38595f b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y +.3856db a9 00 lda #$00 LDA #0 +.3856dd 8f 08 00 af sta $af0008 STA BORDER_X_SIZE +.3856e1 8f 09 00 af sta $af0009 STA BORDER_Y_SIZE +.3856e5 e2 20 sep #$20 SEP #$20 ; set A short +.3856e7 a9 20 lda #$20 LDA #$20 +.3856e9 8f 05 00 af sta $af0005 STA BORDER_COLOR_B +.3856ed 8f 07 00 af sta $af0007 STA BORDER_COLOR_R +.3856f1 a9 00 lda #$00 LDA #0 +.3856f3 8f 06 00 af sta $af0006 STA BORDER_COLOR_G +.3856f7 8f 04 00 af sta $af0004 STA BORDER_CTRL_REG +.3856fb 8f 01 00 af sta $af0001 STA MASTER_CTRL_REG_H +.3856ff a9 01 lda #$01 LDA #Mstr_Ctrl_Text_Mode_En +.385701 8f 00 00 af sta $af0000 STA MASTER_CTRL_REG_L +.385705 c2 20 rep #$20 REP #$20 ; set A long +.385707 a9 00 a0 lda #$a000 LDA #<>CS_TEXT_MEM_PTR ; store the initial screen buffer location +.38570a 85 0c sta $0c STA SCREENBEGIN +.38570c 85 17 sta $17 STA CURSORPOS +.38570e e2 20 sep #$20 SEP #$20 ; set A short +.385710 a9 af lda #$af LDA #`CS_TEXT_MEM_PTR +.385712 85 0e sta $0e STA SCREENBEGIN+2 +.385714 85 19 sta $19 STA CURSORPOS+2 +.385716 c2 30 rep #$30 REP #$30 ; set A&X long +.385718 a9 bf 08 lda #$08bf LDA #SCREEN_WIDTH*28-1 +.38571b a2 80 3b ldx #$3b80 LDX #<>TRACKER_SCREEN +.38571e a0 00 a0 ldy #$a000 LDY #<>CS_TEXT_MEM_PTR +.385721 54 af 38 mvn #$38,#$af MVN #`TRACKER_SCREEN,#$AF +.385724 a9 00 08 lda #$0800 LDA #256 * 8 +.385727 a2 80 45 ldx #$4580 LDX #<>FNXFONT +.38572a a0 00 80 ldy #$8000 LDY #<>FONT_MEMORY_BANK0 +.38572d 54 af 38 mvn #$38,#$af MVN #`FNXFONT,#$AF +.385730 a9 ff 60 lda #$60ff LDA #$60FF +.385733 8f 48 1f af sta $af1f48 STA FG_CHAR_LUT_PTR + 8; +.385737 8f 88 1f af sta $af1f88 STA BG_CHAR_LUT_PTR + 8; +.38573b a9 80 00 lda #$0080 LDA #$0080 +.38573e 8f 4a 1f af sta $af1f4a STA FG_CHAR_LUT_PTR + 10; +.385742 8f 8a 1f af sta $af1f8a STA BG_CHAR_LUT_PTR + 10; +.385746 a9 20 80 lda #$8020 LDA #$8020 +.385749 8f 4c 1f af sta $af1f4c STA FG_CHAR_LUT_PTR + 12; +.38574d 8f 8c 1f af sta $af1f8c STA BG_CHAR_LUT_PTR + 12; +.385751 a9 10 00 lda #$0010 LDA #$0010 +.385754 8f 4e 1f af sta $af1f4e STA FG_CHAR_LUT_PTR + 14; +.385758 8f 8e 1f af sta $af1f8e STA BG_CHAR_LUT_PTR + 14; +.38575c a9 cc cc lda #$cccc LDA #$CCCC +.38575f 8f 50 1f af sta $af1f50 STA FG_CHAR_LUT_PTR + 16; +.385763 8f 90 1f af sta $af1f90 STA BG_CHAR_LUT_PTR + 16; +.385767 a9 cc 00 lda #$00cc LDA #$00CC +.38576a 8f 52 1f af sta $af1f52 STA FG_CHAR_LUT_PTR + 18; +.38576e 8f 92 1f af sta $af1f92 STA BG_CHAR_LUT_PTR + 18; +.385772 a9 22 dd lda #$dd22 LDA #$DD22 +.385775 8f 54 1f af sta $af1f54 STA FG_CHAR_LUT_PTR + 20; +.385779 8f 94 1f af sta $af1f94 STA BG_CHAR_LUT_PTR + 20; +.38577d a9 dd 00 lda #$00dd LDA #$00DD +.385780 8f 56 1f af sta $af1f56 STA FG_CHAR_LUT_PTR + 22; +.385784 8f 96 1f af sta $af1f96 STA BG_CHAR_LUT_PTR + 22; +.385788 a2 00 14 ldx #$1400 LDX #SCREEN_WIDTH*64 +.38578b e2 20 sep #$20 SEP #$20 ; set A short +.38578d a9 20 lda #$20 LDA #$20 +.38578f SETTEXTCOLOR +.38578f 9f ff bf af sta $afbfff,x STA CS_COLOR_MEM_PTR-1,X +.385793 ca dex DEX +.385794 d0 f9 bne $38578f BNE SETTEXTCOLOR +.385796 a0 e0 0b ldy #$0be0 LDY #38 * SCREEN_WIDTH +.385799 20 6b 5a jsr $385a6b JSR REVERSE_LUT +.38579c 20 c8 5a jsr $385ac8 JSR HIGHLIGHT_MODE +.38579f 20 5f 5b jsr $385b5f JSR DISPLAY_ACTIVE_CHANNELS +.3857a2 60 rts RTS +.3857a3 WRITE_HEX +.3857a3 48 pha PHA +.3857a4 da phx PHX +.3857a5 5a phy PHY +.3857a6 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE +.3857aa 29 f0 and #$f0 AND #$F0 +.3857ac 4a lsr a lsr A +.3857ad 4a lsr a lsr A +.3857ae 4a lsr a lsr A +.3857af 4a lsr a lsr A +.3857b0 e2 10 sep #$10 SEP #$10 ; set X short +.3857b2 aa tax TAX +.3857b3 bf 05 0f 38 lda $380f05,x LDA HEX_MAP,X +.3857b7 8f 03 0f 38 sta $380f03 STA @lLOW_NIBBLE +.3857bb af 01 0f 38 lda $380f01 LDA @lTEMP_STORAGE +.3857bf 29 0f and #$0f AND #$0F +.3857c1 aa tax TAX +.3857c2 bf 05 0f 38 lda $380f05,x LDA HEX_MAP,X +.3857c6 8f 04 0f 38 sta $380f04 STA @lHIGH_NIBBLE +.3857ca c2 30 rep #$30 REP #$30 ; set A&X long +.3857cc 7a ply PLY +.3857cd af 03 0f 38 lda $380f03 LDA @lLOW_NIBBLE +.3857d1 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.3857d3 a9 30 30 lda #$3030 LDA #$3030 +.3857d6 bb tyx TYX +.3857d7 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.3857db e2 20 sep #$20 SEP #$20 ; set A short +.3857dd fa plx PLX +.3857de 68 pla PLA +.3857df 60 rts RTS +.3857e0 WRITE_OFF_ON +.3857e0 da phx PHX +.3857e1 c9 00 cmp #$00 CMP #0 +.3857e3 f0 25 beq $38580a BEQ DISPLAY_OFF +.3857e5 a9 4f lda #$4f LDA #'O' +.3857e7 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.3857e9 a9 30 lda #$30 LDA #$30 +.3857eb bb tyx TYX +.3857ec 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.3857f0 c8 iny INY +.3857f1 a9 6e lda #$6e LDA #'n' +.3857f3 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.3857f5 a9 30 lda #$30 LDA #$30 +.3857f7 bb tyx TYX +.3857f8 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.3857fc c8 iny INY +.3857fd a9 20 lda #$20 LDA #$20 +.3857ff 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385801 a9 30 lda #$30 LDA #$30 +.385803 bb tyx TYX +.385804 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.385808 80 23 bra $38582d BRA ON_OFF_DONE +.38580a DISPLAY_OFF +.38580a a9 4f lda #$4f LDA #'O' +.38580c 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.38580e a9 30 lda #$30 LDA #$30 +.385810 bb tyx TYX +.385811 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.385815 c8 iny INY +.385816 a9 66 lda #$66 LDA #'f' +.385818 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.38581a a9 30 lda #$30 LDA #$30 +.38581c bb tyx TYX +.38581d 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.385821 c8 iny INY +.385822 a9 66 lda #$66 LDA #'f' +.385824 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385826 a9 30 lda #$30 LDA #$30 +.385828 bb tyx TYX +.385829 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.38582d ON_OFF_DONE +.38582d fa plx PLX +.38582e 60 rts RTS +.38582f WRITE_INSTRUMENT_NAME +.38582f a9 0a lda #$0a LDA #10 +.385831 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE +.385835 WRITE_CHAR +.385835 a7 67 lda [$67] LDA [INSTR_ADDR] +.385837 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385839 e6 67 inc $67 INC INSTR_ADDR +.38583b d0 02 bne $38583f BNE WRITE_CONTINUE +.38583d e6 68 inc $68 INC INSTR_ADDR + 1 +.38583f WRITE_CONTINUE +.38583f a9 30 lda #$30 LDA #$30 +.385841 bb tyx TYX +.385842 9f 00 c0 af sta $afc000,x STA @lCS_COLOR_MEM_PTR, X +.385846 c8 iny INY +.385847 af 01 0f 38 lda $380f01 LDA @lTEMP_STORAGE +.38584b 3a dec a DEC A +.38584c 8f 01 0f 38 sta $380f01 STA @lTEMP_STORAGE +.385850 d0 e3 bne $385835 BNE WRITE_CHAR +.385852 60 rts RTS +.385853 DISPLAY_PATTERN +.385853 8b phb PHB +.385854 0b phd PHD +.385855 a9 39 lda #$39 LDA #`PATTERNS +.385857 85 72 sta $72 STA PTRN_ADDR + 2 +.385859 af 18 0f 38 lda $380f18 LDA PATTERN_NUM ; this is a BCD value so it won't work once values are above 9 +.38585d a0 43 07 ldy #$0743 LDY #23*SCREEN_WIDTH + 19 +.385860 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.385863 3a dec a DEC A ; use 0 based offsets +.385864 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.385868 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 +.38586b c2 20 rep #$20 REP #$20 ; set A long +.38586d a9 01 07 lda #$0701 LDA #PATTERN_BYTES ; this is the pattern size +.385870 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.385874 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.385878 1a inc a INC A ; skip the pattern # byte +.385879 85 70 sta $70 STA PTRN_ADDR +.38587b e2 20 sep #$20 SEP #$20 ; set A short +.38587d af 19 0f 38 lda $380f19 LDA LINE_NUM_DEC +.385881 a0 37 07 ldy #$0737 LDY #23*SCREEN_WIDTH + 7 +.385884 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.385887 a9 20 lda #$20 LDA #32 +.385889 85 6e sta $6e STA REM_LINES +.38588b a0 c0 a8 ldy #$a8c0 LDY #<>CS_TEXT_MEM_PTR + SCREEN_WIDTH * 28 ; top of the pattern display +.38588e a5 6c lda $6c LDA LINE_NUM_HEX +.385890 c9 0a cmp #$0a CMP #10 +.385892 b0 2f bcs $3858c3 BCS DRAW_DATA ; if line# is greater than 10, skip blank lines and topline +.385894 DRAW_BLANK_LINES +.385894 38 sec SEC +.385895 a9 09 lda #$09 LDA #9 +.385897 e5 6c sbc $6c SBC LINE_NUM_HEX +.385899 f0 15 beq $3858b0 BEQ DRAW_TOP_LINE +.38589b 85 6d sta $6d STA TAB_COUNTER +.38589d BLANKS_LOOP +.38589d c2 20 rep #$20 REP #$20 ; set A long +.38589f a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.3858a2 a2 40 44 ldx #$4440 LDX #<>blank_line +.3858a5 54 af 38 mvn #$38,#$af MVN #`blank_line,#$AF +.3858a8 e2 20 sep #$20 SEP #$20 ; set A short +.3858aa c6 6e dec $6e DEC REM_LINES +.3858ac c6 6d dec $6d DEC TAB_COUNTER +.3858ae d0 ed bne $38589d BNE BLANKS_LOOP +.3858b0 DRAW_TOP_LINE +.3858b0 c2 20 rep #$20 REP #$20 ; set A long +.3858b2 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.3858b5 a2 50 43 ldx #$4350 LDX #<>top_line +.3858b8 54 af 38 mvn #$38,#$af MVN #`top_line,#$AF +.3858bb e2 20 sep #$20 SEP #$20 ; set A short +.3858bd c6 6e dec $6e DEC REM_LINES +.3858bf a9 01 lda #$01 LDA #1 +.3858c1 80 05 bra $3858c8 BRA MOD_TOP_LINE +.3858c3 DRAW_DATA +.3858c3 38 sec SEC +.3858c4 a5 6c lda $6c LDA LINE_NUM_HEX +.3858c6 e9 09 sbc #$09 SBC #9 +.3858c8 MOD_TOP_LINE +.3858c8 85 6d sta $6d STA TAB_COUNTER +.3858ca TRIPLET +.3858ca a9 00 lda #$00 LDA #0 +.3858cc 48 pha PHA +.3858cd ab plb PLB +.3858ce a9 1c lda #$1c LDA #LINE_BYTES +.3858d0 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.3858d4 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 +.3858d7 9c 03 01 stz $0103 STZ UNSIGNED_MULT_B + 1 +.3858da a5 6d lda $6d LDA TAB_COUNTER +.3858dc 3a dec a DEC A ; use zero based offset +.3858dd 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.3858e1 c2 20 rep #$20 REP #$20 ; set A long +.3858e3 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.3858e7 85 73 sta $73 STA LINE_ADDR +.3858e9 e2 20 sep #$20 SEP #$20 ; set A short +.3858eb a5 6d lda $6d LDA TAB_COUNTER +.3858ed 29 03 and #$03 AND #3 +.3858ef f0 15 beq $385906 BEQ draw_tick_line +.3858f1 c2 20 rep #$20 REP #$20 ; set A long +.3858f3 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.3858f6 a2 e0 44 ldx #$44e0 LDX #<>untick_line +.3858f9 54 af 38 mvn #$38,#$af MVN #`untick_line,#$AF +.3858fc e2 20 sep #$20 SEP #$20 ; set A short +.3858fe 20 85 59 jsr $385985 JSR DRAW_LINE_DATA +.385901 c6 6e dec $6e DEC REM_LINES +.385903 4c 18 59 jmp $385918 JMP next_line +.385906 draw_tick_line +.385906 c2 20 rep #$20 REP #$20 ; set A long +.385908 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.38590b a2 90 44 ldx #$4490 LDX #<>tick_line +.38590e 54 af 38 mvn #$38,#$af MVN #`tick_line,#$AF +.385911 e2 20 sep #$20 SEP #$20 ; set A short +.385913 20 85 59 jsr $385985 JSR DRAW_LINE_DATA +.385916 c6 6e dec $6e DEC REM_LINES +.385918 next_line +.385918 e6 6d inc $6d INC TAB_COUNTER +.38591a a5 6d lda $6d LDA TAB_COUNTER +.38591c c9 41 cmp #$41 CMP #MUSICAL_LINES_PER_BAR + 1 +.38591e f0 06 beq $385926 BEQ DRAW_BOTTOM_BAR +.385920 a5 6e lda $6e LDA REM_LINES +.385922 d0 a6 bne $3858ca BNE TRIPLET +.385924 f0 22 beq $385948 BEQ DRAW_LINE_DONE +.385926 DRAW_BOTTOM_BAR +.385926 c2 20 rep #$20 REP #$20 ; set A long +.385928 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.38592b a2 f0 43 ldx #$43f0 LDX #<>btm_line +.38592e 54 af 38 mvn #$38,#$af MVN #`btm_line,#$AF +.385931 e2 20 sep #$20 SEP #$20 ; set A short +.385933 a5 6e lda $6e LDA REM_LINES +.385935 f0 11 beq $385948 BEQ DRAW_LINE_DONE +.385937 BLANKS_BTM_LOOP +.385937 c2 20 rep #$20 REP #$20 ; set A long +.385939 a9 4f 00 lda #$004f LDA #SCREEN_WIDTH-1 +.38593c a2 40 44 ldx #$4440 LDX #<>blank_line +.38593f 54 af 38 mvn #$38,#$af MVN #`blank_line,#$AF +.385942 e2 20 sep #$20 SEP #$20 ; set A short +.385944 c6 6e dec $6e DEC REM_LINES +.385946 d0 ef bne $385937 BNE BLANKS_BTM_LOOP +.385948 DRAW_LINE_DONE +.385948 2b pld PLD +.385949 ab plb PLB +.38594a 60 rts RTS +.38594b DISPLAY_FILENAME +.38594b a0 00 00 ldy #$0000 LDY #0 +.38594e a2 63 07 ldx #$0763 LDX #23*SCREEN_WIDTH + 51 +.385951 DF_LOOP +.385951 b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y +.385953 5a phy PHY +.385954 9b txy TXY +.385955 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385957 e8 inx INX +.385958 7a ply PLY +.385959 c8 iny INY +.38595a c0 08 00 cpy #$0008 CPY #8 +.38595d d0 08 bne $385967 BNE DF_NOT_DOT +.38595f a9 2e lda #$2e LDA #'.' .385961 5a phy PHY .385962 9b txy TXY .385963 97 0c sta [$0c],y STA [SCREENBEGIN], Y .385965 e8 inx INX .385966 7a ply PLY -.385967 c8 iny INY -.385968 c0 08 00 cpy #$0008 CPY #8 -.38596b d0 08 bne $385975 BNE DF_NOT_DOT -.38596d a9 2e lda #$2e LDA #'.' -.38596f 5a phy PHY -.385970 9b txy TXY +.385967 DF_NOT_DOT +.385967 c0 0b 00 cpy #$000b CPY #11 +.38596a d0 e5 bne $385951 BNE DF_LOOP +.38596c 9b txy TXY +.38596d c8 iny INY +.38596e c8 iny INY +.38596f a9 76 lda #$76 LDA #'v' .385971 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385973 e8 inx INX -.385974 7a ply PLY -.385975 DF_NOT_DOT -.385975 c0 0b 00 cpy #$000b CPY #11 -.385978 d0 e5 bne $38595f BNE DF_LOOP -.38597a 9b txy TXY -.38597b c8 iny INY -.38597c c8 iny INY -.38597d a9 76 lda #$76 LDA #'v' -.38597f 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385981 c8 iny INY -.385982 af 67 6a 38 lda $386a67 LDA @lTuneInfo.version -.385986 89 02 bit #$02 BIT #2 -.385988 d0 04 bne $38598e BNE DF_V2 -.38598a a9 31 lda #$31 LDA #'1' -.38598c 80 02 bra $385990 BRA DF_DONE -.38598e DF_V2 -.38598e a9 32 lda #$32 LDA #'2' -.385990 DF_DONE -.385990 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385992 60 rts RTS -.385993 DRAW_LINE_DATA -.385993 5a phy PHY -.385994 da phx PHX -.385995 a9 09 lda #$09 LDA #9 ; number of channels to populate -.385997 85 f7 sta $f7 STA RAD_CHANNEL -.385999 c2 20 rep #$20 REP #$20 ; set A long -.38599b 98 tya TYA ; copy Y into A -.38599c 38 sec SEC -.38599d e9 50 a0 sbc #$a050 SBC #$A000 + SCREEN_WIDTH -.3859a0 aa tax TAX -.3859a1 e2 20 sep #$20 SEP #$20 ; set A short -.3859a3 a4 73 ldy $73 LDY LINE_ADDR -.3859a5 c8 iny INY ; skip the line number -.3859a6 NEXT_CHANNEL -.3859a6 64 4e stz $4e STZ RAD_TEMP -.3859a8 b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; note/octave -.3859aa e8 inx INX ; skip the first column -.3859ab c8 iny INY -.3859ac c9 00 cmp #$00 CMP #0 -.3859ae d0 04 bne $3859b4 BNE DL_DRAW_NOTE -.3859b0 e8 inx INX -.3859b1 e8 inx INX -.3859b2 80 03 bra $3859b7 BRA DL_SKIP_NOTE_DISPLAY -.3859b4 DL_DRAW_NOTE -.3859b4 20 55 5a jsr $385a55 JSR DISPLAY_NOTE_OCTAVE -.3859b7 DL_SKIP_NOTE_DISPLAY -.3859b7 2a rol a ROL A ; put bit 7 into the carry -.3859b8 90 0b bcc $3859c5 BCC SKIP_MID_COL -.3859ba a9 31 lda #$31 LDA #'1' -.3859bc 5a phy PHY -.3859bd 9b txy TXY -.3859be 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.3859c0 7a ply PLY -.3859c1 a9 10 lda #$10 LDA #$10 -.3859c3 85 4e sta $4e STA RAD_TEMP -.3859c5 SKIP_MID_COL -.3859c5 e8 inx INX ; skip the middle column -.3859c6 b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; instrument/effect -.3859c8 c8 iny INY -.3859c9 20 e2 59 jsr $3859e2 JSR DISPLAY_VALUE_SKIP_LOW_NIBBLE_IF_ZERO -.3859cc c9 00 cmp #$00 CMP #0 ; if the effect byte is 0, don't display the next value -.3859ce d0 04 bne $3859d4 BNE SHOW_EFFECT -.3859d0 e8 inx INX -.3859d1 e8 inx INX -.3859d2 80 05 bra $3859d9 BRA DL_SKIP_EFFECT -.3859d4 SHOW_EFFECT -.3859d4 b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; -.3859d6 20 34 5a jsr $385a34 JSR DISPLAY_DEC_VALUE -.3859d9 DL_SKIP_EFFECT -.3859d9 c8 iny INY -.3859da e8 inx INX ; skip the vertical bar -.3859db c6 f7 dec $f7 DEC RAD_CHANNEL -.3859dd d0 c7 bne $3859a6 BNE NEXT_CHANNEL -.3859df fa plx PLX -.3859e0 7a ply PLY -.3859e1 60 rts RTS -.3859e2 DISPLAY_VALUE_SKIP_LOW_NIBBLE_IF_ZERO -.3859e2 5a phy PHY -.3859e3 48 pha PHA -.3859e4 9b txy TXY -.3859e5 a2 00 00 ldx #$0000 LDX #0 -.3859e8 eb xba XBA +.385973 c8 iny INY +.385974 af d2 6a 38 lda $386ad2 LDA @lTuneInfo.version +.385978 89 02 bit #$02 BIT #2 +.38597a d0 04 bne $385980 BNE DF_V2 +.38597c a9 31 lda #$31 LDA #'1' +.38597e 80 02 bra $385982 BRA DF_DONE +.385980 DF_V2 +.385980 a9 32 lda #$32 LDA #'2' +.385982 DF_DONE +.385982 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385984 60 rts RTS +.385985 DRAW_LINE_DATA +.385985 5a phy PHY +.385986 da phx PHX +.385987 a9 09 lda #$09 LDA #9 ; number of channels to populate +.385989 85 f7 sta $f7 STA RAD_CHANNEL +.38598b c2 20 rep #$20 REP #$20 ; set A long +.38598d 98 tya TYA ; copy Y into A +.38598e 38 sec SEC +.38598f e9 50 a0 sbc #$a050 SBC #$A000 + SCREEN_WIDTH +.385992 aa tax TAX +.385993 e2 20 sep #$20 SEP #$20 ; set A short +.385995 a4 73 ldy $73 LDY LINE_ADDR +.385997 c8 iny INY ; skip the line number +.385998 NEXT_CHANNEL +.385998 64 4e stz $4e STZ RAD_TEMP +.38599a b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; note/octave +.38599c e8 inx INX ; skip the first column +.38599d c8 iny INY +.38599e c9 00 cmp #$00 CMP #0 +.3859a0 d0 04 bne $3859a6 BNE DL_DRAW_NOTE +.3859a2 e8 inx INX +.3859a3 e8 inx INX +.3859a4 80 03 bra $3859a9 BRA DL_SKIP_NOTE_DISPLAY +.3859a6 DL_DRAW_NOTE +.3859a6 20 47 5a jsr $385a47 JSR DISPLAY_NOTE_OCTAVE +.3859a9 DL_SKIP_NOTE_DISPLAY +.3859a9 2a rol a ROL A ; put bit 7 into the carry +.3859aa 90 0b bcc $3859b7 BCC SKIP_MID_COL +.3859ac a9 31 lda #$31 LDA #'1' +.3859ae 5a phy PHY +.3859af 9b txy TXY +.3859b0 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.3859b2 7a ply PLY +.3859b3 a9 10 lda #$10 LDA #$10 +.3859b5 85 4e sta $4e STA RAD_TEMP +.3859b7 SKIP_MID_COL +.3859b7 e8 inx INX ; skip the middle column +.3859b8 b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; instrument/effect +.3859ba c8 iny INY +.3859bb 20 d4 59 jsr $3859d4 JSR DISPLAY_VALUE_SKIP_LOW_NIBBLE_IF_ZERO +.3859be c9 00 cmp #$00 CMP #0 ; if the effect byte is 0, don't display the next value +.3859c0 d0 04 bne $3859c6 BNE SHOW_EFFECT +.3859c2 e8 inx INX +.3859c3 e8 inx INX +.3859c4 80 05 bra $3859cb BRA DL_SKIP_EFFECT +.3859c6 SHOW_EFFECT +.3859c6 b7 70 lda [$70],y LDA [PTRN_ADDR],Y ; +.3859c8 20 26 5a jsr $385a26 JSR DISPLAY_DEC_VALUE +.3859cb DL_SKIP_EFFECT +.3859cb c8 iny INY +.3859cc e8 inx INX ; skip the vertical bar +.3859cd c6 f7 dec $f7 DEC RAD_CHANNEL +.3859cf d0 c7 bne $385998 BNE NEXT_CHANNEL +.3859d1 fa plx PLX +.3859d2 7a ply PLY +.3859d3 60 rts RTS +.3859d4 DISPLAY_VALUE_SKIP_LOW_NIBBLE_IF_ZERO +.3859d4 5a phy PHY +.3859d5 48 pha PHA +.3859d6 9b txy TXY +.3859d7 a2 00 00 ldx #$0000 LDX #0 +.3859da eb xba XBA +.3859db a9 00 lda #$00 LDA #0 +.3859dd eb xba XBA +.3859de 29 f0 and #$f0 AND #$F0 ; high-nibble +.3859e0 d0 09 bne $3859eb BNE DV_DISPLAY_VALUE +.3859e2 a5 4e lda $4e LDA RAD_TEMP +.3859e4 d0 03 bne $3859e9 BNE DV_DISPLAY_ZERO +.3859e6 c8 iny INY +.3859e7 80 0e bra $3859f7 BRA DV_LOW_NIBBLE +.3859e9 DV_DISPLAY_ZERO .3859e9 a9 00 lda #$00 LDA #0 -.3859eb eb xba XBA -.3859ec 29 f0 and #$f0 AND #$F0 ; high-nibble -.3859ee d0 09 bne $3859f9 BNE DV_DISPLAY_VALUE -.3859f0 a5 4e lda $4e LDA RAD_TEMP -.3859f2 d0 03 bne $3859f7 BNE DV_DISPLAY_ZERO -.3859f4 c8 iny INY -.3859f5 80 0e bra $385a05 BRA DV_LOW_NIBBLE -.3859f7 DV_DISPLAY_ZERO -.3859f7 a9 00 lda #$00 LDA #0 -.3859f9 DV_DISPLAY_VALUE -.3859f9 4a lsr a LSR -.3859fa 4a lsr a LSR -.3859fb 4a lsr a LSR -.3859fc 4a lsr a LSR -.3859fd aa tax TAX -.3859fe bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X -.385a02 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.385a04 c8 iny INY -.385a05 DV_LOW_NIBBLE -.385a05 68 pla PLA -.385a06 29 0f and #$0f AND #$F ; low-nibble - effect -.385a08 f0 07 beq $385a11 BEQ SKIP_VALUE -.385a0a aa tax TAX -.385a0b bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X -.385a0f 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.385a11 SKIP_VALUE -.385a11 c8 iny INY -.385a12 bb tyx TYX -.385a13 7a ply PLY -.385a14 60 rts RTS -.385a15 DISPLAY_VALUE -.385a15 5a phy PHY -.385a16 48 pha PHA -.385a17 9b txy TXY -.385a18 29 f0 and #$f0 AND #$F0 ; high-nibble -.385a1a 4a lsr a LSR -.385a1b 4a lsr a LSR -.385a1c 4a lsr a LSR -.385a1d 4a lsr a LSR -.385a1e aa tax TAX -.385a1f bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X -.385a23 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.385a25 c8 iny INY -.385a26 68 pla PLA -.385a27 29 0f and #$0f AND #$F ; low-nibble -.385a29 aa tax TAX -.385a2a bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X -.385a2e 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.385a30 c8 iny INY -.385a31 bb tyx TYX -.385a32 7a ply PLY -.385a33 60 rts RTS -.385a34 DISPLAY_DEC_VALUE -.385a34 48 pha PHA -.385a35 29 07 and #$07 AND #$7 -.385a37 85 6f sta $6f STA DEC_MEM -.385a39 68 pla PLA -.385a3a 29 f8 and #$f8 AND #$F8 ; count in BCD in factors of 8 -.385a3c 18 clc CLC -.385a3d 4a lsr a LSR -.385a3e 4a lsr a LSR -.385a3f 4a lsr a LSR -.385a40 85 76 sta $76 STA CONV_VAL -.385a42 f8 sed SED ; switch to decimal mode -.385a43 f0 09 beq $385a4e BEQ ADD_DEC -.385a45 18 clc CLC -.385a46 a9 00 lda #$00 LDA #0 -.385a48 MULT_DEC -.385a48 69 08 adc #$08 ADC #$8 -.385a4a c6 76 dec $76 DEC CONV_VAL -.385a4c d0 fa bne $385a48 BNE MULT_DEC -.385a4e ADD_DEC -.385a4e 65 6f adc $6f ADC DEC_MEM -.385a50 20 15 5a jsr $385a15 JSR DISPLAY_VALUE -.385a53 d8 cld CLD -.385a54 60 rts RTS -.385a55 DISPLAY_NOTE_OCTAVE -.385a55 5a phy PHY -.385a56 48 pha PHA -.385a57 48 pha PHA -.385a58 9b txy TXY -.385a59 c2 20 rep #$20 REP #$20 ; set A long -.385a5b 29 0f 00 and #$000f AND #$F ; low-nibble - C#=1, D=2, ... C=12, 0 is no note and $F is Key Off -.385a5e aa tax TAX -.385a5f e2 20 sep #$20 SEP #$20 ; set A short -.385a61 bf 5a 6a 38 lda $386a5a,x LDA @lnote_array, X -.385a65 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385a67 c8 iny INY +.3859eb DV_DISPLAY_VALUE +.3859eb 4a lsr a LSR +.3859ec 4a lsr a LSR +.3859ed 4a lsr a LSR +.3859ee 4a lsr a LSR +.3859ef aa tax TAX +.3859f0 bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X +.3859f4 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.3859f6 c8 iny INY +.3859f7 DV_LOW_NIBBLE +.3859f7 68 pla PLA +.3859f8 29 0f and #$0f AND #$F ; low-nibble - effect +.3859fa f0 07 beq $385a03 BEQ SKIP_VALUE +.3859fc aa tax TAX +.3859fd bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X +.385a01 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.385a03 SKIP_VALUE +.385a03 c8 iny INY +.385a04 bb tyx TYX +.385a05 7a ply PLY +.385a06 60 rts RTS +.385a07 DISPLAY_VALUE +.385a07 5a phy PHY +.385a08 48 pha PHA +.385a09 9b txy TXY +.385a0a 29 f0 and #$f0 AND #$F0 ; high-nibble +.385a0c 4a lsr a LSR +.385a0d 4a lsr a LSR +.385a0e 4a lsr a LSR +.385a0f 4a lsr a LSR +.385a10 aa tax TAX +.385a11 bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X +.385a15 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.385a17 c8 iny INY +.385a18 68 pla PLA +.385a19 29 0f and #$0f AND #$F ; low-nibble +.385a1b aa tax TAX +.385a1c bf 05 0f 38 lda $380f05,x LDA HEX_MAP, X +.385a20 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.385a22 c8 iny INY +.385a23 bb tyx TYX +.385a24 7a ply PLY +.385a25 60 rts RTS +.385a26 DISPLAY_DEC_VALUE +.385a26 48 pha PHA +.385a27 29 07 and #$07 AND #$7 +.385a29 85 6f sta $6f STA DEC_MEM +.385a2b 68 pla PLA +.385a2c 29 f8 and #$f8 AND #$F8 ; count in BCD in factors of 8 +.385a2e 18 clc CLC +.385a2f 4a lsr a LSR +.385a30 4a lsr a LSR +.385a31 4a lsr a LSR +.385a32 85 76 sta $76 STA CONV_VAL +.385a34 f8 sed SED ; switch to decimal mode +.385a35 f0 09 beq $385a40 BEQ ADD_DEC +.385a37 18 clc CLC +.385a38 a9 00 lda #$00 LDA #0 +.385a3a MULT_DEC +.385a3a 69 08 adc #$08 ADC #$8 +.385a3c c6 76 dec $76 DEC CONV_VAL +.385a3e d0 fa bne $385a3a BNE MULT_DEC +.385a40 ADD_DEC +.385a40 65 6f adc $6f ADC DEC_MEM +.385a42 20 07 5a jsr $385a07 JSR DISPLAY_VALUE +.385a45 d8 cld CLD +.385a46 60 rts RTS +.385a47 DISPLAY_NOTE_OCTAVE +.385a47 5a phy PHY +.385a48 48 pha PHA +.385a49 48 pha PHA +.385a4a 9b txy TXY +.385a4b c2 20 rep #$20 REP #$20 ; set A long +.385a4d 29 0f 00 and #$000f AND #$F ; low-nibble - C#=1, D=2, ... C=12, 0 is no note and $F is Key Off +.385a50 aa tax TAX +.385a51 e2 20 sep #$20 SEP #$20 ; set A short +.385a53 bf c5 6a 38 lda $386ac5,x LDA @lnote_array, X +.385a57 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385a59 c8 iny INY +.385a5a 68 pla PLA +.385a5b 29 70 and #$70 AND #$70 ; high-nibble +.385a5d 4a lsr a LSR +.385a5e 4a lsr a LSR +.385a5f 4a lsr a LSR +.385a60 4a lsr a LSR +.385a61 18 clc CLC +.385a62 69 30 adc #$30 ADC #$30 +.385a64 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385a66 c8 iny INY +.385a67 bb tyx TYX .385a68 68 pla PLA -.385a69 29 70 and #$70 AND #$70 ; high-nibble -.385a6b 4a lsr a LSR -.385a6c 4a lsr a LSR -.385a6d 4a lsr a LSR -.385a6e 4a lsr a LSR -.385a6f 18 clc CLC -.385a70 69 30 adc #$30 ADC #$30 -.385a72 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385a74 c8 iny INY -.385a75 bb tyx TYX -.385a76 68 pla PLA -.385a77 7a ply PLY -.385a78 60 rts RTS -.385a79 REVERSE_LUT -.385a79 8b phb PHB -.385a7a a9 af lda #$af LDA #`CS_COLOR_MEM_PTR -.385a7c 48 pha PHA -.385a7d ab plb PLB -.385a7e a9 09 lda #$09 LDA #9 -.385a80 85 6d sta $6d STA TAB_COUNTER -.385a82 REVERSE_LUT_TABS -.385a82 a9 42 lda #$42 LDA #$42 ; purple background and white foreground +.385a69 7a ply PLY +.385a6a 60 rts RTS +.385a6b REVERSE_LUT +.385a6b 8b phb PHB +.385a6c a9 af lda #$af LDA #`CS_COLOR_MEM_PTR +.385a6e 48 pha PHA +.385a6f ab plb PLB +.385a70 a9 09 lda #$09 LDA #9 +.385a72 85 6d sta $6d STA TAB_COUNTER +.385a74 REVERSE_LUT_TABS +.385a74 a9 42 lda #$42 LDA #$42 ; purple background and white foreground +.385a76 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y +.385a79 c8 iny INY +.385a7a 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y +.385a7d c8 iny INY +.385a7e 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y +.385a81 c8 iny INY +.385a82 a9 52 lda #$52 LDA #$52 ; purple background and yellow foreground .385a84 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y .385a87 c8 iny INY .385a88 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y .385a8b c8 iny INY -.385a8c 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y -.385a8f c8 iny INY -.385a90 a9 52 lda #$52 LDA #$52 ; purple background and yellow foreground +.385a8c a9 42 lda #$42 LDA #$42 ; purple background and white foreground +.385a8e 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y +.385a91 c8 iny INY .385a92 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y .385a95 c8 iny INY .385a96 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y .385a99 c8 iny INY -.385a9a a9 42 lda #$42 LDA #$42 ; purple background and white foreground -.385a9c 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y -.385a9f c8 iny INY -.385aa0 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y -.385aa3 c8 iny INY -.385aa4 99 00 c0 sta $afc000,y STA CS_COLOR_MEM_PTR, Y -.385aa7 c8 iny INY -.385aa8 c8 iny INY ; skip separator -.385aa9 c6 6d dec $6d DEC TAB_COUNTER -.385aab d0 d5 bne $385a82 BNE REVERSE_LUT_TABS -.385aad ab plb PLB -.385aae 60 rts RTS +.385a9a c8 iny INY ; skip separator +.385a9b c6 6d dec $6d DEC TAB_COUNTER +.385a9d d0 d5 bne $385a74 BNE REVERSE_LUT_TABS +.385a9f ab plb PLB +.385aa0 60 rts RTS =406 INSTR_HL_SCR = SCREEN_WIDTH * 5 + 6 =484 INSTR_NUM_HL_SCR = SCREEN_WIDTH * 6 + 4 =453 ORDER_HL_SCR = SCREEN_WIDTH * 5 + 53 =2081 PTTRN_HL_SCR = SCREEN_WIDTH * 26 + 1 -.385aaf DISPLAY_SPEED -.385aaf 5a phy PHY -.385ab0 af 69 6a 38 lda $386a69 LDA @lTuneInfo.InitialSpeed -.385ab4 a0 58 07 ldy #$0758 LDY #23*SCREEN_WIDTH + 40 -.385ab7 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.385aba af 6a 6a 38 lda $386a6a LDA @lTuneInfo.hasSlowTimer -.385abe f0 07 beq $385ac7 BEQ DS_DONE -.385ac0 a9 2a lda #$2a LDA #'*' -.385ac2 a0 57 07 ldy #$0757 LDY #23*SCREEN_WIDTH + 39 -.385ac5 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385ac7 DS_DONE -.385ac7 7a ply PLY -.385ac8 60 rts RTS -.385ac9 DISPLAY_BPM -.385ac9 60 rts RTS -.385aca HL_CLR_TABLE ->385aca 40 20 20 10 .byte $40, $20, $20, $10 ->385ace 20 40 20 30 .byte $20, $40, $20, $30 ->385ad2 20 20 40 20 .byte $20, $20, $40, $20 -.385ad6 HIGHLIGHT_MODE -.385ad6 a9 00 lda #$00 LDA #0 -.385ad8 eb xba XBA -.385ad9 af 15 0f 38 lda $380f15 LDA STATE_MACHINE -.385add 29 30 and #$30 AND #$30 -.385adf 4a lsr a LSR -.385ae0 4a lsr a LSR -.385ae1 48 pha PHA -.385ae2 48 pha PHA -.385ae3 aa tax TAX -.385ae4 bf ca 5a 38 lda $385aca,x LDA HL_CLR_TABLE,X -.385ae8 a2 0a 00 ldx #$000a LDX #10 -.385aeb a0 96 21 ldy #$2196 LDY #$2000 + INSTR_HL_SCR -.385aee INSTR_HIGHLIGHT_LOOP -.385aee 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385af0 c8 iny INY -.385af1 ca dex DEX -.385af2 d0 fa bne $385aee BNE INSTR_HIGHLIGHT_LOOP -.385af4 a0 e4 21 ldy #$21e4 LDY #$2000 + INSTR_NUM_HL_SCR +.385aa1 DISPLAY_SPEED +.385aa1 5a phy PHY +.385aa2 af d4 6a 38 lda $386ad4 LDA @lTuneInfo.InitialSpeed +.385aa6 a0 58 07 ldy #$0758 LDY #23*SCREEN_WIDTH + 40 +.385aa9 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.385aac af d5 6a 38 lda $386ad5 LDA @lTuneInfo.hasSlowTimer +.385ab0 f0 07 beq $385ab9 BEQ DS_DONE +.385ab2 a9 2a lda #$2a LDA #'*' +.385ab4 a0 57 07 ldy #$0757 LDY #23*SCREEN_WIDTH + 39 +.385ab7 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385ab9 DS_DONE +.385ab9 7a ply PLY +.385aba 60 rts RTS +.385abb DISPLAY_BPM +.385abb 60 rts RTS +.385abc HL_CLR_TABLE +>385abc 40 20 20 10 .byte $40, $20, $20, $10 +>385ac0 20 40 20 30 .byte $20, $40, $20, $30 +>385ac4 20 20 40 20 .byte $20, $20, $40, $20 +.385ac8 HIGHLIGHT_MODE +.385ac8 a9 00 lda #$00 LDA #0 +.385aca eb xba XBA +.385acb af 15 0f 38 lda $380f15 LDA STATE_MACHINE +.385acf 29 30 and #$30 AND #$30 +.385ad1 4a lsr a LSR +.385ad2 4a lsr a LSR +.385ad3 48 pha PHA +.385ad4 48 pha PHA +.385ad5 aa tax TAX +.385ad6 bf bc 5a 38 lda $385abc,x LDA HL_CLR_TABLE,X +.385ada a2 0a 00 ldx #$000a LDX #10 +.385add a0 96 21 ldy #$2196 LDY #$2000 + INSTR_HL_SCR +.385ae0 INSTR_HIGHLIGHT_LOOP +.385ae0 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385ae2 c8 iny INY +.385ae3 ca dex DEX +.385ae4 d0 fa bne $385ae0 BNE INSTR_HIGHLIGHT_LOOP +.385ae6 a0 e4 21 ldy #$21e4 LDY #$2000 + INSTR_NUM_HL_SCR +.385ae9 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385aeb 68 pla PLA +.385aec aa tax TAX +.385aed bf bd 5a 38 lda $385abd,x LDA HL_CLR_TABLE+1,X +.385af1 a2 05 00 ldx #$0005 LDX #5 +.385af4 a0 c5 21 ldy #$21c5 LDY #$2000 + ORDER_HL_SCR +.385af7 ORDER_HIGHLIGHT_LOOP .385af7 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385af9 68 pla PLA -.385afa aa tax TAX -.385afb bf cb 5a 38 lda $385acb,x LDA HL_CLR_TABLE+1,X -.385aff a2 05 00 ldx #$0005 LDX #5 -.385b02 a0 c5 21 ldy #$21c5 LDY #$2000 + ORDER_HL_SCR -.385b05 ORDER_HIGHLIGHT_LOOP -.385b05 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385b07 c8 iny INY -.385b08 ca dex DEX -.385b09 d0 fa bne $385b05 BNE ORDER_HIGHLIGHT_LOOP -.385b0b 68 pla PLA -.385b0c aa tax TAX -.385b0d bf cc 5a 38 lda $385acc,x LDA HL_CLR_TABLE+2,X -.385b11 a2 09 00 ldx #$0009 LDX #9 -.385b14 a0 21 28 ldy #$2821 LDY #$2000 + PTTRN_HL_SCR -.385b17 HL_PATTERN_LOOP -.385b17 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385b19 c8 iny INY -.385b1a c8 iny INY -.385b1b c8 iny INY -.385b1c c8 iny INY -.385b1d c8 iny INY -.385b1e 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385b20 c8 iny INY -.385b21 c8 iny INY -.385b22 c8 iny INY -.385b23 c8 iny INY -.385b24 ca dex DEX -.385b25 d0 f0 bne $385b17 BNE HL_PATTERN_LOOP -.385b27 20 6d 5b jsr $385b6d JSR DISPLAY_ACTIVE_CHANNELS -.385b2a 60 rts RTS -.385b2b DISPLAY_ORDERS -.385b2b af 68 6a 38 lda $386a68 LDA @lTuneInfo.songLength -.385b2f f0 3b beq $385b6c BEQ DO_DONE -.385b31 c9 0e cmp #$0e CMP #14 -.385b33 90 02 bcc $385b37 BCC DO_DISPLAY_ORDERS -.385b35 a9 0e lda #$0e LDA #14 ; only display up to 14 orders -.385b37 DO_DISPLAY_ORDERS -.385b37 85 6d sta $6d STA TAB_COUNTER -.385b39 a2 00 00 ldx #$0000 LDX #0 -.385b3c a0 65 02 ldy #$0265 LDY #SCREEN_WIDTH * 7 + 53 -.385b3f c2 20 rep #$20 REP #$20 ; set A long -.385b41 a9 24 fc lda #$fc24 LDA #<>ORDERS -.385b44 85 f0 sta $f0 STA RAD_ADDR -.385b46 a9 39 00 lda #$0039 LDA #<`ORDERS -.385b49 85 f2 sta $f2 STA RAD_ADDR + 2 -.385b4b e2 20 sep #$20 SEP #$20 ; set A short -.385b4d NEXT_ORDER -.385b4d 8a txa TXA -.385b4e 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.385b51 c8 iny INY -.385b52 c8 iny INY -.385b53 c8 iny INY -.385b54 5a phy PHY -.385b55 9b txy TXY -.385b56 b7 f0 lda [$f0],y LDA [RAD_ADDR],Y -.385b58 1a inc a INC A -.385b59 7a ply PLY -.385b5a 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.385b5d e8 inx INX -.385b5e c2 20 rep #$20 REP #$20 ; set A long -.385b60 98 tya TYA -.385b61 18 clc CLC -.385b62 69 4d 00 adc #$004d ADC #SCREEN_WIDTH - 3 -.385b65 a8 tay TAY -.385b66 e2 20 sep #$20 SEP #$20 ; set A short -.385b68 c6 6d dec $6d DEC TAB_COUNTER -.385b6a d0 e1 bne $385b4d BNE NEXT_ORDER -.385b6c DO_DONE -.385b6c 60 rts RTS -.385b6d DISPLAY_ACTIVE_CHANNELS -.385b6d a2 09 00 ldx #$0009 LDX #9 -.385b70 a0 6b 28 ldy #$286b LDY #$2000 + SCREEN_WIDTH * 26 + 75 -.385b73 DAC_LOOP -.385b73 bf b1 68 38 lda $3868b1,x LDA CHANNELS-1,X -.385b77 f0 06 beq $385b7f BEQ INACTIVE_CHANNEL -.385b79 a9 40 lda #$40 LDA #$40 ; white -.385b7b 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385b7d 80 04 bra $385b83 BRA DAC_CONTINUE -.385b7f INACTIVE_CHANNEL -.385b7f a9 20 lda #$20 LDA #$20 ; purple -.385b81 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.385b83 DAC_CONTINUE -.385b83 88 dey DEY -.385b84 88 dey DEY -.385b85 88 dey DEY -.385b86 88 dey DEY -.385b87 88 dey DEY -.385b88 88 dey DEY -.385b89 88 dey DEY -.385b8a 88 dey DEY -.385b8b 88 dey DEY -.385b8c ca dex DEX -.385b8d d0 e4 bne $385b73 BNE DAC_LOOP -.385b8f 60 rts RTS -.385b90 DISPLAY_CHAR -.385b90 5a phy PHY -.385b91 a4 1a ldy $1a LDY CURSORX -.385b93 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.385b95 c8 iny INY -.385b96 84 1a sty $1a STY CURSORX -.385b98 7a ply PLY -.385b99 6b rtl RTL -.385b9a DISPLAY_NEXT_LINE_dep -.385b9a c2 20 rep #$20 REP #$20 ; set A long -.385b9c a5 1a lda $1a LDA CURSORX -.385b9e 29 e0 ff and #$ffe0 AND #$FFE0 ; lines are $0, 80, 160, etc -.385ba1 18 clc CLC -.385ba2 69 6f 00 adc #$006f ADC #SCREEN_WIDTH + 31 ; move to the next line and offset to the file box -.385ba5 85 1a sta $1a STA CURSORX -.385ba7 e2 20 sep #$20 SEP #$20 ; set A short -.385ba9 6b rtl RTL -.385baa DISPLAY_MSG -.385baa 8b phb PHB -.385bab 48 pha PHA ; begin setdbr macro -.385bac 08 php PHP -.385bad e2 20 sep #$20 SEP #$20 ; set A short -.385baf a9 00 lda #$00 LDA #`CS_COLOR_MEM_PTR ; store the initial colour buffer location -.385c2b 85 17 sta $17 STA CURSORPOS -.385c2d ad 1f 03 lda $031f LDA SDOS_LINE_SELECT -.385c30 8d 00 01 sta $0100 STA UNSIGNED_MULT_A -.385c33 a9 50 00 lda #$0050 LDA #SCREEN_WIDTH -.385c36 8d 02 01 sta $0102 STA UNSIGNED_MULT_B -.385c39 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT -.385c3c 18 clc CLC -.385c3d 69 8f 03 adc #$038f ADC #SCREEN_WIDTH * 11 + 31 -.385c40 a8 tay TAY -.385c41 e2 20 sep #$20 SEP #$20 ; set A short -.385c43 a9 af lda #$af LDA #`CS_TEXT_MEM_PTR -.385c45 85 19 sta $19 STA CURSORPOS+2 -.385c47 a2 12 00 ldx #$0012 LDX #18 -.385c4a 68 pla PLA -.385c4b HS_LOOP -.385c4b 97 17 sta [$17],y STA [CURSORPOS],Y -.385c4d c8 iny INY -.385c4e ca dex DEX -.385c4f d0 fa bne $385c4b BNE HS_LOOP -.385c51 6b rtl RTL -.385c52 SELECT_NEXT_FILE -.385c52 18 clc CLC -.385c53 ad 1f 03 lda $031f LDA SDOS_LINE_SELECT -.385c56 1a inc a INC A -.385c57 c9 26 cmp #$26 CMP #38 -.385c59 b0 0f bcs $385c6a BCS DO_NOT_SELECT -.385c5b a9 50 lda #$50 LDA #$50 ; black background -.385c5d 22 25 5c 38 jsl $385c25 JSL TEXT_COLOUR_SELECTED -.385c61 ee 1f 03 inc $031f INC SDOS_LINE_SELECT -.385c64 a9 05 lda #$05 LDA #5 ; yellow background -.385c66 22 25 5c 38 jsl $385c25 JSL TEXT_COLOUR_SELECTED -.385c6a DO_NOT_SELECT -.385c6a 6b rtl RTL -.385c6b SELECT_PREVIOUS_FILE -.385c6b 18 clc CLC -.385c6c ad 1f 03 lda $031f LDA SDOS_LINE_SELECT -.385c6f 3a dec a DEC A -.385c70 30 f8 bmi $385c6a BMI DO_NOT_SELECT -.385c72 a9 50 lda #$50 LDA #$50 ; black background -.385c74 22 25 5c 38 jsl $385c25 JSL TEXT_COLOUR_SELECTED -.385c78 ce 1f 03 dec $031f DEC SDOS_LINE_SELECT -.385c7b a9 05 lda #$05 LDA #5 ; yellow background -.385c7d 22 25 5c 38 jsl $385c25 JSL TEXT_COLOUR_SELECTED -.385c81 6b rtl RTL +.385af9 c8 iny INY +.385afa ca dex DEX +.385afb d0 fa bne $385af7 BNE ORDER_HIGHLIGHT_LOOP +.385afd 68 pla PLA +.385afe aa tax TAX +.385aff bf be 5a 38 lda $385abe,x LDA HL_CLR_TABLE+2,X +.385b03 a2 09 00 ldx #$0009 LDX #9 +.385b06 a0 21 28 ldy #$2821 LDY #$2000 + PTTRN_HL_SCR +.385b09 HL_PATTERN_LOOP +.385b09 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385b0b c8 iny INY +.385b0c c8 iny INY +.385b0d c8 iny INY +.385b0e c8 iny INY +.385b0f c8 iny INY +.385b10 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385b12 c8 iny INY +.385b13 c8 iny INY +.385b14 c8 iny INY +.385b15 c8 iny INY +.385b16 ca dex DEX +.385b17 d0 f0 bne $385b09 BNE HL_PATTERN_LOOP +.385b19 20 5f 5b jsr $385b5f JSR DISPLAY_ACTIVE_CHANNELS +.385b1c 60 rts RTS +.385b1d DISPLAY_ORDERS +.385b1d af d3 6a 38 lda $386ad3 LDA @lTuneInfo.songLength +.385b21 f0 3b beq $385b5e BEQ DO_DONE +.385b23 c9 0e cmp #$0e CMP #14 +.385b25 90 02 bcc $385b29 BCC DO_DISPLAY_ORDERS +.385b27 a9 0e lda #$0e LDA #14 ; only display up to 14 orders +.385b29 DO_DISPLAY_ORDERS +.385b29 85 6d sta $6d STA TAB_COUNTER +.385b2b a2 00 00 ldx #$0000 LDX #0 +.385b2e a0 65 02 ldy #$0265 LDY #SCREEN_WIDTH * 7 + 53 +.385b31 c2 20 rep #$20 REP #$20 ; set A long +.385b33 a9 24 fc lda #$fc24 LDA #<>ORDERS +.385b36 85 f0 sta $f0 STA RAD_ADDR +.385b38 a9 39 00 lda #$0039 LDA #<`ORDERS +.385b3b 85 f2 sta $f2 STA RAD_ADDR + 2 +.385b3d e2 20 sep #$20 SEP #$20 ; set A short +.385b3f NEXT_ORDER +.385b3f 8a txa TXA +.385b40 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.385b43 c8 iny INY +.385b44 c8 iny INY +.385b45 c8 iny INY +.385b46 5a phy PHY +.385b47 9b txy TXY +.385b48 b7 f0 lda [$f0],y LDA [RAD_ADDR],Y +.385b4a 1a inc a INC A +.385b4b 7a ply PLY +.385b4c 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.385b4f e8 inx INX +.385b50 c2 20 rep #$20 REP #$20 ; set A long +.385b52 98 tya TYA +.385b53 18 clc CLC +.385b54 69 4d 00 adc #$004d ADC #SCREEN_WIDTH - 3 +.385b57 a8 tay TAY +.385b58 e2 20 sep #$20 SEP #$20 ; set A short +.385b5a c6 6d dec $6d DEC TAB_COUNTER +.385b5c d0 e1 bne $385b3f BNE NEXT_ORDER +.385b5e DO_DONE +.385b5e 60 rts RTS +.385b5f DISPLAY_ACTIVE_CHANNELS +.385b5f a2 09 00 ldx #$0009 LDX #9 +.385b62 a0 6b 28 ldy #$286b LDY #$2000 + SCREEN_WIDTH * 26 + 75 +.385b65 DAC_LOOP +.385b65 bf 1c 69 38 lda $38691c,x LDA CHANNELS-1,X +.385b69 f0 06 beq $385b71 BEQ INACTIVE_CHANNEL +.385b6b a9 40 lda #$40 LDA #$40 ; white +.385b6d 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385b6f 80 04 bra $385b75 BRA DAC_CONTINUE +.385b71 INACTIVE_CHANNEL +.385b71 a9 20 lda #$20 LDA #$20 ; purple +.385b73 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.385b75 DAC_CONTINUE +.385b75 88 dey DEY +.385b76 88 dey DEY +.385b77 88 dey DEY +.385b78 88 dey DEY +.385b79 88 dey DEY +.385b7a 88 dey DEY +.385b7b 88 dey DEY +.385b7c 88 dey DEY +.385b7d 88 dey DEY +.385b7e ca dex DEX +.385b7f d0 e4 bne $385b65 BNE DAC_LOOP +.385b81 60 rts RTS +.385b82 DISPLAY_CHAR +.385b82 5a phy PHY +.385b83 a4 1a ldy $1a LDY CURSORX +.385b85 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.385b87 c8 iny INY +.385b88 84 1a sty $1a STY CURSORX +.385b8a 7a ply PLY +.385b8b 6b rtl RTL +.385b8c DISPLAY_NEXT_LINE_dep +.385b8c c2 20 rep #$20 REP #$20 ; set A long +.385b8e a5 1a lda $1a LDA CURSORX +.385b90 29 e0 ff and #$ffe0 AND #$FFE0 ; lines are $0, 80, 160, etc +.385b93 18 clc CLC +.385b94 69 6f 00 adc #$006f ADC #SCREEN_WIDTH + 31 ; move to the next line and offset to the file box +.385b97 85 1a sta $1a STA CURSORX +.385b99 e2 20 sep #$20 SEP #$20 ; set A short +.385b9b 6b rtl RTL +.385b9c DISPLAY_MSG +.385b9c 8b phb PHB +.385b9d 48 pha PHA ; begin setdbr macro +.385b9e 08 php PHP +.385b9f e2 20 sep #$20 SEP #$20 ; set A short +.385ba1 a9 00 lda #$00 LDA #`CS_COLOR_MEM_PTR ; store the initial colour buffer location +.385c1d 85 17 sta $17 STA CURSORPOS +.385c1f ad 1f 03 lda $031f LDA SDOS_LINE_SELECT +.385c22 8d 00 01 sta $0100 STA UNSIGNED_MULT_A +.385c25 a9 50 00 lda #$0050 LDA #SCREEN_WIDTH +.385c28 8d 02 01 sta $0102 STA UNSIGNED_MULT_B +.385c2b ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT +.385c2e 18 clc CLC +.385c2f 69 8f 03 adc #$038f ADC #SCREEN_WIDTH * 11 + 31 +.385c32 a8 tay TAY +.385c33 e2 20 sep #$20 SEP #$20 ; set A short +.385c35 a9 af lda #$af LDA #`CS_TEXT_MEM_PTR +.385c37 85 19 sta $19 STA CURSORPOS+2 +.385c39 a2 12 00 ldx #$0012 LDX #18 +.385c3c 68 pla PLA +.385c3d HS_LOOP +.385c3d 97 17 sta [$17],y STA [CURSORPOS],Y +.385c3f c8 iny INY +.385c40 ca dex DEX +.385c41 d0 fa bne $385c3d BNE HS_LOOP +.385c43 6b rtl RTL +.385c44 SELECT_NEXT_FILE +.385c44 18 clc CLC +.385c45 ad 1f 03 lda $031f LDA SDOS_LINE_SELECT +.385c48 1a inc a INC A +.385c49 c9 26 cmp #$26 CMP #38 +.385c4b b0 0f bcs $385c5c BCS DO_NOT_SELECT +.385c4d a9 50 lda #$50 LDA #$50 ; black background +.385c4f 22 17 5c 38 jsl $385c17 JSL TEXT_COLOUR_SELECTED +.385c53 ee 1f 03 inc $031f INC SDOS_LINE_SELECT +.385c56 a9 05 lda #$05 LDA #5 ; yellow background +.385c58 22 17 5c 38 jsl $385c17 JSL TEXT_COLOUR_SELECTED +.385c5c DO_NOT_SELECT +.385c5c 6b rtl RTL +.385c5d SELECT_PREVIOUS_FILE +.385c5d 18 clc CLC +.385c5e ad 1f 03 lda $031f LDA SDOS_LINE_SELECT +.385c61 3a dec a DEC A +.385c62 30 f8 bmi $385c5c BMI DO_NOT_SELECT +.385c64 a9 50 lda #$50 LDA #$50 ; black background +.385c66 22 17 5c 38 jsl $385c17 JSL TEXT_COLOUR_SELECTED +.385c6a ce 1f 03 dec $031f DEC SDOS_LINE_SELECT +.385c6d a9 05 lda #$05 LDA #5 ; yellow background +.385c6f 22 17 5c 38 jsl $385c17 JSL TEXT_COLOUR_SELECTED +.385c73 6b rtl RTL ;****** Return to file: tracker.asm @@ -5624,9 +5630,17 @@ =$afe880 GABE_MSTR_CTRL = $AFE880 =$01 GABE_CTRL_PWR_LED = $01 ; Controls the LED in the Front of the case (Next to the reset button) =$02 GABE_CTRL_SDC_LED = $02 ; Controls the LED in the Front of the Case (Next to SDCard) +=$04 GABE_CTRL_STS_LED0 = $04 ; Control Status LED0 (General Use) - C256 Foenix U Only +=$08 GABE_CTRL_STS_LED1 = $08 ; Control Status LED0 (General Use) - C256 Foenix U Only =$10 GABE_CTRL_BUZZER = $10 ; Controls the Buzzer =$80 GABE_CTRL_WRM_RST = $80 ; Warm Reset (needs to Setup other registers) -=$afe881 GABE_NOTUSED = $AFE881 ; Reserved for future use +=$afe881 GABE_LED_FLASH_CTRL = $AFE881 ; Flashing LED Control +=$01 GABE_LED0_FLASH_CTRL = $01 ; 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +=$02 GABE_LED1_FLASH_CTRL = $02 ; 0- Automatic Flash 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED1 to manually control) +=$10 GABE_LD0_FLASH_FRQ0 = $10 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +=$20 GABE_LD0_FLASH_FRQ1 = $20 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +=$40 GABE_LD1_FLASH_FRQ0 = $40 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) +=$80 GABE_LD1_FLASH_FRQ1 = $80 ; 1 - Bypass Flash Timer (Use GABE_CTRL_STS_LED0 to manually control) =$afe882 GABE_RST_AUTH0 = $AFE882 ; Must Contain the BYTE $AD for Reset to Activate =$afe883 GABE_RST_AUTH1 = $AFE883 ; Must Contain the BYTE $DE for Reset to Activate =$afe884 GABE_RNG_DAT_LO = $AFE884 ; Low Part of 16Bit RNG Generator @@ -5640,10 +5654,17 @@ =$02 GABE_RNG_CTRL_DV = $02 ; After Setting the Seed Value, Toggle that Bit for it be registered =$afe887 GABE_SYS_STAT = $AFE887 ; =$01 GABE_SYS_STAT_MID0 = $01 ; Machine ID -- LSB -=$02 GABE_SYS_STAT_MID1 = $02 ; Machine ID -- MSB -=$08 GABE_SYS_STAT_EXP = $08 ; if Zero, there is an Expansion Card Preset -=$40 GABE_SYS_STAT_CPUA = $40 ; Indicates the (8bit/16bit) Size of the Accumulator -=$80 GABE_SYS_STAT_CPUX = $80 ; Indicates the (8bit/16bit) Size of the Accumulator +=$02 GABE_SYS_STAT_MID1 = $02 ; Machine ID -- +=$04 GABE_SYS_STAT_MID2 = $04 ; Machine ID -- MSB +=$10 GABE_SYS_STAT_EXP = $10 ; if Zero, there is an Expansion Card Preset +=$40 GABE_SYS_STAT_CPUA = $40 ; Indicates the (8bit/16bit) Size of the Accumulator - Not Implemented +=$80 GABE_SYS_STAT_CPUX = $80 ; Indicates the (8bit/16bit) Size of the Accumulator - Not Implemented +=$afe88a GABE_SUBVERSION_LO = $AFE88A +=$afe88b GABE_SUBVERSION_HI = $AFE88B +=$afe88c GABE_VERSION_LO = $AFE88C +=$afe88d GABE_VERSION_HI = $AFE88D +=$afe88e GABE_MODEL_LO = $AFE88E +=$afe88f GABE_MODEL_HI = $AFE88F ;****** Return to file: SDOS.asm @@ -5704,26 +5725,26 @@ ;****** Return to file: SDOS.asm +=$0080 SD_DATA = $0080 ; 3 bytes - used indirect addressing +=$0083 SD_TMP_DATA = $0083 ; 3 bytes - used indirect addressing +=$0086 SD_DATA_FAT_PAGE = $0086 ; 2 bytes - last FAT page that was loaded +=$0088 SD_MULT_AREA = $0088 ; 4 bytes =$5f00 SD_FIRST_SECTOR = $5F00 ; 4 bytes =$5f04 SD_FAT_OFFSET = $5F04 ; 4 bytes =$5f08 SD_ROOT_OFFSET = $5F08 ; 4 bytes =$5f0c SD_DATA_OFFSET = $5F0C ; 4 bytes =$5f10 SD_RESERVED_SECTORS = $5F10 ; 2 bytes -=$5f12 SD_SECTORS_PER_FAT = $5F12 ; 2 bytes -=$5f14 SD_BYTES_PER_SECTOR = $5F14 ; 2 bytes -=$5f16 SD_FAT_COUNT = $5F16 ; 2 bytes -=$5f18 SD_SECTORS = $5F18 ; 4 bytes -=$5f1c SD_ROOT_ENTRIES = $5F1C ; 2 bytes +=$5f12 SD_SECTORS_PER_FAT = $5F12 ; 4 bytes - changed to 4 to allow FAT32 partitons +=$5f16 SD_BYTES_PER_SECTOR = $5F16 ; 2 bytes +=$5f18 SD_FAT_COUNT = $5F18 ; 2 bytes +=$5f1a SD_SECTORS = $5F1A ; 4 bytes +=$5f1e SD_ROOT_ENTRIES = $5F1E ; 2 bytes =$5f20 SD_DIR_OFFSET = $5F20 ; 2 bytes - use this to read the root directory -=$5f22 SD_NEXT_CLUSTER = $5F22 ; 2 bytes - use this to point to the next file cluster in the FAT +=$5f22 SD_NEXT_CLUSTER_NU = $5F22 ; 2 bytes - use this to point to the next file cluster in the FAT =$5f24 SD_SECTORS_PER_CLUSTER = $5F24 ; 2 byte -=$5f26 SD_FAT16 = $5F26 ; 1 byte - write 1 for FAT16, 0 for FAT12 +=$5f26 SD_FAT16_32 = $5F26 ; 1 byte - write 2 for FAT32, 1 for FAT16, 0 for FAT12 =$5f27 CLUSTER_PTR = $5F27 ; 2 bytes =$5f29 LOG_CLUSTER_PTR = $5F29 ; 4 bytes -=$0080 SD_DATA = $0080 ; 3 bytes - used indirect addressing -=$0083 SD_TMP_DATA = $0083 ; 3 bytes - used indirect addressing -=$0086 SD_DATA_FAT_PAGE = $0086 ; 2 bytes - last FAT page that was loaded -=$0088 SD_MULT_AREA = $0088 ; 4 bytes =$6000 SD_BLK_BEGIN = $6000 ; 512 bytes =$6200 SD_BTSCT_BEGIN = $6200 ; 512 bytes =$6400 SD_ROOT_BEGIN = $6400 ; 512 bytes @@ -5749,1480 +5770,1539 @@ >001a 00 00 cluster .word 0 >001c 00 00 size_l .word 0 >001e 00 00 size_h .word 0 -.385c82 ISDOS_INIT -.385c82 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL -.385c86 29 fd and #$fd AND #~GABE_CTRL_SDC_LED -.385c88 09 02 ora #$02 ORA #GABE_CTRL_SDC_LED -.385c8a 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL -.385c8e c2 20 rep #$20 REP #$20 ; set A long -.385c90 a9 00 00 lda #$0000 LDA #0 -.385c93 8d 08 5f sta $5f08 STA SD_ROOT_OFFSET -.385c96 8d 22 5f sta $5f22 STA SD_NEXT_CLUSTER -.385c99 e2 20 sep #$20 SEP #$20 ; set A short -.385c9b 85 3f sta $3f STA SDCARD_PRSNT_MNT -.385c9d a9 01 lda #$01 LDA #SDC_TRANS_INIT_SD -.385c9f 8f 02 ea af sta $afea02 STA SDC_TRANS_TYPE_REG -.385ca3 a9 01 lda #$01 LDA #SDC_TRANS_START -.385ca5 8f 03 ea af sta $afea03 STA SDC_TRANS_CONTROL_REG -.385ca9 af 04 ea af lda $afea04 SD_WAIT LDA SDC_TRANS_STATUS_REG -.385cad 29 01 and #$01 AND #SDC_TRANS_BUSY -.385caf c9 01 cmp #$01 CMP #SDC_TRANS_BUSY -.385cb1 f0 f6 beq $385ca9 BEQ SD_WAIT -.385cb3 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.385cb7 f0 08 beq $385cc1 BEQ SD_INIT_SUCCESS -.385cb9 a2 91 62 ldx #$6291 LDX #<>sd_no_card_msg -.385cbc 20 aa 5b jsr $385baa JSR DISPLAY_MSG -.385cbf 80 06 bra $385cc7 BRA SD_INIT_DONE -.385cc1 SD_INIT_SUCCESS -.385cc1 a9 01 lda #$01 LDA #1 -.385cc3 85 3f sta $3f STA SDCARD_PRSNT_MNT -.385cc5 80 00 bra $385cc7 BRA SD_INIT_DONE -.385cc7 SD_INIT_DONE -.385cc7 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL -.385ccb 29 fd and #$fd AND #~GABE_CTRL_SDC_LED -.385ccd 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL -.385cd1 6b rtl RTL -.385cd2 CALC_OFFSET_BYTES -.385cd2 a5 8a lda $8a LDA SD_MULT_AREA + 2 ; high 16-bits -.385cd4 0a asl a ASL A -.385cd5 85 8b sta $8b STA SD_MULT_AREA + 3 -.385cd7 18 clc CLC -.385cd8 a5 88 lda $88 LDA SD_MULT_AREA -.385cda 0a asl a ASL A -.385cdb 85 89 sta $89 STA SD_MULT_AREA + 1 -.385cdd 90 02 bcc $385ce1 BCC CALC_DONE -.385cdf e6 8b inc $8b INC SD_MULT_AREA + 3 -.385ce1 CALC_DONE -.385ce1 e2 20 sep #$20 SEP #$20 ; set A short -.385ce3 64 88 stz $88 stz SD_MULT_AREA -.385ce5 c2 20 rep #$20 REP #$20 ; set A long -.385ce7 60 rts RTS -.385ce8 ISDOS_READ_MBR_BOOT -.385ce8 a5 3f lda $3f LDA SDCARD_PRSNT_MNT ; this must be non-zero -.385cea d0 01 bne $385ced BNE RMBR_CARD_PRESENT -.385cec 6b rtl RTL -.385ced RMBR_CARD_PRESENT -.385ced c2 20 rep #$20 REP #$20 ; set A long -.385cef a9 00 60 lda #$6000 LDA #SD_BLK_BEGIN -.385cf2 85 80 sta $80 STA SD_DATA -.385cf4 a9 00 00 lda #$0000 LDA #0 -.385cf7 85 82 sta $82 STA SD_DATA + 2 -.385cf9 a9 00 00 lda #$0000 LDA #0 -.385cfc 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.385d00 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.385d04 e2 20 sep #$20 SEP #$20 ; set A short -.385d06 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.385d0a af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.385d0e f0 01 beq $385d11 BEQ SD_CONTINUE_1 -.385d10 6b rtl RTL -.385d11 SD_CONTINUE_1 -.385d11 c2 20 rep #$20 REP #$20 ; set A long -.385d13 ad fe 61 lda $61fe LDA SD_BLK_BEGIN + 510 -.385d16 c9 55 aa cmp #$aa55 CMP #$AA55 -.385d19 f0 01 beq $385d1c BEQ VALID_SIG -.385d1b 6b rtl RTL -.385d1c VALID_SIG -.385d1c c2 20 rep #$20 REP #$20 ; set A long -.385d1e a2 be 01 ldx #$01be LDX #446 ; offset to first partition -.385d21 bd 08 60 lda $6008,x LDA SD_BLK_BEGIN,X + 8 -.385d24 85 88 sta $88 STA SD_MULT_AREA -.385d26 bd 0a 60 lda $600a,x LDA SD_BLK_BEGIN,X + 10 -.385d29 85 8a sta $8a STA SD_MULT_AREA + 2 -.385d2b 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES -.385d2e a5 88 lda $88 LDA SD_MULT_AREA -.385d30 8d 00 5f sta $5f00 STA SD_FIRST_SECTOR -.385d33 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.385d37 a5 8a lda $8a LDA SD_MULT_AREA + 2 -.385d39 8d 02 5f sta $5f02 STA SD_FIRST_SECTOR + 2 -.385d3c 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.385d40 a9 00 62 lda #$6200 LDA #SD_BTSCT_BEGIN -.385d43 85 80 sta $80 STA SD_DATA -.385d45 a9 00 00 lda #$0000 LDA #0 -.385d48 85 82 sta $82 STA SD_DATA + 2 -.385d4a e2 20 sep #$20 SEP #$20 ; set A short -.385d4c 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.385d50 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.385d54 f0 01 beq $385d57 BEQ SD_CONTINUE_2 -.385d56 6b rtl RTL -.385d57 SD_CONTINUE_2 -.385d57 c2 20 rep #$20 REP #$20 ; set A long -.385d59 a2 00 00 ldx #$0000 LDX #0 -.385d5c bd 0b 62 lda $620b,x LDA SD_BTSCT_BEGIN,X + $B -.385d5f 8d 14 5f sta $5f14 STA SD_BYTES_PER_SECTOR -.385d62 e2 20 sep #$20 SEP #$20 ; set A short -.385d64 bd 0d 62 lda $620d,x LDA SD_BTSCT_BEGIN,X + $D -.385d67 8d 24 5f sta $5f24 STA SD_SECTORS_PER_CLUSTER -.385d6a a9 00 lda #$00 LDA #0 -.385d6c 8d 25 5f sta $5f25 STA SD_SECTORS_PER_CLUSTER + 1 -.385d6f c2 20 rep #$20 REP #$20 ; set A long -.385d71 bd 10 62 lda $6210,x LDA SD_BTSCT_BEGIN,X + $10 -.385d74 29 ff 00 and #$00ff AND #$FF -.385d77 8d 16 5f sta $5f16 STA SD_FAT_COUNT -.385d7a bd 11 62 lda $6211,x LDA SD_BTSCT_BEGIN,X + $11 -.385d7d 8d 1c 5f sta $5f1c STA SD_ROOT_ENTRIES -.385d80 bd 13 62 lda $6213,x LDA SD_BTSCT_BEGIN,X + $13 -.385d83 f0 28 beq $385dad BEQ SD_LARGE_SECTORS -.385d85 8d 18 5f sta $5f18 STA SD_SECTORS -.385d88 a9 00 00 lda #$0000 LDA #0 -.385d8b 8d 1a 5f sta $5f1a STA SD_SECTORS + 2 -.385d8e ad 18 5f lda $5f18 LDA SD_SECTORS -.385d91 8d 12 01 sta $0112 STA D0_OPERAND_B -.385d94 ad 24 5f lda $5f24 LDA SD_SECTORS_PER_CLUSTER -.385d97 8d 10 01 sta $0110 STA D0_OPERAND_A -.385d9a ad 14 01 lda $0114 LDA D0_RESULT -.385d9d c9 f7 0f cmp #$0ff7 CMP #$FF7 -.385da0 b0 17 bcs $385db9 BCS SD_SMALL_SECTORS ; number of sectors is more than fat12 can handle -.385da2 e2 20 sep #$20 SEP #$20 ; set A short -.385da4 a9 00 lda #$00 LDA #0 -.385da6 8d 26 5f sta $5f26 STA SD_FAT16 -.385da9 c2 20 rep #$20 REP #$20 ; set A long -.385dab 80 15 bra $385dc2 BRA SD_FAT12 -.385dad SD_LARGE_SECTORS -.385dad bd 20 62 lda $6220,x LDA SD_BTSCT_BEGIN,X + $20 -.385db0 8d 18 5f sta $5f18 STA SD_SECTORS -.385db3 bd 22 62 lda $6222,x LDA SD_BTSCT_BEGIN,X + $22 -.385db6 8d 1a 5f sta $5f1a STA SD_SECTORS + 2 -.385db9 SD_SMALL_SECTORS -.385db9 e2 20 sep #$20 SEP #$20 ; set A short -.385dbb a9 01 lda #$01 LDA #1 -.385dbd 8d 26 5f sta $5f26 STA SD_FAT16 -.385dc0 c2 20 rep #$20 REP #$20 ; set A long -.385dc2 SD_FAT12 -.385dc2 bd 0e 62 lda $620e,x LDA SD_BTSCT_BEGIN,X + $E -.385dc5 8d 10 5f sta $5f10 STA SD_RESERVED_SECTORS -.385dc8 bd 16 62 lda $6216,x LDA SD_BTSCT_BEGIN,X + $16 -.385dcb 8d 12 5f sta $5f12 STA SD_SECTORS_PER_FAT -.385dce 20 c1 61 jsr $3861c1 JSR COMPUTE_FAT_ROOT_DATA_OFFSETS -.385dd1 RMBR_DONE -.385dd1 6b rtl RTL -.385dd2 ISDOS_READ_BLOCK -.385dd2 5a phy PHY -.385dd3 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL -.385dd7 29 fd and #$fd AND #~GABE_CTRL_SDC_LED -.385dd9 09 02 ora #$02 ORA #GABE_CTRL_SDC_LED -.385ddb 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL -.385ddf a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.385de1 d0 02 bne $385de5 BNE SR_CARD_PRESENT -.385de3 80 2d bra $385e12 BRA SR_DONE -.385de5 SR_CARD_PRESENT -.385de5 a9 02 lda #$02 LDA #SDC_TRANS_READ_BLK -.385de7 8f 02 ea af sta $afea02 STA SDC_TRANS_TYPE_REG -.385deb a9 01 lda #$01 LDA #SDC_TRANS_START -.385ded 8f 03 ea af sta $afea03 STA SDC_TRANS_CONTROL_REG -.385df1 af 04 ea af lda $afea04 SR_WAIT LDA SDC_TRANS_STATUS_REG -.385df5 29 01 and #$01 AND #SDC_TRANS_BUSY -.385df7 c9 01 cmp #$01 CMP #SDC_TRANS_BUSY -.385df9 f0 f6 beq $385df1 BEQ SR_WAIT -.385dfb af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.385dff f0 02 beq $385e03 BEQ SD_READ_BLOCK_OK -.385e01 80 0f bra $385e12 BRA SR_DONE -.385e03 SD_READ_BLOCK_OK -.385e03 a0 00 00 ldy #$0000 LDY #0 -.385e06 SR_READ_LOOP -.385e06 af 10 ea af lda $afea10 LDA SDC_RX_FIFO_DATA_REG -.385e0a 97 80 sta [$80],y STA [SD_DATA],Y -.385e0c c8 iny INY -.385e0d c0 00 02 cpy #$0200 CPY #512 -.385e10 d0 f4 bne $385e06 BNE SR_READ_LOOP -.385e12 SR_DONE -.385e12 a9 01 lda #$01 LDA #1 -.385e14 8f 14 ea af sta $afea14 STA SDC_RX_FIFO_CTRL_REG -.385e18 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL -.385e1c 29 fd and #$fd AND #~GABE_CTRL_SDC_LED -.385e1e 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL -.385e22 7a ply PLY -.385e23 6b rtl RTL -.385e24 DISPLAY_FAT_NAME -.385e24 48 pha PHA ; - store the value of filetype -.385e25 a0 00 00 ldy #$0000 LDY #0 -.385e28 _RD_VOLNAME_LOOP -.385e28 b7 80 lda [$80],y LDA [SD_DATA],Y -.385e2a 22 18 10 00 jsl $001018 JSL PUTC -.385e2e c8 iny INY -.385e2f c0 08 00 cpy #$0008 CPY #8 -.385e32 f0 07 beq $385e3b BEQ _RD_DOT -.385e34 c0 0b 00 cpy #$000b CPY #11 -.385e37 d0 ef bne $385e28 BNE _RD_VOLNAME_LOOP -.385e39 80 0e bra $385e49 BRA _DFAT_NAME_DONE -.385e3b _RD_DOT -.385e3b 68 pla PLA ; - read the value of filetype -.385e3c 48 pha PHA ; - store the value of filetype -.385e3d 89 18 bit #$18 BIT #$18 -.385e3f d0 e7 bne $385e28 BNE _RD_VOLNAME_LOOP -.385e41 a9 2e lda #$2e LDA #"." -.385e43 22 18 10 00 jsl $001018 JSL PUTC -.385e47 80 df bra $385e28 BRA _RD_VOLNAME_LOOP -.385e49 _DFAT_NAME_DONE -.385e49 68 pla PLA ; - read the value of filetype -.385e4a 89 18 bit #$18 BIT #$18 -.385e4c d0 3b bne $385e89 BNE RD_DFAT_DONE -.385e4e a9 38 lda #$38 LDA #`sd_cluster_str -.385e50 8b phb PHB -.385e51 48 pha PHA -.385e52 ab plb PLB -.385e53 a2 c0 63 ldx #$63c0 LDX #<>sd_cluster_str -.385e56 22 1c 10 00 jsl $00101c JSL PUTS -.385e5a ab plb PLB -.385e5b a0 1b 00 ldy #$001b LDY #fatrec.cluster + 1 -.385e5e b7 80 lda [$80],y LDA [SD_DATA],Y -.385e60 22 80 10 00 jsl $001080 JSL PRINTAH -.385e64 a0 1a 00 ldy #$001a LDY #fatrec.cluster -.385e67 b7 80 lda [$80],y LDA [SD_DATA],Y -.385e69 22 80 10 00 jsl $001080 JSL PRINTAH -.385e6d a9 38 lda #$38 LDA #`sd_filesize_str -.385e6f 8b phb PHB -.385e70 48 pha PHA -.385e71 ab plb PLB -.385e72 a2 cb 63 ldx #$63cb LDX #<>sd_filesize_str -.385e75 22 1c 10 00 jsl $00101c JSL PUTS -.385e79 ab plb PLB -.385e7a a0 1f 00 ldy #$001f LDY #fatrec.size_h + 1 -.385e7d RD_SIZE_LOOP -.385e7d b7 80 lda [$80],y LDA [SD_DATA],Y -.385e7f 22 80 10 00 jsl $001080 JSL PRINTAH -.385e83 88 dey DEY -.385e84 c0 1b 00 cpy #$001b CPY #$1B -.385e87 d0 f4 bne $385e7d BNE RD_SIZE_LOOP -.385e89 RD_DFAT_DONE -.385e89 a9 0d lda #$0d LDA #$D -.385e8b 22 18 10 00 jsl $001018 JSL PUTC -.385e8f 60 rts RTS -.385e90 ISDOS_DISPLAY_ROOT_DIR -.385e90 a5 3f lda $3f LDA SDCARD_PRSNT_MNT ; this must be non-zero -.385e92 d0 01 bne $385e95 BNE RD_CARD_PRESENT -.385e94 6b rtl RTL -.385e95 RD_CARD_PRESENT -.385e95 c2 20 rep #$20 REP #$20 ; set A long -.385e97 a9 00 00 lda #$0000 LDA #0 ; reset the root entries offset -.385e9a 8d 20 5f sta $5f20 STA SD_DIR_OFFSET -.385e9d RD_NEXT_SECTOR -.385e9d a9 00 64 lda #$6400 LDA #SD_ROOT_BEGIN -.385ea0 85 80 sta $80 STA SD_DATA -.385ea2 a9 00 00 lda #$0000 LDA #0 -.385ea5 85 82 sta $82 STA SD_DATA + 2 -.385ea7 ad 20 5f lda $5f20 LDA SD_DIR_OFFSET ; multiply by 512 -.385eaa 0a asl a ASL A -.385eab eb xba XBA -.385eac 8d 20 01 sta $0120 STA ADDER_A -.385eaf a9 00 00 lda #$0000 LDA #0 -.385eb2 8d 22 01 sta $0122 STA ADDER_A + 2 -.385eb5 ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET -.385eb8 8d 24 01 sta $0124 STA ADDER_B -.385ebb ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET+2 -.385ebe 8d 26 01 sta $0126 STA ADDER_B + 2 -.385ec1 ad 28 01 lda $0128 LDA ADDER_R -.385ec4 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.385ec8 ad 2a 01 lda $012a LDA ADDER_R + 2 -.385ecb 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.385ecf e2 20 sep #$20 SEP #$20 ; set A short -.385ed1 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.385ed5 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.385ed9 f0 08 beq $385ee3 BEQ RD_DIR_ENTRY -.385edb a2 31 63 ldx #$6331 LDX #<>SD_ROOT_ERROR_MSG -.385ede 20 aa 5b jsr $385baa JSR DISPLAY_MSG -.385ee1 80 6a bra $385f4d BRA RD_DONE -.385ee3 RD_DIR_ENTRY -.385ee3 a7 80 lda [$80] LDA [SD_DATA] -.385ee5 d0 04 bne $385eeb BNE RD_CONTINUE ; if first byte is 0, entry is available and there are no following entries -.385ee7 5c 4d 5f 38 jmp $385f4d JML RD_DONE -.385eeb RD_CONTINUE -.385eeb c9 e5 cmp #$e5 CMP #$E5 -.385eed f0 35 beq $385f24 BEQ RD_SKIP -.385eef RD_LOOP -.385eef a0 0b 00 ldy #$000b LDY #fatrec.type -.385ef2 b7 80 lda [$80],y LDA [SD_DATA],Y -.385ef4 c9 0f cmp #$0f CMP #$F ; long file name -.385ef6 d0 04 bne $385efc BNE RD_NOT_VFAT -.385ef8 5c 78 5f 38 jmp $385f78 JML RD_READ_LONG_FILENAME -.385efc RD_NOT_VFAT -.385efc 89 02 bit #$02 BIT #2 ; hidden -.385efe f0 02 beq $385f02 BEQ RD_NOT_HIDDEN -.385f00 80 22 bra $385f24 BRA RD_SKIP -.385f02 RD_NOT_HIDDEN -.385f02 89 08 bit #$08 BIT #8 ; volume name -.385f04 f0 04 beq $385f0a BEQ RD_NOT_VOLUME -.385f06 5c 63 5f 38 jmp $385f63 JML RD_READ_VOLNAME -.385f0a RD_NOT_VOLUME -.385f0a 89 10 bit #$10 BIT #$10 ; directory -.385f0c f0 04 beq $385f12 BEQ RD_NOT_DIRECTORY -.385f0e 5c 4e 5f 38 jmp $385f4e JML RD_DIRNAME -.385f12 RD_NOT_DIRECTORY -.385f12 48 pha PHA ; - store the value of filetype -.385f13 a9 38 lda #$38 LDA #`sd_filename -.385f15 8b phb PHB -.385f16 48 pha PHA -.385f17 ab plb PLB -.385f18 a2 b2 63 ldx #$63b2 LDX #<>sd_filename -.385f1b 22 1c 10 00 jsl $00101c JSL PUTS -.385f1f ab plb PLB -.385f20 68 pla PLA -.385f21 20 24 5e jsr $385e24 JSR DISPLAY_FAT_NAME -.385f24 RD_SKIP -.385f24 c2 20 rep #$20 REP #$20 ; set A long -.385f26 a5 80 lda $80 LDA SD_DATA -.385f28 29 e0 01 and #$01e0 AND #$1E0 -.385f2b c9 e0 01 cmp #$01e0 CMP #$1E0 -.385f2e d0 0f bne $385f3f BNE RD_SKIP_NEXT -.385f30 ad 20 5f lda $5f20 LDA SD_DIR_OFFSET -.385f33 1a inc a INC A -.385f34 cd 1c 5f cmp $5f1c CMP SD_ROOT_ENTRIES -.385f37 b0 14 bcs $385f4d BCS RD_DONE -.385f39 8d 20 5f sta $5f20 STA SD_DIR_OFFSET ; next sector -.385f3c 4c 9d 5e jmp $385e9d JMP RD_NEXT_SECTOR -.385f3f RD_SKIP_NEXT -.385f3f a5 80 lda $80 LDA SD_DATA -.385f41 18 clc CLC -.385f42 69 20 00 adc #$0020 ADC #$20 -.385f45 85 80 sta $80 STA SD_DATA -.385f47 e2 20 sep #$20 SEP #$20 ; set A short -.385f49 5c e3 5e 38 jmp $385ee3 JML RD_DIR_ENTRY -.385f4d RD_DONE -.385f4d 6b rtl RTL -.385f4e RD_DIRNAME -.385f4e 48 pha PHA ; - store the value of filetype -.385f4f a9 38 lda #$38 LDA #`sd_dir_name -.385f51 8b phb PHB -.385f52 48 pha PHA -.385f53 ab plb PLB -.385f54 a2 a4 63 ldx #$63a4 LDX #<>sd_dir_name -.385f57 22 1c 10 00 jsl $00101c JSL PUTS -.385f5b ab plb PLB -.385f5c 68 pla PLA -.385f5d 20 24 5e jsr $385e24 JSR DISPLAY_FAT_NAME -.385f60 4c 24 5f jmp $385f24 JMP RD_SKIP -.385f63 RD_READ_VOLNAME -.385f63 48 pha PHA ; - store the value of filetype -.385f64 a9 38 lda #$38 LDA #`sd_volume_name -.385f66 8b phb PHB -.385f67 48 pha PHA -.385f68 ab plb PLB -.385f69 a2 88 63 ldx #$6388 LDX #<>sd_volume_name -.385f6c 22 1c 10 00 jsl $00101c JSL PUTS -.385f70 ab plb PLB -.385f71 68 pla PLA -.385f72 20 24 5e jsr $385e24 JSR DISPLAY_FAT_NAME -.385f75 4c 24 5f jmp $385f24 JMP RD_SKIP -.385f78 RD_READ_LONG_FILENAME -.385f78 4c 24 5f jmp $385f24 JMP RD_SKIP -.385f7b STORE_FILE_LIST -.385f7b a0 0b 00 ldy #$000b LDY #11 -.385f7e c9 10 cmp #$10 CMP #$10 -.385f80 f0 02 beq $385f84 BEQ SF_DIR -.385f82 a9 01 lda #$01 LDA #1 -.385f84 SF_DIR -.385f84 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y -.385f86 a0 00 00 ldy #$0000 LDY #0 -.385f89 a2 0b 00 ldx #$000b LDX #11 -.385f8c SF_LOOP_NAME -.385f8c b7 80 lda [$80],y LDA [SD_DATA],Y -.385f8e 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y -.385f90 c8 iny INY -.385f91 ca dex DEX -.385f92 d0 f8 bne $385f8c BNE SF_LOOP_NAME -.385f94 c2 20 rep #$20 REP #$20 ; set A long -.385f96 a0 1a 00 ldy #$001a LDY #fatrec.cluster -.385f99 b7 80 lda [$80],y LDA [SD_DATA],Y -.385f9b a0 10 00 ldy #$0010 LDY #16 -.385f9e 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y -.385fa0 a0 1c 00 ldy #$001c LDY #fatrec.size_l -.385fa3 b7 80 lda [$80],y LDA [SD_DATA],Y -.385fa5 a0 0c 00 ldy #$000c LDY #12 -.385fa8 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y -.385faa a0 1e 00 ldy #$001e LDY #fatrec.size_h +.385c74 ISDOS_INIT +.385c74 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL +.385c78 29 fd and #$fd AND #~GABE_CTRL_SDC_LED +.385c7a 09 02 ora #$02 ORA #GABE_CTRL_SDC_LED +.385c7c 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL +.385c80 c2 20 rep #$20 REP #$20 ; set A long +.385c82 a9 00 00 lda #$0000 LDA #0 +.385c85 8d 08 5f sta $5f08 STA SD_ROOT_OFFSET +.385c88 e2 20 sep #$20 SEP #$20 ; set A short +.385c8a 85 3f sta $3f STA SDCARD_PRSNT_MNT +.385c8c a9 01 lda #$01 LDA #SDC_TRANS_INIT_SD +.385c8e 8f 02 ea af sta $afea02 STA SDC_TRANS_TYPE_REG +.385c92 a9 01 lda #$01 LDA #SDC_TRANS_START +.385c94 8f 03 ea af sta $afea03 STA SDC_TRANS_CONTROL_REG +.385c98 af 04 ea af lda $afea04 SD_WAIT LDA SDC_TRANS_STATUS_REG +.385c9c 29 01 and #$01 AND #SDC_TRANS_BUSY +.385c9e c9 01 cmp #$01 CMP #SDC_TRANS_BUSY +.385ca0 f0 f6 beq $385c98 BEQ SD_WAIT +.385ca2 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.385ca6 f0 08 beq $385cb0 BEQ SD_INIT_SUCCESS +.385ca8 a2 f9 62 ldx #$62f9 LDX #<>sd_no_card_msg +.385cab 20 9c 5b jsr $385b9c JSR DISPLAY_MSG +.385cae 80 06 bra $385cb6 BRA SD_INIT_DONE +.385cb0 SD_INIT_SUCCESS +.385cb0 a9 01 lda #$01 LDA #1 +.385cb2 85 3f sta $3f STA SDCARD_PRSNT_MNT +.385cb4 80 00 bra $385cb6 BRA SD_INIT_DONE +.385cb6 SD_INIT_DONE +.385cb6 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL +.385cba 29 fd and #$fd AND #~GABE_CTRL_SDC_LED +.385cbc 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL +.385cc0 6b rtl RTL +.385cc1 CALC_OFFSET_BYTES +.385cc1 a5 8a lda $8a LDA SD_MULT_AREA + 2 ; high 16-bits +.385cc3 0a asl a ASL A +.385cc4 85 8b sta $8b STA SD_MULT_AREA + 3 +.385cc6 18 clc CLC +.385cc7 a5 88 lda $88 LDA SD_MULT_AREA +.385cc9 0a asl a ASL A +.385cca 85 89 sta $89 STA SD_MULT_AREA + 1 +.385ccc 90 02 bcc $385cd0 BCC CALC_DONE +.385cce e6 8b inc $8b INC SD_MULT_AREA + 3 +.385cd0 CALC_DONE +.385cd0 e2 20 sep #$20 SEP #$20 ; set A short +.385cd2 64 88 stz $88 stz SD_MULT_AREA +.385cd4 c2 20 rep #$20 REP #$20 ; set A long +.385cd6 60 rts RTS +.385cd7 ISDOS_READ_MBR_AND_BOOT_SECTOR +.385cd7 a5 3f lda $3f LDA SDCARD_PRSNT_MNT ; this must be non-zero +.385cd9 d0 01 bne $385cdc BNE RMBR_CARD_PRESENT +.385cdb 6b rtl RTL +.385cdc RMBR_CARD_PRESENT +.385cdc c2 20 rep #$20 REP #$20 ; set A long +.385cde a9 00 60 lda #$6000 LDA #SD_BLK_BEGIN +.385ce1 85 80 sta $80 STA SD_DATA +.385ce3 a9 00 00 lda #$0000 LDA #0 +.385ce6 85 82 sta $82 STA SD_DATA + 2 +.385ce8 a9 00 00 lda #$0000 LDA #0 +.385ceb 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.385cef 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.385cf3 e2 20 sep #$20 SEP #$20 ; set A short +.385cf5 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.385cf9 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.385cfd f0 01 beq $385d00 BEQ SD_CONTINUE_1 +.385cff 6b rtl RTL +.385d00 SD_CONTINUE_1 +.385d00 c2 20 rep #$20 REP #$20 ; set A long +.385d02 ad fe 61 lda $61fe LDA SD_BLK_BEGIN + 510 +.385d05 c9 55 aa cmp #$aa55 CMP #$AA55 +.385d08 f0 01 beq $385d0b BEQ VALID_SIG +.385d0a 6b rtl RTL +.385d0b VALID_SIG +.385d0b c2 20 rep #$20 REP #$20 ; set A long +.385d0d a2 be 01 ldx #$01be LDX #446 ; offset to first partition +.385d10 bd 08 60 lda $6008,x LDA SD_BLK_BEGIN,X + 8 +.385d13 85 88 sta $88 STA SD_MULT_AREA +.385d15 bd 0a 60 lda $600a,x LDA SD_BLK_BEGIN,X + 10 +.385d18 85 8a sta $8a STA SD_MULT_AREA + 2 +.385d1a 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES +.385d1d a5 88 lda $88 LDA SD_MULT_AREA +.385d1f 8d 00 5f sta $5f00 STA SD_FIRST_SECTOR +.385d22 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.385d26 a5 8a lda $8a LDA SD_MULT_AREA + 2 +.385d28 8d 02 5f sta $5f02 STA SD_FIRST_SECTOR + 2 +.385d2b 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.385d2f a9 00 62 lda #$6200 LDA #SD_BTSCT_BEGIN +.385d32 85 80 sta $80 STA SD_DATA +.385d34 a9 00 00 lda #$0000 LDA #0 +.385d37 85 82 sta $82 STA SD_DATA + 2 +.385d39 e2 20 sep #$20 SEP #$20 ; set A short +.385d3b 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.385d3f af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.385d43 f0 01 beq $385d46 BEQ SD_CONTINUE_2 +.385d45 6b rtl RTL +.385d46 SD_CONTINUE_2 +.385d46 c2 20 rep #$20 REP #$20 ; set A long +.385d48 a2 00 00 ldx #$0000 LDX #0 +.385d4b bd 0b 62 lda $620b,x LDA SD_BTSCT_BEGIN,X + $B +.385d4e 8d 16 5f sta $5f16 STA SD_BYTES_PER_SECTOR +.385d51 e2 20 sep #$20 SEP #$20 ; set A short +.385d53 bd 0d 62 lda $620d,x LDA SD_BTSCT_BEGIN,X + $D +.385d56 8d 24 5f sta $5f24 STA SD_SECTORS_PER_CLUSTER +.385d59 a9 00 lda #$00 LDA #0 +.385d5b 8d 25 5f sta $5f25 STA SD_SECTORS_PER_CLUSTER + 1 +.385d5e c2 20 rep #$20 REP #$20 ; set A long +.385d60 bd 10 62 lda $6210,x LDA SD_BTSCT_BEGIN,X + $10 +.385d63 29 ff 00 and #$00ff AND #$FF +.385d66 8d 18 5f sta $5f18 STA SD_FAT_COUNT +.385d69 bd 11 62 lda $6211,x LDA SD_BTSCT_BEGIN,X + $11 +.385d6c 8d 1e 5f sta $5f1e STA SD_ROOT_ENTRIES +.385d6f bd 13 62 lda $6213,x LDA SD_BTSCT_BEGIN,X + $13 +.385d72 f0 28 beq $385d9c BEQ SD_LARGE_SECTORS +.385d74 8d 1a 5f sta $5f1a STA SD_SECTORS +.385d77 a9 00 00 lda #$0000 LDA #0 +.385d7a 8d 1c 5f sta $5f1c STA SD_SECTORS + 2 +.385d7d ad 1a 5f lda $5f1a LDA SD_SECTORS +.385d80 8d 12 01 sta $0112 STA D0_OPERAND_B +.385d83 ad 24 5f lda $5f24 LDA SD_SECTORS_PER_CLUSTER +.385d86 8d 10 01 sta $0110 STA D0_OPERAND_A +.385d89 ad 14 01 lda $0114 LDA D0_RESULT +.385d8c c9 f7 0f cmp #$0ff7 CMP #$FF7 +.385d8f b0 1d bcs $385dae BCS SD_SMALL_SECTORS ; number of sectors is more than fat12 can handle +.385d91 e2 20 sep #$20 SEP #$20 ; set A short +.385d93 a9 00 lda #$00 LDA #0 +.385d95 8d 26 5f sta $5f26 STA SD_FAT16_32 +.385d98 c2 20 rep #$20 REP #$20 ; set A long +.385d9a 80 1b bra $385db7 BRA SD_FAT12 +.385d9c SD_LARGE_SECTORS +.385d9c bd 20 62 lda $6220,x LDA SD_BTSCT_BEGIN,X + $20 +.385d9f 8d 1a 5f sta $5f1a STA SD_SECTORS +.385da2 bd 22 62 lda $6222,x LDA SD_BTSCT_BEGIN,X + $22 +.385da5 8d 1c 5f sta $5f1c STA SD_SECTORS + 2 +.385da8 a9 ff ff lda #$ffff LDA #$FFFF +.385dab 8d 1e 5f sta $5f1e STA SD_ROOT_ENTRIES +.385dae SD_SMALL_SECTORS +.385dae e2 20 sep #$20 SEP #$20 ; set A short +.385db0 a9 01 lda #$01 LDA #1 +.385db2 8d 26 5f sta $5f26 STA SD_FAT16_32 +.385db5 c2 20 rep #$20 REP #$20 ; set A long +.385db7 SD_FAT12 +.385db7 bd 0e 62 lda $620e,x LDA SD_BTSCT_BEGIN,X + $E +.385dba 8d 10 5f sta $5f10 STA SD_RESERVED_SECTORS +.385dbd bd 16 62 lda $6216,x LDA SD_BTSCT_BEGIN,X + $16 +.385dc0 f0 0b beq $385dcd BEQ SD_FAT32_SECTORS ; if sectors per FAT is 0, then this is a FAT32 partition +.385dc2 8d 12 5f sta $5f12 STA SD_SECTORS_PER_FAT +.385dc5 a9 00 00 lda #$0000 LDA #0 +.385dc8 8d 14 5f sta $5f14 STA SD_SECTORS_PER_FAT + 2 +.385dcb 80 15 bra $385de2 BRA SD_COMPUTE_OFFSETS +.385dcd SD_FAT32_SECTORS +.385dcd e2 20 sep #$20 SEP #$20 ; set A short +.385dcf a9 02 lda #$02 LDA #2 ; identify the FAT32 partition +.385dd1 8d 26 5f sta $5f26 STA SD_FAT16_32 +.385dd4 c2 20 rep #$20 REP #$20 ; set A long +.385dd6 bd 24 62 lda $6224,x LDA SD_BTSCT_BEGIN,X + $24 +.385dd9 8d 12 5f sta $5f12 STA SD_SECTORS_PER_FAT +.385ddc bd 26 62 lda $6226,x LDA SD_BTSCT_BEGIN,X + $26 +.385ddf 8d 14 5f sta $5f14 STA SD_SECTORS_PER_FAT+2 +.385de2 SD_COMPUTE_OFFSETS +.385de2 20 29 62 jsr $386229 JSR COMPUTE_FAT_ROOT_DATA_OFFSETS +.385de5 RMBR_DONE +.385de5 6b rtl RTL +.385de6 ISDOS_READ_BLOCK +.385de6 5a phy PHY +.385de7 af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL +.385deb 29 fd and #$fd AND #~GABE_CTRL_SDC_LED +.385ded 09 02 ora #$02 ORA #GABE_CTRL_SDC_LED +.385def 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL +.385df3 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.385df5 d0 02 bne $385df9 BNE SR_CARD_PRESENT +.385df7 80 2d bra $385e26 BRA SR_DONE +.385df9 SR_CARD_PRESENT +.385df9 a9 02 lda #$02 LDA #SDC_TRANS_READ_BLK +.385dfb 8f 02 ea af sta $afea02 STA SDC_TRANS_TYPE_REG +.385dff a9 01 lda #$01 LDA #SDC_TRANS_START +.385e01 8f 03 ea af sta $afea03 STA SDC_TRANS_CONTROL_REG +.385e05 af 04 ea af lda $afea04 SR_WAIT LDA SDC_TRANS_STATUS_REG +.385e09 29 01 and #$01 AND #SDC_TRANS_BUSY +.385e0b c9 01 cmp #$01 CMP #SDC_TRANS_BUSY +.385e0d f0 f6 beq $385e05 BEQ SR_WAIT +.385e0f af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.385e13 f0 02 beq $385e17 BEQ SD_READ_BLOCK_OK +.385e15 80 0f bra $385e26 BRA SR_DONE +.385e17 SD_READ_BLOCK_OK +.385e17 a0 00 00 ldy #$0000 LDY #0 +.385e1a SR_READ_LOOP +.385e1a af 10 ea af lda $afea10 LDA SDC_RX_FIFO_DATA_REG +.385e1e 97 80 sta [$80],y STA [SD_DATA],Y +.385e20 c8 iny INY +.385e21 c0 00 02 cpy #$0200 CPY #512 +.385e24 d0 f4 bne $385e1a BNE SR_READ_LOOP +.385e26 SR_DONE +.385e26 a9 01 lda #$01 LDA #1 +.385e28 8f 14 ea af sta $afea14 STA SDC_RX_FIFO_CTRL_REG +.385e2c af 80 e8 af lda $afe880 LDA GABE_MSTR_CTRL +.385e30 29 fd and #$fd AND #~GABE_CTRL_SDC_LED +.385e32 8f 80 e8 af sta $afe880 STA GABE_MSTR_CTRL +.385e36 7a ply PLY +.385e37 6b rtl RTL +.385e38 DISPLAY_FAT_NAME +.385e38 48 pha PHA ; - store the value of filetype +.385e39 a0 00 00 ldy #$0000 LDY #0 +.385e3c _RD_VOLNAME_LOOP +.385e3c b7 80 lda [$80],y LDA [SD_DATA],Y +.385e3e 22 18 10 00 jsl $001018 JSL PUTC +.385e42 c8 iny INY +.385e43 c0 08 00 cpy #$0008 CPY #8 +.385e46 f0 07 beq $385e4f BEQ _RD_DOT +.385e48 c0 0b 00 cpy #$000b CPY #11 +.385e4b d0 ef bne $385e3c BNE _RD_VOLNAME_LOOP +.385e4d 80 0e bra $385e5d BRA _DFAT_NAME_DONE +.385e4f _RD_DOT +.385e4f 68 pla PLA ; - read the value of filetype +.385e50 48 pha PHA ; - store the value of filetype +.385e51 89 18 bit #$18 BIT #$18 +.385e53 d0 e7 bne $385e3c BNE _RD_VOLNAME_LOOP +.385e55 a9 2e lda #$2e LDA #"." +.385e57 22 18 10 00 jsl $001018 JSL PUTC +.385e5b 80 df bra $385e3c BRA _RD_VOLNAME_LOOP +.385e5d _DFAT_NAME_DONE +.385e5d 68 pla PLA ; - read the value of filetype +.385e5e 89 18 bit #$18 BIT #$18 +.385e60 d0 3b bne $385e9d BNE RD_DFAT_DONE +.385e62 a9 38 lda #$38 LDA #`sd_cluster_str +.385e64 8b phb PHB +.385e65 48 pha PHA +.385e66 ab plb PLB +.385e67 a2 28 64 ldx #$6428 LDX #<>sd_cluster_str +.385e6a 22 1c 10 00 jsl $00101c JSL PUTS +.385e6e ab plb PLB +.385e6f a0 1b 00 ldy #$001b LDY #fatrec.cluster + 1 +.385e72 b7 80 lda [$80],y LDA [SD_DATA],Y +.385e74 22 80 10 00 jsl $001080 JSL PRINTAH +.385e78 a0 1a 00 ldy #$001a LDY #fatrec.cluster +.385e7b b7 80 lda [$80],y LDA [SD_DATA],Y +.385e7d 22 80 10 00 jsl $001080 JSL PRINTAH +.385e81 a9 38 lda #$38 LDA #`sd_filesize_str +.385e83 8b phb PHB +.385e84 48 pha PHA +.385e85 ab plb PLB +.385e86 a2 33 64 ldx #$6433 LDX #<>sd_filesize_str +.385e89 22 1c 10 00 jsl $00101c JSL PUTS +.385e8d ab plb PLB +.385e8e a0 1f 00 ldy #$001f LDY #fatrec.size_h + 1 +.385e91 RD_SIZE_LOOP +.385e91 b7 80 lda [$80],y LDA [SD_DATA],Y +.385e93 22 80 10 00 jsl $001080 JSL PRINTAH +.385e97 88 dey DEY +.385e98 c0 1b 00 cpy #$001b CPY #$1B +.385e9b d0 f4 bne $385e91 BNE RD_SIZE_LOOP +.385e9d RD_DFAT_DONE +.385e9d a9 0d lda #$0d LDA #$D +.385e9f 22 18 10 00 jsl $001018 JSL PUTC +.385ea3 60 rts RTS +.385ea4 ISDOS_DISPLAY_ROOT_DIR +.385ea4 a5 3f lda $3f LDA SDCARD_PRSNT_MNT ; this must be non-zero +.385ea6 d0 01 bne $385ea9 BNE RD_CARD_PRESENT +.385ea8 6b rtl RTL +.385ea9 RD_CARD_PRESENT +.385ea9 c2 20 rep #$20 REP #$20 ; set A long +.385eab a9 00 00 lda #$0000 LDA #0 ; reset the root entries offset +.385eae 8d 20 5f sta $5f20 STA SD_DIR_OFFSET +.385eb1 RD_NEXT_SECTOR +.385eb1 a9 00 64 lda #$6400 LDA #SD_ROOT_BEGIN +.385eb4 85 80 sta $80 STA SD_DATA +.385eb6 a9 00 00 lda #$0000 LDA #0 +.385eb9 85 82 sta $82 STA SD_DATA + 2 +.385ebb ad 20 5f lda $5f20 LDA SD_DIR_OFFSET ; multiply by 512 +.385ebe 0a asl a ASL A +.385ebf eb xba XBA +.385ec0 8d 20 01 sta $0120 STA ADDER_A +.385ec3 a9 00 00 lda #$0000 LDA #0 +.385ec6 8d 22 01 sta $0122 STA ADDER_A + 2 +.385ec9 ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET +.385ecc 8d 24 01 sta $0124 STA ADDER_B +.385ecf ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET+2 +.385ed2 8d 26 01 sta $0126 STA ADDER_B + 2 +.385ed5 ad 28 01 lda $0128 LDA ADDER_R +.385ed8 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.385edc ad 2a 01 lda $012a LDA ADDER_R + 2 +.385edf 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.385ee3 e2 20 sep #$20 SEP #$20 ; set A short +.385ee5 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.385ee9 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.385eed f0 08 beq $385ef7 BEQ RD_DIR_ENTRY +.385eef a2 99 63 ldx #$6399 LDX #<>SD_ROOT_ERROR_MSG +.385ef2 20 9c 5b jsr $385b9c JSR DISPLAY_MSG +.385ef5 80 6a bra $385f61 BRA RD_DONE +.385ef7 RD_DIR_ENTRY +.385ef7 a7 80 lda [$80] LDA [SD_DATA] +.385ef9 d0 04 bne $385eff BNE RD_CONTINUE ; if first byte is 0, entry is available and there are no following entries +.385efb 5c 61 5f 38 jmp $385f61 JML RD_DONE +.385eff RD_CONTINUE +.385eff c9 e5 cmp #$e5 CMP #$E5 +.385f01 f0 35 beq $385f38 BEQ RD_SKIP +.385f03 RD_LOOP +.385f03 a0 0b 00 ldy #$000b LDY #fatrec.type +.385f06 b7 80 lda [$80],y LDA [SD_DATA],Y +.385f08 c9 0f cmp #$0f CMP #$F ; long file name +.385f0a d0 04 bne $385f10 BNE RD_NOT_VFAT +.385f0c 5c 8c 5f 38 jmp $385f8c JML RD_READ_LONG_FILENAME +.385f10 RD_NOT_VFAT +.385f10 89 02 bit #$02 BIT #2 ; hidden +.385f12 f0 02 beq $385f16 BEQ RD_NOT_HIDDEN +.385f14 80 22 bra $385f38 BRA RD_SKIP +.385f16 RD_NOT_HIDDEN +.385f16 89 08 bit #$08 BIT #8 ; volume name +.385f18 f0 04 beq $385f1e BEQ RD_NOT_VOLUME +.385f1a 5c 77 5f 38 jmp $385f77 JML RD_READ_VOLNAME +.385f1e RD_NOT_VOLUME +.385f1e 89 10 bit #$10 BIT #$10 ; directory +.385f20 f0 04 beq $385f26 BEQ RD_NOT_DIRECTORY +.385f22 5c 62 5f 38 jmp $385f62 JML RD_DIRNAME +.385f26 RD_NOT_DIRECTORY +.385f26 48 pha PHA ; - store the value of filetype +.385f27 a9 38 lda #$38 LDA #`sd_filename +.385f29 8b phb PHB +.385f2a 48 pha PHA +.385f2b ab plb PLB +.385f2c a2 1a 64 ldx #$641a LDX #<>sd_filename +.385f2f 22 1c 10 00 jsl $00101c JSL PUTS +.385f33 ab plb PLB +.385f34 68 pla PLA +.385f35 20 38 5e jsr $385e38 JSR DISPLAY_FAT_NAME +.385f38 RD_SKIP +.385f38 c2 20 rep #$20 REP #$20 ; set A long +.385f3a a5 80 lda $80 LDA SD_DATA +.385f3c 29 e0 01 and #$01e0 AND #$1E0 +.385f3f c9 e0 01 cmp #$01e0 CMP #$1E0 +.385f42 d0 0f bne $385f53 BNE RD_SKIP_NEXT +.385f44 ad 20 5f lda $5f20 LDA SD_DIR_OFFSET +.385f47 1a inc a INC A +.385f48 cd 1e 5f cmp $5f1e CMP SD_ROOT_ENTRIES +.385f4b b0 14 bcs $385f61 BCS RD_DONE +.385f4d 8d 20 5f sta $5f20 STA SD_DIR_OFFSET ; next sector +.385f50 4c b1 5e jmp $385eb1 JMP RD_NEXT_SECTOR +.385f53 RD_SKIP_NEXT +.385f53 a5 80 lda $80 LDA SD_DATA +.385f55 18 clc CLC +.385f56 69 20 00 adc #$0020 ADC #$20 +.385f59 85 80 sta $80 STA SD_DATA +.385f5b e2 20 sep #$20 SEP #$20 ; set A short +.385f5d 5c f7 5e 38 jmp $385ef7 JML RD_DIR_ENTRY +.385f61 RD_DONE +.385f61 6b rtl RTL +.385f62 RD_DIRNAME +.385f62 48 pha PHA ; - store the value of filetype +.385f63 a9 38 lda #$38 LDA #`sd_dir_name +.385f65 8b phb PHB +.385f66 48 pha PHA +.385f67 ab plb PLB +.385f68 a2 0c 64 ldx #$640c LDX #<>sd_dir_name +.385f6b 22 1c 10 00 jsl $00101c JSL PUTS +.385f6f ab plb PLB +.385f70 68 pla PLA +.385f71 20 38 5e jsr $385e38 JSR DISPLAY_FAT_NAME +.385f74 4c 38 5f jmp $385f38 JMP RD_SKIP +.385f77 RD_READ_VOLNAME +.385f77 48 pha PHA ; - store the value of filetype +.385f78 a9 38 lda #$38 LDA #`sd_volume_name +.385f7a 8b phb PHB +.385f7b 48 pha PHA +.385f7c ab plb PLB +.385f7d a2 f0 63 ldx #$63f0 LDX #<>sd_volume_name +.385f80 22 1c 10 00 jsl $00101c JSL PUTS +.385f84 ab plb PLB +.385f85 68 pla PLA +.385f86 20 38 5e jsr $385e38 JSR DISPLAY_FAT_NAME +.385f89 4c 38 5f jmp $385f38 JMP RD_SKIP +.385f8c RD_READ_LONG_FILENAME +.385f8c 4c 38 5f jmp $385f38 JMP RD_SKIP +.385f8f STORE_FILE_LIST +.385f8f a0 0b 00 ldy #$000b LDY #11 +.385f92 c9 10 cmp #$10 CMP #$10 +.385f94 f0 02 beq $385f98 BEQ SF_DIR +.385f96 a9 01 lda #$01 LDA #1 +.385f98 SF_DIR +.385f98 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y +.385f9a a0 00 00 ldy #$0000 LDY #0 +.385f9d a2 0b 00 ldx #$000b LDX #11 +.385fa0 SF_LOOP_NAME +.385fa0 b7 80 lda [$80],y LDA [SD_DATA],Y +.385fa2 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y +.385fa4 c8 iny INY +.385fa5 ca dex DEX +.385fa6 d0 f8 bne $385fa0 BNE SF_LOOP_NAME +.385fa8 c2 20 rep #$20 REP #$20 ; set A long +.385faa a0 1a 00 ldy #$001a LDY #fatrec.cluster .385fad b7 80 lda [$80],y LDA [SD_DATA],Y -.385faf a0 0e 00 ldy #$000e LDY #14 +.385faf a0 10 00 ldy #$0010 LDY #16 .385fb2 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y -.385fb4 a5 51 lda $51 LDA SDOS_FILE_REC_PTR -.385fb6 18 clc CLC -.385fb7 69 12 00 adc #$0012 ADC #18 -.385fba 85 51 sta $51 STA SDOS_FILE_REC_PTR -.385fbc e2 20 sep #$20 SEP #$20 ; set A short -.385fbe 60 rts RTS -.385fbf ISDOS_PARSE_ROOT_DIR -.385fbf a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.385fc1 d0 01 bne $385fc4 BNE SP_CARD_PRESENT -.385fc3 6b rtl RTL -.385fc4 SP_CARD_PRESENT -.385fc4 c2 20 rep #$20 REP #$20 ; set A long -.385fc6 a9 00 00 lda #$0000 LDA #0 ; reset the root entries offset -.385fc9 8d 20 5f sta $5f20 STA SD_DIR_OFFSET -.385fcc SP_NEXT_SECTOR -.385fcc a9 00 64 lda #$6400 LDA #SD_ROOT_BEGIN -.385fcf 85 80 sta $80 STA SD_DATA -.385fd1 a9 00 00 lda #$0000 LDA #0 -.385fd4 85 82 sta $82 STA SD_DATA + 2 -.385fd6 ad 20 5f lda $5f20 LDA SD_DIR_OFFSET ; multiply by 512 -.385fd9 0a asl a ASL A -.385fda eb xba XBA -.385fdb 8d 20 01 sta $0120 STA ADDER_A -.385fde a9 00 00 lda #$0000 LDA #0 -.385fe1 8d 22 01 sta $0122 STA ADDER_A + 2 -.385fe4 ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET -.385fe7 8d 24 01 sta $0124 STA ADDER_B -.385fea ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET+2 -.385fed 8d 26 01 sta $0126 STA ADDER_B + 2 -.385ff0 ad 28 01 lda $0128 LDA ADDER_R -.385ff3 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.385ff7 ad 2a 01 lda $012a LDA ADDER_R + 2 -.385ffa 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.385ffe e2 20 sep #$20 SEP #$20 ; set A short -.386000 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.386004 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.386008 f0 04 beq $38600e BEQ SP_DIR_ENTRY -.38600a 5c 6a 60 38 jmp $38606a JML SP_DONE -.38600e SP_DIR_ENTRY -.38600e a7 80 lda [$80] LDA [SD_DATA] -.386010 d0 04 bne $386016 BNE SP_CONTINUE ; if first byte is 0, entry is available and there are no following entries -.386012 5c 6a 60 38 jmp $38606a JML SP_DONE -.386016 SP_CONTINUE -.386016 c9 e5 cmp #$e5 CMP #$E5 -.386018 f0 27 beq $386041 BEQ SP_SKIP -.38601a SP_LOOP -.38601a a0 0b 00 ldy #$000b LDY #fatrec.type -.38601d b7 80 lda [$80],y LDA [SD_DATA],Y -.38601f c9 0f cmp #$0f CMP #$F ; long file name -.386021 d0 04 bne $386027 BNE SP_NOT_VFAT -.386023 5c 41 60 38 jmp $386041 JML SP_SKIP -.386027 SP_NOT_VFAT -.386027 89 02 bit #$02 BIT #2 ; hidden -.386029 f0 02 beq $38602d BEQ SP_NOT_HIDDEN -.38602b 80 14 bra $386041 BRA SP_SKIP -.38602d SP_NOT_HIDDEN -.38602d 89 08 bit #$08 BIT #8 ; volume name -.38602f f0 04 beq $386035 BEQ SP_NOT_VOLUME -.386031 5c 41 60 38 jmp $386041 JML SP_SKIP -.386035 SP_NOT_VOLUME -.386035 89 10 bit #$10 BIT #$10 ; directory -.386037 f0 05 beq $38603e BEQ SP_NOT_DIRECTORY -.386039 20 7b 5f jsr $385f7b JSR STORE_FILE_LIST -.38603c 80 03 bra $386041 BRA SP_SKIP -.38603e SP_NOT_DIRECTORY -.38603e 20 7b 5f jsr $385f7b JSR STORE_FILE_LIST -.386041 SP_SKIP -.386041 c2 20 rep #$20 REP #$20 ; set A long -.386043 a5 80 lda $80 LDA SD_DATA -.386045 29 e0 01 and #$01e0 AND #$1E0 ; each record in FAT is $20 bytes long -.386048 c9 e0 01 cmp #$01e0 CMP #$1E0 -.38604b d0 0f bne $38605c BNE SP_SKIP_NEXT -.38604d ad 20 5f lda $5f20 LDA SD_DIR_OFFSET -.386050 1a inc a INC A -.386051 cd 1c 5f cmp $5f1c CMP SD_ROOT_ENTRIES -.386054 b0 14 bcs $38606a BCS SP_DONE -.386056 8d 20 5f sta $5f20 STA SD_DIR_OFFSET ; next sector -.386059 4c cc 5f jmp $385fcc JMP SP_NEXT_SECTOR -.38605c SP_SKIP_NEXT -.38605c a5 80 lda $80 LDA SD_DATA -.38605e 18 clc CLC -.38605f 69 20 00 adc #$0020 ADC #$20 -.386062 85 80 sta $80 STA SD_DATA -.386064 e2 20 sep #$20 SEP #$20 ; set A short -.386066 5c 0e 60 38 jmp $38600e JML SP_DIR_ENTRY -.38606a SP_DONE -.38606a 6b rtl RTL -.38606b ISDOS_READ_FAT_SECTOR -.38606b 48 pha PHA -.38606c a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.38606e 29 ff 00 and #$00ff AND #$FF -.386071 d0 02 bne $386075 BNE RF_CARD_PRESENT -.386073 68 pla PLA -.386074 6b rtl RTL -.386075 RF_CARD_PRESENT -.386075 68 pla PLA -.386076 85 88 sta $88 STA SD_MULT_AREA -.386078 a9 00 00 lda #$0000 LDA #0 -.38607b 85 8a sta $8a STA SD_MULT_AREA + 2 -.38607d 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES -.386080 a5 88 lda $88 LDA SD_MULT_AREA -.386082 8d 20 01 sta $0120 STA ADDER_A -.386085 a5 8a lda $8a LDA SD_MULT_AREA + 2 -.386087 8d 22 01 sta $0122 STA ADDER_A + 2 -.38608a ad 04 5f lda $5f04 LDA SD_FAT_OFFSET -.38608d 8d 24 01 sta $0124 STA ADDER_B -.386090 ad 06 5f lda $5f06 LDA SD_FAT_OFFSET+2 -.386093 8d 26 01 sta $0126 STA ADDER_B + 2 -.386096 ad 28 01 lda $0128 LDA ADDER_R -.386099 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.38609d ad 2a 01 lda $012a LDA ADDER_R + 2 -.3860a0 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.3860a4 e2 20 sep #$20 SEP #$20 ; set A short -.3860a6 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.3860aa af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.3860ae f0 08 beq $3860b8 BEQ SD_CONTINUE_FAT -.3860b0 a2 12 63 ldx #$6312 LDX #<>SD_FAT_ERROR_MSG -.3860b3 20 aa 5b jsr $385baa JSR DISPLAY_MSG -.3860b6 80 00 bra $3860b8 BRA SD_CONTINUE_FAT -.3860b8 SD_CONTINUE_FAT -.3860b8 c2 20 rep #$20 REP #$20 ; set A long -.3860ba 6b rtl RTL -.3860bb ISDOS_READ_DATA_CLUSTER -.3860bb 48 pha PHA -.3860bc a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.3860be 29 ff 00 and #$00ff AND #$FF -.3860c1 d0 02 bne $3860c5 BNE SDR_CARD_PRESENT -.3860c3 68 pla PLA -.3860c4 6b rtl RTL -.3860c5 SDR_CARD_PRESENT -.3860c5 68 pla PLA -.3860c6 38 sec SEC -.3860c7 e9 02 00 sbc #$0002 SBC #2 -.3860ca 8d 00 01 sta $0100 STA UNSIGNED_MULT_A -.3860cd ad 24 5f lda $5f24 LDA SD_SECTORS_PER_CLUSTER -.3860d0 8d 02 01 sta $0102 STA UNSIGNED_MULT_B -.3860d3 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT -.3860d6 48 pha PHA -.3860d7 a2 00 00 ldx #$0000 LDX #0 -.3860da SDR_NEXT_SECTOR -.3860da 85 88 sta $88 STA SD_MULT_AREA -.3860dc a9 00 00 lda #$0000 LDA #0 -.3860df 85 8a sta $8a STA SD_MULT_AREA + 2 -.3860e1 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES -.3860e4 a5 88 lda $88 LDA SD_MULT_AREA -.3860e6 8d 20 01 sta $0120 STA ADDER_A -.3860e9 a5 8a lda $8a LDA SD_MULT_AREA + 2 -.3860eb 8d 22 01 sta $0122 STA ADDER_A + 2 -.3860ee ad 0c 5f lda $5f0c LDA SD_DATA_OFFSET -.3860f1 8d 24 01 sta $0124 STA ADDER_B -.3860f4 ad 0e 5f lda $5f0e LDA SD_DATA_OFFSET+2 -.3860f7 8d 26 01 sta $0126 STA ADDER_B + 2 -.3860fa ad 28 01 lda $0128 LDA ADDER_R -.3860fd 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG -.386101 ad 2a 01 lda $012a LDA ADDER_R + 2 -.386104 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG -.386108 e2 20 sep #$20 SEP #$20 ; set A short -.38610a 22 d2 5d 38 jsl $385dd2 JSL ISDOS_READ_BLOCK -.38610e af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG -.386112 f0 0a beq $38611e BEQ SD_CONTINUE_DATA -.386114 a9 ff lda #$ff LDA #$FF -.386116 8d 27 5f sta $5f27 STA CLUSTER_PTR -.386119 8d 28 5f sta $5f28 STA CLUSTER_PTR + 1 -.38611c 80 17 bra $386135 BRA SD_CONTINUE_DATA_DONE -.38611e SD_CONTINUE_DATA -.38611e c2 20 rep #$20 REP #$20 ; set A long -.386120 a5 80 lda $80 LDA SD_DATA -.386122 18 clc CLC -.386123 69 00 02 adc #$0200 ADC #$200 -.386126 85 80 sta $80 STA SD_DATA -.386128 90 02 bcc $38612c BCC SD_CONT_NO_CARRY -.38612a e6 82 inc $82 INC SD_DATA + 2 -.38612c SD_CONT_NO_CARRY -.38612c 68 pla PLA -.38612d 1a inc a INC A -.38612e 48 pha PHA -.38612f e8 inx INX -.386130 ec 24 5f cpx $5f24 CPX SD_SECTORS_PER_CLUSTER -.386133 d0 a5 bne $3860da BNE SDR_NEXT_SECTOR -.386135 SD_CONTINUE_DATA_DONE -.386135 c2 20 rep #$20 REP #$20 ; set A long -.386137 68 pla PLA -.386138 6b rtl RTL -.386139 ISDOS_READ_FILE -.386139 48 pha PHA -.38613a a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.38613c 29 ff 00 and #$00ff AND #$FF -.38613f d0 02 bne $386143 BNE SD_CARD_PRESENT -.386141 68 pla PLA -.386142 6b rtl RTL -.386143 SD_CARD_PRESENT -.386143 68 pla PLA -.386144 8d 27 5f sta $5f27 STA CLUSTER_PTR -.386147 SD_CLUSTER_LOOP -.386147 22 bb 60 38 jsl $3860bb JSL ISDOS_READ_DATA_CLUSTER -.38614b ad 26 5f lda $5f26 LDA SD_FAT16 -.38614e 29 01 00 and #$0001 AND #$1 -.386151 0a asl a ASL -.386152 aa tax TAX -.386153 fc 59 61 jsr ($386159,x) JSR (READ_FAT_TABLE,X) -.386156 d0 ef bne $386147 BNE SD_CLUSTER_LOOP -.386158 6b rtl RTL ->386159 5d 61 READ_FAT_TABLE .word <>FAT12_GET_NEXT_CLUSTER ->38615b 82 61 .word <>FAT16_GET_NEXT_CLUSTER -.38615d FAT12_GET_NEXT_CLUSTER -.38615d ad 27 5f lda $5f27 LDA CLUSTER_PTR ; a FAT12 page contains about 340 entries -.386160 4a lsr a LSR A ; this may result in a carry, if the cluster to read is odd -.386161 90 0e bcc $386171 BCC F12_NC_NO_CARRY -.386163 18 clc CLC -.386164 6d 27 5f adc $5f27 ADC CLUSTER_PTR -.386167 a8 tay TAY -.386168 b9 00 66 lda $6600,y LDA FAT_DATA,Y -.38616b 4a lsr a LSR A -.38616c 4a lsr a LSR A -.38616d 4a lsr a LSR A -.38616e 4a lsr a LSR A ; divide by 16 -.38616f 80 0a bra $38617b BRA F12_NC_CONTINUE -.386171 F12_NC_NO_CARRY -.386171 6d 27 5f adc $5f27 ADC CLUSTER_PTR -.386174 a8 tay TAY -.386175 b9 00 66 lda $6600,y LDA FAT_DATA,Y -.386178 29 ff 0f and #$0fff AND #$FFF -.38617b F12_NC_CONTINUE -.38617b 8d 27 5f sta $5f27 STA CLUSTER_PTR -.38617e c9 ff 0f cmp #$0fff CMP #$FFF -.386181 60 rts RTS -.386182 FAT16_GET_NEXT_CLUSTER -.386182 ad 27 5f lda $5f27 LDA CLUSTER_PTR -.386185 eb xba XBA -.386186 29 ff 00 and #$00ff AND #$FF -.386189 c5 86 cmp $86 CMP SD_DATA_FAT_PAGE -.38618b f0 22 beq $3861af BEQ SKIP_FAT_LOADING -.38618d 48 pha PHA -.38618e a5 80 lda $80 LDA SD_DATA -.386190 85 83 sta $83 STA SD_TMP_DATA -.386192 a5 82 lda $82 LDA SD_DATA + 2 -.386194 85 85 sta $85 STA SD_TMP_DATA + 2 -.386196 a9 00 66 lda #$6600 LDA #FAT_DATA -.386199 85 80 sta $80 STA SD_DATA -.38619b a9 00 00 lda #$0000 LDA #0 -.38619e 85 82 sta $82 STA SD_DATA + 2 -.3861a0 68 pla PLA -.3861a1 85 86 sta $86 STA SD_DATA_FAT_PAGE -.3861a3 22 6b 60 38 jsl $38606b JSL ISDOS_READ_FAT_SECTOR -.3861a7 a5 83 lda $83 LDA SD_TMP_DATA -.3861a9 85 80 sta $80 STA SD_DATA -.3861ab a5 85 lda $85 LDA SD_TMP_DATA + 2 -.3861ad 85 82 sta $82 STA SD_DATA + 2 -.3861af SKIP_FAT_LOADING -.3861af ad 27 5f lda $5f27 LDA CLUSTER_PTR -.3861b2 29 ff 00 and #$00ff AND #$FF -.3861b5 0a asl a ASL A ; multiply by 2 -.3861b6 a8 tay TAY -.3861b7 b9 00 66 lda $6600,y LDA FAT_DATA,Y -.3861ba 8d 27 5f sta $5f27 STA CLUSTER_PTR -.3861bd c9 ff ff cmp #$ffff CMP #$FFFF -.3861c0 60 rts RTS -.3861c1 COMPUTE_FAT_ROOT_DATA_OFFSETS -.3861c1 ad 10 5f lda $5f10 LDA SD_RESERVED_SECTORS ; 16 bit value -.3861c4 85 88 sta $88 STA SD_MULT_AREA -.3861c6 a9 00 00 lda #$0000 LDA #0 -.3861c9 85 8a sta $8a STA SD_MULT_AREA + 2 -.3861cb 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES ; compute the byte offset -.3861ce a5 88 lda $88 LDA SD_MULT_AREA -.3861d0 8d 20 01 sta $0120 STA ADDER_A -.3861d3 a5 8a lda $8a LDA SD_MULT_AREA + 2 -.3861d5 8d 22 01 sta $0122 STA ADDER_A+2 -.3861d8 ad 00 5f lda $5f00 LDA SD_FIRST_SECTOR ; 32 bit value -.3861db 8d 24 01 sta $0124 STA ADDER_B -.3861de ad 02 5f lda $5f02 LDA SD_FIRST_SECTOR + 2 -.3861e1 8d 26 01 sta $0126 STA ADDER_B + 2 -.3861e4 ad 28 01 lda $0128 LDA ADDER_R -.3861e7 8d 04 5f sta $5f04 STA SD_FAT_OFFSET -.3861ea ad 2a 01 lda $012a LDA ADDER_R + 2 -.3861ed 8d 06 5f sta $5f06 STA SD_FAT_OFFSET + 2 -.3861f0 ad 16 5f lda $5f16 LDA SD_FAT_COUNT -.3861f3 8d 00 01 sta $0100 STA UNSIGNED_MULT_A -.3861f6 ad 12 5f lda $5f12 LDA SD_SECTORS_PER_FAT -.3861f9 8d 02 01 sta $0102 STA UNSIGNED_MULT_B -.3861fc ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT -.3861ff 85 88 sta $88 STA SD_MULT_AREA -.386201 ad 06 01 lda $0106 LDA UNSIGNED_MULT_RESULT + 2 -.386204 85 8a sta $8a STA SD_MULT_AREA + 2 -.386206 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES ; compute the byte offset -.386209 a5 88 lda $88 LDA SD_MULT_AREA -.38620b 8d 20 01 sta $0120 STA ADDER_A -.38620e a5 8a lda $8a LDA SD_MULT_AREA + 2 -.386210 8d 22 01 sta $0122 STA ADDER_A + 2 -.386213 ad 04 5f lda $5f04 LDA SD_FAT_OFFSET -.386216 8d 24 01 sta $0124 STA ADDER_B -.386219 ad 06 5f lda $5f06 LDA SD_FAT_OFFSET + 2 -.38621c 8d 26 01 sta $0126 STA ADDER_B +2 -.38621f ad 28 01 lda $0128 LDA ADDER_R -.386222 8d 08 5f sta $5f08 STA SD_ROOT_OFFSET -.386225 ad 2a 01 lda $012a LDA ADDER_R +2 -.386228 8d 0a 5f sta $5f0a STA SD_ROOT_OFFSET + 2 -.38622b ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET -.38622e 8d 20 01 sta $0120 STA ADDER_A -.386231 ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET + 2 -.386234 8d 22 01 sta $0122 STA ADDER_A + 2 -.386237 a9 20 00 lda #$0020 LDA #32 ; the root contains 512 entries at 32 bytes each -.38623a 85 88 sta $88 STA SD_MULT_AREA -.38623c a9 00 00 lda #$0000 LDA #0 -.38623f 85 8a sta $8a STA SD_MULT_AREA + 2 -.386241 20 d2 5c jsr $385cd2 JSR CALC_OFFSET_BYTES -.386244 a5 88 lda $88 LDA SD_MULT_AREA -.386246 8d 24 01 sta $0124 STA ADDER_B -.386249 a5 8a lda $8a LDA SD_MULT_AREA + 2 -.38624b 8d 26 01 sta $0126 STA ADDER_B + 2 -.38624e ad 28 01 lda $0128 LDA ADDER_R -.386251 8d 0c 5f sta $5f0c STA SD_DATA_OFFSET -.386254 ad 2a 01 lda $012a LDA ADDER_R + 2 -.386257 8d 0e 5f sta $5f0e STA SD_DATA_OFFSET + 2 -.38625a 60 rts RTS ->38625b 30 30 20 2d 20 57 65 6c sd_card_tester .text "00 - Welcome to the SDCard Tester", $d, 0 ->386263 63 6f 6d 65 20 74 6f 20 74 68 65 20 53 44 43 61 ->386273 72 64 20 54 65 73 74 65 72 0d 00 ->38627e 30 31 20 2d 20 43 61 72 sd_card_present_msg .text "01 - Card Present", $d, 0 ->386286 64 20 50 72 65 73 65 6e 74 0d 00 ->386291 30 31 20 2d 20 4e 4f 20 sd_no_card_msg .text "01 - NO SDCARD PRESENT", $0D, $00 ->386299 53 44 43 41 52 44 20 50 52 45 53 45 4e 54 0d 00 ->3862a9 30 32 20 2d 20 43 61 6e sd_cant_read_mbr_msg .text "02 - Can't read MBR - No Card present", $D, $0 ->3862b1 27 74 20 72 65 61 64 20 4d 42 52 20 2d 20 4e 6f ->3862c1 20 43 61 72 64 20 70 72 65 73 65 6e 74 0d 00 ->3862d0 30 33 20 2d 20 45 72 72 sd_read_failure .text "03 - Error during read operation", $d, $0 ->3862d8 6f 72 20 64 75 72 69 6e 67 20 72 65 61 64 20 6f ->3862e8 70 65 72 61 74 69 6f 6e 0d 00 ->3862f2 30 34 20 2d 20 45 72 72 SD_BOOT_SECTOR_MSG .text "04 - Error reading Boot sector", $d, $0 ->3862fa 6f 72 20 72 65 61 64 69 6e 67 20 42 6f 6f 74 20 ->38630a 73 65 63 74 6f 72 0d 00 ->386312 30 35 20 2d 20 45 72 72 SD_FAT_ERROR_MSG .text "05 - Error reading FAT sector", $d, $0 ->38631a 6f 72 20 72 65 61 64 69 6e 67 20 46 41 54 20 73 ->38632a 65 63 74 6f 72 0d 00 ->386331 30 35 20 2d 20 45 72 72 SD_ROOT_ERROR_MSG .text "05 - Error reading Root sector", $d, $0 ->386339 6f 72 20 72 65 61 64 69 6e 67 20 52 6f 6f 74 20 ->386349 73 65 63 74 6f 72 0d 00 ->386351 30 35 20 2d 20 45 72 72 SD_DATA_ERROR_MSG .text "05 - Error reading Data sector", $d, $0 ->386359 6f 72 20 72 65 61 64 69 6e 67 20 44 61 74 61 20 ->386369 73 65 63 74 6f 72 0d 00 ->386371 49 6e 76 61 6c 69 64 20 INVALID_SIG_MSG .text 'Invalid MBR Signature',$D,0 ->386379 4d 42 52 20 53 69 67 6e 61 74 75 72 65 0d 00 ->386388 56 6f 6c 75 6d 65 20 4e sd_volume_name .text "Volume Name: ", $0 ->386390 61 6d 65 3a 20 00 ->386396 56 46 41 54 20 4e 61 6d sd_vfat_name .text "VFAT Name : ", $0 ->38639e 65 20 20 3a 20 00 ->3863a4 44 69 72 65 63 74 6f 72 sd_dir_name .text "Directory : ", $0 ->3863ac 79 20 20 3a 20 00 ->3863b2 46 69 6c 65 6e 61 6d 65 sd_filename .text "Filename : ", $0 ->3863ba 20 20 20 3a 20 00 ->3863c0 2c 20 43 6c 75 73 74 65 sd_cluster_str .text ", Cluster:", $0 ->3863c8 72 3a 00 ->3863cb 2c 20 53 69 7a 65 3a 00 sd_filesize_str .text ", Size:", $0 +.385fb4 a0 1c 00 ldy #$001c LDY #fatrec.size_l +.385fb7 b7 80 lda [$80],y LDA [SD_DATA],Y +.385fb9 a0 0c 00 ldy #$000c LDY #12 +.385fbc 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y +.385fbe a0 1e 00 ldy #$001e LDY #fatrec.size_h +.385fc1 b7 80 lda [$80],y LDA [SD_DATA],Y +.385fc3 a0 0e 00 ldy #$000e LDY #14 +.385fc6 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR],Y +.385fc8 a5 51 lda $51 LDA SDOS_FILE_REC_PTR +.385fca 18 clc CLC +.385fcb 69 12 00 adc #$0012 ADC #18 +.385fce 85 51 sta $51 STA SDOS_FILE_REC_PTR +.385fd0 e2 20 sep #$20 SEP #$20 ; set A short +.385fd2 60 rts RTS +.385fd3 ISDOS_PARSE_ROOT_DIR +.385fd3 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.385fd5 d0 01 bne $385fd8 BNE SP_CARD_PRESENT +.385fd7 6b rtl RTL +.385fd8 SP_CARD_PRESENT +.385fd8 c2 20 rep #$20 REP #$20 ; set A long +.385fda a9 00 00 lda #$0000 LDA #0 ; reset the root entries offset +.385fdd 8d 20 5f sta $5f20 STA SD_DIR_OFFSET +.385fe0 SP_NEXT_SECTOR +.385fe0 a9 00 64 lda #$6400 LDA #SD_ROOT_BEGIN +.385fe3 85 80 sta $80 STA SD_DATA +.385fe5 a9 00 00 lda #$0000 LDA #0 +.385fe8 85 82 sta $82 STA SD_DATA + 2 +.385fea ad 20 5f lda $5f20 LDA SD_DIR_OFFSET ; multiply by 512 +.385fed 0a asl a ASL A +.385fee eb xba XBA +.385fef 8d 20 01 sta $0120 STA ADDER_A +.385ff2 a9 00 00 lda #$0000 LDA #0 +.385ff5 8d 22 01 sta $0122 STA ADDER_A + 2 +.385ff8 ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET +.385ffb 8d 24 01 sta $0124 STA ADDER_B +.385ffe ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET+2 +.386001 8d 26 01 sta $0126 STA ADDER_B + 2 +.386004 ad 28 01 lda $0128 LDA ADDER_R +.386007 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.38600b ad 2a 01 lda $012a LDA ADDER_R + 2 +.38600e 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.386012 e2 20 sep #$20 SEP #$20 ; set A short +.386014 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.386018 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.38601c f0 04 beq $386022 BEQ SP_DIR_ENTRY +.38601e 5c 7e 60 38 jmp $38607e JML SP_DONE +.386022 SP_DIR_ENTRY +.386022 a7 80 lda [$80] LDA [SD_DATA] +.386024 d0 04 bne $38602a BNE SP_CONTINUE ; if first byte is 0, entry is available and there are no following entries +.386026 5c 7e 60 38 jmp $38607e JML SP_DONE +.38602a SP_CONTINUE +.38602a c9 e5 cmp #$e5 CMP #$E5 +.38602c f0 27 beq $386055 BEQ SP_SKIP +.38602e SP_LOOP +.38602e a0 0b 00 ldy #$000b LDY #fatrec.type +.386031 b7 80 lda [$80],y LDA [SD_DATA],Y +.386033 c9 0f cmp #$0f CMP #$F ; long file name +.386035 d0 04 bne $38603b BNE SP_NOT_VFAT +.386037 5c 55 60 38 jmp $386055 JML SP_SKIP +.38603b SP_NOT_VFAT +.38603b 89 02 bit #$02 BIT #2 ; hidden +.38603d f0 02 beq $386041 BEQ SP_NOT_HIDDEN +.38603f 80 14 bra $386055 BRA SP_SKIP +.386041 SP_NOT_HIDDEN +.386041 89 08 bit #$08 BIT #8 ; volume name +.386043 f0 04 beq $386049 BEQ SP_NOT_VOLUME +.386045 5c 55 60 38 jmp $386055 JML SP_SKIP +.386049 SP_NOT_VOLUME +.386049 89 10 bit #$10 BIT #$10 ; directory +.38604b f0 05 beq $386052 BEQ SP_NOT_DIRECTORY +.38604d 20 8f 5f jsr $385f8f JSR STORE_FILE_LIST +.386050 80 03 bra $386055 BRA SP_SKIP +.386052 SP_NOT_DIRECTORY +.386052 20 8f 5f jsr $385f8f JSR STORE_FILE_LIST +.386055 SP_SKIP +.386055 c2 20 rep #$20 REP #$20 ; set A long +.386057 a5 80 lda $80 LDA SD_DATA +.386059 29 e0 01 and #$01e0 AND #$1E0 ; each record in FAT is $20 bytes long +.38605c c9 e0 01 cmp #$01e0 CMP #$1E0 +.38605f d0 0f bne $386070 BNE SP_SKIP_NEXT +.386061 ad 20 5f lda $5f20 LDA SD_DIR_OFFSET +.386064 1a inc a INC A +.386065 cd 1e 5f cmp $5f1e CMP SD_ROOT_ENTRIES +.386068 b0 14 bcs $38607e BCS SP_DONE +.38606a 8d 20 5f sta $5f20 STA SD_DIR_OFFSET ; next sector +.38606d 4c e0 5f jmp $385fe0 JMP SP_NEXT_SECTOR +.386070 SP_SKIP_NEXT +.386070 a5 80 lda $80 LDA SD_DATA +.386072 18 clc CLC +.386073 69 20 00 adc #$0020 ADC #$20 +.386076 85 80 sta $80 STA SD_DATA +.386078 e2 20 sep #$20 SEP #$20 ; set A short +.38607a 5c 22 60 38 jmp $386022 JML SP_DIR_ENTRY +.38607e SP_DONE +.38607e 6b rtl RTL +.38607f ISDOS_READ_FAT_SECTOR +.38607f 48 pha PHA +.386080 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.386082 29 ff 00 and #$00ff AND #$FF +.386085 d0 02 bne $386089 BNE RF_CARD_PRESENT +.386087 68 pla PLA +.386088 6b rtl RTL +.386089 RF_CARD_PRESENT +.386089 68 pla PLA +.38608a 85 88 sta $88 STA SD_MULT_AREA +.38608c a9 00 00 lda #$0000 LDA #0 +.38608f 85 8a sta $8a STA SD_MULT_AREA + 2 +.386091 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES +.386094 a5 88 lda $88 LDA SD_MULT_AREA +.386096 8d 20 01 sta $0120 STA ADDER_A +.386099 a5 8a lda $8a LDA SD_MULT_AREA + 2 +.38609b 8d 22 01 sta $0122 STA ADDER_A + 2 +.38609e ad 04 5f lda $5f04 LDA SD_FAT_OFFSET +.3860a1 8d 24 01 sta $0124 STA ADDER_B +.3860a4 ad 06 5f lda $5f06 LDA SD_FAT_OFFSET+2 +.3860a7 8d 26 01 sta $0126 STA ADDER_B + 2 +.3860aa ad 28 01 lda $0128 LDA ADDER_R +.3860ad 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.3860b1 ad 2a 01 lda $012a LDA ADDER_R + 2 +.3860b4 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.3860b8 e2 20 sep #$20 SEP #$20 ; set A short +.3860ba 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.3860be af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.3860c2 f0 08 beq $3860cc BEQ SD_CONTINUE_FAT +.3860c4 a2 7a 63 ldx #$637a LDX #<>SD_FAT_ERROR_MSG +.3860c7 20 9c 5b jsr $385b9c JSR DISPLAY_MSG +.3860ca 80 00 bra $3860cc BRA SD_CONTINUE_FAT +.3860cc SD_CONTINUE_FAT +.3860cc c2 20 rep #$20 REP #$20 ; set A long +.3860ce 6b rtl RTL +.3860cf ISDOS_READ_DATA_CLUSTER +.3860cf 48 pha PHA +.3860d0 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.3860d2 29 ff 00 and #$00ff AND #$FF +.3860d5 d0 02 bne $3860d9 BNE SDR_CARD_PRESENT +.3860d7 68 pla PLA +.3860d8 6b rtl RTL +.3860d9 SDR_CARD_PRESENT +.3860d9 ad 26 5f lda $5f26 LDA SD_FAT16_32 +.3860dc 29 03 00 and #$0003 AND #3 +.3860df c9 02 00 cmp #$0002 CMP #2 +.3860e2 f0 07 beq $3860eb BEQ SDR_FAT32 +.3860e4 68 pla PLA +.3860e5 38 sec SEC +.3860e6 e9 02 00 sbc #$0002 SBC #2 +.3860e9 80 05 bra $3860f0 BRA SDR_FAT_ADJ_CONTINUE +.3860eb SDR_FAT32 +.3860eb 68 pla PLA +.3860ec 38 sec SEC +.3860ed e9 06 00 sbc #$0006 SBC #6 +.3860f0 SDR_FAT_ADJ_CONTINUE +.3860f0 8d 00 01 sta $0100 STA UNSIGNED_MULT_A +.3860f3 ad 24 5f lda $5f24 LDA SD_SECTORS_PER_CLUSTER +.3860f6 8d 02 01 sta $0102 STA UNSIGNED_MULT_B +.3860f9 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT +.3860fc 48 pha PHA +.3860fd a2 00 00 ldx #$0000 LDX #0 +.386100 SDR_NEXT_SECTOR +.386100 85 88 sta $88 STA SD_MULT_AREA +.386102 a9 00 00 lda #$0000 LDA #0 +.386105 85 8a sta $8a STA SD_MULT_AREA + 2 +.386107 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES +.38610a a5 88 lda $88 LDA SD_MULT_AREA +.38610c 8d 20 01 sta $0120 STA ADDER_A +.38610f a5 8a lda $8a LDA SD_MULT_AREA + 2 +.386111 8d 22 01 sta $0122 STA ADDER_A + 2 +.386114 ad 0c 5f lda $5f0c LDA SD_DATA_OFFSET +.386117 8d 24 01 sta $0124 STA ADDER_B +.38611a ad 0e 5f lda $5f0e LDA SD_DATA_OFFSET+2 +.38611d 8d 26 01 sta $0126 STA ADDER_B + 2 +.386120 ad 28 01 lda $0128 LDA ADDER_R +.386123 8f 07 ea af sta $afea07 STA SDC_SD_ADDR_7_0_REG +.386127 ad 2a 01 lda $012a LDA ADDER_R + 2 +.38612a 8f 09 ea af sta $afea09 STA SDC_SD_ADDR_23_16_REG +.38612e e2 20 sep #$20 SEP #$20 ; set A short +.386130 22 e6 5d 38 jsl $385de6 JSL ISDOS_READ_BLOCK +.386134 af 05 ea af lda $afea05 LDA SDC_TRANS_ERROR_REG +.386138 f0 0a beq $386144 BEQ SD_CONTINUE_DATA +.38613a a9 ff lda #$ff LDA #$FF +.38613c 8d 27 5f sta $5f27 STA CLUSTER_PTR +.38613f 8d 28 5f sta $5f28 STA CLUSTER_PTR + 1 +.386142 80 17 bra $38615b BRA SD_CONTINUE_DATA_DONE +.386144 SD_CONTINUE_DATA +.386144 c2 20 rep #$20 REP #$20 ; set A long +.386146 a5 80 lda $80 LDA SD_DATA +.386148 18 clc CLC +.386149 69 00 02 adc #$0200 ADC #$200 +.38614c 85 80 sta $80 STA SD_DATA +.38614e 90 02 bcc $386152 BCC SD_CONT_NO_CARRY +.386150 e6 82 inc $82 INC SD_DATA + 2 +.386152 SD_CONT_NO_CARRY +.386152 68 pla PLA +.386153 1a inc a INC A +.386154 48 pha PHA +.386155 e8 inx INX +.386156 ec 24 5f cpx $5f24 CPX SD_SECTORS_PER_CLUSTER +.386159 d0 a5 bne $386100 BNE SDR_NEXT_SECTOR +.38615b SD_CONTINUE_DATA_DONE +.38615b c2 20 rep #$20 REP #$20 ; set A long +.38615d 68 pla PLA +.38615e 6b rtl RTL +.38615f ISDOS_READ_FILE +.38615f 48 pha PHA +.386160 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.386162 29 ff 00 and #$00ff AND #$FF +.386165 d0 02 bne $386169 BNE SD_CARD_PRESENT +.386167 68 pla PLA +.386168 6b rtl RTL +.386169 SD_CARD_PRESENT +.386169 68 pla PLA +.38616a 8d 27 5f sta $5f27 STA CLUSTER_PTR +.38616d SD_CLUSTER_LOOP +.38616d 22 cf 60 38 jsl $3860cf JSL ISDOS_READ_DATA_CLUSTER +.386171 ad 26 5f lda $5f26 LDA SD_FAT16_32 +.386174 29 03 00 and #$0003 AND #$3 +.386177 0a asl a ASL +.386178 aa tax TAX +.386179 fc 7f 61 jsr ($38617f,x) JSR (READ_FAT_TABLE,X) +.38617c d0 ef bne $38616d BNE SD_CLUSTER_LOOP +.38617e 6b rtl RTL +>38617f 85 61 READ_FAT_TABLE .word <>FAT12_GET_NEXT_CLUSTER +>386181 aa 61 .word <>FAT16_GET_NEXT_CLUSTER +>386183 e9 61 .word <>FAT32_GET_NEXT_CLUSTER +.386185 FAT12_GET_NEXT_CLUSTER +.386185 ad 27 5f lda $5f27 LDA CLUSTER_PTR ; a FAT12 page contains about 340 entries +.386188 4a lsr a LSR A ; this may result in a carry, if the cluster to read is odd +.386189 90 0e bcc $386199 BCC F12_NC_NO_CARRY +.38618b 18 clc CLC +.38618c 6d 27 5f adc $5f27 ADC CLUSTER_PTR +.38618f a8 tay TAY +.386190 b9 00 66 lda $6600,y LDA FAT_DATA,Y +.386193 4a lsr a LSR A +.386194 4a lsr a LSR A +.386195 4a lsr a LSR A +.386196 4a lsr a LSR A ; divide by 16 +.386197 80 0a bra $3861a3 BRA F12_NC_CONTINUE +.386199 F12_NC_NO_CARRY +.386199 6d 27 5f adc $5f27 ADC CLUSTER_PTR +.38619c a8 tay TAY +.38619d b9 00 66 lda $6600,y LDA FAT_DATA,Y +.3861a0 29 ff 0f and #$0fff AND #$FFF +.3861a3 F12_NC_CONTINUE +.3861a3 8d 27 5f sta $5f27 STA CLUSTER_PTR +.3861a6 c9 ff 0f cmp #$0fff CMP #$FFF +.3861a9 60 rts RTS +.3861aa FAT16_GET_NEXT_CLUSTER +.3861aa ad 27 5f lda $5f27 LDA CLUSTER_PTR +.3861ad eb xba XBA +.3861ae 29 ff 00 and #$00ff AND #$FF +.3861b1 c5 86 cmp $86 CMP SD_DATA_FAT_PAGE +.3861b3 f0 22 beq $3861d7 BEQ SKIP_FAT16_LOADING +.3861b5 48 pha PHA +.3861b6 a5 80 lda $80 LDA SD_DATA +.3861b8 85 83 sta $83 STA SD_TMP_DATA +.3861ba a5 82 lda $82 LDA SD_DATA + 2 +.3861bc 85 85 sta $85 STA SD_TMP_DATA + 2 +.3861be a9 00 66 lda #$6600 LDA #FAT_DATA +.3861c1 85 80 sta $80 STA SD_DATA +.3861c3 a9 00 00 lda #$0000 LDA #0 +.3861c6 85 82 sta $82 STA SD_DATA + 2 +.3861c8 68 pla PLA +.3861c9 85 86 sta $86 STA SD_DATA_FAT_PAGE +.3861cb 22 7f 60 38 jsl $38607f JSL ISDOS_READ_FAT_SECTOR +.3861cf a5 83 lda $83 LDA SD_TMP_DATA +.3861d1 85 80 sta $80 STA SD_DATA +.3861d3 a5 85 lda $85 LDA SD_TMP_DATA + 2 +.3861d5 85 82 sta $82 STA SD_DATA + 2 +.3861d7 SKIP_FAT16_LOADING +.3861d7 ad 27 5f lda $5f27 LDA CLUSTER_PTR +.3861da 29 ff 00 and #$00ff AND #$FF +.3861dd 0a asl a ASL A ; multiply by 2 +.3861de a8 tay TAY +.3861df b9 00 66 lda $6600,y LDA FAT_DATA,Y +.3861e2 8d 27 5f sta $5f27 STA CLUSTER_PTR +.3861e5 c9 ff ff cmp #$ffff CMP #$FFFF ; the branch instruction occurs upon return +.3861e8 60 rts RTS +.3861e9 FAT32_GET_NEXT_CLUSTER +.3861e9 ad 27 5f lda $5f27 LDA CLUSTER_PTR +.3861ec eb xba XBA +.3861ed 29 ff 00 and #$00ff AND #$FF +.3861f0 c5 86 cmp $86 CMP SD_DATA_FAT_PAGE +.3861f2 f0 22 beq $386216 BEQ SKIP_FAT32_LOADING +.3861f4 48 pha PHA +.3861f5 a5 80 lda $80 LDA SD_DATA +.3861f7 85 83 sta $83 STA SD_TMP_DATA +.3861f9 a5 82 lda $82 LDA SD_DATA + 2 +.3861fb 85 85 sta $85 STA SD_TMP_DATA + 2 +.3861fd a9 00 66 lda #$6600 LDA #FAT_DATA +.386200 85 80 sta $80 STA SD_DATA +.386202 a9 00 00 lda #$0000 LDA #0 +.386205 85 82 sta $82 STA SD_DATA + 2 +.386207 68 pla PLA +.386208 85 86 sta $86 STA SD_DATA_FAT_PAGE +.38620a 22 7f 60 38 jsl $38607f JSL ISDOS_READ_FAT_SECTOR +.38620e a5 83 lda $83 LDA SD_TMP_DATA +.386210 85 80 sta $80 STA SD_DATA +.386212 a5 85 lda $85 LDA SD_TMP_DATA + 2 +.386214 85 82 sta $82 STA SD_DATA + 2 +.386216 SKIP_FAT32_LOADING +.386216 ad 27 5f lda $5f27 LDA CLUSTER_PTR +.386219 29 ff 00 and #$00ff AND #$FF +.38621c 0a asl a ASL A ; multiply by 4 +.38621d 0a asl a ASL A +.38621e a8 tay TAY +.38621f b9 00 66 lda $6600,y LDA FAT_DATA,Y ; check for end of file +.386222 8d 27 5f sta $5f27 STA CLUSTER_PTR +.386225 c9 ff ff cmp #$ffff CMP #$FFFF ; the branch instruction occurs upon return +.386228 60 rts RTS +.386229 COMPUTE_FAT_ROOT_DATA_OFFSETS +.386229 ad 10 5f lda $5f10 LDA SD_RESERVED_SECTORS ; 16 bit value +.38622c 85 88 sta $88 STA SD_MULT_AREA +.38622e a9 00 00 lda #$0000 LDA #0 +.386231 85 8a sta $8a STA SD_MULT_AREA + 2 +.386233 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES ; compute the byte offset +.386236 a5 88 lda $88 LDA SD_MULT_AREA +.386238 8d 20 01 sta $0120 STA ADDER_A +.38623b a5 8a lda $8a LDA SD_MULT_AREA + 2 +.38623d 8d 22 01 sta $0122 STA ADDER_A+2 +.386240 ad 00 5f lda $5f00 LDA SD_FIRST_SECTOR ; 32 bit value +.386243 8d 24 01 sta $0124 STA ADDER_B +.386246 ad 02 5f lda $5f02 LDA SD_FIRST_SECTOR + 2 +.386249 8d 26 01 sta $0126 STA ADDER_B + 2 +.38624c ad 28 01 lda $0128 LDA ADDER_R +.38624f 8d 04 5f sta $5f04 STA SD_FAT_OFFSET +.386252 ad 2a 01 lda $012a LDA ADDER_R + 2 +.386255 8d 06 5f sta $5f06 STA SD_FAT_OFFSET + 2 +.386258 ad 18 5f lda $5f18 LDA SD_FAT_COUNT +.38625b 8d 00 01 sta $0100 STA UNSIGNED_MULT_A +.38625e ad 12 5f lda $5f12 LDA SD_SECTORS_PER_FAT +.386261 8d 02 01 sta $0102 STA UNSIGNED_MULT_B +.386264 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT +.386267 85 88 sta $88 STA SD_MULT_AREA +.386269 ad 06 01 lda $0106 LDA UNSIGNED_MULT_RESULT + 2 +.38626c 85 8a sta $8a STA SD_MULT_AREA + 2 +.38626e 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES ; compute the byte offset +.386271 a5 88 lda $88 LDA SD_MULT_AREA +.386273 8d 20 01 sta $0120 STA ADDER_A +.386276 a5 8a lda $8a LDA SD_MULT_AREA + 2 +.386278 8d 22 01 sta $0122 STA ADDER_A + 2 +.38627b ad 04 5f lda $5f04 LDA SD_FAT_OFFSET +.38627e 8d 24 01 sta $0124 STA ADDER_B +.386281 ad 06 5f lda $5f06 LDA SD_FAT_OFFSET + 2 +.386284 8d 26 01 sta $0126 STA ADDER_B +2 +.386287 ad 28 01 lda $0128 LDA ADDER_R +.38628a 8d 08 5f sta $5f08 STA SD_ROOT_OFFSET +.38628d ad 2a 01 lda $012a LDA ADDER_R +2 +.386290 8d 0a 5f sta $5f0a STA SD_ROOT_OFFSET + 2 +.386293 ad 08 5f lda $5f08 LDA SD_ROOT_OFFSET +.386296 8d 20 01 sta $0120 STA ADDER_A +.386299 ad 0a 5f lda $5f0a LDA SD_ROOT_OFFSET + 2 +.38629c 8d 22 01 sta $0122 STA ADDER_A + 2 +.38629f a9 20 00 lda #$0020 LDA #32 ; the root contains 512 entries at 32 bytes each +.3862a2 85 88 sta $88 STA SD_MULT_AREA +.3862a4 a9 00 00 lda #$0000 LDA #0 +.3862a7 85 8a sta $8a STA SD_MULT_AREA + 2 +.3862a9 20 c1 5c jsr $385cc1 JSR CALC_OFFSET_BYTES +.3862ac a5 88 lda $88 LDA SD_MULT_AREA +.3862ae 8d 24 01 sta $0124 STA ADDER_B +.3862b1 a5 8a lda $8a LDA SD_MULT_AREA + 2 +.3862b3 8d 26 01 sta $0126 STA ADDER_B + 2 +.3862b6 ad 28 01 lda $0128 LDA ADDER_R +.3862b9 8d 0c 5f sta $5f0c STA SD_DATA_OFFSET +.3862bc ad 2a 01 lda $012a LDA ADDER_R + 2 +.3862bf 8d 0e 5f sta $5f0e STA SD_DATA_OFFSET + 2 +.3862c2 60 rts RTS +>3862c3 30 30 20 2d 20 57 65 6c sd_card_tester .text "00 - Welcome to the SDCard Tester", $d, 0 +>3862cb 63 6f 6d 65 20 74 6f 20 74 68 65 20 53 44 43 61 +>3862db 72 64 20 54 65 73 74 65 72 0d 00 +>3862e6 30 31 20 2d 20 43 61 72 sd_card_present_msg .text "01 - Card Present", $d, 0 +>3862ee 64 20 50 72 65 73 65 6e 74 0d 00 +>3862f9 30 31 20 2d 20 4e 4f 20 sd_no_card_msg .text "01 - NO SDCARD PRESENT", $0D, $00 +>386301 53 44 43 41 52 44 20 50 52 45 53 45 4e 54 0d 00 +>386311 30 32 20 2d 20 43 61 6e sd_cant_read_mbr_msg .text "02 - Can't read MBR - No Card present", $D, $0 +>386319 27 74 20 72 65 61 64 20 4d 42 52 20 2d 20 4e 6f +>386329 20 43 61 72 64 20 70 72 65 73 65 6e 74 0d 00 +>386338 30 33 20 2d 20 45 72 72 sd_read_failure .text "03 - Error during read operation", $d, $0 +>386340 6f 72 20 64 75 72 69 6e 67 20 72 65 61 64 20 6f +>386350 70 65 72 61 74 69 6f 6e 0d 00 +>38635a 30 34 20 2d 20 45 72 72 SD_BOOT_SECTOR_MSG .text "04 - Error reading Boot sector", $d, $0 +>386362 6f 72 20 72 65 61 64 69 6e 67 20 42 6f 6f 74 20 +>386372 73 65 63 74 6f 72 0d 00 +>38637a 30 35 20 2d 20 45 72 72 SD_FAT_ERROR_MSG .text "05 - Error reading FAT sector", $d, $0 +>386382 6f 72 20 72 65 61 64 69 6e 67 20 46 41 54 20 73 +>386392 65 63 74 6f 72 0d 00 +>386399 30 35 20 2d 20 45 72 72 SD_ROOT_ERROR_MSG .text "05 - Error reading Root sector", $d, $0 +>3863a1 6f 72 20 72 65 61 64 69 6e 67 20 52 6f 6f 74 20 +>3863b1 73 65 63 74 6f 72 0d 00 +>3863b9 30 35 20 2d 20 45 72 72 SD_DATA_ERROR_MSG .text "05 - Error reading Data sector", $d, $0 +>3863c1 6f 72 20 72 65 61 64 69 6e 67 20 44 61 74 61 20 +>3863d1 73 65 63 74 6f 72 0d 00 +>3863d9 49 6e 76 61 6c 69 64 20 INVALID_SIG_MSG .text 'Invalid MBR Signature',$D,0 +>3863e1 4d 42 52 20 53 69 67 6e 61 74 75 72 65 0d 00 +>3863f0 56 6f 6c 75 6d 65 20 4e sd_volume_name .text "Volume Name: ", $0 +>3863f8 61 6d 65 3a 20 00 +>3863fe 56 46 41 54 20 4e 61 6d sd_vfat_name .text "VFAT Name : ", $0 +>386406 65 20 20 3a 20 00 +>38640c 44 69 72 65 63 74 6f 72 sd_dir_name .text "Directory : ", $0 +>386414 79 20 20 3a 20 00 +>38641a 46 69 6c 65 6e 61 6d 65 sd_filename .text "Filename : ", $0 +>386422 20 20 20 3a 20 00 +>386428 2c 20 43 6c 75 73 74 65 sd_cluster_str .text ", Cluster:", $0 +>386430 72 3a 00 +>386433 2c 20 53 69 7a 65 3a 00 sd_filesize_str .text ", Size:", $0 ;****** Return to file: tracker.asm -.3863d3 TRACKER -.3863d3 a9 ff lda #$ff LDA #$FF -.3863d5 8f 48 01 00 sta $000148 STA @lINT_EDGE_REG0 -.3863d9 8f 49 01 00 sta $000149 STA @lINT_EDGE_REG1 -.3863dd 8f 4a 01 00 sta $00014a STA @lINT_EDGE_REG2 -.3863e1 a9 ff lda #$ff LDA #$FF -.3863e3 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 -.3863e7 8f 4d 01 00 sta $00014d STA @lINT_MASK_REG1 -.3863eb 8f 4e 01 00 sta $00014e STA @lINT_MASK_REG2 -.3863ef 20 db 56 jsr $3856db JSR DRAW_DISPLAY -.3863f2 20 2c 67 jsr $38672c JSR INIT_KEYBOARD -.3863f5 20 c3 67 jsr $3867c3 JSR INIT_MOUSEPOINTER -.3863f8 20 37 64 jsr $386437 JSR INIT_CURSOR -.3863fb 20 79 64 jsr $386479 JSR RESET_STATE_MACHINE -.3863fe a9 38 lda #$38 LDA #`INSTRUMENT_ACCORDN -.386400 85 69 sta $69 STA INSTR_ADDR+2 -.386402 a9 42 lda #$42 LDA #$42 -.386404 8f 6a 00 00 sta $00006a STA @lINSTR_NUMBER -.386408 a2 00 00 ldx #$0000 LDX #0 ; setup channels -.38640b NEXT_INSTR -.38640b a9 00 lda #$00 LDA #0 -.38640d eb xba XBA -.38640e da phx PHX -.38640f bf 18 10 38 lda $381018,x LDA registerOffsets_operator0,X -.386413 aa tax TAX -.386414 20 4e 65 jsr $38654e JSR LOAD_INSTRUMENT -.386417 fa plx PLX -.386418 e8 inx INX -.386419 e0 09 00 cpx #$0009 CPX #9 -.38641c d0 ed bne $38640b BNE NEXT_INSTR -.38641e 22 79 30 38 jsl $383079 JSL IOPL2_TONE_TEST -.386422 20 58 64 jsr $386458 JSR ENABLE_IRQS -.386425 22 b1 30 38 jsl $3830b1 JSL OPL2_INIT -.386429 58 cli CLI -.38642a 20 ae 55 jsr $3855ae JSR INIT_MIDI -.38642d 20 2b 5b jsr $385b2b JSR DISPLAY_ORDERS -.386430 20 61 58 jsr $385861 JSR DISPLAY_PATTERN -.386433 ea nop ALWAYS NOP -.386434 ea nop NOP -.386435 80 fc bra $386433 BRA ALWAYS -.386437 48 pha INIT_CURSOR PHA -.386438 a9 e9 lda #$e9 LDA #$E9 ;The Cursor Character will be a Fully Filled Block -.38643a 8f 12 00 af sta $af0012 STA VKY_TXT_CURSOR_CHAR_REG -.38643e a9 00 lda #$00 LDA #$0 ;Set Cursor Disabled -.386440 8f 10 00 af sta $af0010 STA VKY_TXT_CURSOR_CTRL_REG ; -.386444 c2 30 rep #$30 REP #$30 ; set A&X long -.386446 a9 00 00 lda #$0000 LDA #$0000; -.386449 8f 14 00 af sta $af0014 STA VKY_TXT_CURSOR_X_REG_L; // Set the X to Position 1 -.38644d a9 00 00 lda #$0000 LDA #$0000; -.386450 8f 16 00 af sta $af0016 STA VKY_TXT_CURSOR_Y_REG_L; // Set the Y to Position 1 (Below) -.386454 e2 20 sep #$20 SEP #$20 ; set A short -.386456 68 pla PLA -.386457 60 rts RTS -.386458 ENABLE_IRQS -.386458 af 40 01 00 lda $000140 LDA @lINT_PENDING_REG0 -.38645c 29 84 and #$84 AND #FNX0_INT07_MOUSE | FNX0_INT02_TMR0 ;AND #FNX0_INT00_SOF -.38645e 8f 40 01 00 sta $000140 STA @lINT_PENDING_REG0 ; Writing it back will clear the Active Bit -.386462 af 41 01 00 lda $000141 LDA @lINT_PENDING_REG1 -.386466 29 a1 and #$a1 AND #FNX1_INT00_KBD | FNX1_INT05_MPU401 | FNX1_INT07_SDCARD -.386468 8f 41 01 00 sta $000141 STA @lINT_PENDING_REG1 ; Writing it back will clear the Active Bit -.38646c a9 7b lda #$7b LDA #~(FNX0_INT07_MOUSE | FNX0_INT02_TMR0) ;LDA #~(FNX0_INT00_SOF | FNX0_INT00_SOF ) -.38646e 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 -.386472 a9 5e lda #$5e LDA #~(FNX1_INT00_KBD | FNX1_INT05_MPU401 | FNX1_INT07_SDCARD) -.386474 8f 4d 01 00 sta $00014d STA @lINT_MASK_REG1 -.386478 60 rts RTS -.386479 RESET_STATE_MACHINE -.386479 a9 00 lda #$00 LDA #0 -.38647b 8f 15 0f 38 sta $380f15 STA STATE_MACHINE -.38647f 85 48 sta $48 STA RAD_ORDER_NUM -.386481 64 6c stz $6c STZ LINE_NUM_HEX -.386483 64 49 stz $49 STZ RAD_ORDER_NUM + 1 -.386485 a9 01 lda #$01 LDA #1 -.386487 8f 19 0f 38 sta $380f19 STA LINE_NUM_DEC -.38648b a6 48 ldx $48 LDX RAD_ORDER_NUM -.38648d bf 24 fc 39 lda $39fc24,x LDA @lORDERS,X ; load the first pattern in the order list -.386491 1a inc a INC A -.386492 PATTN_OK -.386492 8f 18 0f 38 sta $380f18 STA PATTERN_NUM -.386496 20 af 5a jsr $385aaf JSR DISPLAY_SPEED -.386499 60 rts RTS -.38649a INCREMENT_ORDER -.38649a 48 pha PHA -.38649b a9 00 lda #$00 LDA #0 -.38649d eb xba XBA -.38649e af 48 00 00 lda $000048 LDA @lRAD_ORDER_NUM -.3864a2 1a inc a INC A -.3864a3 cf 68 6a 38 cmp $386a68 CMP @lTuneInfo.songLength -.3864a7 d0 02 bne $3864ab BNE LOAD_ORDER -.3864a9 a9 00 lda #$00 LDA #0 -.3864ab LOAD_ORDER -.3864ab 8f 48 00 00 sta $000048 STA @lRAD_ORDER_NUM -.3864af aa tax TAX -.3864b0 a0 90 01 ldy #$0190 LDY #SCREEN_WIDTH * 5 -.3864b3 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3864b6 bf 24 fc 39 lda $39fc24,x LDA @lORDERS,X ; load the pattern from the order list -.3864ba 1a inc a INC A -.3864bb 8f 18 0f 38 sta $380f18 STA PATTERN_NUM -.3864bf 68 pla PLA -.3864c0 60 rts RTS -.3864c1 INIT_TIMER0_BPM -.3864c1 8b phb PHB -.3864c2 a9 00 lda #$00 LDA #0 -.3864c4 48 pha PHA -.3864c5 ab plb PLB ; set databank to 0 -.3864c6 a9 03 lda #$03 LDA #3 ; each timer counter is 24 bits - 3 bytes -.3864c8 8d 00 01 sta $0100 STA UNSIGNED_MULT_A -.3864cb 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 -.3864ce 9c 03 01 stz $0103 STZ UNSIGNED_MULT_B + 1 -.3864d1 38 sec SEC -.3864d2 af 17 0f 38 lda $380f17 LDA BPM ; multiply by the BPM, the 4 offset is the lowest BPM -.3864d6 e9 04 sbc #$04 SBC #4 -.3864d8 8d 02 01 sta $0102 STA UNSIGNED_MULT_B -.3864db c2 20 rep #$20 REP #$20 ; set A long -.3864dd ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT -.3864e0 aa tax TAX -.3864e1 e2 20 sep #$20 SEP #$20 ; set A short -.3864e3 a9 00 lda #$00 LDA #0 ; set timer0 charge to 0 -.3864e5 8d 61 01 sta $0161 STA TIMER0_CHARGE_L -.3864e8 8d 62 01 sta $0162 STA TIMER0_CHARGE_M -.3864eb 8d 63 01 sta $0163 STA TIMER0_CHARGE_H -.3864ee bf 00 00 3a lda $3a0000,x LDA @lSPM_004,X -.3864f2 8d 65 01 sta $0165 STA TIMER0_CMP_L -.3864f5 bf 01 00 3a lda $3a0001,x LDA @lSPM_004+1,X -.3864f9 8d 66 01 sta $0166 STA TIMER0_CMP_M -.3864fc bf 02 00 3a lda $3a0002,x LDA @lSPM_004+2,X -.386500 8d 67 01 sta $0167 STA TIMER0_CMP_H -.386503 a9 01 lda #$01 LDA #TMR0_CMP_RECLR ; count up from "CHARGE" value to TIMER_CMP -.386505 8d 64 01 sta $0164 STA TIMER0_CMP_REG -.386508 a9 0b lda #$0b LDA #(TMR0_EN | TMR0_UPDWN | TMR0_SCLR) -.38650a 8d 60 01 sta $0160 STA TIMER0_CTRL_REG -.38650d ab plb PLB -.38650e 60 rts RTS -.38650f INIT_TIMER0 -.38650f 8b phb PHB -.386510 a9 00 lda #$00 LDA #0 -.386512 48 pha PHA -.386513 ab plb PLB ; set databank to 0 -.386514 e2 20 sep #$20 SEP #$20 ; set A short -.386516 a9 00 lda #$00 LDA #0 ; set timer0 charge to 0 -.386518 8d 61 01 sta $0161 STA TIMER0_CHARGE_L -.38651b 8d 62 01 sta $0162 STA TIMER0_CHARGE_M -.38651e 8d 63 01 sta $0163 STA TIMER0_CHARGE_H -.386521 a9 01 lda #$01 LDA #TMR0_CMP_RECLR ; count up from "CHARGE" value to TIMER_CMP -.386523 8d 64 01 sta $0164 STA TIMER0_CMP_REG -.386526 a9 0b lda #$0b LDA #(TMR0_EN | TMR0_UPDWN | TMR0_SCLR) -.386528 8d 60 01 sta $0160 STA TIMER0_CTRL_REG -.38652b ab plb PLB -.38652c 60 rts RTS -.38652d INIT_OPL2_TMRS -.38652d a9 80 lda #$80 LDA #$80 ; Reset OPL2 Interrupts -.38652f 8f 04 e6 af sta $afe604 STA OPL3_L_IRQ ; byte 4 of OPL2 -.386533 20 47 65 jsr $386547 JSR WAIT_80 -.386536 a9 10 lda #$10 LDA #$10 -.386538 8f 02 e6 af sta $afe602 STA OPL3_L_TIMER1 ; byte 2 of OPL2 -.38653c 8f 03 e6 af sta $afe603 STA OPL3_L_TIMER2 ; byte 2 of OPL2 -.386540 a9 03 lda #$03 LDA #$3 ; enable timers 1 and 2 -.386542 8f 04 e6 af sta $afe604 STA OPL3_L_IRQ ; byte 4 of OPL2 -.386546 60 rts RTS -.386547 WAIT_80 -.386547 a2 30 02 ldx #$0230 LDX #560 -.38654a WAIT_LP -.38654a ca dex DEX -.38654b d0 fd bne $38654a BNE WAIT_LP -.38654d 60 rts RTS -.38654e LOAD_INSTRUMENT -.38654e af 6a 00 00 lda $00006a LDA @lINSTR_NUMBER -.386552 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386556 a9 00 lda #$00 LDA #0 -.386558 8f 01 01 00 sta $000101 STA @lUNSIGNED_MULT_A + 1 -.38655c 8f 03 01 00 sta $000103 STA @lUNSIGNED_MULT_B + 1 -.386560 a9 16 lda #$16 LDA #INSTR_REC_LEN -.386562 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386566 c2 20 rep #$20 REP #$20 ; set A long -.386568 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.38656c 18 clc CLC -.38656d 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN -.386570 85 67 sta $67 STA INSTR_ADDR -.386572 e2 20 sep #$20 SEP #$20 ; set A short -.386574 af 6a 00 00 lda $00006a LDA @lINSTR_NUMBER -.386578 a0 a3 01 ldy #$01a3 LDY #5 * SCREEN_WIDTH + 19 -.38657b 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38657e a7 67 lda [$67] LDA [INSTR_ADDR] -.386580 d0 4b bne $3865cd BNE DRUM_SET -.386582 e6 67 inc $67 INC INSTR_ADDR -.386584 d0 02 bne $386588 BNE LD_INST_1 -.386586 e6 68 inc $68 INC INSTR_ADDR+1 -.386588 LD_INST_1 -.386588 20 ce 65 jsr $3865ce JSR LOAD_AM_VIB_MULT -.38658b e6 67 inc $67 INC INSTR_ADDR -.38658d d0 02 bne $386591 BNE LD_INST_2 -.38658f e6 68 inc $68 INC INSTR_ADDR+1 -.386591 LD_INST_2 -.386591 20 3e 66 jsr $38663e JSR LOAD_KEY_OP_LVL -.386594 e6 67 inc $67 INC INSTR_ADDR -.386596 d0 02 bne $38659a BNE LD_INST_3 -.386598 e6 68 inc $68 INC INSTR_ADDR+1 -.38659a LD_INST_3 -.38659a 20 78 66 jsr $386678 JSR LOAD_ATT_DEC_RATE -.38659d e6 67 inc $67 INC INSTR_ADDR -.38659f d0 02 bne $3865a3 BNE LD_INST_4 -.3865a1 e6 68 inc $68 INC INSTR_ADDR+1 -.3865a3 LD_INST_4 -.3865a3 20 b4 66 jsr $3866b4 JSR LOAD_SUSTAIN_RELEASE_RATE -.3865a6 e6 67 inc $67 INC INSTR_ADDR -.3865a8 d0 02 bne $3865ac BNE LD_INST_5 -.3865aa e6 68 inc $68 INC INSTR_ADDR+1 -.3865ac LD_INST_5 -.3865ac da phx PHX -.3865ad a6 27 ldx $27 LDX OPL2_CHANNEL -.3865af 20 f0 66 jsr $3866f0 JSR LOAD_FEEDBACK_ALGO -.3865b2 fa plx PLX -.3865b3 e6 67 inc $67 INC INSTR_ADDR -.3865b5 d0 02 bne $3865b9 BNE LD_INST_6 -.3865b7 e6 68 inc $68 INC INSTR_ADDR+1 -.3865b9 LD_INST_6 -.3865b9 20 0c 67 jsr $38670c JSR LOAD_WAVE -.3865bc c2 20 rep #$20 REP #$20 ; set A long -.3865be a5 67 lda $67 LDA INSTR_ADDR -.3865c0 69 06 00 adc #$0006 ADC #6 -.3865c3 85 67 sta $67 STA INSTR_ADDR -.3865c5 e2 20 sep #$20 SEP #$20 ; set A short -.3865c7 a0 a8 01 ldy #$01a8 LDY #5 * SCREEN_WIDTH + 24 -.3865ca 20 3d 58 jsr $38583d JSR WRITE_INSTRUMENT_NAME -.3865cd DRUM_SET -.3865cd 60 rts RTS -.3865ce LOAD_AM_VIB_MULT -.3865ce a7 67 lda [$67] LDA [INSTR_ADDR] -.3865d0 48 pha PHA -.3865d1 48 pha PHA -.3865d2 48 pha PHA -.3865d3 48 pha PHA -.3865d4 9f 20 e7 af sta $afe720,x STA @lOPL3_R_AM_VID_EG_KSR_MULT,X -.3865d8 29 80 and #$80 AND #TREMOLO -.3865da a0 3d 02 ldy #$023d LDY #7 * SCREEN_WIDTH + 13 -.3865dd 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.3865e0 68 pla PLA -.3865e1 29 40 and #$40 AND #VIBRATO -.3865e3 a0 8d 02 ldy #$028d LDY #8 * SCREEN_WIDTH + 13 -.3865e6 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.3865e9 68 pla PLA -.3865ea 29 20 and #$20 AND #SUSTAINING -.3865ec a0 dd 02 ldy #$02dd LDY #9 * SCREEN_WIDTH + 13 -.3865ef 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.3865f2 68 pla PLA -.3865f3 29 10 and #$10 AND #KSR -.3865f5 a0 2d 03 ldy #$032d LDY #10 * SCREEN_WIDTH + 13 -.3865f8 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.3865fb 68 pla PLA -.3865fc 29 0f and #$0f AND #MULTIPLIER -.3865fe a0 7e 03 ldy #$037e LDY #11 * SCREEN_WIDTH + 14 -.386601 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386604 a0 06 00 ldy #$0006 LDY #6 -.386607 b7 67 lda [$67],y LDA [INSTR_ADDR], Y -.386609 48 pha PHA -.38660a 48 pha PHA -.38660b 48 pha PHA -.38660c 48 pha PHA -.38660d 9f 23 e7 af sta $afe723,x STA @lOPL3_R_AM_VID_EG_KSR_MULT + 3,X -.386611 29 80 and #$80 AND #TREMOLO -.386613 a0 57 02 ldy #$0257 LDY #7 * SCREEN_WIDTH + 39 -.386616 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.386619 68 pla PLA -.38661a 29 40 and #$40 AND #VIBRATO -.38661c a0 a7 02 ldy #$02a7 LDY #8 * SCREEN_WIDTH + 39 -.38661f 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.386622 68 pla PLA -.386623 29 20 and #$20 AND #SUSTAINING -.386625 a0 f7 02 ldy #$02f7 LDY #9 * SCREEN_WIDTH + 39 -.386628 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.38662b 68 pla PLA -.38662c 29 10 and #$10 AND #KSR -.38662e a0 47 03 ldy #$0347 LDY #10 * SCREEN_WIDTH + 39 -.386631 20 ee 57 jsr $3857ee JSR WRITE_OFF_ON -.386634 68 pla PLA -.386635 29 0f and #$0f AND #MULTIPLIER -.386637 a0 98 03 ldy #$0398 LDY #11 * SCREEN_WIDTH + 40 -.38663a 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38663d 60 rts RTS -.38663e LOAD_KEY_OP_LVL -.38663e a7 67 lda [$67] LDA [INSTR_ADDR] -.386640 48 pha PHA -.386641 9f 40 e7 af sta $afe740,x STA @lOPL3_R_KSL_TL,X -.386645 29 c0 and #$c0 AND #KEY_SCALE -.386647 2a rol a ROL A -.386648 2a rol a ROL A -.386649 2a rol a ROL A -.38664a a0 ce 03 ldy #$03ce LDY #12 * SCREEN_WIDTH + 14 -.38664d 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386650 68 pla PLA -.386651 29 3f and #$3f AND #OP_LEVEL -.386653 a0 1e 04 ldy #$041e LDY #13 * SCREEN_WIDTH + 14 -.386656 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386659 a0 06 00 ldy #$0006 LDY #6 -.38665c b7 67 lda [$67],y LDA [INSTR_ADDR],Y -.38665e 48 pha PHA -.38665f 9f 43 e7 af sta $afe743,x STA @lOPL3_R_KSL_TL + 3,X -.386663 29 c0 and #$c0 AND #KEY_SCALE -.386665 2a rol a ROL A -.386666 2a rol a ROL A -.386667 2a rol a ROL A -.386668 a0 e8 03 ldy #$03e8 LDY #12 * SCREEN_WIDTH + 40 -.38666b 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38666e 68 pla PLA -.38666f 29 3f and #$3f AND #OP_LEVEL -.386671 a0 38 04 ldy #$0438 LDY #13 * SCREEN_WIDTH + 40 -.386674 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386677 60 rts RTS -.386678 LOAD_ATT_DEC_RATE -.386678 a7 67 lda [$67] LDA [INSTR_ADDR] -.38667a 48 pha PHA -.38667b 9f 60 e7 af sta $afe760,x STA @lOPL3_R_AR_DR,X -.38667f 29 f0 and #$f0 AND #ATTACK_RT -.386681 4a lsr a LSR A -.386682 4a lsr a LSR A -.386683 4a lsr a LSR A -.386684 4a lsr a LSR A -.386685 a0 6e 04 ldy #$046e LDY #14 * SCREEN_WIDTH + 14 -.386688 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38668b 68 pla PLA -.38668c 29 0f and #$0f AND #DECAY_RT -.38668e a0 be 04 ldy #$04be LDY #15 * SCREEN_WIDTH + 14 -.386691 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386694 a0 06 00 ldy #$0006 LDY #6 -.386697 b7 67 lda [$67],y LDA [INSTR_ADDR],Y -.386699 48 pha PHA -.38669a 9f 63 e7 af sta $afe763,x STA @lOPL3_R_AR_DR + 3,X -.38669e 29 f0 and #$f0 AND #ATTACK_RT -.3866a0 4a lsr a LSR A -.3866a1 4a lsr a LSR A -.3866a2 4a lsr a LSR A -.3866a3 4a lsr a LSR A -.3866a4 a0 88 04 ldy #$0488 LDY #14 * SCREEN_WIDTH + 40 -.3866a7 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866aa 68 pla PLA -.3866ab 29 0f and #$0f AND #DECAY_RT -.3866ad a0 d8 04 ldy #$04d8 LDY #15 * SCREEN_WIDTH + 40 -.3866b0 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866b3 60 rts RTS -.3866b4 LOAD_SUSTAIN_RELEASE_RATE -.3866b4 a7 67 lda [$67] LDA [INSTR_ADDR] -.3866b6 48 pha PHA -.3866b7 9f 80 e7 af sta $afe780,x STA @lOPL3_R_SL_RR,X -.3866bb 29 f0 and #$f0 AND #ATTACK_RT -.3866bd 4a lsr a LSR A -.3866be 4a lsr a LSR A -.3866bf 4a lsr a LSR A -.3866c0 4a lsr a LSR A -.3866c1 a0 0e 05 ldy #$050e LDY #16 * SCREEN_WIDTH + 14 -.3866c4 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866c7 68 pla PLA -.3866c8 29 0f and #$0f AND #DECAY_RT -.3866ca a0 5e 05 ldy #$055e LDY #17 * SCREEN_WIDTH + 14 -.3866cd 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866d0 a0 06 00 ldy #$0006 LDY #6 -.3866d3 b7 67 lda [$67],y LDA [INSTR_ADDR],Y -.3866d5 48 pha PHA -.3866d6 9f 83 e7 af sta $afe783,x STA @lOPL3_R_SL_RR + 3,X -.3866da 29 f0 and #$f0 AND #ATTACK_RT -.3866dc 4a lsr a LSR A -.3866dd 4a lsr a LSR A -.3866de 4a lsr a LSR A -.3866df 4a lsr a LSR A -.3866e0 a0 28 05 ldy #$0528 LDY #16 * SCREEN_WIDTH + 40 -.3866e3 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866e6 68 pla PLA -.3866e7 29 0f and #$0f AND #DECAY_RT -.3866e9 a0 78 05 ldy #$0578 LDY #17 * SCREEN_WIDTH + 40 -.3866ec 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.3866ef 60 rts RTS -.3866f0 LOAD_FEEDBACK_ALGO -.3866f0 a7 67 lda [$67] LDA [INSTR_ADDR] -.3866f2 48 pha PHA -.3866f3 09 f0 ora #$f0 ORA #$F0 ; Channel B -.3866f5 9f c0 e7 af sta $afe7c0,x STA @lOPL3_R_FEEDBACK,X -.3866f9 29 0e and #$0e AND #FEEDBACK -.3866fb 4a lsr a LSR A -.3866fc a0 68 06 ldy #$0668 LDY #20 * SCREEN_WIDTH + 40 -.3866ff 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386702 68 pla PLA -.386703 29 01 and #$01 AND #ALGORITHM -.386705 a0 b8 06 ldy #$06b8 LDY #21 * SCREEN_WIDTH + 40 -.386708 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38670b 60 rts RTS -.38670c LOAD_WAVE -.38670c a7 67 lda [$67] LDA [INSTR_ADDR] -.38670e 9f e0 e7 af sta $afe7e0,x STA @lOPL3_R_WAVE_SELECT,X -.386712 29 07 and #$07 AND #$7 -.386714 a0 ae 05 ldy #$05ae LDY #18 * SCREEN_WIDTH + 14 -.386717 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38671a a0 05 00 ldy #$0005 LDY #5 -.38671d b7 67 lda [$67],y LDA [INSTR_ADDR],Y -.38671f 9f e3 e7 af sta $afe7e3,x STA @lOPL3_R_WAVE_SELECT+3,X -.386723 29 07 and #$07 AND #$7 -.386725 a0 c8 05 ldy #$05c8 LDY #18 * SCREEN_WIDTH + 40 -.386728 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.38672b 60 rts RTS -.38672c INIT_KEYBOARD -.38672c 0b phd PHD -.38672d 48 pha PHA -.38672e da phx PHX -.38672f 08 php PHP -.386730 18 clc CLC -.386731 e2 20 sep #$20 SEP #$20 ; set A short -.386733 a9 00 lda #$00 LDA #$00 -.386735 8d 87 0f sta $0f87 STA KEYBOARD_SC_FLG ; Clear the Keyboard Flag -.386738 20 da 67 jsr $3867da JSR Poll_Inbuf -.38673b a9 aa lda #$aa LDA #$AA ;Send self test command -.38673d 8f 64 10 af sta $af1064 STA KBD_CMD_BUF -.386741 20 e5 67 jsr $3867e5 JSR Poll_Outbuf ; -.386744 af 60 10 af lda $af1060 LDA KBD_OUT_BUF ;Check self test result -.386748 c9 55 cmp #$55 CMP #$55 -.38674a f0 03 beq $38674f BEQ passAAtest -.38674c 82 6f 00 brl $3867be BRL initkb_loop_out -.38674f passAAtest -.38674f a9 ab lda #$ab LDA #$AB ;Send test Interface command -.386751 8f 64 10 af sta $af1064 STA KBD_CMD_BUF -.386755 20 e5 67 jsr $3867e5 JSR Poll_Outbuf ; -.386758 af 60 10 af lda $af1060 LDA KBD_OUT_BUF ;Display Interface test results -.38675c c9 00 cmp #$00 CMP #$00 ;Should be 00 -.38675e f0 03 beq $386763 BEQ passABtest -.386760 82 5b 00 brl $3867be BRL initkb_loop_out -.386763 passABtest -.386763 a9 60 lda #$60 LDA #$60 ; Send Command 0x60 so to Enable Interrupt -.386765 8f 64 10 af sta $af1064 STA KBD_CMD_BUF -.386769 20 da 67 jsr $3867da JSR Poll_Inbuf ; -.38676c a9 69 lda #$69 LDA #%01101001 ; Enable Interrupt -.38676e 8f 60 10 af sta $af1060 STA KBD_DATA_BUF -.386772 20 da 67 jsr $3867da JSR Poll_Inbuf ; -.386775 a9 ff lda #$ff LDA #$FF ; Send Keyboard Reset command -.386777 8f 60 10 af sta $af1060 STA KBD_DATA_BUF -.38677b a2 ff ff ldx #$ffff LDX #$FFFF -.38677e ca dex DLY_LOOP1 DEX -.38677f ea nop NOP -.386780 ea nop NOP -.386781 ea nop NOP -.386782 ea nop NOP -.386783 ea nop NOP -.386784 ea nop NOP -.386785 ea nop NOP -.386786 ea nop NOP -.386787 e0 00 00 cpx #$0000 CPX #$0000 -.38678a d0 f2 bne $38677e BNE DLY_LOOP1 -.38678c 20 e5 67 jsr $3867e5 JSR Poll_Outbuf ; -.38678f af 60 10 af lda $af1060 LDA KBD_OUT_BUF ; Read Output Buffer -.386793 DO_CMD_F4_AGAIN -.386793 20 da 67 jsr $3867da JSR Poll_Inbuf ; -.386796 a9 f4 lda #$f4 LDA #$F4 ; Enable the Keyboard -.386798 8f 60 10 af sta $af1060 STA KBD_DATA_BUF -.38679c 20 e5 67 jsr $3867e5 JSR Poll_Outbuf ; -.38679f af 60 10 af lda $af1060 LDA KBD_OUT_BUF ; Clear the Output buffer -.3867a3 c9 fa cmp #$fa CMP #$FA -.3867a5 d0 ec bne $386793 BNE DO_CMD_F4_AGAIN -.3867a7 20 f0 67 jsr $3867f0 JSR INIT_MOUSE -.3867aa af 40 01 00 lda $000140 LDA @lINT_PENDING_REG0 ; Read the Pending Register & -.3867ae 29 80 and #$80 AND #FNX0_INT07_MOUSE -.3867b0 8f 40 01 00 sta $000140 STA @lINT_PENDING_REG0 ; Writing it back will clear the Active Bit -.3867b4 af 41 01 00 lda $000141 LDA @lINT_PENDING_REG1 ; Read the Pending Register & -.3867b8 29 01 and #$01 AND #FNX1_INT00_KBD -.3867ba 8f 41 01 00 sta $000141 STA @lINT_PENDING_REG1 ; Writing it back will clear the Active Bit -.3867be initkb_loop_out -.3867be InitSuccess -.3867be 28 plp PLP -.3867bf fa plx PLX -.3867c0 68 pla PLA -.3867c1 2b pld PLD -.3867c2 60 rts RTS -.3867c3 INIT_MOUSEPOINTER -.3867c3 c2 30 rep #$30 REP #$30 ; set A&X long -.3867c5 a2 80 4d ldx #$4d80 LDX #<>MOUSE_POINTER_PTR -.3867c8 a9 00 01 lda #$0100 LDA #$100 -.3867cb a0 00 05 ldy #$0500 LDY #$0500 -.3867ce 54 af 38 mvn $38,$af MVN #`MOUSE_POINTER_PTR,#$AF -.3867d1 e2 20 sep #$20 SEP #$20 ; set A short -.3867d3 a9 01 lda #$01 LDA #$01 -.3867d5 8f 00 07 af sta $af0700 STA @lMOUSE_PTR_CTRL_REG_L ; Enable Mouse, Mouse Pointer Graphic Bank 0 -.3867d9 60 rts RTS -.3867da Poll_Inbuf -.3867da af 64 10 af lda $af1064 LDA STATUS_PORT ; Load Status Byte -.3867de 29 02 and #$02 AND #3868b2 01 01 01 01 01 01 01 01 CHANNELS .byte 1,1,1,1,1,1,1,1,1 ->3868ba 01 -.3868bb TOGGLE_CHANNEL -.3868bb aa tax TAX -.3868bc ca dex DEX -.3868bd bf b2 68 38 lda $3868b2,x LDA CHANNELS,X -.3868c1 49 01 eor #$01 EOR #1 -.3868c3 9f b2 68 38 sta $3868b2,x STA CHANNELS,X -.3868c7 60 rts RTS ->3868c8 80 80 80 31 33 80 36 38 SCAN_TO_NOTE .text $80, $80, $80, $31, $33, $80, $36, $38, $3A, $80, $41, $80, $80, $80, $80, $80 ->3868d0 3a 80 41 80 80 80 80 80 ->3868d8 2c 32 34 35 37 39 3b 3c .text $2C, $32, $34, $35, $37, $39, $3B, $3C, $42, $80, $80, $80, $80, $80, $80, $21 ->3868e0 42 80 80 80 80 80 80 21 ->3868e8 23 80 26 28 2a 80 80 80 .text $23, $80, $26, $28, $2A, $80, $80, $80, $80, $80, $80, $80, $1C, $22, $24, $25 ->3868f0 80 80 80 80 1c 22 24 25 ->3868f8 27 29 2b 80 80 80 80 80 .text $27, $29, $2B, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 ->386900 80 80 80 80 80 80 80 80 ->386908 80 80 80 80 80 80 80 80 .text $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 ->386910 80 80 80 80 80 80 80 80 ->386918 80 80 80 80 80 80 80 80 .text $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 ->386920 80 80 80 80 80 80 80 80 -.386928 MIDI_COMMAND_TABLE ->386928 02 56 02 56 .word <>NOTE_OFF, <>NOTE_ON ->38692c 82 56 82 56 .word <>POLY_PRESSURE, <>CONTROL_CHANGE ->386930 ab 56 ab 56 .word <>PROGRAM_CHANGE, <>CHANNEL_PRESSURE ; these two command expect 1 datat byte only - no running status ->386934 82 56 c2 56 .word <>PITCH_BEND, <>SYSTEM_COMMAND ->386938 da 56 .word <>INVALID_COMMAND +.38643b TRACKER +.38643b a9 ff lda #$ff LDA #$FF +.38643d 8f 48 01 00 sta $000148 STA @lINT_EDGE_REG0 +.386441 8f 49 01 00 sta $000149 STA @lINT_EDGE_REG1 +.386445 8f 4a 01 00 sta $00014a STA @lINT_EDGE_REG2 +.386449 a9 ff lda #$ff LDA #$FF +.38644b 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 +.38644f 8f 4d 01 00 sta $00014d STA @lINT_MASK_REG1 +.386453 8f 4e 01 00 sta $00014e STA @lINT_MASK_REG2 +.386457 20 db 56 jsr $3856db JSR DRAW_DISPLAY +.38645a 20 97 67 jsr $386797 JSR INIT_KEYBOARD +.38645d 20 2e 68 jsr $38682e JSR INIT_MOUSEPOINTER +.386460 20 a2 64 jsr $3864a2 JSR INIT_CURSOR +.386463 20 e4 64 jsr $3864e4 JSR RESET_STATE_MACHINE +.386466 a9 38 lda #$38 LDA #`INSTRUMENT_ACCORDN +.386468 85 69 sta $69 STA INSTR_ADDR+2 +.38646a a9 42 lda #$42 LDA #$42 +.38646c 8f 6a 00 00 sta $00006a STA @lINSTR_NUMBER +.386470 a2 00 00 ldx #$0000 LDX #0 ; setup channels +.386473 NEXT_INSTR +.386473 a9 00 lda #$00 LDA #0 +.386475 eb xba XBA +.386476 da phx PHX +.386477 bf 18 10 38 lda $381018,x LDA registerOffsets_operator0,X +.38647b aa tax TAX +.38647c 20 b9 65 jsr $3865b9 JSR LOAD_INSTRUMENT +.38647f fa plx PLX +.386480 e8 inx INX +.386481 e0 09 00 cpx #$0009 CPX #9 +.386484 d0 ed bne $386473 BNE NEXT_INSTR +.386486 22 79 30 38 jsl $383079 JSL IOPL2_TONE_TEST +.38648a 20 c3 64 jsr $3864c3 JSR ENABLE_IRQS +.38648d 22 b1 30 38 jsl $3830b1 JSL OPL3_INIT +.386491 20 7a 65 jsr $38657a JSR INIT_TIMER0 ; TIMER0 is setup for 50hz +.386494 20 ae 55 jsr $3855ae JSR INIT_MIDI +.386497 20 1d 5b jsr $385b1d JSR DISPLAY_ORDERS +.38649a 20 53 58 jsr $385853 JSR DISPLAY_PATTERN +.38649d 58 cli CLI +.38649e ea nop ALWAYS NOP +.38649f ea nop NOP +.3864a0 80 fc bra $38649e BRA ALWAYS +.3864a2 48 pha INIT_CURSOR PHA +.3864a3 a9 e9 lda #$e9 LDA #$E9 ;The Cursor Character will be a Fully Filled Block +.3864a5 8f 12 00 af sta $af0012 STA VKY_TXT_CURSOR_CHAR_REG +.3864a9 a9 00 lda #$00 LDA #$0 ;Set Cursor Disabled +.3864ab 8f 10 00 af sta $af0010 STA VKY_TXT_CURSOR_CTRL_REG ; +.3864af c2 30 rep #$30 REP #$30 ; set A&X long +.3864b1 a9 00 00 lda #$0000 LDA #$0000; +.3864b4 8f 14 00 af sta $af0014 STA VKY_TXT_CURSOR_X_REG_L; // Set the X to Position 1 +.3864b8 a9 00 00 lda #$0000 LDA #$0000; +.3864bb 8f 16 00 af sta $af0016 STA VKY_TXT_CURSOR_Y_REG_L; // Set the Y to Position 1 (Below) +.3864bf e2 20 sep #$20 SEP #$20 ; set A short +.3864c1 68 pla PLA +.3864c2 60 rts RTS +.3864c3 ENABLE_IRQS +.3864c3 af 40 01 00 lda $000140 LDA @lINT_PENDING_REG0 +.3864c7 29 84 and #$84 AND #FNX0_INT07_MOUSE | FNX0_INT02_TMR0 ;AND #FNX0_INT00_SOF +.3864c9 8f 40 01 00 sta $000140 STA @lINT_PENDING_REG0 ; Writing it back will clear the Active Bit +.3864cd af 41 01 00 lda $000141 LDA @lINT_PENDING_REG1 +.3864d1 29 a1 and #$a1 AND #FNX1_INT00_KBD | FNX1_INT05_MPU401 | FNX1_INT07_SDCARD +.3864d3 8f 41 01 00 sta $000141 STA @lINT_PENDING_REG1 ; Writing it back will clear the Active Bit +.3864d7 a9 7b lda #$7b LDA #~(FNX0_INT07_MOUSE | FNX0_INT02_TMR0) ;LDA #~(FNX0_INT00_SOF | FNX0_INT00_SOF ) +.3864d9 8f 4c 01 00 sta $00014c STA @lINT_MASK_REG0 +.3864dd a9 5e lda #$5e LDA #~(FNX1_INT00_KBD | FNX1_INT05_MPU401 | FNX1_INT07_SDCARD) +.3864df 8f 4d 01 00 sta $00014d STA @lINT_MASK_REG1 +.3864e3 60 rts RTS +.3864e4 RESET_STATE_MACHINE +.3864e4 a9 00 lda #$00 LDA #0 +.3864e6 8f 15 0f 38 sta $380f15 STA STATE_MACHINE +.3864ea 85 48 sta $48 STA RAD_ORDER_NUM +.3864ec 64 6c stz $6c STZ LINE_NUM_HEX +.3864ee 64 49 stz $49 STZ RAD_ORDER_NUM + 1 +.3864f0 a9 01 lda #$01 LDA #1 +.3864f2 8f 19 0f 38 sta $380f19 STA LINE_NUM_DEC +.3864f6 a6 48 ldx $48 LDX RAD_ORDER_NUM +.3864f8 bf 24 fc 39 lda $39fc24,x LDA @lORDERS,X ; load the first pattern in the order list +.3864fc 1a inc a INC A +.3864fd PATTN_OK +.3864fd 8f 18 0f 38 sta $380f18 STA PATTERN_NUM +.386501 20 a1 5a jsr $385aa1 JSR DISPLAY_SPEED +.386504 60 rts RTS +.386505 INCREMENT_ORDER +.386505 48 pha PHA +.386506 a9 00 lda #$00 LDA #0 +.386508 eb xba XBA +.386509 af 48 00 00 lda $000048 LDA @lRAD_ORDER_NUM +.38650d 1a inc a INC A +.38650e cf d3 6a 38 cmp $386ad3 CMP @lTuneInfo.songLength +.386512 d0 02 bne $386516 BNE LOAD_ORDER +.386514 a9 00 lda #$00 LDA #0 +.386516 LOAD_ORDER +.386516 8f 48 00 00 sta $000048 STA @lRAD_ORDER_NUM +.38651a aa tax TAX +.38651b a0 90 01 ldy #$0190 LDY #SCREEN_WIDTH * 5 +.38651e 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386521 bf 24 fc 39 lda $39fc24,x LDA @lORDERS,X ; load the pattern from the order list +.386525 1a inc a INC A +.386526 8f 18 0f 38 sta $380f18 STA PATTERN_NUM +.38652a 68 pla PLA +.38652b 60 rts RTS +.38652c INIT_TIMER0_BPM +.38652c 8b phb PHB +.38652d a9 00 lda #$00 LDA #0 +.38652f 48 pha PHA +.386530 ab plb PLB ; set databank to 0 +.386531 a9 03 lda #$03 LDA #3 ; each timer counter is 24 bits - 3 bytes +.386533 8d 00 01 sta $0100 STA UNSIGNED_MULT_A +.386536 9c 01 01 stz $0101 STZ UNSIGNED_MULT_A + 1 +.386539 9c 03 01 stz $0103 STZ UNSIGNED_MULT_B + 1 +.38653c 38 sec SEC +.38653d af 17 0f 38 lda $380f17 LDA BPM ; multiply by the BPM, the 4 offset is the lowest BPM +.386541 e9 04 sbc #$04 SBC #4 +.386543 8d 02 01 sta $0102 STA UNSIGNED_MULT_B +.386546 c2 20 rep #$20 REP #$20 ; set A long +.386548 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT +.38654b aa tax TAX +.38654c e2 20 sep #$20 SEP #$20 ; set A short +.38654e a9 00 lda #$00 LDA #0 ; set timer0 charge to 0 +.386550 8d 61 01 sta $0161 STA TIMER0_CHARGE_L +.386553 8d 62 01 sta $0162 STA TIMER0_CHARGE_M +.386556 8d 63 01 sta $0163 STA TIMER0_CHARGE_H +.386559 bf 00 00 3a lda $3a0000,x LDA @lSPM_004,X +.38655d 8d 65 01 sta $0165 STA TIMER0_CMP_L +.386560 bf 01 00 3a lda $3a0001,x LDA @lSPM_004+1,X +.386564 8d 66 01 sta $0166 STA TIMER0_CMP_M +.386567 bf 02 00 3a lda $3a0002,x LDA @lSPM_004+2,X +.38656b 8d 67 01 sta $0167 STA TIMER0_CMP_H +.38656e a9 01 lda #$01 LDA #TMR0_CMP_RECLR ; count up from "CHARGE" value to TIMER_CMP +.386570 8d 64 01 sta $0164 STA TIMER0_CMP_REG +.386573 a9 0b lda #$0b LDA #(TMR0_EN | TMR0_UPDWN | TMR0_SCLR) +.386575 8d 60 01 sta $0160 STA TIMER0_CTRL_REG +.386578 ab plb PLB +.386579 60 rts RTS +.38657a INIT_TIMER0 +.38657a 8b phb PHB +.38657b a9 00 lda #$00 LDA #0 +.38657d 48 pha PHA +.38657e ab plb PLB ; set databank to 0 +.38657f e2 20 sep #$20 SEP #$20 ; set A short +.386581 a9 00 lda #$00 LDA #0 ; set timer0 charge to 0 +.386583 8d 61 01 sta $0161 STA TIMER0_CHARGE_L +.386586 8d 62 01 sta $0162 STA TIMER0_CHARGE_M +.386589 8d 63 01 sta $0163 STA TIMER0_CHARGE_H +.38658c a9 01 lda #$01 LDA #TMR0_CMP_RECLR ; count up from "CHARGE" value to TIMER_CMP +.38658e 8d 64 01 sta $0164 STA TIMER0_CMP_REG +.386591 a9 0b lda #$0b LDA #(TMR0_EN | TMR0_UPDWN | TMR0_SCLR) +.386593 8d 60 01 sta $0160 STA TIMER0_CTRL_REG +.386596 ab plb PLB +.386597 60 rts RTS +.386598 INIT_OPL2_TMRS +.386598 a9 80 lda #$80 LDA #$80 ; Reset OPL2 Interrupts +.38659a 8f 04 e6 af sta $afe604 STA OPL3_L_IRQ ; byte 4 of OPL2 +.38659e 20 b2 65 jsr $3865b2 JSR WAIT_80 +.3865a1 a9 10 lda #$10 LDA #$10 +.3865a3 8f 02 e6 af sta $afe602 STA OPL3_L_TIMER1 ; byte 2 of OPL2 +.3865a7 8f 03 e6 af sta $afe603 STA OPL3_L_TIMER2 ; byte 2 of OPL2 +.3865ab a9 03 lda #$03 LDA #$3 ; enable timers 1 and 2 +.3865ad 8f 04 e6 af sta $afe604 STA OPL3_L_IRQ ; byte 4 of OPL2 +.3865b1 60 rts RTS +.3865b2 WAIT_80 +.3865b2 a2 30 02 ldx #$0230 LDX #560 +.3865b5 WAIT_LP +.3865b5 ca dex DEX +.3865b6 d0 fd bne $3865b5 BNE WAIT_LP +.3865b8 60 rts RTS +.3865b9 LOAD_INSTRUMENT +.3865b9 af 6a 00 00 lda $00006a LDA @lINSTR_NUMBER +.3865bd 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.3865c1 a9 00 lda #$00 LDA #0 +.3865c3 8f 01 01 00 sta $000101 STA @lUNSIGNED_MULT_A + 1 +.3865c7 8f 03 01 00 sta $000103 STA @lUNSIGNED_MULT_B + 1 +.3865cb a9 16 lda #$16 LDA #INSTR_REC_LEN +.3865cd 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.3865d1 c2 20 rep #$20 REP #$20 ; set A long +.3865d3 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.3865d7 18 clc CLC +.3865d8 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN +.3865db 85 67 sta $67 STA INSTR_ADDR +.3865dd e2 20 sep #$20 SEP #$20 ; set A short +.3865df af 6a 00 00 lda $00006a LDA @lINSTR_NUMBER +.3865e3 a0 a3 01 ldy #$01a3 LDY #5 * SCREEN_WIDTH + 19 +.3865e6 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3865e9 a7 67 lda [$67] LDA [INSTR_ADDR] +.3865eb d0 4b bne $386638 BNE DRUM_SET +.3865ed e6 67 inc $67 INC INSTR_ADDR +.3865ef d0 02 bne $3865f3 BNE LD_INST_1 +.3865f1 e6 68 inc $68 INC INSTR_ADDR+1 +.3865f3 LD_INST_1 +.3865f3 20 39 66 jsr $386639 JSR LOAD_AM_VIB_MULT +.3865f6 e6 67 inc $67 INC INSTR_ADDR +.3865f8 d0 02 bne $3865fc BNE LD_INST_2 +.3865fa e6 68 inc $68 INC INSTR_ADDR+1 +.3865fc LD_INST_2 +.3865fc 20 a9 66 jsr $3866a9 JSR LOAD_KEY_OP_LVL +.3865ff e6 67 inc $67 INC INSTR_ADDR +.386601 d0 02 bne $386605 BNE LD_INST_3 +.386603 e6 68 inc $68 INC INSTR_ADDR+1 +.386605 LD_INST_3 +.386605 20 e3 66 jsr $3866e3 JSR LOAD_ATT_DEC_RATE +.386608 e6 67 inc $67 INC INSTR_ADDR +.38660a d0 02 bne $38660e BNE LD_INST_4 +.38660c e6 68 inc $68 INC INSTR_ADDR+1 +.38660e LD_INST_4 +.38660e 20 1f 67 jsr $38671f JSR LOAD_SUSTAIN_RELEASE_RATE +.386611 e6 67 inc $67 INC INSTR_ADDR +.386613 d0 02 bne $386617 BNE LD_INST_5 +.386615 e6 68 inc $68 INC INSTR_ADDR+1 +.386617 LD_INST_5 +.386617 da phx PHX +.386618 a6 27 ldx $27 LDX OPL2_CHANNEL +.38661a 20 5b 67 jsr $38675b JSR LOAD_FEEDBACK_ALGO +.38661d fa plx PLX +.38661e e6 67 inc $67 INC INSTR_ADDR +.386620 d0 02 bne $386624 BNE LD_INST_6 +.386622 e6 68 inc $68 INC INSTR_ADDR+1 +.386624 LD_INST_6 +.386624 20 77 67 jsr $386777 JSR LOAD_WAVE +.386627 c2 20 rep #$20 REP #$20 ; set A long +.386629 a5 67 lda $67 LDA INSTR_ADDR +.38662b 69 06 00 adc #$0006 ADC #6 +.38662e 85 67 sta $67 STA INSTR_ADDR +.386630 e2 20 sep #$20 SEP #$20 ; set A short +.386632 a0 a8 01 ldy #$01a8 LDY #5 * SCREEN_WIDTH + 24 +.386635 20 2f 58 jsr $38582f JSR WRITE_INSTRUMENT_NAME +.386638 DRUM_SET +.386638 60 rts RTS +.386639 LOAD_AM_VIB_MULT +.386639 a7 67 lda [$67] LDA [INSTR_ADDR] +.38663b 48 pha PHA +.38663c 48 pha PHA +.38663d 48 pha PHA +.38663e 48 pha PHA +.38663f 9f 20 e7 af sta $afe720,x STA @lOPL3_R_AM_VID_EG_KSR_MULT,X +.386643 29 80 and #$80 AND #TREMOLO +.386645 a0 3d 02 ldy #$023d LDY #7 * SCREEN_WIDTH + 13 +.386648 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.38664b 68 pla PLA +.38664c 29 40 and #$40 AND #VIBRATO +.38664e a0 8d 02 ldy #$028d LDY #8 * SCREEN_WIDTH + 13 +.386651 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.386654 68 pla PLA +.386655 29 20 and #$20 AND #SUSTAINING +.386657 a0 dd 02 ldy #$02dd LDY #9 * SCREEN_WIDTH + 13 +.38665a 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.38665d 68 pla PLA +.38665e 29 10 and #$10 AND #KSR +.386660 a0 2d 03 ldy #$032d LDY #10 * SCREEN_WIDTH + 13 +.386663 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.386666 68 pla PLA +.386667 29 0f and #$0f AND #MULTIPLIER +.386669 a0 7e 03 ldy #$037e LDY #11 * SCREEN_WIDTH + 14 +.38666c 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.38666f a0 06 00 ldy #$0006 LDY #6 +.386672 b7 67 lda [$67],y LDA [INSTR_ADDR], Y +.386674 48 pha PHA +.386675 48 pha PHA +.386676 48 pha PHA +.386677 48 pha PHA +.386678 9f 23 e7 af sta $afe723,x STA @lOPL3_R_AM_VID_EG_KSR_MULT + 3,X +.38667c 29 80 and #$80 AND #TREMOLO +.38667e a0 57 02 ldy #$0257 LDY #7 * SCREEN_WIDTH + 39 +.386681 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.386684 68 pla PLA +.386685 29 40 and #$40 AND #VIBRATO +.386687 a0 a7 02 ldy #$02a7 LDY #8 * SCREEN_WIDTH + 39 +.38668a 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.38668d 68 pla PLA +.38668e 29 20 and #$20 AND #SUSTAINING +.386690 a0 f7 02 ldy #$02f7 LDY #9 * SCREEN_WIDTH + 39 +.386693 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.386696 68 pla PLA +.386697 29 10 and #$10 AND #KSR +.386699 a0 47 03 ldy #$0347 LDY #10 * SCREEN_WIDTH + 39 +.38669c 20 e0 57 jsr $3857e0 JSR WRITE_OFF_ON +.38669f 68 pla PLA +.3866a0 29 0f and #$0f AND #MULTIPLIER +.3866a2 a0 98 03 ldy #$0398 LDY #11 * SCREEN_WIDTH + 40 +.3866a5 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866a8 60 rts RTS +.3866a9 LOAD_KEY_OP_LVL +.3866a9 a7 67 lda [$67] LDA [INSTR_ADDR] +.3866ab 48 pha PHA +.3866ac 9f 40 e7 af sta $afe740,x STA @lOPL3_R_KSL_TL,X +.3866b0 29 c0 and #$c0 AND #KEY_SCALE +.3866b2 2a rol a ROL A +.3866b3 2a rol a ROL A +.3866b4 2a rol a ROL A +.3866b5 a0 ce 03 ldy #$03ce LDY #12 * SCREEN_WIDTH + 14 +.3866b8 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866bb 68 pla PLA +.3866bc 29 3f and #$3f AND #OP_LEVEL +.3866be a0 1e 04 ldy #$041e LDY #13 * SCREEN_WIDTH + 14 +.3866c1 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866c4 a0 06 00 ldy #$0006 LDY #6 +.3866c7 b7 67 lda [$67],y LDA [INSTR_ADDR],Y +.3866c9 48 pha PHA +.3866ca 9f 43 e7 af sta $afe743,x STA @lOPL3_R_KSL_TL + 3,X +.3866ce 29 c0 and #$c0 AND #KEY_SCALE +.3866d0 2a rol a ROL A +.3866d1 2a rol a ROL A +.3866d2 2a rol a ROL A +.3866d3 a0 e8 03 ldy #$03e8 LDY #12 * SCREEN_WIDTH + 40 +.3866d6 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866d9 68 pla PLA +.3866da 29 3f and #$3f AND #OP_LEVEL +.3866dc a0 38 04 ldy #$0438 LDY #13 * SCREEN_WIDTH + 40 +.3866df 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866e2 60 rts RTS +.3866e3 LOAD_ATT_DEC_RATE +.3866e3 a7 67 lda [$67] LDA [INSTR_ADDR] +.3866e5 48 pha PHA +.3866e6 9f 60 e7 af sta $afe760,x STA @lOPL3_R_AR_DR,X +.3866ea 29 f0 and #$f0 AND #ATTACK_RT +.3866ec 4a lsr a LSR A +.3866ed 4a lsr a LSR A +.3866ee 4a lsr a LSR A +.3866ef 4a lsr a LSR A +.3866f0 a0 6e 04 ldy #$046e LDY #14 * SCREEN_WIDTH + 14 +.3866f3 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866f6 68 pla PLA +.3866f7 29 0f and #$0f AND #DECAY_RT +.3866f9 a0 be 04 ldy #$04be LDY #15 * SCREEN_WIDTH + 14 +.3866fc 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.3866ff a0 06 00 ldy #$0006 LDY #6 +.386702 b7 67 lda [$67],y LDA [INSTR_ADDR],Y +.386704 48 pha PHA +.386705 9f 63 e7 af sta $afe763,x STA @lOPL3_R_AR_DR + 3,X +.386709 29 f0 and #$f0 AND #ATTACK_RT +.38670b 4a lsr a LSR A +.38670c 4a lsr a LSR A +.38670d 4a lsr a LSR A +.38670e 4a lsr a LSR A +.38670f a0 88 04 ldy #$0488 LDY #14 * SCREEN_WIDTH + 40 +.386712 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386715 68 pla PLA +.386716 29 0f and #$0f AND #DECAY_RT +.386718 a0 d8 04 ldy #$04d8 LDY #15 * SCREEN_WIDTH + 40 +.38671b 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.38671e 60 rts RTS +.38671f LOAD_SUSTAIN_RELEASE_RATE +.38671f a7 67 lda [$67] LDA [INSTR_ADDR] +.386721 48 pha PHA +.386722 9f 80 e7 af sta $afe780,x STA @lOPL3_R_SL_RR,X +.386726 29 f0 and #$f0 AND #ATTACK_RT +.386728 4a lsr a LSR A +.386729 4a lsr a LSR A +.38672a 4a lsr a LSR A +.38672b 4a lsr a LSR A +.38672c a0 0e 05 ldy #$050e LDY #16 * SCREEN_WIDTH + 14 +.38672f 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386732 68 pla PLA +.386733 29 0f and #$0f AND #DECAY_RT +.386735 a0 5e 05 ldy #$055e LDY #17 * SCREEN_WIDTH + 14 +.386738 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.38673b a0 06 00 ldy #$0006 LDY #6 +.38673e b7 67 lda [$67],y LDA [INSTR_ADDR],Y +.386740 48 pha PHA +.386741 9f 83 e7 af sta $afe783,x STA @lOPL3_R_SL_RR + 3,X +.386745 29 f0 and #$f0 AND #ATTACK_RT +.386747 4a lsr a LSR A +.386748 4a lsr a LSR A +.386749 4a lsr a LSR A +.38674a 4a lsr a LSR A +.38674b a0 28 05 ldy #$0528 LDY #16 * SCREEN_WIDTH + 40 +.38674e 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386751 68 pla PLA +.386752 29 0f and #$0f AND #DECAY_RT +.386754 a0 78 05 ldy #$0578 LDY #17 * SCREEN_WIDTH + 40 +.386757 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.38675a 60 rts RTS +.38675b LOAD_FEEDBACK_ALGO +.38675b a7 67 lda [$67] LDA [INSTR_ADDR] +.38675d 48 pha PHA +.38675e 09 f0 ora #$f0 ORA #$F0 ; Channel B +.386760 9f c0 e7 af sta $afe7c0,x STA @lOPL3_R_FEEDBACK,X +.386764 29 0e and #$0e AND #FEEDBACK +.386766 4a lsr a LSR A +.386767 a0 68 06 ldy #$0668 LDY #20 * SCREEN_WIDTH + 40 +.38676a 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.38676d 68 pla PLA +.38676e 29 01 and #$01 AND #ALGORITHM +.386770 a0 b8 06 ldy #$06b8 LDY #21 * SCREEN_WIDTH + 40 +.386773 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386776 60 rts RTS +.386777 LOAD_WAVE +.386777 a7 67 lda [$67] LDA [INSTR_ADDR] +.386779 9f e0 e7 af sta $afe7e0,x STA @lOPL3_R_WAVE_SELECT,X +.38677d 29 07 and #$07 AND #$7 +.38677f a0 ae 05 ldy #$05ae LDY #18 * SCREEN_WIDTH + 14 +.386782 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386785 a0 05 00 ldy #$0005 LDY #5 +.386788 b7 67 lda [$67],y LDA [INSTR_ADDR],Y +.38678a 9f e3 e7 af sta $afe7e3,x STA @lOPL3_R_WAVE_SELECT+3,X +.38678e 29 07 and #$07 AND #$7 +.386790 a0 c8 05 ldy #$05c8 LDY #18 * SCREEN_WIDTH + 40 +.386793 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386796 60 rts RTS +.386797 INIT_KEYBOARD +.386797 0b phd PHD +.386798 48 pha PHA +.386799 da phx PHX +.38679a 08 php PHP +.38679b 18 clc CLC +.38679c e2 20 sep #$20 SEP #$20 ; set A short +.38679e a9 00 lda #$00 LDA #$00 +.3867a0 8d 87 0f sta $0f87 STA KEYBOARD_SC_FLG ; Clear the Keyboard Flag +.3867a3 20 45 68 jsr $386845 JSR Poll_Inbuf +.3867a6 a9 aa lda #$aa LDA #$AA ;Send self test command +.3867a8 8f 64 10 af sta $af1064 STA KBD_CMD_BUF +.3867ac 20 50 68 jsr $386850 JSR Poll_Outbuf ; +.3867af af 60 10 af lda $af1060 LDA KBD_OUT_BUF ;Check self test result +.3867b3 c9 55 cmp #$55 CMP #$55 +.3867b5 f0 03 beq $3867ba BEQ passAAtest +.3867b7 82 6f 00 brl $386829 BRL initkb_loop_out +.3867ba passAAtest +.3867ba a9 ab lda #$ab LDA #$AB ;Send test Interface command +.3867bc 8f 64 10 af sta $af1064 STA KBD_CMD_BUF +.3867c0 20 50 68 jsr $386850 JSR Poll_Outbuf ; +.3867c3 af 60 10 af lda $af1060 LDA KBD_OUT_BUF ;Display Interface test results +.3867c7 c9 00 cmp #$00 CMP #$00 ;Should be 00 +.3867c9 f0 03 beq $3867ce BEQ passABtest +.3867cb 82 5b 00 brl $386829 BRL initkb_loop_out +.3867ce passABtest +.3867ce a9 60 lda #$60 LDA #$60 ; Send Command 0x60 so to Enable Interrupt +.3867d0 8f 64 10 af sta $af1064 STA KBD_CMD_BUF +.3867d4 20 45 68 jsr $386845 JSR Poll_Inbuf ; +.3867d7 a9 69 lda #$69 LDA #%01101001 ; Enable Interrupt +.3867d9 8f 60 10 af sta $af1060 STA KBD_DATA_BUF +.3867dd 20 45 68 jsr $386845 JSR Poll_Inbuf ; +.3867e0 a9 ff lda #$ff LDA #$FF ; Send Keyboard Reset command +.3867e2 8f 60 10 af sta $af1060 STA KBD_DATA_BUF +.3867e6 a2 ff ff ldx #$ffff LDX #$FFFF +.3867e9 ca dex DLY_LOOP1 DEX +.3867ea ea nop NOP +.3867eb ea nop NOP +.3867ec ea nop NOP +.3867ed ea nop NOP +.3867ee ea nop NOP +.3867ef ea nop NOP +.3867f0 ea nop NOP +.3867f1 ea nop NOP +.3867f2 e0 00 00 cpx #$0000 CPX #$0000 +.3867f5 d0 f2 bne $3867e9 BNE DLY_LOOP1 +.3867f7 20 50 68 jsr $386850 JSR Poll_Outbuf ; +.3867fa af 60 10 af lda $af1060 LDA KBD_OUT_BUF ; Read Output Buffer +.3867fe DO_CMD_F4_AGAIN +.3867fe 20 45 68 jsr $386845 JSR Poll_Inbuf ; +.386801 a9 f4 lda #$f4 LDA #$F4 ; Enable the Keyboard +.386803 8f 60 10 af sta $af1060 STA KBD_DATA_BUF +.386807 20 50 68 jsr $386850 JSR Poll_Outbuf ; +.38680a af 60 10 af lda $af1060 LDA KBD_OUT_BUF ; Clear the Output buffer +.38680e c9 fa cmp #$fa CMP #$FA +.386810 d0 ec bne $3867fe BNE DO_CMD_F4_AGAIN +.386812 20 5b 68 jsr $38685b JSR INIT_MOUSE +.386815 af 40 01 00 lda $000140 LDA @lINT_PENDING_REG0 ; Read the Pending Register & +.386819 29 80 and #$80 AND #FNX0_INT07_MOUSE +.38681b 8f 40 01 00 sta $000140 STA @lINT_PENDING_REG0 ; Writing it back will clear the Active Bit +.38681f af 41 01 00 lda $000141 LDA @lINT_PENDING_REG1 ; Read the Pending Register & +.386823 29 01 and #$01 AND #FNX1_INT00_KBD +.386825 8f 41 01 00 sta $000141 STA @lINT_PENDING_REG1 ; Writing it back will clear the Active Bit +.386829 initkb_loop_out +.386829 InitSuccess +.386829 28 plp PLP +.38682a fa plx PLX +.38682b 68 pla PLA +.38682c 2b pld PLD +.38682d 60 rts RTS +.38682e INIT_MOUSEPOINTER +.38682e c2 30 rep #$30 REP #$30 ; set A&X long +.386830 a2 80 4d ldx #$4d80 LDX #<>MOUSE_POINTER_PTR +.386833 a9 00 01 lda #$0100 LDA #$100 +.386836 a0 00 05 ldy #$0500 LDY #$0500 +.386839 54 af 38 mvn #$38,#$af MVN #`MOUSE_POINTER_PTR,#$AF +.38683c e2 20 sep #$20 SEP #$20 ; set A short +.38683e a9 01 lda #$01 LDA #$01 +.386840 8f 00 07 af sta $af0700 STA @lMOUSE_PTR_CTRL_REG_L ; Enable Mouse, Mouse Pointer Graphic Bank 0 +.386844 60 rts RTS +.386845 Poll_Inbuf +.386845 af 64 10 af lda $af1064 LDA STATUS_PORT ; Load Status Byte +.386849 29 02 and #$02 AND #38691d 01 01 01 01 01 01 01 01 CHANNELS .byte 1,1,1,1,1,1,1,1,1 +>386925 01 +.386926 TOGGLE_CHANNEL +.386926 aa tax TAX +.386927 ca dex DEX +.386928 bf 1d 69 38 lda $38691d,x LDA CHANNELS,X +.38692c 49 01 eor #$01 EOR #1 +.38692e 9f 1d 69 38 sta $38691d,x STA CHANNELS,X +.386932 60 rts RTS +>386933 80 80 80 31 33 80 36 38 SCAN_TO_NOTE .text $80, $80, $80, $31, $33, $80, $36, $38, $3A, $80, $41, $80, $80, $80, $80, $80 +>38693b 3a 80 41 80 80 80 80 80 +>386943 2c 32 34 35 37 39 3b 3c .text $2C, $32, $34, $35, $37, $39, $3B, $3C, $42, $80, $80, $80, $80, $80, $80, $21 +>38694b 42 80 80 80 80 80 80 21 +>386953 23 80 26 28 2a 80 80 80 .text $23, $80, $26, $28, $2A, $80, $80, $80, $80, $80, $80, $80, $1C, $22, $24, $25 +>38695b 80 80 80 80 1c 22 24 25 +>386963 27 29 2b 80 80 80 80 80 .text $27, $29, $2B, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 +>38696b 80 80 80 80 80 80 80 80 +>386973 80 80 80 80 80 80 80 80 .text $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 +>38697b 80 80 80 80 80 80 80 80 +>386983 80 80 80 80 80 80 80 80 .text $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80 +>38698b 80 80 80 80 80 80 80 80 +.386993 MIDI_COMMAND_TABLE +>386993 02 56 02 56 .word <>NOTE_OFF, <>NOTE_ON +>386997 82 56 82 56 .word <>POLY_PRESSURE, <>CONTROL_CHANGE +>38699b ab 56 ab 56 .word <>PROGRAM_CHANGE, <>CHANNEL_PRESSURE ; these two command expect 1 datat byte only - no running status +>38699f 82 56 c2 56 .word <>PITCH_BEND, <>SYSTEM_COMMAND +>3869a3 da 56 .word <>INVALID_COMMAND ;****** Processing file: file_load.asm -.38693a LOAD_FILE_DISPLAY -.38693a c2 10 rep #$10 REP #$10 ; set X long -.38693c a9 02 lda #$02 LDA #2 -.38693e 8f 15 0f 38 sta $380f15 STA STATE_MACHINE -.386942 22 82 5c 38 jsl $385c82 JSL ISDOS_INIT -.386946 LOAD_DIRECTORY -.386946 a9 00 lda #$00 LDA #0 -.386948 8d 1f 03 sta $031f STA SDOS_LINE_SELECT -.38694b a9 34 lda #$34 LDA #`SDCARD_LIST -.38694d 85 53 sta $53 STA SDOS_FILE_REC_PTR+2 -.38694f 64 52 stz $52 STZ SDOS_FILE_REC_PTR+1 -.386951 64 51 stz $51 STZ SDOS_FILE_REC_PTR -.386953 20 5f 69 jsr $38695f JSR LOAD_SDCARD_DATA -.386956 20 8a 69 jsr $38698a JSR SHOW_FILE_MENU -.386959 20 d0 69 jsr $3869d0 JSR POPULATE_FILES -.38695c e2 10 sep #$10 SEP #$10 ; set X short -.38695e 6b rtl RTL -.38695f LOAD_SDCARD_DATA -.38695f a9 00 lda #$00 LDA #0 -.386961 a0 00 04 ldy #$0400 LDY #1024 ; each struct is 18 bytes long, so this allows to load a 64 entries directory -.386964 CLEAR_FILE_AREA -.386964 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR], Y -.386966 88 dey DEY -.386967 d0 fb bne $386964 BNE CLEAR_FILE_AREA -.386969 a5 3f lda $3f LDA SDCARD_PRSNT_MNT -.38696b f0 1c beq $386989 BEQ LOAD_SDCARD_DATA_DONE ; if SD not present, exit -.38696d 22 e8 5c 38 jsl $385ce8 JSL ISDOS_READ_MBR_BOOT -.386971 22 bf 5f 38 jsl $385fbf JSL ISDOS_PARSE_ROOT_DIR -.386975 c2 20 rep #$20 REP #$20 ; set A long -.386977 a9 00 66 lda #$6600 LDA #FAT_DATA -.38697a 85 80 sta $80 STA SD_DATA -.38697c a9 00 00 lda #$0000 LDA #0 -.38697f 85 82 sta $82 STA SD_DATA + 2 -.386981 85 86 sta $86 STA SD_DATA_FAT_PAGE -.386983 22 6b 60 38 jsl $38606b JSL ISDOS_READ_FAT_SECTOR -.386987 e2 20 sep #$20 SEP #$20 ; set A short -.386989 LOAD_SDCARD_DATA_DONE -.386989 60 rts RTS -.38698a SHOW_FILE_MENU -.38698a c2 30 rep #$30 REP #$30 ; set A&X long -.38698c a9 00 a0 lda #$a000 LDA #<>CS_TEXT_MEM_PTR ; store the initial screen buffer location -.38698f 85 0c sta $0c STA SCREENBEGIN -.386991 a9 00 c0 lda #$c000 LDA #<>CS_COLOR_MEM_PTR ; store the initial colour buffer location -.386994 85 17 sta $17 STA CURSORPOS -.386996 e2 20 sep #$20 SEP #$20 ; set A short -.386998 a9 af lda #$af LDA #`CS_TEXT_MEM_PTR -.38699a 85 0e sta $0e STA SCREENBEGIN+2 -.38699c 85 19 sta $19 STA CURSORPOS+2 -.38699e a0 3e 03 ldy #$033e LDY #SCREEN_WIDTH * 10 + 30 -.3869a1 a9 28 lda #$28 LDA #40 ; lines to copy -.3869a3 85 80 sta $80 STA LINE_COPY -.3869a5 a2 8f 03 ldx #$038f LDX #SCREEN_WIDTH * 11 + 31 ; initialize the cursor position for file display -.3869a8 86 1a stx $1a STX CURSORX -.3869aa a2 00 00 ldx #$0000 LDX #0 -.3869ad a9 14 lda #$14 COPY_LINE LDA #20 ; columns to copy -.3869af 85 81 sta $81 STA CHAR_COPY -.3869b1 bf 80 4e 38 lda $384e80,x COPY_CHAR LDA FILE_LOAD_SCREEN,X -.3869b5 97 0c sta [$0c],y STA [SCREENBEGIN],Y -.3869b7 a9 50 lda #$50 LDA #$50 ; yellow -.3869b9 97 17 sta [$17],y STA [CURSORPOS],Y -.3869bb c8 iny INY -.3869bc e8 inx INX -.3869bd c6 81 dec $81 DEC CHAR_COPY -.3869bf d0 f0 bne $3869b1 BNE COPY_CHAR -.3869c1 c2 20 rep #$20 REP #$20 ; set A long -.3869c3 98 tya TYA -.3869c4 18 clc CLC -.3869c5 69 3c 00 adc #$003c ADC #SCREEN_WIDTH - 20 ; skip to next line -.3869c8 a8 tay TAY -.3869c9 e2 20 sep #$20 SEP #$20 ; set A short -.3869cb c6 80 dec $80 DEC LINE_COPY -.3869cd d0 de bne $3869ad BNE COPY_LINE -.3869cf 60 rts RTS -.3869d0 POPULATE_FILES -.3869d0 64 51 stz $51 STZ SDOS_FILE_REC_PTR -.3869d2 64 52 stz $52 STZ SDOS_FILE_REC_PTR+1 -.3869d4 a9 34 lda #$34 LDA #`SDCARD_LIST -.3869d6 85 53 sta $53 STA SDOS_FILE_REC_PTR+2 -.3869d8 a2 00 00 ldx #$0000 LDX #0 -.3869db PF_NEXT_FILE -.3869db a0 0b 00 ldy #$000b LDY #11 -.3869de b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y -.3869e0 f0 24 beq $386a06 BEQ PF_DONE -.3869e2 22 c3 5b 38 jsl $385bc3 JSL DISPLAY_FAT_RECORD -.3869e6 c2 20 rep #$20 REP #$20 ; set A long -.3869e8 a5 1a lda $1a LDA CURSORX -.3869ea 18 clc CLC -.3869eb 69 3e 00 adc #$003e ADC #SCREEN_WIDTH - 18 -.3869ee 85 1a sta $1a STA CURSORX -.3869f0 a5 51 lda $51 LDA SDOS_FILE_REC_PTR -.3869f2 69 12 00 adc #$0012 ADC #18 -.3869f5 85 51 sta $51 STA SDOS_FILE_REC_PTR -.3869f7 c9 80 04 cmp #$0480 CMP #1152 -.3869fa b0 0a bcs $386a06 BCS PF_DONE -.3869fc e8 inx INX -.3869fd e0 26 00 cpx #$0026 CPX #38 -.386a00 f0 04 beq $386a06 BEQ PF_DONE -.386a02 e2 20 sep #$20 SEP #$20 ; set A short -.386a04 80 d5 bra $3869db BRA PF_NEXT_FILE -.386a06 PF_DONE -.386a06 e2 20 sep #$20 SEP #$20 ; set A short -.386a08 a9 05 lda #$05 LDA #5 ; Yellow Background -.386a0a 22 25 5c 38 jsl $385c25 JSL TEXT_COLOUR_SELECTED -.386a0e 60 rts RTS -.386a0f READ_FILE -.386a0f a9 00 lda #$00 LDA #0 -.386a11 eb xba XBA -.386a12 ad 1f 03 lda $031f LDA SDOS_LINE_SELECT -.386a15 c2 30 rep #$30 REP #$30 ; set A&X long -.386a17 8d 00 01 sta $0100 STA UNSIGNED_MULT_A -.386a1a a9 12 00 lda #$0012 LDA #18 -.386a1d 8d 02 01 sta $0102 STA UNSIGNED_MULT_B -.386a20 ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT -.386a23 85 51 sta $51 STA SDOS_FILE_REC_PTR -.386a25 a9 00 80 lda #$8000 LDA #<>RAD_FILE_TEMP -.386a28 85 80 sta $80 STA SD_DATA -.386a2a a9 37 00 lda #$0037 LDA #`RAD_FILE_TEMP -.386a2d 85 82 sta $82 STA SD_DATA + 2 -.386a2f a0 10 00 ldy #$0010 LDY #16 -.386a32 b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y -.386a34 22 39 61 38 jsl $386139 JSL ISDOS_READ_FILE -.386a38 e2 20 sep #$20 SEP #$20 ; set A short -.386a3a 22 b1 30 38 jsl $3830b1 JSL OPL2_INIT -.386a3e 22 6b 6a 38 jsl $386a6b JSL RAD_INIT_PLAYER -.386a42 22 47 6a 38 jsl $386a47 JSL EXIT_FILE -.386a46 6b rtl RTL -.386a47 EXIT_FILE -.386a47 20 79 64 jsr $386479 JSR RESET_STATE_MACHINE -.386a4a 20 db 56 jsr $3856db JSR DRAW_DISPLAY -.386a4d 20 59 59 jsr $385959 JSR DISPLAY_FILENAME -.386a50 20 61 58 jsr $385861 JSR DISPLAY_PATTERN -.386a53 20 2b 5b jsr $385b2b JSR DISPLAY_ORDERS -.386a56 20 af 5a jsr $385aaf JSR DISPLAY_SPEED -.386a59 6b rtl RTL +.3869a5 LOAD_FILE_DISPLAY +.3869a5 c2 10 rep #$10 REP #$10 ; set X long +.3869a7 a9 02 lda #$02 LDA #2 +.3869a9 8f 15 0f 38 sta $380f15 STA STATE_MACHINE +.3869ad 22 74 5c 38 jsl $385c74 JSL ISDOS_INIT +.3869b1 LOAD_DIRECTORY +.3869b1 a9 00 lda #$00 LDA #0 +.3869b3 8d 1f 03 sta $031f STA SDOS_LINE_SELECT +.3869b6 a9 34 lda #$34 LDA #`SDCARD_LIST +.3869b8 85 53 sta $53 STA SDOS_FILE_REC_PTR+2 +.3869ba 64 52 stz $52 STZ SDOS_FILE_REC_PTR+1 +.3869bc 64 51 stz $51 STZ SDOS_FILE_REC_PTR +.3869be 20 ca 69 jsr $3869ca JSR LOAD_SDCARD_DATA +.3869c1 20 f5 69 jsr $3869f5 JSR SHOW_FILE_MENU +.3869c4 20 3b 6a jsr $386a3b JSR POPULATE_FILES +.3869c7 e2 10 sep #$10 SEP #$10 ; set X short +.3869c9 6b rtl RTL +.3869ca LOAD_SDCARD_DATA +.3869ca a9 00 lda #$00 LDA #0 +.3869cc a0 00 04 ldy #$0400 LDY #1024 ; each struct is 18 bytes long, so this allows to load a 64 entries directory +.3869cf CLEAR_FILE_AREA +.3869cf 97 51 sta [$51],y STA [SDOS_FILE_REC_PTR], Y +.3869d1 88 dey DEY +.3869d2 d0 fb bne $3869cf BNE CLEAR_FILE_AREA +.3869d4 a5 3f lda $3f LDA SDCARD_PRSNT_MNT +.3869d6 f0 1c beq $3869f4 BEQ LOAD_SDCARD_DATA_DONE ; if SD not present, exit +.3869d8 22 d7 5c 38 jsl $385cd7 JSL ISDOS_READ_MBR_AND_BOOT_SECTOR +.3869dc 22 d3 5f 38 jsl $385fd3 JSL ISDOS_PARSE_ROOT_DIR +.3869e0 c2 20 rep #$20 REP #$20 ; set A long +.3869e2 a9 00 66 lda #$6600 LDA #FAT_DATA +.3869e5 85 80 sta $80 STA SD_DATA +.3869e7 a9 00 00 lda #$0000 LDA #0 +.3869ea 85 82 sta $82 STA SD_DATA + 2 +.3869ec 85 86 sta $86 STA SD_DATA_FAT_PAGE +.3869ee 22 7f 60 38 jsl $38607f JSL ISDOS_READ_FAT_SECTOR +.3869f2 e2 20 sep #$20 SEP #$20 ; set A short +.3869f4 LOAD_SDCARD_DATA_DONE +.3869f4 60 rts RTS +.3869f5 SHOW_FILE_MENU +.3869f5 c2 30 rep #$30 REP #$30 ; set A&X long +.3869f7 a9 00 a0 lda #$a000 LDA #<>CS_TEXT_MEM_PTR ; store the initial screen buffer location +.3869fa 85 0c sta $0c STA SCREENBEGIN +.3869fc a9 00 c0 lda #$c000 LDA #<>CS_COLOR_MEM_PTR ; store the initial colour buffer location +.3869ff 85 17 sta $17 STA CURSORPOS +.386a01 e2 20 sep #$20 SEP #$20 ; set A short +.386a03 a9 af lda #$af LDA #`CS_TEXT_MEM_PTR +.386a05 85 0e sta $0e STA SCREENBEGIN+2 +.386a07 85 19 sta $19 STA CURSORPOS+2 +.386a09 a0 3e 03 ldy #$033e LDY #SCREEN_WIDTH * 10 + 30 +.386a0c a9 28 lda #$28 LDA #40 ; lines to copy +.386a0e 85 80 sta $80 STA LINE_COPY +.386a10 a2 8f 03 ldx #$038f LDX #SCREEN_WIDTH * 11 + 31 ; initialize the cursor position for file display +.386a13 86 1a stx $1a STX CURSORX +.386a15 a2 00 00 ldx #$0000 LDX #0 +.386a18 a9 14 lda #$14 COPY_LINE LDA #20 ; columns to copy +.386a1a 85 81 sta $81 STA CHAR_COPY +.386a1c bf 80 4e 38 lda $384e80,x COPY_CHAR LDA FILE_LOAD_SCREEN,X +.386a20 97 0c sta [$0c],y STA [SCREENBEGIN],Y +.386a22 a9 50 lda #$50 LDA #$50 ; yellow +.386a24 97 17 sta [$17],y STA [CURSORPOS],Y +.386a26 c8 iny INY +.386a27 e8 inx INX +.386a28 c6 81 dec $81 DEC CHAR_COPY +.386a2a d0 f0 bne $386a1c BNE COPY_CHAR +.386a2c c2 20 rep #$20 REP #$20 ; set A long +.386a2e 98 tya TYA +.386a2f 18 clc CLC +.386a30 69 3c 00 adc #$003c ADC #SCREEN_WIDTH - 20 ; skip to next line +.386a33 a8 tay TAY +.386a34 e2 20 sep #$20 SEP #$20 ; set A short +.386a36 c6 80 dec $80 DEC LINE_COPY +.386a38 d0 de bne $386a18 BNE COPY_LINE +.386a3a 60 rts RTS +.386a3b POPULATE_FILES +.386a3b 64 51 stz $51 STZ SDOS_FILE_REC_PTR +.386a3d 64 52 stz $52 STZ SDOS_FILE_REC_PTR+1 +.386a3f a9 34 lda #$34 LDA #`SDCARD_LIST +.386a41 85 53 sta $53 STA SDOS_FILE_REC_PTR+2 +.386a43 a2 00 00 ldx #$0000 LDX #0 +.386a46 PF_NEXT_FILE +.386a46 a0 0b 00 ldy #$000b LDY #11 +.386a49 b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y +.386a4b f0 24 beq $386a71 BEQ PF_DONE +.386a4d 22 b5 5b 38 jsl $385bb5 JSL DISPLAY_FAT_RECORD +.386a51 c2 20 rep #$20 REP #$20 ; set A long +.386a53 a5 1a lda $1a LDA CURSORX +.386a55 18 clc CLC +.386a56 69 3e 00 adc #$003e ADC #SCREEN_WIDTH - 18 +.386a59 85 1a sta $1a STA CURSORX +.386a5b a5 51 lda $51 LDA SDOS_FILE_REC_PTR +.386a5d 69 12 00 adc #$0012 ADC #18 +.386a60 85 51 sta $51 STA SDOS_FILE_REC_PTR +.386a62 c9 80 04 cmp #$0480 CMP #1152 +.386a65 b0 0a bcs $386a71 BCS PF_DONE +.386a67 e8 inx INX +.386a68 e0 26 00 cpx #$0026 CPX #38 +.386a6b f0 04 beq $386a71 BEQ PF_DONE +.386a6d e2 20 sep #$20 SEP #$20 ; set A short +.386a6f 80 d5 bra $386a46 BRA PF_NEXT_FILE +.386a71 PF_DONE +.386a71 e2 20 sep #$20 SEP #$20 ; set A short +.386a73 a9 05 lda #$05 LDA #5 ; Yellow Background +.386a75 22 17 5c 38 jsl $385c17 JSL TEXT_COLOUR_SELECTED +.386a79 60 rts RTS +.386a7a READ_FILE +.386a7a a9 00 lda #$00 LDA #0 +.386a7c eb xba XBA +.386a7d ad 1f 03 lda $031f LDA SDOS_LINE_SELECT +.386a80 c2 30 rep #$30 REP #$30 ; set A&X long +.386a82 8d 00 01 sta $0100 STA UNSIGNED_MULT_A +.386a85 a9 12 00 lda #$0012 LDA #18 +.386a88 8d 02 01 sta $0102 STA UNSIGNED_MULT_B +.386a8b ad 04 01 lda $0104 LDA UNSIGNED_MULT_RESULT +.386a8e 85 51 sta $51 STA SDOS_FILE_REC_PTR +.386a90 a9 00 80 lda #$8000 LDA #<>RAD_FILE_TEMP +.386a93 85 80 sta $80 STA SD_DATA +.386a95 a9 37 00 lda #$0037 LDA #`RAD_FILE_TEMP +.386a98 85 82 sta $82 STA SD_DATA + 2 +.386a9a a0 10 00 ldy #$0010 LDY #16 +.386a9d b7 51 lda [$51],y LDA [SDOS_FILE_REC_PTR],Y +.386a9f 22 5f 61 38 jsl $38615f JSL ISDOS_READ_FILE +.386aa3 e2 20 sep #$20 SEP #$20 ; set A short +.386aa5 22 b1 30 38 jsl $3830b1 JSL OPL3_INIT +.386aa9 22 d6 6a 38 jsl $386ad6 JSL RAD_INIT_PLAYER +.386aad 22 b2 6a 38 jsl $386ab2 JSL EXIT_FILE +.386ab1 6b rtl RTL +.386ab2 EXIT_FILE +.386ab2 20 e4 64 jsr $3864e4 JSR RESET_STATE_MACHINE +.386ab5 20 db 56 jsr $3856db JSR DRAW_DISPLAY +.386ab8 20 4b 59 jsr $38594b JSR DISPLAY_FILENAME +.386abb 20 53 58 jsr $385853 JSR DISPLAY_PATTERN +.386abe 20 1d 5b jsr $385b1d JSR DISPLAY_ORDERS +.386ac1 20 a1 5a jsr $385aa1 JSR DISPLAY_SPEED +.386ac4 6b rtl RTL ;****** Return to file: tracker.asm @@ -7247,783 +7327,783 @@ >0001 00 songLength .byte $00 >0002 06 InitialSpeed .byte $06 >0003 00 hasSlowTimer .byte $00 ;BOOL $00 = False, $01 = True ->386a5a 43 90 44 91 45 46 92 47 note_array .byte $43, $90, $44, $91, $45, $46, $92, $47, $93, $41, $94, $42, $43 ->386a62 93 41 94 42 43 -.386a67 TuneInfo ->386a67 00 version .byte $00 ; bit 1 is RAD 1, bit 2 is RAD 2 ->386a68 00 songLength .byte $00 ->386a69 06 InitialSpeed .byte $06 ->386a6a 00 hasSlowTimer .byte $00 ;BOOL $00 = False, $01 = True -.386a6b RAD_INIT_PLAYER -.386a6b 22 b1 30 38 jsl $3830b1 JSL OPL2_INIT ; Init OPL2 -.386a6f 20 97 6c jsr $386c97 JSR RAD_ALL_NOTES_OFF -.386a72 a2 00 00 ldx #$0000 LDX #0 -.386a75 a9 00 lda #$00 LDA #0 -.386a77 RI_RESET -.386a77 9f 00 00 39 sta $390000,x STA PATTERNS,X -.386a7b e8 inx INX -.386a7c d0 f9 bne $386a77 BNE RI_RESET -.386a7e c2 30 rep #$30 REP #$30 ; set A&X long -.386a80 a9 00 80 lda #$8000 LDA #<>RAD_FILE_TEMP ; Set the Pointer where the File Begins -.386a83 85 08 sta $08 STA OPL2_ADDY_PTR_LO; -.386a85 a9 37 00 lda #$0037 LDA #<`RAD_FILE_TEMP -.386a88 85 0a sta $0a STA OPL2_ADDY_PTR_HI; -.386a8a e2 20 sep #$20 SEP #$20 ; set A short -.386a8c a0 10 00 ldy #$0010 LDY #$0010 -.386a8f b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386a91 c9 10 cmp #$10 CMP #$10 ; BCD version 1.0 or 2.1 -.386a93 d0 05 bne $386a9a BNE RI_LOAD_VERSION_21 -.386a95 22 f7 6a 38 jsl $386af7 JSL READ_VERSION_10 -.386a99 6b rtl RTL ; End of RAD_INIT_PLAYER -.386a9a RI_LOAD_VERSION_21 -.386a9a c9 21 cmp #$21 CMP #$21 -.386a9c d0 04 bne $386aa2 BNE RI_INVALID -.386a9e 22 a3 6a 38 jsl $386aa3 JSL READ_VERSION_21 -.386aa2 RI_INVALID -.386aa2 6b rtl RTL ; End of RAD_INIT_PLAYER -.386aa3 READ_VERSION_21 -.386aa3 a9 02 lda #$02 LDA #2 -.386aa5 8f 67 6a 38 sta $386a67 STA @lTuneInfo.version -.386aa9 20 b0 6a jsr $386ab0 JSR READ_TIMER -.386aac 20 82 6b jsr $386b82 JSR PARSER_RAD_FILE_INSTRUMENT_21; Parse the Instrument -.386aaf 6b rtl RTL ; End of READ_VERSION_21 -.386ab0 READ_TIMER -.386ab0 a0 11 00 ldy #$0011 LDY #$11 -.386ab3 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386ab5 89 40 bit #$40 BIT #$40 -.386ab7 f0 17 beq $386ad0 BEQ RT_NOT_SLOW -.386ab9 a9 01 lda #$01 LDA #1 -.386abb 8f 6a 6a 38 sta $386a6a STA @lTuneInfo.hasSlowTimer -.386abf a9 0f lda #$0f LDA #SLOW_TIMER -.386ac6 8d 66 01 sta $0166 STA TIMER0_CMP_M -.386ac9 a9 0c lda #$0c LDA #<`SLOW_TIMER -.386acb 8d 67 01 sta $0167 STA TIMER0_CMP_H -.386ace 80 23 bra $386af3 BRA SET_TIMER -.386ad0 RT_NOT_SLOW -.386ad0 89 20 bit #$20 BIT #$20 -.386ad2 f0 0a beq $386ade BEQ RT_NOT_BPM -.386ad4 c8 iny INY -.386ad5 c2 20 rep #$20 REP #$20 ; set A long -.386ad7 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386ad9 e2 20 sep #$20 SEP #$20 ; set A short -.386adb c8 iny INY -.386adc 80 15 bra $386af3 BRA SET_TIMER -.386ade RT_NOT_BPM -.386ade a9 00 lda #$00 LDA #0 -.386ae0 8f 6a 6a 38 sta $386a6a STA @lTuneInfo.hasSlowTimer -.386ae4 a9 98 lda #$98 LDA #FIFTY_HZ_COUNT -.386aeb 8d 66 01 sta $0166 STA TIMER0_CMP_M -.386aee a9 04 lda #$04 LDA #<`FIFTY_HZ_COUNT -.386af0 8d 67 01 sta $0167 STA TIMER0_CMP_H -.386af3 SET_TIMER -.386af3 20 0f 65 jsr $38650f JSR INIT_TIMER0 -.386af6 60 rts RTS -.386af7 READ_VERSION_10 -.386af7 a9 01 lda #$01 LDA #1 -.386af9 8f 67 6a 38 sta $386a67 STA @lTuneInfo.version -.386afd 20 15 6b jsr $386b15 JSR PARSER_RAD_FILE_INSTRUMENT_10; Parse the Instrument -.386b00 20 95 6b jsr $386b95 JSR PROCESS_ORDER_LIST_10 ; Parse the Order List -.386b03 20 ba 6b jsr $386bba JSR READ_PATTERNS_10 -.386b06 20 b0 6a jsr $386ab0 JSR READ_TIMER -.386b09 6b rtl RTL ; End of READ_VERSION_10 ->386b0a 07 01 08 02 09 03 0a 04 ADLIB_OFFSETS .byte 7,1,8,2,9,3,10,4,5,11,6 ->386b12 05 0b 06 -.386b15 PARSER_RAD_FILE_INSTRUMENT_10 -.386b15 c8 iny INY ; $11 bit 7: description, bit6: slow timer, bits4..0: speed -.386b16 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386b18 29 1f and #$1f AND #$1F -.386b1a 8f 69 6a 38 sta $386a69 STA @lTuneInfo.InitialSpeed +>386ac5 43 90 44 91 45 46 92 47 note_array .byte $43, $90, $44, $91, $45, $46, $92, $47, $93, $41, $94, $42, $43 +>386acd 93 41 94 42 43 +.386ad2 TuneInfo +>386ad2 00 version .byte $00 ; bit 1 is RAD 1, bit 2 is RAD 2 +>386ad3 00 songLength .byte $00 +>386ad4 06 InitialSpeed .byte $06 +>386ad5 00 hasSlowTimer .byte $00 ;BOOL $00 = False, $01 = True +.386ad6 RAD_INIT_PLAYER +.386ad6 22 b1 30 38 jsl $3830b1 JSL OPL3_INIT ; Init OPL3 +.386ada 20 02 6d jsr $386d02 JSR RAD_ALL_NOTES_OFF +.386add a2 00 00 ldx #$0000 LDX #0 +.386ae0 a9 00 lda #$00 LDA #0 +.386ae2 RI_RESET +.386ae2 9f 00 00 39 sta $390000,x STA PATTERNS,X +.386ae6 e8 inx INX +.386ae7 d0 f9 bne $386ae2 BNE RI_RESET +.386ae9 c2 30 rep #$30 REP #$30 ; set A&X long +.386aeb a9 00 80 lda #$8000 LDA #<>RAD_FILE_TEMP ; Set the Pointer where the File Begins +.386aee 85 08 sta $08 STA OPL2_ADDY_PTR_LO; +.386af0 a9 37 00 lda #$0037 LDA #<`RAD_FILE_TEMP +.386af3 85 0a sta $0a STA OPL2_ADDY_PTR_HI; +.386af5 e2 20 sep #$20 SEP #$20 ; set A short +.386af7 a0 10 00 ldy #$0010 LDY #$0010 +.386afa b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386afc c9 10 cmp #$10 CMP #$10 ; BCD version 1.0 or 2.1 +.386afe d0 05 bne $386b05 BNE RI_LOAD_VERSION_21 +.386b00 22 62 6b 38 jsl $386b62 JSL READ_VERSION_10 +.386b04 6b rtl RTL ; End of RAD_INIT_PLAYER +.386b05 RI_LOAD_VERSION_21 +.386b05 c9 21 cmp #$21 CMP #$21 +.386b07 d0 04 bne $386b0d BNE RI_INVALID +.386b09 22 0e 6b 38 jsl $386b0e JSL READ_VERSION_21 +.386b0d RI_INVALID +.386b0d 6b rtl RTL ; End of RAD_INIT_PLAYER +.386b0e READ_VERSION_21 +.386b0e a9 02 lda #$02 LDA #2 +.386b10 8f d2 6a 38 sta $386ad2 STA @lTuneInfo.version +.386b14 20 1b 6b jsr $386b1b JSR READ_TIMER +.386b17 20 ed 6b jsr $386bed JSR PARSER_RAD_FILE_INSTRUMENT_21; Parse the Instrument +.386b1a 6b rtl RTL ; End of READ_VERSION_21 +.386b1b READ_TIMER +.386b1b a0 11 00 ldy #$0011 LDY #$11 .386b1e b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386b20 29 80 and #$80 AND #$80 -.386b22 f0 07 beq $386b2b BEQ READ_INSTR_DATA -.386b24 Not_Done_With_Description -.386b24 c8 iny INY ; Move the Pointer Forward -.386b25 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386b27 c9 00 cmp #$00 CMP #$00 ; Check for the End of Text -.386b29 d0 f9 bne $386b24 BNE Not_Done_With_Description -.386b2b READ_INSTR_DATA -.386b2b c8 iny INY ; This points after either After Description or next to Offset 0x11 -.386b2c a9 38 lda #$38 LDA #<`INSTRUMENT_ACCORDN -.386b2e 85 f2 sta $f2 STA RAD_ADDR + 2 -.386b30 ProcessNextInstruments_10 -.386b30 e2 20 sep #$20 SEP #$20 ; set A short -.386b32 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Instrument Number -.386b34 f0 4a beq $386b80 BEQ DoneProcessingInstrument_10 -.386b36 c2 20 rep #$20 REP #$20 ; set A long -.386b38 3a dec a DEC A -.386b39 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386b3d a9 16 00 lda #$0016 LDA #INSTR_REC_LEN -.386b40 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386b44 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT ; not sure why this one requires a long address - bank is still 0 -.386b48 18 clc CLC -.386b49 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN -.386b4c 85 f0 sta $f0 STA RAD_ADDR -.386b4e a9 00 00 lda #$0000 LDA #0 -.386b51 e2 20 sep #$20 SEP #$20 ; set A short -.386b53 c8 iny INY -.386b54 64 4e stz $4e STZ RAD_TEMP -.386b56 87 f0 sta [$f0] STA [RAD_ADDR] ; Not a drum instrument -.386b58 Transfer_Instrument_Info -.386b58 a6 4e ldx $4e LDX RAD_TEMP -.386b5a bf 0a 6b 38 lda $386b0a,x LDA ADLIB_OFFSETS,X ; RAD uses a different order for registers -.386b5e aa tax TAX -.386b5f b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Register -.386b61 5a phy PHY -.386b62 9b txy TXY -.386b63 97 f0 sta [$f0],y STA [RAD_ADDR],Y ; Write to the instrument table -.386b65 7a ply PLY -.386b66 c8 iny INY -.386b67 e6 4e inc $4e INC RAD_TEMP -.386b69 a5 4e lda $4e LDA RAD_TEMP -.386b6b c9 0b cmp #$0b CMP #11 -.386b6d 90 e9 bcc $386b58 BCC Transfer_Instrument_Info -.386b6f 5a phy PHY ; store the position in the file on the stack -.386b70 a0 0c 00 ldy #$000c LDY #12 ; beginning of text -.386b73 a9 20 lda #$20 LDA #$20 -.386b75 BLANK_INSTR_DESCR -.386b75 97 f0 sta [$f0],y STA [RAD_ADDR],Y -.386b77 c8 iny INY -.386b78 c0 16 00 cpy #$0016 CPY #22 -.386b7b d0 f8 bne $386b75 BNE BLANK_INSTR_DESCR -.386b7d 7a ply PLY -.386b7e 80 b0 bra $386b30 BRA ProcessNextInstruments_10 -.386b80 DoneProcessingInstrument_10 -.386b80 c8 iny INY -.386b81 60 rts RTS -.386b82 PARSER_RAD_FILE_INSTRUMENT_21 -.386b82 PR_LOOP -.386b82 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386b84 c8 iny INY -.386b85 c9 00 cmp #$00 CMP #0 -.386b87 d0 f9 bne $386b82 BNE PR_LOOP -.386b89 a9 38 lda #$38 LDA #<`INSTRUMENT_ACCORDN -.386b8b 85 f2 sta $f2 STA RAD_ADDR + 2 -.386b8d ProcessNextInstruments_21 -.386b8d e2 20 sep #$20 SEP #$20 ; set A short -.386b8f b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Instrument Number -.386b91 f0 00 beq $386b93 BEQ DoneProcessingInstrument_21 -.386b93 DoneProcessingInstrument_21 -.386b93 c8 iny INY -.386b94 60 rts RTS -.386b95 PROCESS_ORDER_LIST_10 -.386b95 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Song Length -.386b97 8f 68 6a 38 sta $386a68 STA @lTuneInfo.songLength -.386b9b aa tax TAX -.386b9c c8 iny INY -.386b9d c2 20 rep #$20 REP #$20 ; set A long -.386b9f a9 24 fc lda #$fc24 LDA #<>ORDERS -.386ba2 85 f0 sta $f0 STA RAD_ADDR -.386ba4 a9 39 00 lda #$0039 LDA #<`ORDERS -.386ba7 85 f2 sta $f2 STA RAD_ADDR + 2 -.386ba9 e2 20 sep #$20 SEP #$20 ; set A short -.386bab READ_ORDER -.386bab b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386bad c8 iny INY -.386bae 87 f0 sta [$f0] STA [RAD_ADDR] -.386bb0 e6 f0 inc $f0 INC RAD_ADDR -.386bb2 b0 02 bcs $386bb6 BCS ORDER_CONTINUE -.386bb4 e6 f1 inc $f1 INC RAD_ADDR + 1 -.386bb6 ORDER_CONTINUE -.386bb6 ca dex DEX -.386bb7 d0 f2 bne $386bab BNE READ_ORDER -.386bb9 60 rts RTS -.386bba READ_PATTERNS_10 -.386bba 64 f3 stz $f3 STZ RAD_PATTRN -.386bbc a9 39 lda #$39 LDA #<`PATTERNS -.386bbe 85 f6 sta $f6 STA RAD_PTN_DEST + 2 -.386bc0 NEXT_PATTERN -.386bc0 c2 20 rep #$20 REP #$20 ; set A long -.386bc2 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386bc4 f0 1f beq $386be5 BEQ SKIP_PATTERN -.386bc6 5a phy PHY -.386bc7 a8 tay TAY -.386bc8 a5 f3 lda $f3 LDA RAD_PATTRN -.386bca 29 ff 00 and #$00ff AND #$00FF -.386bcd 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386bd1 a9 01 07 lda #$0701 LDA #PATTERN_BYTES -.386bd4 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386bd8 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.386bdc 1a inc a INC A ; skip the pattern byte -.386bdd 85 f4 sta $f4 STA RAD_PTN_DEST -.386bdf e2 20 sep #$20 SEP #$20 ; set A short -.386be1 20 f2 6b jsr $386bf2 JSR READ_PATTERN_10 -.386be4 7a ply PLY -.386be5 SKIP_PATTERN -.386be5 c8 iny INY -.386be6 c8 iny INY -.386be7 e2 20 sep #$20 SEP #$20 ; set A short -.386be9 e6 f3 inc $f3 INC RAD_PATTRN -.386beb a5 f3 lda $f3 LDA RAD_PATTRN -.386bed c9 20 cmp #$20 CMP #32 -.386bef d0 cf bne $386bc0 BNE NEXT_PATTERN -.386bf1 60 rts RTS -.386bf2 READ_PATTERN_10 -.386bf2 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; read the line number - bit 7 indicates the last line -.386bf4 8f 42 00 00 sta $000042 STA @lRAD_LINE -.386bf8 c8 iny INY -.386bf9 c2 20 rep #$20 REP #$20 ; set A long -.386bfb 29 7f 00 and #$007f AND #$7F -.386bfe 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386c02 a9 1c 00 lda #$001c LDA #LINE_BYTES -.386c05 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386c09 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.386c0d 1a inc a INC A ; skip the line number -.386c0e 8f fa 00 00 sta $0000fa STA @lRAD_LINE_PTR -.386c12 e2 20 sep #$20 SEP #$20 ; set A short -.386c14 READ_NOTE -.386c14 a6 fa ldx $fa LDX RAD_LINE_PTR ; X contains the offset in the destination memory -.386c16 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; channel - bit 7 indicates the last note +.386b20 89 40 bit #$40 BIT #$40 +.386b22 f0 17 beq $386b3b BEQ RT_NOT_SLOW +.386b24 a9 01 lda #$01 LDA #1 +.386b26 8f d5 6a 38 sta $386ad5 STA @lTuneInfo.hasSlowTimer +.386b2a a9 0f lda #$0f LDA #SLOW_TIMER +.386b31 8d 66 01 sta $0166 STA TIMER0_CMP_M +.386b34 a9 0c lda #$0c LDA #<`SLOW_TIMER +.386b36 8d 67 01 sta $0167 STA TIMER0_CMP_H +.386b39 80 23 bra $386b5e BRA SET_TIMER +.386b3b RT_NOT_SLOW +.386b3b 89 20 bit #$20 BIT #$20 +.386b3d f0 0a beq $386b49 BEQ RT_NOT_BPM +.386b3f c8 iny INY +.386b40 c2 20 rep #$20 REP #$20 ; set A long +.386b42 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386b44 e2 20 sep #$20 SEP #$20 ; set A short +.386b46 c8 iny INY +.386b47 80 15 bra $386b5e BRA SET_TIMER +.386b49 RT_NOT_BPM +.386b49 a9 00 lda #$00 LDA #0 +.386b4b 8f d5 6a 38 sta $386ad5 STA @lTuneInfo.hasSlowTimer +.386b4f a9 98 lda #$98 LDA #FIFTY_HZ_COUNT +.386b56 8d 66 01 sta $0166 STA TIMER0_CMP_M +.386b59 a9 04 lda #$04 LDA #<`FIFTY_HZ_COUNT +.386b5b 8d 67 01 sta $0167 STA TIMER0_CMP_H +.386b5e SET_TIMER +.386b5e 20 7a 65 jsr $38657a JSR INIT_TIMER0 +.386b61 60 rts RTS +.386b62 READ_VERSION_10 +.386b62 a9 01 lda #$01 LDA #1 +.386b64 8f d2 6a 38 sta $386ad2 STA @lTuneInfo.version +.386b68 20 80 6b jsr $386b80 JSR PARSER_RAD_FILE_INSTRUMENT_10; Parse the Instrument +.386b6b 20 00 6c jsr $386c00 JSR PROCESS_ORDER_LIST_10 ; Parse the Order List +.386b6e 20 25 6c jsr $386c25 JSR READ_PATTERNS_10 +.386b71 20 1b 6b jsr $386b1b JSR READ_TIMER +.386b74 6b rtl RTL ; End of READ_VERSION_10 +>386b75 07 01 08 02 09 03 0a 04 ADLIB_OFFSETS .byte 7,1,8,2,9,3,10,4,5,11,6 +>386b7d 05 0b 06 +.386b80 PARSER_RAD_FILE_INSTRUMENT_10 +.386b80 c8 iny INY ; $11 bit 7: description, bit6: slow timer, bits4..0: speed +.386b81 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386b83 29 1f and #$1f AND #$1F +.386b85 8f d4 6a 38 sta $386ad4 STA @lTuneInfo.InitialSpeed +.386b89 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386b8b 29 80 and #$80 AND #$80 +.386b8d f0 07 beq $386b96 BEQ READ_INSTR_DATA +.386b8f Not_Done_With_Description +.386b8f c8 iny INY ; Move the Pointer Forward +.386b90 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386b92 c9 00 cmp #$00 CMP #$00 ; Check for the End of Text +.386b94 d0 f9 bne $386b8f BNE Not_Done_With_Description +.386b96 READ_INSTR_DATA +.386b96 c8 iny INY ; This points after either After Description or next to Offset 0x11 +.386b97 a9 38 lda #$38 LDA #<`INSTRUMENT_ACCORDN +.386b99 85 f2 sta $f2 STA RAD_ADDR + 2 +.386b9b ProcessNextInstruments_10 +.386b9b e2 20 sep #$20 SEP #$20 ; set A short +.386b9d b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Instrument Number +.386b9f f0 4a beq $386beb BEQ DoneProcessingInstrument_10 +.386ba1 c2 20 rep #$20 REP #$20 ; set A long +.386ba3 3a dec a DEC A +.386ba4 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.386ba8 a9 16 00 lda #$0016 LDA #INSTR_REC_LEN +.386bab 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.386baf af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT ; not sure why this one requires a long address - bank is still 0 +.386bb3 18 clc CLC +.386bb4 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN +.386bb7 85 f0 sta $f0 STA RAD_ADDR +.386bb9 a9 00 00 lda #$0000 LDA #0 +.386bbc e2 20 sep #$20 SEP #$20 ; set A short +.386bbe c8 iny INY +.386bbf 64 4e stz $4e STZ RAD_TEMP +.386bc1 87 f0 sta [$f0] STA [RAD_ADDR] ; Not a drum instrument +.386bc3 Transfer_Instrument_Info +.386bc3 a6 4e ldx $4e LDX RAD_TEMP +.386bc5 bf 75 6b 38 lda $386b75,x LDA ADLIB_OFFSETS,X ; RAD uses a different order for registers +.386bc9 aa tax TAX +.386bca b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Register +.386bcc 5a phy PHY +.386bcd 9b txy TXY +.386bce 97 f0 sta [$f0],y STA [RAD_ADDR],Y ; Write to the instrument table +.386bd0 7a ply PLY +.386bd1 c8 iny INY +.386bd2 e6 4e inc $4e INC RAD_TEMP +.386bd4 a5 4e lda $4e LDA RAD_TEMP +.386bd6 c9 0b cmp #$0b CMP #11 +.386bd8 90 e9 bcc $386bc3 BCC Transfer_Instrument_Info +.386bda 5a phy PHY ; store the position in the file on the stack +.386bdb a0 0c 00 ldy #$000c LDY #12 ; beginning of text +.386bde a9 20 lda #$20 LDA #$20 +.386be0 BLANK_INSTR_DESCR +.386be0 97 f0 sta [$f0],y STA [RAD_ADDR],Y +.386be2 c8 iny INY +.386be3 c0 16 00 cpy #$0016 CPY #22 +.386be6 d0 f8 bne $386be0 BNE BLANK_INSTR_DESCR +.386be8 7a ply PLY +.386be9 80 b0 bra $386b9b BRA ProcessNextInstruments_10 +.386beb DoneProcessingInstrument_10 +.386beb c8 iny INY +.386bec 60 rts RTS +.386bed PARSER_RAD_FILE_INSTRUMENT_21 +.386bed PR_LOOP +.386bed b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386bef c8 iny INY +.386bf0 c9 00 cmp #$00 CMP #0 +.386bf2 d0 f9 bne $386bed BNE PR_LOOP +.386bf4 a9 38 lda #$38 LDA #<`INSTRUMENT_ACCORDN +.386bf6 85 f2 sta $f2 STA RAD_ADDR + 2 +.386bf8 ProcessNextInstruments_21 +.386bf8 e2 20 sep #$20 SEP #$20 ; set A short +.386bfa b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Instrument Number +.386bfc f0 00 beq $386bfe BEQ DoneProcessingInstrument_21 +.386bfe DoneProcessingInstrument_21 +.386bfe c8 iny INY +.386bff 60 rts RTS +.386c00 PROCESS_ORDER_LIST_10 +.386c00 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; Read Song Length +.386c02 8f d3 6a 38 sta $386ad3 STA @lTuneInfo.songLength +.386c06 aa tax TAX +.386c07 c8 iny INY +.386c08 c2 20 rep #$20 REP #$20 ; set A long +.386c0a a9 24 fc lda #$fc24 LDA #<>ORDERS +.386c0d 85 f0 sta $f0 STA RAD_ADDR +.386c0f a9 39 00 lda #$0039 LDA #<`ORDERS +.386c12 85 f2 sta $f2 STA RAD_ADDR + 2 +.386c14 e2 20 sep #$20 SEP #$20 ; set A short +.386c16 READ_ORDER +.386c16 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y .386c18 c8 iny INY -.386c19 8f f9 00 00 sta $0000f9 STA @lRAD_LAST_NOTE -.386c1d 29 0f and #$0f AND #$F -.386c1f 8f f7 00 00 sta $0000f7 STA @lRAD_CHANNEL -.386c23 c2 20 rep #$20 REP #$20 ; set A long -.386c25 8a txa TXA -.386c26 18 clc CLC -.386c27 65 f7 adc $f7 ADC RAD_CHANNEL ; multiply channel by 3 -.386c29 65 f7 adc $f7 ADC RAD_CHANNEL -.386c2b 65 f7 adc $f7 ADC RAD_CHANNEL -.386c2d aa tax TAX -.386c2e e2 20 sep #$20 SEP #$20 ; set A short -.386c30 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; note / octave -.386c32 5a phy PHY -.386c33 9b txy TXY -.386c34 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y -.386c36 7a ply PLY -.386c37 c8 iny INY -.386c38 e8 inx INX -.386c39 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; instrument/effect -.386c3b 5a phy PHY -.386c3c 9b txy TXY -.386c3d 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y -.386c3f 7a ply PLY -.386c40 c8 iny INY -.386c41 e8 inx INX -.386c42 29 0f and #$0f AND #$F -.386c44 f0 09 beq $386c4f BEQ CHECK_LASTNOTE -.386c46 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; effect parameter -.386c48 5a phy PHY -.386c49 9b txy TXY -.386c4a 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y -.386c4c 7a ply PLY -.386c4d c8 iny INY -.386c4e e8 inx INX -.386c4f CHECK_LASTNOTE -.386c4f af f9 00 00 lda $0000f9 LDA @lRAD_LAST_NOTE -.386c53 10 bf bpl $386c14 BPL READ_NOTE -.386c55 af 42 00 00 lda $000042 LDA @lRAD_LINE -.386c59 10 97 bpl $386bf2 BPL READ_PATTERN_10 -.386c5b 60 rts RTS -.386c5c DRAW_BLANKS -.386c5c 5a phy PHY -.386c5d da phx PHX -.386c5e a2 12 00 ldx #$0012 LDX #18 -.386c61 a0 00 00 ldy #$0000 LDY #0 -.386c64 a9 2d lda #$2d LDA #'-' -.386c66 BL_NEXT -.386c66 97 0c sta [$0c],y STA [SCREENBEGIN], Y -.386c68 c8 iny INY -.386c69 ca dex DEX -.386c6a d0 fa bne $386c66 BNE BL_NEXT -.386c6c fa plx PLX -.386c6d 7a ply PLY -.386c6e 60 rts RTS -.386c6f DISPLAY_RAD_PTN_DEST -.386c6f 5a phy PHY -.386c70 a5 f6 lda $f6 LDA RAD_PTN_DEST+2 -.386c72 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386c75 c8 iny INY -.386c76 c8 iny INY -.386c77 a5 f5 lda $f5 LDA RAD_PTN_DEST+1 -.386c79 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386c7c c8 iny INY -.386c7d c8 iny INY -.386c7e a5 f4 lda $f4 LDA RAD_PTN_DEST -.386c80 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386c83 7a ply PLY -.386c84 60 rts RTS -.386c85 WRITE_A_LNG -.386c85 48 pha PHA -.386c86 48 pha PHA -.386c87 e2 20 sep #$20 SEP #$20 ; set A short -.386c89 68 pla PLA -.386c8a 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386c8d 88 dey DEY -.386c8e 88 dey DEY -.386c8f 68 pla PLA -.386c90 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386c93 c2 20 rep #$20 REP #$20 ; set A long -.386c95 68 pla PLA -.386c96 60 rts RTS -.386c97 RAD_ALL_NOTES_OFF -.386c97 5a phy PHY -.386c98 c2 20 rep #$20 REP #$20 ; set A long -.386c9a a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE -.386c9d 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386c9f a9 af 00 lda #$00af LDA #`OPL3_R_BASE -.386ca2 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 -.386ca4 e2 20 sep #$20 SEP #$20 ; set A short -.386ca6 a0 a0 00 ldy #$00a0 LDY #$A0 -.386ca9 a9 00 lda #$00 LDA #0 -.386cab NEXT_NOTE_OFF -.386cab 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386cad c8 iny INY -.386cae c0 b9 00 cpy #$00b9 CPY #$B9 -.386cb1 d0 f8 bne $386cab BNE NEXT_NOTE_OFF -.386cb3 7a ply PLY -.386cb4 60 rts RTS -.386cb5 RAD_PLAYNOTES -.386cb5 5a phy PHY -.386cb6 20 5c 6c jsr $386c5c JSR DRAW_BLANKS -.386cb9 c2 20 rep #$20 REP #$20 ; set A long -.386cbb af 18 0f 38 lda $380f18 LDA PATTERN_NUM -.386cbf 29 ff 00 and #$00ff AND #$FF -.386cc2 3a dec a DEC A ; start at 0 -.386cc3 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386cc7 a9 01 07 lda #$0701 LDA #PATTERN_BYTES -.386cca 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386cce af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.386cd2 1a inc a INC A ; skip the pattern number byte -.386cd3 85 f4 sta $f4 STA RAD_PTN_DEST -.386cd5 e2 20 sep #$20 SEP #$20 ; set A short -.386cd7 a9 39 lda #$39 LDA #<`PATTERNS -.386cd9 85 f6 sta $f6 STA RAD_PTN_DEST + 2 -.386cdb a0 a0 00 ldy #$00a0 LDY #SCREEN_WIDTH * 2 -.386cde 20 6f 6c jsr $386c6f JSR DISPLAY_RAD_PTN_DEST ; display the address of the pattern -.386ce1 c2 20 rep #$20 REP #$20 ; set A long -.386ce3 a5 6c lda $6c LDA LINE_NUM_HEX -.386ce5 29 7f 00 and #$007f AND #$7F -.386ce8 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A -.386cec a9 1c 00 lda #$001c LDA #LINE_BYTES -.386cef 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B -.386cf3 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT -.386cf7 1a inc a INC A ; skip the line number byte -.386cf8 a0 52 00 ldy #$0052 LDY #SCREEN_WIDTH + 2 -.386cfb 20 85 6c jsr $386c85 JSR WRITE_A_LNG ; display the line offset from the pattern address -.386cfe a8 tay TAY ; Y contains the line offset -.386cff a9 00 00 lda #$0000 LDA #0 -.386d02 e2 20 sep #$20 SEP #$20 ; set A short -.386d04 64 28 stz $28 STZ OPL2_REG_REGION -.386d06 PN_NEXT_NOTE -.386d06 8f 27 00 00 sta $000027 STA @lOPL2_CHANNEL -.386d0a aa tax TAX -.386d0b bf b2 68 38 lda $3868b2,x LDA CHANNELS,X -.386d0f d0 05 bne $386d16 BNE PN_PLAY_NOTE -.386d11 c8 iny INY ; skip the channel data -.386d12 c8 iny INY -.386d13 c8 iny INY -.386d14 80 58 bra $386d6e BRA PN_CONTINUE -.386d16 PN_PLAY_NOTE -.386d16 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; octave/note -.386d18 29 7f and #$7f AND #$7F -.386d1a 20 d5 6e jsr $386ed5 JSR RAD_WRITE_OCT_NOTE -.386d1d b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; bit 7 is bit 4 of the instrument number -.386d1f 29 80 and #$80 AND #$80 -.386d21 4a lsr a LSR A -.386d22 4a lsr a LSR A -.386d23 4a lsr a LSR A -.386d24 85 4e sta $4e STA RAD_TEMP -.386d26 c8 iny INY -.386d27 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; instrument/effect -.386d29 29 f0 and #$f0 AND #$F0 -.386d2b 4a lsr a LSR A -.386d2c 4a lsr a LSR A -.386d2d 4a lsr a LSR A -.386d2e 4a lsr a LSR A -.386d2f 65 4e adc $4e ADC RAD_TEMP -.386d31 f0 14 beq $386d47 BEQ SKIP_INSTRUMENT -.386d33 3a dec a DEC A ; instruments are starting at 0 -.386d34 8f 6a 00 00 sta $00006a STA @lINSTR_NUMBER -.386d38 5a phy PHY -.386d39 a6 27 ldx $27 LDX OPL2_CHANNEL -.386d3b a9 00 lda #$00 LDA #0 -.386d3d eb xba XBA -.386d3e bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X -.386d42 aa tax TAX -.386d43 20 4e 65 jsr $38654e JSR LOAD_INSTRUMENT -.386d46 7a ply PLY -.386d47 SKIP_INSTRUMENT -.386d47 af 30 00 00 lda $000030 LDA @lOPL2_NOTE -.386d4b f0 11 beq $386d5e BEQ SKIP_NOTE ; if the note is 0, don't play anything. -.386d4d c9 0f cmp #$0f CMP #$0F ; NOTE OFF -.386d4f f0 2b beq $386d7c BEQ RAD_NOTE_OFF -.386d51 c2 20 rep #$20 REP #$20 ; set A long -.386d53 5a phy PHY -.386d54 20 f5 37 jsr $3837f5 JSR OPL2_GET_REG_OFFSET -.386d57 22 01 32 38 jsl $383201 JSL OPL2_PLAYNOTE -.386d5b 7a ply PLY -.386d5c e2 20 sep #$20 SEP #$20 ; set A short -.386d5e SKIP_NOTE -.386d5e a9 00 lda #$00 LDA #0 -.386d60 eb xba XBA -.386d61 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; instrument/effect -.386d63 c8 iny INY -.386d64 29 0f and #$0f AND #$F -.386d66 f0 05 beq $386d6d BEQ SKIP_EFFECT -.386d68 0a asl a ASL A ; double bytes -.386d69 aa tax TAX -.386d6a fc 8d 6d jsr ($386d8d,x) JSR (RAD_EFFECT_TABLE,X) -.386d6d SKIP_EFFECT -.386d6d c8 iny INY -.386d6e PN_CONTINUE -.386d6e a9 00 lda #$00 LDA #0 ; clear B -.386d70 eb xba XBA -.386d71 af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL -.386d75 1a inc a INC A -.386d76 c9 09 cmp #$09 CMP #9 -.386d78 d0 8c bne $386d06 BNE PN_NEXT_NOTE -.386d7a 7a ply PLY -.386d7b 60 rts RTS -.386d7c RAD_NOTE_OFF -.386d7c af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL -.386d80 18 clc CLC -.386d81 69 b0 adc #$b0 ADC #$B0 -.386d83 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386d85 a9 00 lda #$00 LDA #0 -.386d87 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386d89 c8 iny INY -.386d8a c8 iny INY -.386d8b 80 e1 bra $386d6e BRA PN_CONTINUE -.386d8d RAD_EFFECT_TABLE ->386d8d ad 6d .word <>RAD_EFFECT_NONE ; 00 ->386d8f 20 6e .word <>RAD_EFFECT_NOTE_SLIDE_UP ; 01 ->386d91 20 6e .word <>RAD_EFFECT_NOTE_SLIDE_DOWN ; 02 ->386d93 ad 6d .word <>RAD_EFFECT_NOTE_SLIDE_TO ; 03 ->386d95 ad 6d .word <>RAD_NOOP ->386d97 ad 6d .word <>RAD_EFFECT_NOTE_SLIDE_VOLUME ; 05 ->386d99 ad 6d .word <>RAD_NOOP ->386d9b ad 6d .word <>RAD_NOOP ->386d9d ad 6d .word <>RAD_NOOP ->386d9f ad 6d .word <>RAD_NOOP ->386da1 ae 6d .word <>RAD_EFFECT_VOLUME_SLIDE ; 0A ->386da3 ad 6d .word <>RAD_NOOP ->386da5 96 6e .word <>RAD_EFFECT_SET_VOLUME ; 0C ->386da7 05 6e .word <>RAD_EFFECT_PATTERN_BREAK ; 0D ->386da9 ad 6d .word <>RAD_NOOP ->386dab 16 6e .word <>RAD_EFFECT_SET_SPEED ; 0F -.386dad RAD_NOOP -.386dad RAD_EFFECT_NONE -.386dad RAD_EFFECT_NOTE_SLIDE_TO -.386dad RAD_EFFECT_NOTE_SLIDE_VOLUME -.386dad 60 rts RTS -.386dae RAD_EFFECT_VOLUME_SLIDE -.386dae 5a phy PHY -.386daf b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; store value of the effect in RAD_CHANNE_EFFCT -.386db1 85 4c sta $4c STA RAD_CHANNE_EFFCT -.386db3 c2 20 rep #$20 REP #$20 ; set A long -.386db5 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE -.386db8 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386dba a9 af 00 lda #$00af LDA #`OPL3_R_BASE -.386dbd 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 -.386dbf e2 30 sep #$30 SEP #$30 ; set A&X short -.386dc1 a5 27 lda $27 LDA OPL2_CHANNEL -.386dc3 aa tax TAX -.386dc4 bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X -.386dc8 18 clc CLC -.386dc9 69 40 adc #$40 ADC #$40 -.386dcb a8 tay TAY -.386dcc b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; volume -.386dce 48 pha PHA -.386dcf 29 3f and #$3f AND #$3F -.386dd1 18 clc CLC -.386dd2 65 4c adc $4c ADC RAD_CHANNE_EFFCT ; check for values greater than 50 -.386dd4 c9 40 cmp #$40 CMP #$40 ; if there's an overflow, use #$3F (low volume) -.386dd6 90 02 bcc $386dda BCC NO_OVERFLOW_0 -.386dd8 a9 3f lda #$3f LDA #$3F -.386dda NO_OVERFLOW_0 -.386dda 29 3f and #$3f AND #$3F -.386ddc 85 4e sta $4e STA RAD_TEMP -.386dde 68 pla PLA -.386ddf 29 c0 and #$c0 AND #$C0 -.386de1 05 4e ora $4e ORA RAD_TEMP -.386de3 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386de5 c8 iny INY -.386de6 c8 iny INY -.386de7 c8 iny INY -.386de8 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; volume -.386dea 48 pha PHA -.386deb 29 3f and #$3f AND #$3F -.386ded 18 clc CLC -.386dee 65 4c adc $4c ADC RAD_CHANNE_EFFCT -.386df0 c9 40 cmp #$40 CMP #$40 ; if there's an overflow, use #$3F (low volume) -.386df2 90 02 bcc $386df6 BCC NO_OVERFLOW_1 -.386df4 a9 3f lda #$3f LDA #$3F -.386df6 NO_OVERFLOW_1 -.386df6 29 3f and #$3f AND #$3F -.386df8 85 4e sta $4e STA RAD_TEMP -.386dfa 68 pla PLA -.386dfb 29 c0 and #$c0 AND #$C0 -.386dfd 05 4e ora $4e ORA RAD_TEMP -.386dff 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386e01 c2 10 rep #$10 REP #$10 ; set X long -.386e03 7a ply PLY -.386e04 60 rts RTS -.386e05 RAD_EFFECT_PATTERN_BREAK -.386e05 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter -.386e07 3a dec a DEC A ; DECREMENT by 1, because the next timer interrupt will increment at the beginning -.386e08 85 6c sta $6c STA LINE_NUM_HEX -.386e0a a9 00 lda #$00 LDA #0 ; convert the effect to a decimal line number -.386e0c 8f 19 0f 38 sta $380f19 STA @lLINE_NUM_DEC -.386e10 20 9a 64 jsr $38649a JSR INCREMENT_ORDER -.386e13 7a ply PLY ; don't return to the calling method, return to the parent -.386e14 7a ply PLY -.386e15 60 rts RTS -.386e16 RAD_EFFECT_SET_SPEED -.386e16 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter -.386e18 8f 69 6a 38 sta $386a69 STA @lTuneInfo.InitialSpeed -.386e1c 20 af 5a jsr $385aaf JSR DISPLAY_SPEED -.386e1f 60 rts RTS -.386e20 RAD_EFFECT_NOTE_SLIDE_UP -.386e20 RAD_EFFECT_NOTE_SLIDE_DOWN -.386e20 5a phy PHY -.386e21 4a lsr a LSR -.386e22 85 50 sta $50 STA RAD_EFFECT ; 1 slide down, 2 slide up -.386e24 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; store value of the effect in RAD_CHANNE_EFFCT -.386e26 85 4c sta $4c STA RAD_CHANNE_EFFCT -.386e28 c2 20 rep #$20 REP #$20 ; set A long -.386e2a a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE -.386e2d 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386e2f a9 af 00 lda #$00af LDA #`OPL3_R_BASE -.386e32 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 -.386e34 e2 30 sep #$30 SEP #$30 ; set A&X short -.386e36 a5 27 lda $27 LDA OPL2_CHANNEL -.386e38 18 clc CLC -.386e39 69 a0 adc #$a0 ADC #$A0 -.386e3b a8 tay TAY -.386e3c b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; read low fnumber byte -.386e3e c2 10 rep #$10 REP #$10 ; set X long -.386e40 bb tyx TYX -.386e41 a0 5a 00 ldy #$005a LDY #SCREEN_WIDTH + 10 -.386e44 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386e47 9b txy TXY -.386e48 e2 10 sep #$10 SEP #$10 ; set X short -.386e4a 48 pha PHA ; store A on the stack -.386e4b 98 tya TYA -.386e4c 18 clc CLC -.386e4d 69 10 adc #$10 ADC #$10 -.386e4f a8 tay TAY -.386e50 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; read bits 0,1 of high fnumber -.386e52 85 4e sta $4e STA RAD_TEMP ; store the entire value of $B0 -.386e54 c2 10 rep #$10 REP #$10 ; set X long -.386e56 bb tyx TYX -.386e57 a0 a8 00 ldy #$00a8 LDY #SCREEN_WIDTH * 2 + 8 -.386e5a 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386e5d 29 03 and #$03 AND #3 -.386e5f a0 58 00 ldy #$0058 LDY #SCREEN_WIDTH + 8 -.386e62 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386e65 9b txy TXY -.386e66 eb xba XBA -.386e67 68 pla PLA ; A is now the FNUMBER -.386e68 aa tax TAX ; X is now the FNUMBER -.386e69 a5 50 lda $50 LDA RAD_EFFECT -.386e6b 89 02 bit #$02 BIT #2 -.386e6d f0 0a beq $386e79 BEQ SLIDE_UP -.386e6f c2 20 rep #$20 REP #$20 ; set A long -.386e71 8a txa TXA -.386e72 38 sec SEC -.386e73 e5 4c sbc $4c SBC RAD_CHANNE_EFFCT ; substract the effect parameter -.386e75 e2 20 sep #$20 SEP #$20 ; set A short -.386e77 80 08 bra $386e81 BRA FINISH_SLIDE -.386e79 SLIDE_UP -.386e79 c2 20 rep #$20 REP #$20 ; set A long -.386e7b 8a txa TXA -.386e7c 18 clc CLC -.386e7d 65 4c adc $4c ADC RAD_CHANNE_EFFCT ; substract the effect parameter -.386e7f e2 20 sep #$20 SEP #$20 ; set A short -.386e81 FINISH_SLIDE -.386e81 e2 10 sep #$10 SEP #$10 ; set X short -.386e83 eb xba XBA -.386e84 29 03 and #$03 AND #3 -.386e86 05 4e ora $4e ORA RAD_TEMP -.386e88 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386e8a 98 tya TYA -.386e8b 38 sec SEC -.386e8c e9 10 sbc #$10 SBC #$10 -.386e8e a8 tay TAY -.386e8f eb xba XBA -.386e90 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386e92 c2 10 rep #$10 REP #$10 ; set X long -.386e94 7a ply PLY -.386e95 60 rts RTS -.386e96 RAD_EFFECT_SET_VOLUME -.386e96 5a phy PHY -.386e97 c2 20 rep #$20 REP #$20 ; set A long -.386e99 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE -.386e9c 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386e9e a9 af 00 lda #$00af LDA #`OPL3_R_BASE -.386ea1 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 -.386ea3 e2 20 sep #$20 SEP #$20 ; set A short -.386ea5 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter -.386ea7 29 7f and #$7f AND #$7F -.386ea9 f0 01 beq $386eac BEQ HANDLE_ZERO -.386eab 3a dec a DEC A -.386eac HANDLE_ZERO -.386eac 49 3f eor #$3f EOR #$3F ; complement -.386eae 85 4e sta $4e STA RAD_TEMP -.386eb0 e2 10 sep #$10 SEP #$10 ; set X short -.386eb2 a6 27 ldx $27 LDX OPL2_CHANNEL -.386eb4 bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X -.386eb8 18 clc CLC -.386eb9 69 40 adc #$40 ADC #$40 -.386ebb a8 tay TAY -.386ebc b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y -.386ebe 29 c0 and #$c0 AND #$C0 ; -.386ec0 18 clc CLC -.386ec1 65 4e adc $4e ADC RAD_TEMP -.386ec3 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386ec5 c8 iny INY -.386ec6 c8 iny INY -.386ec7 c8 iny INY -.386ec8 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y -.386eca 29 c0 and #$c0 AND #$C0 ; -.386ecc 18 clc CLC -.386ecd 65 4e adc $4e ADC RAD_TEMP -.386ecf 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y -.386ed1 c2 10 rep #$10 REP #$10 ; set X long -.386ed3 7a ply PLY -.386ed4 60 rts RTS -.386ed5 RAD_WRITE_OCT_NOTE -.386ed5 5a phy PHY -.386ed6 48 pha PHA -.386ed7 48 pha PHA -.386ed8 af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL -.386edc 0a asl a ASL A ; multiply the channel by 2 for the screen position -.386edd a8 tay TAY -.386ede 68 pla PLA -.386edf f0 03 beq $386ee4 BEQ DONT_DISPLAY_00 -.386ee1 20 b1 57 jsr $3857b1 JSR WRITE_HEX -.386ee4 DONT_DISPLAY_00 -.386ee4 29 70 and #$70 AND #$70 ; octave -.386ee6 4a lsr a LSR -.386ee7 4a lsr a LSR -.386ee8 4a lsr a LSR -.386ee9 4a lsr a LSR -.386eea 8f 31 00 00 sta $000031 STA @lOPL2_OCTAVE -.386eee 68 pla PLA -.386eef 29 0f and #$0f AND #$0F ; note -.386ef1 8f 30 00 00 sta $000030 STA @lOPL2_NOTE -.386ef5 7a ply PLY -.386ef6 60 rts RTS -.386ef7 RAD_SETINSTRUMENT -.386ef7 5a phy PHY -.386ef8 e2 20 sep #$20 SEP #$20 ; set A short -.386efa a9 01 lda #$01 LDA #$01 -.386efc 85 26 sta $26 STA OPL2_OPERATOR -.386efe c2 20 rep #$20 REP #$20 ; set A long -.386f00 a9 38 00 lda #$0038 LDA #<`INSTRUMENT_ACCORDN -.386f03 85 0a sta $0a STA OPL2_ADDY_PTR_HI -.386f05 a5 32 lda $32 LDA OPL2_PARAMETER0 -.386f07 29 ff 00 and #$00ff AND #$00FF -.386f0a 3a dec a DEC A -.386f0b 0a asl a ASL A -.386f0c 0a asl a ASL A -.386f0d 0a asl a ASL A -.386f0e 0a asl a ASL A -.386f0f 18 clc CLC -.386f10 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN -.386f13 85 08 sta $08 STA OPL2_ADDY_PTR_LO -.386f15 c2 20 rep #$20 REP #$20 ; set A long -.386f17 a9 20 00 lda #$0020 LDA #$0020 -.386f1a 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f1e e2 20 sep #$20 SEP #$20 ; set A short -.386f20 a0 00 00 ldy #$0000 LDY #$0000 -.386f23 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f25 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f27 c2 20 rep #$20 REP #$20 ; set A long -.386f29 a9 40 00 lda #$0040 LDA #$0040 -.386f2c 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f30 e2 20 sep #$20 SEP #$20 ; set A short -.386f32 a0 02 00 ldy #$0002 LDY #$0002 -.386f35 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f37 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f39 c2 20 rep #$20 REP #$20 ; set A long -.386f3b a9 60 00 lda #$0060 LDA #$0060 -.386f3e 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f42 e2 20 sep #$20 SEP #$20 ; set A short -.386f44 a0 04 00 ldy #$0004 LDY #$0004 -.386f47 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f49 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f4b c2 20 rep #$20 REP #$20 ; set A long -.386f4d a9 80 00 lda #$0080 LDA #$0080 -.386f50 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f54 e2 20 sep #$20 SEP #$20 ; set A short -.386f56 a0 06 00 ldy #$0006 LDY #$0006 -.386f59 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f5b 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f5d c2 20 rep #$20 REP #$20 ; set A long -.386f5f a9 e0 00 lda #$00e0 LDA #$00E0 -.386f62 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f66 e2 20 sep #$20 SEP #$20 ; set A short -.386f68 a0 09 00 ldy #$0009 LDY #$0009 -.386f6b b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f6d 29 0f and #$0f AND #$0F -.386f6f 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f71 a9 00 lda #$00 LDA #$00 -.386f73 85 26 sta $26 STA OPL2_OPERATOR -.386f75 c2 20 rep #$20 REP #$20 ; set A long -.386f77 a9 20 00 lda #$0020 LDA #$0020 -.386f7a 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f7e e2 20 sep #$20 SEP #$20 ; set A short -.386f80 a0 01 00 ldy #$0001 LDY #$0001 -.386f83 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f85 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f87 c2 20 rep #$20 REP #$20 ; set A long -.386f89 a9 40 00 lda #$0040 LDA #$0040 -.386f8c 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386f90 e2 20 sep #$20 SEP #$20 ; set A short -.386f92 a0 03 00 ldy #$0003 LDY #$0003 -.386f95 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386f97 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386f99 c2 20 rep #$20 REP #$20 ; set A long -.386f9b a9 60 00 lda #$0060 LDA #$0060 -.386f9e 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386fa2 e2 20 sep #$20 SEP #$20 ; set A short -.386fa4 a0 05 00 ldy #$0005 LDY #$0005 -.386fa7 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386fa9 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386fab c2 20 rep #$20 REP #$20 ; set A long -.386fad a9 80 00 lda #$0080 LDA #$0080 -.386fb0 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386fb4 e2 20 sep #$20 SEP #$20 ; set A short -.386fb6 a0 71 00 ldy #$0071 LDY #$00071 -.386fb9 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386fbb 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386fbd c2 20 rep #$20 REP #$20 ; set A long -.386fbf a9 e0 00 lda #$00e0 LDA #$00E0 -.386fc2 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET -.386fc6 e2 20 sep #$20 SEP #$20 ; set A short -.386fc8 a0 09 00 ldy #$0009 LDY #$0009 -.386fcb b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386fcd 29 f0 and #$f0 AND #$F0 -.386fcf 4a lsr a LSR A -.386fd0 4a lsr a LSR A -.386fd1 4a lsr a LSR A -.386fd2 4a lsr a LSR A -.386fd3 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386fd5 a5 27 lda $27 LDA OPL2_CHANNEL -.386fd7 18 clc CLC -.386fd8 29 0f and #$0f AND #$0F ; This is just precaution, it should be between 0 to 8 -.386fda 69 c0 adc #$c0 ADC #$C0 -.386fdc 85 2a sta $2a STA OPL2_REG_OFFSET -.386fde a9 00 lda #$00 LDA #$00 -.386fe0 85 2b sta $2b STA OPL2_REG_OFFSET+1; -.386fe2 c2 30 rep #$30 REP #$30 ; set A&X long -.386fe4 18 clc CLC -.386fe5 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE -.386fe8 65 2a adc $2a ADC OPL2_REG_OFFSET -.386fea 85 2c sta $2c STA OPL2_IND_ADDY_LL -.386fec a9 af 00 lda #$00af LDA #`OPL3_R_BASE -.386fef 85 2e sta $2e STA OPL2_IND_ADDY_HL -.386ff1 e2 20 sep #$20 SEP #$20 ; set A short -.386ff3 a0 08 00 ldy #$0008 LDY #$0008 -.386ff6 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y -.386ff8 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] -.386ffa 7a ply PLY -.386ffb 60 rts RTS +.386c19 87 f0 sta [$f0] STA [RAD_ADDR] +.386c1b e6 f0 inc $f0 INC RAD_ADDR +.386c1d b0 02 bcs $386c21 BCS ORDER_CONTINUE +.386c1f e6 f1 inc $f1 INC RAD_ADDR + 1 +.386c21 ORDER_CONTINUE +.386c21 ca dex DEX +.386c22 d0 f2 bne $386c16 BNE READ_ORDER +.386c24 60 rts RTS +.386c25 READ_PATTERNS_10 +.386c25 64 f3 stz $f3 STZ RAD_PATTRN +.386c27 a9 39 lda #$39 LDA #<`PATTERNS +.386c29 85 f6 sta $f6 STA RAD_PTN_DEST + 2 +.386c2b NEXT_PATTERN +.386c2b c2 20 rep #$20 REP #$20 ; set A long +.386c2d b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386c2f f0 1f beq $386c50 BEQ SKIP_PATTERN +.386c31 5a phy PHY +.386c32 a8 tay TAY +.386c33 a5 f3 lda $f3 LDA RAD_PATTRN +.386c35 29 ff 00 and #$00ff AND #$00FF +.386c38 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.386c3c a9 01 07 lda #$0701 LDA #PATTERN_BYTES +.386c3f 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.386c43 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.386c47 1a inc a INC A ; skip the pattern byte +.386c48 85 f4 sta $f4 STA RAD_PTN_DEST +.386c4a e2 20 sep #$20 SEP #$20 ; set A short +.386c4c 20 5d 6c jsr $386c5d JSR READ_PATTERN_10 +.386c4f 7a ply PLY +.386c50 SKIP_PATTERN +.386c50 c8 iny INY +.386c51 c8 iny INY +.386c52 e2 20 sep #$20 SEP #$20 ; set A short +.386c54 e6 f3 inc $f3 INC RAD_PATTRN +.386c56 a5 f3 lda $f3 LDA RAD_PATTRN +.386c58 c9 20 cmp #$20 CMP #32 +.386c5a d0 cf bne $386c2b BNE NEXT_PATTERN +.386c5c 60 rts RTS +.386c5d READ_PATTERN_10 +.386c5d b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; read the line number - bit 7 indicates the last line +.386c5f 8f 42 00 00 sta $000042 STA @lRAD_LINE +.386c63 c8 iny INY +.386c64 c2 20 rep #$20 REP #$20 ; set A long +.386c66 29 7f 00 and #$007f AND #$7F +.386c69 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.386c6d a9 1c 00 lda #$001c LDA #LINE_BYTES +.386c70 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.386c74 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.386c78 1a inc a INC A ; skip the line number +.386c79 8f fa 00 00 sta $0000fa STA @lRAD_LINE_PTR +.386c7d e2 20 sep #$20 SEP #$20 ; set A short +.386c7f READ_NOTE +.386c7f a6 fa ldx $fa LDX RAD_LINE_PTR ; X contains the offset in the destination memory +.386c81 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; channel - bit 7 indicates the last note +.386c83 c8 iny INY +.386c84 8f f9 00 00 sta $0000f9 STA @lRAD_LAST_NOTE +.386c88 29 0f and #$0f AND #$F +.386c8a 8f f7 00 00 sta $0000f7 STA @lRAD_CHANNEL +.386c8e c2 20 rep #$20 REP #$20 ; set A long +.386c90 8a txa TXA +.386c91 18 clc CLC +.386c92 65 f7 adc $f7 ADC RAD_CHANNEL ; multiply channel by 3 +.386c94 65 f7 adc $f7 ADC RAD_CHANNEL +.386c96 65 f7 adc $f7 ADC RAD_CHANNEL +.386c98 aa tax TAX +.386c99 e2 20 sep #$20 SEP #$20 ; set A short +.386c9b b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; note / octave +.386c9d 5a phy PHY +.386c9e 9b txy TXY +.386c9f 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y +.386ca1 7a ply PLY +.386ca2 c8 iny INY +.386ca3 e8 inx INX +.386ca4 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; instrument/effect +.386ca6 5a phy PHY +.386ca7 9b txy TXY +.386ca8 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y +.386caa 7a ply PLY +.386cab c8 iny INY +.386cac e8 inx INX +.386cad 29 0f and #$0f AND #$F +.386caf f0 09 beq $386cba BEQ CHECK_LASTNOTE +.386cb1 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y ; effect parameter +.386cb3 5a phy PHY +.386cb4 9b txy TXY +.386cb5 97 f4 sta [$f4],y STA [RAD_PTN_DEST],Y +.386cb7 7a ply PLY +.386cb8 c8 iny INY +.386cb9 e8 inx INX +.386cba CHECK_LASTNOTE +.386cba af f9 00 00 lda $0000f9 LDA @lRAD_LAST_NOTE +.386cbe 10 bf bpl $386c7f BPL READ_NOTE +.386cc0 af 42 00 00 lda $000042 LDA @lRAD_LINE +.386cc4 10 97 bpl $386c5d BPL READ_PATTERN_10 +.386cc6 60 rts RTS +.386cc7 DRAW_BLANKS +.386cc7 5a phy PHY +.386cc8 da phx PHX +.386cc9 a2 12 00 ldx #$0012 LDX #18 +.386ccc a0 00 00 ldy #$0000 LDY #0 +.386ccf a9 2d lda #$2d LDA #'-' +.386cd1 BL_NEXT +.386cd1 97 0c sta [$0c],y STA [SCREENBEGIN], Y +.386cd3 c8 iny INY +.386cd4 ca dex DEX +.386cd5 d0 fa bne $386cd1 BNE BL_NEXT +.386cd7 fa plx PLX +.386cd8 7a ply PLY +.386cd9 60 rts RTS +.386cda DISPLAY_RAD_PTN_DEST +.386cda 5a phy PHY +.386cdb a5 f6 lda $f6 LDA RAD_PTN_DEST+2 +.386cdd 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386ce0 c8 iny INY +.386ce1 c8 iny INY +.386ce2 a5 f5 lda $f5 LDA RAD_PTN_DEST+1 +.386ce4 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386ce7 c8 iny INY +.386ce8 c8 iny INY +.386ce9 a5 f4 lda $f4 LDA RAD_PTN_DEST +.386ceb 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386cee 7a ply PLY +.386cef 60 rts RTS +.386cf0 WRITE_A_LNG +.386cf0 48 pha PHA +.386cf1 48 pha PHA +.386cf2 e2 20 sep #$20 SEP #$20 ; set A short +.386cf4 68 pla PLA +.386cf5 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386cf8 88 dey DEY +.386cf9 88 dey DEY +.386cfa 68 pla PLA +.386cfb 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386cfe c2 20 rep #$20 REP #$20 ; set A long +.386d00 68 pla PLA +.386d01 60 rts RTS +.386d02 RAD_ALL_NOTES_OFF +.386d02 5a phy PHY +.386d03 c2 20 rep #$20 REP #$20 ; set A long +.386d05 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE +.386d08 85 2c sta $2c STA OPL2_IND_ADDY_LL +.386d0a a9 af 00 lda #$00af LDA #`OPL3_R_BASE +.386d0d 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 +.386d0f e2 20 sep #$20 SEP #$20 ; set A short +.386d11 a0 a0 00 ldy #$00a0 LDY #$A0 +.386d14 a9 00 lda #$00 LDA #0 +.386d16 NEXT_NOTE_OFF +.386d16 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386d18 c8 iny INY +.386d19 c0 b9 00 cpy #$00b9 CPY #$B9 +.386d1c d0 f8 bne $386d16 BNE NEXT_NOTE_OFF +.386d1e 7a ply PLY +.386d1f 60 rts RTS +.386d20 RAD_PLAYNOTES +.386d20 5a phy PHY +.386d21 20 c7 6c jsr $386cc7 JSR DRAW_BLANKS +.386d24 c2 20 rep #$20 REP #$20 ; set A long +.386d26 af 18 0f 38 lda $380f18 LDA PATTERN_NUM +.386d2a 29 ff 00 and #$00ff AND #$FF +.386d2d 3a dec a DEC A ; start at 0 +.386d2e 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.386d32 a9 01 07 lda #$0701 LDA #PATTERN_BYTES +.386d35 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.386d39 af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.386d3d 1a inc a INC A ; skip the pattern number byte +.386d3e 85 f4 sta $f4 STA RAD_PTN_DEST +.386d40 e2 20 sep #$20 SEP #$20 ; set A short +.386d42 a9 39 lda #$39 LDA #<`PATTERNS +.386d44 85 f6 sta $f6 STA RAD_PTN_DEST + 2 +.386d46 a0 a0 00 ldy #$00a0 LDY #SCREEN_WIDTH * 2 +.386d49 20 da 6c jsr $386cda JSR DISPLAY_RAD_PTN_DEST ; display the address of the pattern +.386d4c c2 20 rep #$20 REP #$20 ; set A long +.386d4e a5 6c lda $6c LDA LINE_NUM_HEX +.386d50 29 7f 00 and #$007f AND #$7F +.386d53 8f 00 01 00 sta $000100 STA @lUNSIGNED_MULT_A +.386d57 a9 1c 00 lda #$001c LDA #LINE_BYTES +.386d5a 8f 02 01 00 sta $000102 STA @lUNSIGNED_MULT_B +.386d5e af 04 01 00 lda $000104 LDA @lUNSIGNED_MULT_RESULT +.386d62 1a inc a INC A ; skip the line number byte +.386d63 a0 52 00 ldy #$0052 LDY #SCREEN_WIDTH + 2 +.386d66 20 f0 6c jsr $386cf0 JSR WRITE_A_LNG ; display the line offset from the pattern address +.386d69 a8 tay TAY ; Y contains the line offset +.386d6a a9 00 00 lda #$0000 LDA #0 +.386d6d e2 20 sep #$20 SEP #$20 ; set A short +.386d6f 64 28 stz $28 STZ OPL2_REG_REGION +.386d71 PN_NEXT_NOTE +.386d71 8f 27 00 00 sta $000027 STA @lOPL2_CHANNEL +.386d75 aa tax TAX +.386d76 bf 1d 69 38 lda $38691d,x LDA CHANNELS,X +.386d7a d0 05 bne $386d81 BNE PN_PLAY_NOTE +.386d7c c8 iny INY ; skip the channel data +.386d7d c8 iny INY +.386d7e c8 iny INY +.386d7f 80 58 bra $386dd9 BRA PN_CONTINUE +.386d81 PN_PLAY_NOTE +.386d81 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; octave/note +.386d83 29 7f and #$7f AND #$7F +.386d85 20 40 6f jsr $386f40 JSR RAD_WRITE_OCT_NOTE +.386d88 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; bit 7 is bit 4 of the instrument number +.386d8a 29 80 and #$80 AND #$80 +.386d8c 4a lsr a LSR A +.386d8d 4a lsr a LSR A +.386d8e 4a lsr a LSR A +.386d8f 85 4e sta $4e STA RAD_TEMP +.386d91 c8 iny INY +.386d92 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; instrument/effect +.386d94 29 f0 and #$f0 AND #$F0 +.386d96 4a lsr a LSR A +.386d97 4a lsr a LSR A +.386d98 4a lsr a LSR A +.386d99 4a lsr a LSR A +.386d9a 65 4e adc $4e ADC RAD_TEMP +.386d9c f0 14 beq $386db2 BEQ SKIP_INSTRUMENT +.386d9e 3a dec a DEC A ; instruments are starting at 0 +.386d9f 8f 6a 00 00 sta $00006a STA @lINSTR_NUMBER +.386da3 5a phy PHY +.386da4 a6 27 ldx $27 LDX OPL2_CHANNEL +.386da6 a9 00 lda #$00 LDA #0 +.386da8 eb xba XBA +.386da9 bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X +.386dad aa tax TAX +.386dae 20 b9 65 jsr $3865b9 JSR LOAD_INSTRUMENT +.386db1 7a ply PLY +.386db2 SKIP_INSTRUMENT +.386db2 af 30 00 00 lda $000030 LDA @lOPL2_NOTE +.386db6 f0 11 beq $386dc9 BEQ SKIP_NOTE ; if the note is 0, don't play anything. +.386db8 c9 0f cmp #$0f CMP #$0F ; NOTE OFF +.386dba f0 2b beq $386de7 BEQ RAD_NOTE_OFF +.386dbc c2 20 rep #$20 REP #$20 ; set A long +.386dbe 5a phy PHY +.386dbf 20 f5 37 jsr $3837f5 JSR OPL2_GET_REG_OFFSET +.386dc2 22 01 32 38 jsl $383201 JSL OPL2_PLAYNOTE +.386dc6 7a ply PLY +.386dc7 e2 20 sep #$20 SEP #$20 ; set A short +.386dc9 SKIP_NOTE +.386dc9 a9 00 lda #$00 LDA #0 +.386dcb eb xba XBA +.386dcc b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; instrument/effect +.386dce c8 iny INY +.386dcf 29 0f and #$0f AND #$F +.386dd1 f0 05 beq $386dd8 BEQ SKIP_EFFECT +.386dd3 0a asl a ASL A ; double bytes +.386dd4 aa tax TAX +.386dd5 fc f8 6d jsr ($386df8,x) JSR (RAD_EFFECT_TABLE,X) +.386dd8 SKIP_EFFECT +.386dd8 c8 iny INY +.386dd9 PN_CONTINUE +.386dd9 a9 00 lda #$00 LDA #0 ; clear B +.386ddb eb xba XBA +.386ddc af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL +.386de0 1a inc a INC A +.386de1 c9 09 cmp #$09 CMP #9 +.386de3 d0 8c bne $386d71 BNE PN_NEXT_NOTE +.386de5 7a ply PLY +.386de6 60 rts RTS +.386de7 RAD_NOTE_OFF +.386de7 af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL +.386deb 18 clc CLC +.386dec 69 b0 adc #$b0 ADC #$B0 +.386dee 85 2c sta $2c STA OPL2_IND_ADDY_LL +.386df0 a9 00 lda #$00 LDA #0 +.386df2 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386df4 c8 iny INY +.386df5 c8 iny INY +.386df6 80 e1 bra $386dd9 BRA PN_CONTINUE +.386df8 RAD_EFFECT_TABLE +>386df8 18 6e .word <>RAD_EFFECT_NONE ; 00 +>386dfa 8b 6e .word <>RAD_EFFECT_NOTE_SLIDE_UP ; 01 +>386dfc 8b 6e .word <>RAD_EFFECT_NOTE_SLIDE_DOWN ; 02 +>386dfe 18 6e .word <>RAD_EFFECT_NOTE_SLIDE_TO ; 03 +>386e00 18 6e .word <>RAD_NOOP +>386e02 18 6e .word <>RAD_EFFECT_NOTE_SLIDE_VOLUME ; 05 +>386e04 18 6e .word <>RAD_NOOP +>386e06 18 6e .word <>RAD_NOOP +>386e08 18 6e .word <>RAD_NOOP +>386e0a 18 6e .word <>RAD_NOOP +>386e0c 19 6e .word <>RAD_EFFECT_VOLUME_SLIDE ; 0A +>386e0e 18 6e .word <>RAD_NOOP +>386e10 01 6f .word <>RAD_EFFECT_SET_VOLUME ; 0C +>386e12 70 6e .word <>RAD_EFFECT_PATTERN_BREAK ; 0D +>386e14 18 6e .word <>RAD_NOOP +>386e16 81 6e .word <>RAD_EFFECT_SET_SPEED ; 0F +.386e18 RAD_NOOP +.386e18 RAD_EFFECT_NONE +.386e18 RAD_EFFECT_NOTE_SLIDE_TO +.386e18 RAD_EFFECT_NOTE_SLIDE_VOLUME +.386e18 60 rts RTS +.386e19 RAD_EFFECT_VOLUME_SLIDE +.386e19 5a phy PHY +.386e1a b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; store value of the effect in RAD_CHANNE_EFFCT +.386e1c 85 4c sta $4c STA RAD_CHANNE_EFFCT +.386e1e c2 20 rep #$20 REP #$20 ; set A long +.386e20 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE +.386e23 85 2c sta $2c STA OPL2_IND_ADDY_LL +.386e25 a9 af 00 lda #$00af LDA #`OPL3_R_BASE +.386e28 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 +.386e2a e2 30 sep #$30 SEP #$30 ; set A&X short +.386e2c a5 27 lda $27 LDA OPL2_CHANNEL +.386e2e aa tax TAX +.386e2f bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X +.386e33 18 clc CLC +.386e34 69 40 adc #$40 ADC #$40 +.386e36 a8 tay TAY +.386e37 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; volume +.386e39 48 pha PHA +.386e3a 29 3f and #$3f AND #$3F +.386e3c 18 clc CLC +.386e3d 65 4c adc $4c ADC RAD_CHANNE_EFFCT ; check for values greater than 50 +.386e3f c9 40 cmp #$40 CMP #$40 ; if there's an overflow, use #$3F (low volume) +.386e41 90 02 bcc $386e45 BCC NO_OVERFLOW_0 +.386e43 a9 3f lda #$3f LDA #$3F +.386e45 NO_OVERFLOW_0 +.386e45 29 3f and #$3f AND #$3F +.386e47 85 4e sta $4e STA RAD_TEMP +.386e49 68 pla PLA +.386e4a 29 c0 and #$c0 AND #$C0 +.386e4c 05 4e ora $4e ORA RAD_TEMP +.386e4e 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386e50 c8 iny INY +.386e51 c8 iny INY +.386e52 c8 iny INY +.386e53 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; volume +.386e55 48 pha PHA +.386e56 29 3f and #$3f AND #$3F +.386e58 18 clc CLC +.386e59 65 4c adc $4c ADC RAD_CHANNE_EFFCT +.386e5b c9 40 cmp #$40 CMP #$40 ; if there's an overflow, use #$3F (low volume) +.386e5d 90 02 bcc $386e61 BCC NO_OVERFLOW_1 +.386e5f a9 3f lda #$3f LDA #$3F +.386e61 NO_OVERFLOW_1 +.386e61 29 3f and #$3f AND #$3F +.386e63 85 4e sta $4e STA RAD_TEMP +.386e65 68 pla PLA +.386e66 29 c0 and #$c0 AND #$C0 +.386e68 05 4e ora $4e ORA RAD_TEMP +.386e6a 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386e6c c2 10 rep #$10 REP #$10 ; set X long +.386e6e 7a ply PLY +.386e6f 60 rts RTS +.386e70 RAD_EFFECT_PATTERN_BREAK +.386e70 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter +.386e72 3a dec a DEC A ; DECREMENT by 1, because the next timer interrupt will increment at the beginning +.386e73 85 6c sta $6c STA LINE_NUM_HEX +.386e75 a9 00 lda #$00 LDA #0 ; convert the effect to a decimal line number +.386e77 8f 19 0f 38 sta $380f19 STA @lLINE_NUM_DEC +.386e7b 20 05 65 jsr $386505 JSR INCREMENT_ORDER +.386e7e 7a ply PLY ; don't return to the calling method, return to the parent +.386e7f 7a ply PLY +.386e80 60 rts RTS +.386e81 RAD_EFFECT_SET_SPEED +.386e81 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter +.386e83 8f d4 6a 38 sta $386ad4 STA @lTuneInfo.InitialSpeed +.386e87 20 a1 5a jsr $385aa1 JSR DISPLAY_SPEED +.386e8a 60 rts RTS +.386e8b RAD_EFFECT_NOTE_SLIDE_UP +.386e8b RAD_EFFECT_NOTE_SLIDE_DOWN +.386e8b 5a phy PHY +.386e8c 4a lsr a LSR +.386e8d 85 50 sta $50 STA RAD_EFFECT ; 1 slide down, 2 slide up +.386e8f b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; store value of the effect in RAD_CHANNE_EFFCT +.386e91 85 4c sta $4c STA RAD_CHANNE_EFFCT +.386e93 c2 20 rep #$20 REP #$20 ; set A long +.386e95 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE +.386e98 85 2c sta $2c STA OPL2_IND_ADDY_LL +.386e9a a9 af 00 lda #$00af LDA #`OPL3_R_BASE +.386e9d 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 +.386e9f e2 30 sep #$30 SEP #$30 ; set A&X short +.386ea1 a5 27 lda $27 LDA OPL2_CHANNEL +.386ea3 18 clc CLC +.386ea4 69 a0 adc #$a0 ADC #$A0 +.386ea6 a8 tay TAY +.386ea7 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; read low fnumber byte +.386ea9 c2 10 rep #$10 REP #$10 ; set X long +.386eab bb tyx TYX +.386eac a0 5a 00 ldy #$005a LDY #SCREEN_WIDTH + 10 +.386eaf 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386eb2 9b txy TXY +.386eb3 e2 10 sep #$10 SEP #$10 ; set X short +.386eb5 48 pha PHA ; store A on the stack +.386eb6 98 tya TYA +.386eb7 18 clc CLC +.386eb8 69 10 adc #$10 ADC #$10 +.386eba a8 tay TAY +.386ebb b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y ; read bits 0,1 of high fnumber +.386ebd 85 4e sta $4e STA RAD_TEMP ; store the entire value of $B0 +.386ebf c2 10 rep #$10 REP #$10 ; set X long +.386ec1 bb tyx TYX +.386ec2 a0 a8 00 ldy #$00a8 LDY #SCREEN_WIDTH * 2 + 8 +.386ec5 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386ec8 29 03 and #$03 AND #3 +.386eca a0 58 00 ldy #$0058 LDY #SCREEN_WIDTH + 8 +.386ecd 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386ed0 9b txy TXY +.386ed1 eb xba XBA +.386ed2 68 pla PLA ; A is now the FNUMBER +.386ed3 aa tax TAX ; X is now the FNUMBER +.386ed4 a5 50 lda $50 LDA RAD_EFFECT +.386ed6 89 02 bit #$02 BIT #2 +.386ed8 f0 0a beq $386ee4 BEQ SLIDE_UP +.386eda c2 20 rep #$20 REP #$20 ; set A long +.386edc 8a txa TXA +.386edd 38 sec SEC +.386ede e5 4c sbc $4c SBC RAD_CHANNE_EFFCT ; substract the effect parameter +.386ee0 e2 20 sep #$20 SEP #$20 ; set A short +.386ee2 80 08 bra $386eec BRA FINISH_SLIDE +.386ee4 SLIDE_UP +.386ee4 c2 20 rep #$20 REP #$20 ; set A long +.386ee6 8a txa TXA +.386ee7 18 clc CLC +.386ee8 65 4c adc $4c ADC RAD_CHANNE_EFFCT ; substract the effect parameter +.386eea e2 20 sep #$20 SEP #$20 ; set A short +.386eec FINISH_SLIDE +.386eec e2 10 sep #$10 SEP #$10 ; set X short +.386eee eb xba XBA +.386eef 29 03 and #$03 AND #3 +.386ef1 05 4e ora $4e ORA RAD_TEMP +.386ef3 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386ef5 98 tya TYA +.386ef6 38 sec SEC +.386ef7 e9 10 sbc #$10 SBC #$10 +.386ef9 a8 tay TAY +.386efa eb xba XBA +.386efb 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386efd c2 10 rep #$10 REP #$10 ; set X long +.386eff 7a ply PLY +.386f00 60 rts RTS +.386f01 RAD_EFFECT_SET_VOLUME +.386f01 5a phy PHY +.386f02 c2 20 rep #$20 REP #$20 ; set A long +.386f04 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE +.386f07 85 2c sta $2c STA OPL2_IND_ADDY_LL +.386f09 a9 af 00 lda #$00af LDA #`OPL3_R_BASE +.386f0c 85 2e sta $2e STA OPL2_IND_ADDY_LL + 2 +.386f0e e2 20 sep #$20 SEP #$20 ; set A short +.386f10 b7 f4 lda [$f4],y LDA [RAD_PTN_DEST],Y ; effect parameter +.386f12 29 7f and #$7f AND #$7F +.386f14 f0 01 beq $386f17 BEQ HANDLE_ZERO +.386f16 3a dec a DEC A +.386f17 HANDLE_ZERO +.386f17 49 3f eor #$3f EOR #$3F ; complement +.386f19 85 4e sta $4e STA RAD_TEMP +.386f1b e2 10 sep #$10 SEP #$10 ; set X short +.386f1d a6 27 ldx $27 LDX OPL2_CHANNEL +.386f1f bf 18 10 38 lda $381018,x LDA @lregisterOffsets_operator0,X +.386f23 18 clc CLC +.386f24 69 40 adc #$40 ADC #$40 +.386f26 a8 tay TAY +.386f27 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y +.386f29 29 c0 and #$c0 AND #$C0 ; +.386f2b 18 clc CLC +.386f2c 65 4e adc $4e ADC RAD_TEMP +.386f2e 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386f30 c8 iny INY +.386f31 c8 iny INY +.386f32 c8 iny INY +.386f33 b7 2c lda [$2c],y LDA [OPL2_IND_ADDY_LL],Y +.386f35 29 c0 and #$c0 AND #$C0 ; +.386f37 18 clc CLC +.386f38 65 4e adc $4e ADC RAD_TEMP +.386f3a 97 2c sta [$2c],y STA [OPL2_IND_ADDY_LL],Y +.386f3c c2 10 rep #$10 REP #$10 ; set X long +.386f3e 7a ply PLY +.386f3f 60 rts RTS +.386f40 RAD_WRITE_OCT_NOTE +.386f40 5a phy PHY +.386f41 48 pha PHA +.386f42 48 pha PHA +.386f43 af 27 00 00 lda $000027 LDA @lOPL2_CHANNEL +.386f47 0a asl a ASL A ; multiply the channel by 2 for the screen position +.386f48 a8 tay TAY +.386f49 68 pla PLA +.386f4a f0 03 beq $386f4f BEQ DONT_DISPLAY_00 +.386f4c 20 a3 57 jsr $3857a3 JSR WRITE_HEX +.386f4f DONT_DISPLAY_00 +.386f4f 29 70 and #$70 AND #$70 ; octave +.386f51 4a lsr a LSR +.386f52 4a lsr a LSR +.386f53 4a lsr a LSR +.386f54 4a lsr a LSR +.386f55 8f 31 00 00 sta $000031 STA @lOPL2_OCTAVE +.386f59 68 pla PLA +.386f5a 29 0f and #$0f AND #$0F ; note +.386f5c 8f 30 00 00 sta $000030 STA @lOPL2_NOTE +.386f60 7a ply PLY +.386f61 60 rts RTS +.386f62 RAD_SETINSTRUMENT +.386f62 5a phy PHY +.386f63 e2 20 sep #$20 SEP #$20 ; set A short +.386f65 a9 01 lda #$01 LDA #$01 +.386f67 85 26 sta $26 STA OPL2_OPERATOR +.386f69 c2 20 rep #$20 REP #$20 ; set A long +.386f6b a9 38 00 lda #$0038 LDA #<`INSTRUMENT_ACCORDN +.386f6e 85 0a sta $0a STA OPL2_ADDY_PTR_HI +.386f70 a5 32 lda $32 LDA OPL2_PARAMETER0 +.386f72 29 ff 00 and #$00ff AND #$00FF +.386f75 3a dec a DEC A +.386f76 0a asl a ASL A +.386f77 0a asl a ASL A +.386f78 0a asl a ASL A +.386f79 0a asl a ASL A +.386f7a 18 clc CLC +.386f7b 69 3b 10 adc #$103b ADC #<>INSTRUMENT_ACCORDN +.386f7e 85 08 sta $08 STA OPL2_ADDY_PTR_LO +.386f80 c2 20 rep #$20 REP #$20 ; set A long +.386f82 a9 20 00 lda #$0020 LDA #$0020 +.386f85 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386f89 e2 20 sep #$20 SEP #$20 ; set A short +.386f8b a0 00 00 ldy #$0000 LDY #$0000 +.386f8e b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386f90 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386f92 c2 20 rep #$20 REP #$20 ; set A long +.386f94 a9 40 00 lda #$0040 LDA #$0040 +.386f97 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386f9b e2 20 sep #$20 SEP #$20 ; set A short +.386f9d a0 02 00 ldy #$0002 LDY #$0002 +.386fa0 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386fa2 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386fa4 c2 20 rep #$20 REP #$20 ; set A long +.386fa6 a9 60 00 lda #$0060 LDA #$0060 +.386fa9 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386fad e2 20 sep #$20 SEP #$20 ; set A short +.386faf a0 04 00 ldy #$0004 LDY #$0004 +.386fb2 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386fb4 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386fb6 c2 20 rep #$20 REP #$20 ; set A long +.386fb8 a9 80 00 lda #$0080 LDA #$0080 +.386fbb 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386fbf e2 20 sep #$20 SEP #$20 ; set A short +.386fc1 a0 06 00 ldy #$0006 LDY #$0006 +.386fc4 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386fc6 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386fc8 c2 20 rep #$20 REP #$20 ; set A long +.386fca a9 e0 00 lda #$00e0 LDA #$00E0 +.386fcd 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386fd1 e2 20 sep #$20 SEP #$20 ; set A short +.386fd3 a0 09 00 ldy #$0009 LDY #$0009 +.386fd6 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386fd8 29 0f and #$0f AND #$0F +.386fda 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386fdc a9 00 lda #$00 LDA #$00 +.386fde 85 26 sta $26 STA OPL2_OPERATOR +.386fe0 c2 20 rep #$20 REP #$20 ; set A long +.386fe2 a9 20 00 lda #$0020 LDA #$0020 +.386fe5 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386fe9 e2 20 sep #$20 SEP #$20 ; set A short +.386feb a0 01 00 ldy #$0001 LDY #$0001 +.386fee b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.386ff0 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.386ff2 c2 20 rep #$20 REP #$20 ; set A long +.386ff4 a9 40 00 lda #$0040 LDA #$0040 +.386ff7 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.386ffb e2 20 sep #$20 SEP #$20 ; set A short +.386ffd a0 03 00 ldy #$0003 LDY #$0003 +.387000 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.387002 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.387004 c2 20 rep #$20 REP #$20 ; set A long +.387006 a9 60 00 lda #$0060 LDA #$0060 +.387009 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.38700d e2 20 sep #$20 SEP #$20 ; set A short +.38700f a0 05 00 ldy #$0005 LDY #$0005 +.387012 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.387014 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.387016 c2 20 rep #$20 REP #$20 ; set A long +.387018 a9 80 00 lda #$0080 LDA #$0080 +.38701b 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.38701f e2 20 sep #$20 SEP #$20 ; set A short +.387021 a0 71 00 ldy #$0071 LDY #$00071 +.387024 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.387026 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.387028 c2 20 rep #$20 REP #$20 ; set A long +.38702a a9 e0 00 lda #$00e0 LDA #$00E0 +.38702d 22 f5 37 38 jsl $3837f5 JSL OPL2_GET_REG_OFFSET +.387031 e2 20 sep #$20 SEP #$20 ; set A short +.387033 a0 09 00 ldy #$0009 LDY #$0009 +.387036 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.387038 29 f0 and #$f0 AND #$F0 +.38703a 4a lsr a LSR A +.38703b 4a lsr a LSR A +.38703c 4a lsr a LSR A +.38703d 4a lsr a LSR A +.38703e 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.387040 a5 27 lda $27 LDA OPL2_CHANNEL +.387042 18 clc CLC +.387043 29 0f and #$0f AND #$0F ; This is just precaution, it should be between 0 to 8 +.387045 69 c0 adc #$c0 ADC #$C0 +.387047 85 2a sta $2a STA OPL2_REG_OFFSET +.387049 a9 00 lda #$00 LDA #$00 +.38704b 85 2b sta $2b STA OPL2_REG_OFFSET+1; +.38704d c2 30 rep #$30 REP #$30 ; set A&X long +.38704f 18 clc CLC +.387050 a9 00 e7 lda #$e700 LDA #<>OPL3_R_BASE +.387053 65 2a adc $2a ADC OPL2_REG_OFFSET +.387055 85 2c sta $2c STA OPL2_IND_ADDY_LL +.387057 a9 af 00 lda #$00af LDA #`OPL3_R_BASE +.38705a 85 2e sta $2e STA OPL2_IND_ADDY_HL +.38705c e2 20 sep #$20 SEP #$20 ; set A short +.38705e a0 08 00 ldy #$0008 LDY #$0008 +.387061 b7 08 lda [$08],y LDA [OPL2_ADDY_PTR_LO],Y +.387063 87 2c sta [$2c] STA [OPL2_IND_ADDY_LL] +.387065 7a ply PLY +.387066 60 rts RTS ;****** Return to file: tracker.asm