diff --git a/software/ugophy/Makefile b/software/ugophy/Makefile index ff4f356..35a68ba 100644 --- a/software/ugophy/Makefile +++ b/software/ugophy/Makefile @@ -1,9 +1,6 @@ all: ugoph.bin -player.bin: vtpl.asm - sjasmplus vtpl.asm - -ugoph.bin: *.asm player.bin +ugoph.bin: *.asm sjasmplus main.asm clean: diff --git a/software/ugophy/esxdos.asm b/software/ugophy/esxdos.asm index b74d230..1ef7ac7 100644 --- a/software/ugophy/esxdos.asm +++ b/software/ugophy/esxdos.asm @@ -14,8 +14,7 @@ FMODE_CREATE = #0E ; Returns: ; A - current drive getDefaultDrive: - ld a, 0 - rst #8 + ld a, 0 : rst #8 defb ESX_GETSETDRV ret @@ -25,11 +24,9 @@ getDefaultDrive: ; Returns: ; A - file stream id fopen: - push bc - push hl + push bc : push hl call getDefaultDrive - pop ix - pop bc + pop ix : pop bc rst #8 defb ESX_FOPEN ret @@ -46,8 +43,7 @@ fclose: ; Returns ; BC - length(how much was actually read) fread: - push hl - pop ix + push hl : pop ix rst #8 defb ESX_FREAD ret @@ -58,8 +54,7 @@ fread: ; Returns: ; BC - actually written bytes fwrite: - push hl - pop ix + push hl : pop ix rst #8 defb ESX_FWRITE ret diff --git a/software/ugophy/gopher.asm b/software/ugophy/gopher.asm index bb0928d..dd11e89 100644 --- a/software/ugophy/gopher.asm +++ b/software/ugophy/gopher.asm @@ -2,213 +2,125 @@ ; de - path ; bc - port openPage: - push hl - push de - push bc + push hl : push de : push bc - xor a - call changeBank + xor a : call changeBank - ex hl, de + ex hl, de : ld de, hist : ld bc, 322 : ldir - ld de, hist - ld bc, 322 - ldir + ld hl, page_buffer : xor a : ld (hl), a : ld de, page_buffer + 1 : ld bc, #ffff - page_buffer - 1 : ldir + + pop bc : pop de : pop hl - ld hl, page_buffer - xor a - ld (hl), a - ld de, page_buffer + 1 - ld bc, #ffff - page_buffer - 1 - ldir - pop bc - pop de - pop hl call makeRequest - xor a - call changeBank + xor a : call changeBank - ld hl, page_buffer - call loadData - xor a - ld (show_offset), a - ld a, 1 - ld (cursor_pos), a + ld hl, page_buffer : call loadData + + xor a : ld (show_offset), a + inc a : ld (cursor_pos), a ret ; HL - domain stringZ ; DE - path stringZ ; BC - port stringZ makeRequest: - push de - push bc - push HL + push de : push bc : push hl - ld hl, downloading_msg - call showTypePrint + ld hl, downloading_msg : call showTypePrint - xor a - call changeBank + xor a : call changeBank - ld hl, cmd_open1 ; Open TCP connection - call uartWriteStringZ - pop hl - call uartWriteStringZ - ld hl, cmd_open2 - call uartWriteStringZ - pop hl - call uartWriteStringZ - ld hl, cmd_open3 - call okErrCmd +; Open TCP connection + ld hl, cmd_open1 : call uartWriteStringZ + pop hl : call uartWriteStringZ + ld hl, cmd_open2 : call uartWriteStringZ + pop hl : call uartWriteStringZ + ld hl, cmd_open3 : call okErrCmd - pop hl - cp 1 - jp nz, reqErr - push hl + pop hl : cp 1 : jp nz, reqErr : push hl - ld hl, cmd_send ; Send request - call uartWriteStringZ - pop hl - push hl - call getStringLength ; Calculate addr length - push bc - pop hl - inc hl ; CR - inc hl ; LF - call B2D16 ; To string - ld hl, B2DBUF - call SkipWhitespace - call uartWriteStringZ - - ld hl, crlf - call okErrCmd - pop hl - cp 1 - jp nz, reqErr - push hl +; Send request + ld hl, cmd_send : call uartWriteStringZ + pop hl : push hl + call getStringLength + push bc : pop hl : inc hl : inc hl : call B2D16 + + ld hl, B2DBUF : call SkipWhitespace : call uartWriteStringZ + ld hl, crlf : call okErrCmd + + pop hl : cp 1 : jp nz, reqErr : push hl wPrmt: - call uartReadBlocking - call pushRing - ld hl, send_prompt - call searchRing - cp 1 - jr nz, wPrmt + call uartReadBlocking : call pushRing + ld hl, send_prompt : call searchRing : cp 1 : jr nz, wPrmt - pop hl - call uartWriteStringZ + pop hl : call uartWriteStringZ - ld hl, crlf - call uartWriteStringZ - ld a, 1 - ld (connectionOpen), a + ld hl, crlf : call uartWriteStringZ : ld a, 1 : ld (connectionOpen), a ret -reqErr - ld hl, connectionError - call putStringZ - xor a - ld (connectionOpen), a - ret +reqErr: + pop hl ; Now we won't back to same address + + ld hl, connectionError : call showTypePrint : call wSec + xor a : ld (connectionOpen), a + + call initWifi ; Trying reset ESP and continue work + jp historyBack ; Let's try back home on one URL :) ; Load data to ram via gopher ; HL - data pointer ; In data_recv downloaded volume loadData: - ld (data_pointer), hl - ld hl, 0 - ld (data_recv), hl + ld (data_pointer), hl + ld hl, 0 : ld (data_recv), hl lpLoop: call getPacket - ld a, (connectionOpen) - and a - jp z, ldEnd - ld bc, (bytes_avail) - ld de, (data_pointer) - ld hl, output_buffer - ldir - ld hl, (data_pointer) - ld de, (bytes_avail) - push de - add hl, de - ld (data_pointer), hl - pop de - ld hl, (data_recv) - add hl, de - ld (data_recv), hl + + ld a, (connectionOpen) : and a : jp z, ldEnd + + ld bc, (bytes_avail) : ld de, (data_pointer) : ld hl, output_buffer : ldir + ld hl, (data_pointer) : ld de, (bytes_avail) : push de : add hl, de : ld (data_pointer), hl : pop de + ld hl, (data_recv) : add hl, de : ld (data_recv), hl + jp lpLoop ldEnd - xor a - ld (data_pointer), a + xor a : ld (data_pointer), a ret ; Download file via gopher ; HL - filename downloadData: - ld b, FMODE_CREATE - call fopen - ld (fstream), a + ld b, FMODE_CREATE : call fopen : ld (fstream), a dwnLp: - call getPacket - ld a, (connectionOpen) - and a - jp z, dwnEnd - ld bc, (bytes_avail) - ld hl, output_buffer - ld a, (fstream) - call fwrite - ld a, (fstream) - call fsync + call getPacket : ld a, (connectionOpen) : and a : jp z, dwnEnd + + ld bc, (bytes_avail) : ld hl, output_buffer : ld a, (fstream) : call fwrite + + ld a, (fstream) : call fsync jp dwnLp dwnEnd: - ld a, (fstream) - call fclose + ld a, (fstream) : call fclose ret openURI: - call cleanIBuff - ld b, 19 - ld c, 0 - call gotoXY + call cleanIBuff - ld hl, cleanLine - call printZ64 - - ld b, 19 - ld c, 0 - call gotoXY - - ld hl, hostTxt - call printZ64 + ld b, 19: ld c, 0 :call gotoXY : ld hl, cleanLine : call printZ64 + ld b, 19: ld c, 0 : call gotoXY : ld hl, hostTxt : call printZ64 call input - ld a, (iBuff) - or a - jp z, backToPage + ld a, (iBuff) : or a : jp z, backToPage - ld b, 19 - ld c, 0 - call gotoXY + ld b, 19 : ld c, 0 : call gotoXY : ld hl, cleanLine : call printZ64 + + ld hl, iBuff : ld de, d_host : ld bc, 65 : ldir + + ld hl, d_host : ld de, d_path : ld bc, d_port : call openPage - ld hl, cleanLine - call printZ64 - - ld hl, iBuff - - ld a, (hl) - and a - ret z - - ld de, d_host - ld bc, 65 - ldir - - ld hl, d_host - ld de, d_path - ld bc, d_port - call openPage jp showPage @@ -232,4 +144,5 @@ d_port db '70' hist ds 322 connectionOpen db 0 downloading_msg db 'Downloading...', 0 -connectionError db 'Cant open TCP connection', 0 + +connectionError db "Issue with making request - trying get back", 0 diff --git a/software/ugophy/keyboard.asm b/software/ugophy/keyboard.asm index d9cb26a..cdcddd9 100644 --- a/software/ugophy/keyboard.asm +++ b/software/ugophy/keyboard.asm @@ -2,99 +2,62 @@ CURKEY = 23560 ; Returns in A key code or zero if key wans't pressed inkey: - ld hl, CURKEY - ld a, (hl) - push af - xor a - ld (hl), a - pop af + ld hl, CURKEY : ld a, (hl) + push af : xor a : ld (hl), a : pop af ret findZero: - ld a, (hl) - or a - ret z + ld a, (hl) : or a : ret z inc hl jp findZero input: - ld b, 20 - ld c, 0 - call gotoXY + ld b, 20 : ld c, 0 : call gotoXY - ld hl, cleanLine - call printZ64 - ld hl, iBuff - call findZero + ld hl, cleanLine : call printZ64 + + ld hl, iBuff : call findZero iLp: halt push hl - ld b, 20 - ld c, 0 - call gotoXY + + ld b, 20 : ld c, 0: call gotoXY + ld hl, iBuff : call printZ64 - ld hl, iBuff - call printZ64 - - ld a, '_' - call putC - ld a, ' ' - call putC + ld a, '_' : call putC : ld a, ' ' : call putC call inkey - cp 0 - jr z, iNth + cp 0 : jr z, iNth + cp 12 : jr z, iBS + cp 13 : jr z, iRet - cp 12 - jr z, iBS - - cp 13 - jr z, iRet - - pop hl - ld (hl), A - push hl - ld de, iBuff + 62 - sub hl, de - ld a, h - or l - jr z, iCr - pop hl - inc hl + pop hl : ld (hl), A : push hl + + ld de, iBuff + 62 : sub hl, de : ld a, h : or l : jr z, iCr + + pop hl : inc hl jr iLp -iBS: pop hl - push hl - ld de, iBuff - sub hl, de - ld a, h - or l - pop hl - jr z, iLp - dec hl - ld (hl), 0 - jr iLp -iCr pop hl - xor a - ld (hl), a - push hl -iNth pop hl + +iBS: pop hl : push hl + ld de, iBuff : sub hl, de : ld a, h : or l + pop hl :jr z, iLp + + dec hl : ld (hl), 0 jr iLp + +iCr pop hl : xor a : ld (hl), a : push hl +iNth pop hl: jr iLp + cleanIBuff: - ld bc, 64 - ld hl, iBuff - ld de, iBuff + 1 - ld (hl), 0 - ldir - ret + ld bc, 64 : ld hl, iBuff : ld de, iBuff + 1 : ld (hl), 0 : ldir + ret + iRet: pop hl - ld b, 20 - ld c, 0 - call gotoXY - - ld hl, cleanLine - call printZ64 + + ld b, 20 : ld c, 0 : call gotoXY + ld hl, cleanLine :call printZ64 ret iBuff defs 65 \ No newline at end of file diff --git a/software/ugophy/main.asm b/software/ugophy/main.asm index effdd9a..3d5426c 100644 --- a/software/ugophy/main.asm +++ b/software/ugophy/main.asm @@ -3,34 +3,40 @@ Start: di - xor a - call changeBank + call checkHighMem : jp nz, noMem + + xor a : out (#fe), a : call changeBank + ld sp, #5aff - ld de, #4000 - ld bc, eop - page_buffer - ld hl, page_buffer - ldir + ld de, #4000 : ld bc, eop - player : ld hl, player : ldir ei call renderHeader - ld hl, connecting_wifi - call printZ64 + ld hl, connecting_wifi : call printZ64 call initWifi call wSec - ld de, path - ld hl, server - ld bc, port - call openPage + ld de, path : ld hl, server : ld bc, port : call openPage jp showPage +noMem: + ld hl, no128k +nmLp: + push hl + ld a, (hl) + and a : jr z, $ + rst #10 + pop hl + inc hl + jp nmLp + + wSec: ld b, 50 -wsLp halt - djnz wsLp +wsLp halt : djnz wsLp include "tscreen.asm" include "keyboard.asm" @@ -43,7 +49,8 @@ wsLp halt include "ring.asm" include "esxdos.asm" -connecting_wifi db 13, ' Connecting to WiFi', 13, 0 + +connecting_wifi db 13, 'Connecting to WiFi', 13, 0 open_lbl db 'Opening connection to ', 0 path db '/ncmenu' @@ -54,6 +61,16 @@ port db '70' defs 5 db 0 page_buffer equ $ - INCBIN "player.bin" + display "PAGE buffer:", $ +no128k db 13, "You're started in 48k mode!", 13 + db "Current version require full", 13 + db "128K memory access", 13 + db "System halted!", 0 +player + DISPLAY "Player starts:" , $ + include "vtpl.asm" + DISPLAY "Player ends: ", $ + ENT eop equ $ SAVEBIN "ugoph.bin", Start, $ - Start + SAVETAP "ugoph.tap", Start \ No newline at end of file diff --git a/software/ugophy/render.asm b/software/ugophy/render.asm index 9a594f2..d1afbb3 100644 --- a/software/ugophy/render.asm +++ b/software/ugophy/render.asm @@ -1,229 +1,127 @@ showPage: - xor a - ld (show_offset), a - ld a, 1 - ld (cursor_pos), a + xor a : ld (show_offset), a + inc a :ld (cursor_pos), a backToPage: - call renderScreen - call showCursor + call renderScreen : call showCursor showLp: - xor a - call changeBank - + xor a : call changeBank jp controls - dup 5 - halt - edup - - jr showLp controls: call inkey - cp 0 - jr z, showLp - - cp 'q' - jp z, pageCursorUp - - cp 'a' - jp z, pageCursorDown - - cp 13 - jp z, selectItem - - cp 'b' - jp z, historyBack - - cp 'o' - jp z, pageScrollUp - - cp 'p' - jp z, pageScrollDn - - cp 'n' - jp z, openURI + cp 0 : jr z, showLp + cp 'q' : jp z, pageCursorUp + cp 'a' : jp z, pageCursorDown + cp 13 : jp z, selectItem + cp 'b' : jp z, historyBack + cp 'o' : jp z, pageScrollUp + cp 'p' : jp z, pageScrollDn + cp 'n' : jp z, openURI jp showLp historyBack: - ld hl, server - ld de, path - ld bc, port - call openPage + ld hl, server : ld de, path : ld bc, port : call openPage jp showPage pageCursorUp: - ld a, (cursor_pos) + ld a, (cursor_pos) dec a - cp 0 - jp z, pageScrollUp + cp 0 : jp z, pageScrollUp - push af - call hideCursor - pop af - ld (cursor_pos), a - call showCursor + push af : call hideCursor : pop af : ld (cursor_pos), a : call showCursor jp showLp pageCursorDown: ld a, (cursor_pos) inc a - cp 21 - jp z, pageScrollDn + cp 21 : jp z, pageScrollDn - push af - call hideCursor - pop af - ld (cursor_pos), a - call showCursor + push af : call hideCursor : pop af : ld (cursor_pos), a : call showCursor jp showLp pageScrollDn: - ld hl, (show_offset) - ld de, 20 - add hl, de - ld (show_offset), hl - ld a, 1 - ld (cursor_pos), a - call renderScreen - call showCursor - jp showLp + ld hl, (show_offset) : ld de, 20 : add hl, de : ld (show_offset), hl + ld a, 1 : ld (cursor_pos), a + + jp backToPage pageScrollUp: - ld a, (show_offset) - and a - jp z, showLp + ld a, (show_offset) : and a : jp z, showLp + ld hl, (show_offset) : ld de, 20 : sub hl, de : ld (show_offset), hl + ld a, 20 : ld (cursor_pos), a - ld hl, (show_offset) - ld de, 20 - sub hl, de - ld (show_offset), hl - - ld a, 20 - ld (cursor_pos), a jp backToPage selectItem: - ld a, (cursor_pos) - dec a - ld b, a - ld a, (show_offset) - add b - ld b, a + ld a, (cursor_pos) : dec a : ld b, a : ld a, (show_offset) : add b : ld b, a call findLine - ld a, h - cp l - ret z + + ld a, h : or l : jp z, showLp + ld a, (hl) - cp '1' - jr z, downPg - - cp '0' - jr z, downPg - - cp '9' - jp z, downFl - - cp '7' - jr z, userInput + cp '1' : jr z, downPg + cp '0' : jr z, downPg + cp '9' : jp z, downFl + cp '7' : jr z, userInput jp showLp userInput: - call cleanIBuff - call input + call cleanIBuff : call input - call extractInfo - ld hl, file_buffer - call findEnd - ld a, 9 - ld (hl), a - inc hl - ex hl, de - ld hl, iBuff - ld bc, 64 - ldir + call extractInfo + ld hl, file_buffer : call findEnd : ld a, 9 : ld (hl), a : inc hl + ex hl, de : ld hl, iBuff : ld bc, 64 : ldir - ld hl, hist - ld de, path - ld bc, 322 - ldir + ld hl, hist : ld de, path : ld bc, 322 : ldir - ld hl, server_buffer - ld de, file_buffer - ld bc, port_buffer - call openPage + ld hl, server_buffer : ld de, file_buffer : ld bc, port_buffer : call openPage + jp showPage downPg: push af call extractInfo - ld hl, hist - ld de, path - ld bc, 322 - ldir + ld hl, hist : ld de, path : ld bc, 322 : ldir - ld hl, server_buffer - ld de, file_buffer - ld bc, port_buffer - call openPage + ld hl, server_buffer : ld de, file_buffer : ld bc, port_buffer : call openPage + pop af - cp '1' - jp z,showPage - - cp '0' - jp z, showText + cp '1' : jp z,showPage + cp '0' : jp z, showText jp showLp downFl: - call extractInfo - call clearRing - call cleanIBuff + call extractInfo : call clearRing : call cleanIBuff - ld hl, file_buffer - call findFnme - jp isOpenable + ld hl, file_buffer : call findFnme : jp isOpenable dfl: - ld hl, file_buffer - call findFnme + ld hl, file_buffer : call findFnme + ld de, iBuff : ld bc, 65 : ldir - ld de, iBuff - ld bc, 65 - ldir - call input - ld hl, iBuff - call showTypePrint + ld hl, iBuff : call showTypePrint - ld hl, server_buffer - ld de, file_buffer - ld bc, port_buffer - call makeRequest + ld hl, server_buffer : ld de, file_buffer : ld bc, port_buffer : call makeRequest - xor a - call changeBank + xor a : call changeBank - ld hl, iBuff - call downloadData + ld hl, iBuff : call downloadData - call hideCursor - call showCursor + call hideCursor : call showCursor jp showLp isOpenable: - ld a, (hl) - and a - jr z, checkFile - push hl - call pushRing - pop hl + ld a, (hl) : and a : jr z, checkFile + push hl : call pushRing : pop hl inc hl jr isOpenable @@ -236,249 +134,154 @@ pt2Ext2 db ".PT2", 0 checkFile: ;; Images - ld hl, imgExt - call searchRing - cp 1 - jr z, loadImage - - ld hl, imgExt2 - call searchRing - cp 1 - jr z, loadImage + ld hl, imgExt : call searchRing : cp 1 : jr z, loadImage + ld hl, imgExt2 : call searchRing : cp 1 : jr z, loadImage ;; Music - xor a - ld (#4000 + 10), a + xor a: ld (#400A), a - ld hl, pt3Ext - call searchRing - cp 1 - jr z, playMusic + ld hl, pt3Ext : call searchRing : cp 1: jr z, playMusic + ld hl, pt3Ext2 : call searchRing : cp 1 : jr z, playMusic - ld hl, pt3Ext2 - call searchRing - cp 1 - jr z, playMusic + ld a, 2 : ld (#400A), a - ld a, 2 - ld (#4000 + 10), a - - ld hl, pt2Ext2 - call searchRing - cp 1 - jr z, playMusic - - - ld hl, pt2Ext - call searchRing - cp 1 - jr z, playMusic + ld hl, pt2Ext2 : call searchRing : cp 1 : jr z, playMusic + ld hl, pt2Ext : call searchRing : cp 1 : jr z, playMusic jp dfl loadImage: - ld hl, server_buffer - ld de, file_buffer - ld bc, port_buffer - call makeRequest + ld hl, server_buffer : ld de, file_buffer : ld bc, port_buffer : call makeRequest - ld a, 7 - call changeBank - - ld hl, #c000 - call loadData + ld a, 7 : call changeBank + ld hl, #c000 : call loadData - ld c, #ff - xor a - out (c), a -wKey: call inkey - or a - jr z, wKey - - xor a - call changeBank + ld c, #ff : xor a : out (c), a +wKey: + call inkey : or a : jr z, wKey + xor a : call changeBank jp backToPage playMusic: - ld hl, hist - ld de, path - ld bc, 322 - ldir + ld hl, hist : ld de, path : ld bc, 322 : ldir - ld hl, (show_offset) - push hl + ld hl, (show_offset) : push hl - ld hl, server_buffer - ld de, file_buffer - ld bc, port_buffer - call openPage + ld hl, server_buffer : ld de, file_buffer : ld bc, port_buffer : call openPage - ld hl, playing - call showTypePrint + ld hl, playing : call showTypePrint - xor a - call changeBank + xor a : call changeBank call setNoTurboMode - ld hl, page_buffer - call #4003 + ld a, (#400A) : or 1 : ld (#400A), a + ld hl, page_buffer : call #4003 playLp: - halt - call #4005 - xor a - in a, (#fe) - cpl - and 15 - jr z, playLp + halt : call #4005 + xor a : in a, (#fe) : cpl : and 15 : jp nz, stopPlay + ld a, (#400A) : rla : jr nc, playLp +songEnded: call #4008 + call setTurbo4Mode + ld hl, server : ld de, path : ld bc, port : call openPage + pop hl : ld (show_offset), hl + ld a, (cursor_pos) : inc a : cp 21 : jr z, playNxtPg : ld (cursor_pos), a + + jr playContinue +playNxtPg: + ld hl, (show_offset) : ld de, 20 : add hl, de : ld (show_offset), hl : ld a, 1 : ld (cursor_pos), a +playContinue: + call renderScreen : call showCursor + jp selectItem + +stopPlay: + call #4008 call setTurbo4Mode - ld hl, server - ld de, path - ld bc, port - call openPage - - pop hl - ld (show_offset), hl + ld hl, server : ld de, path : ld bc, port : call openPage + pop hl : ld (show_offset), hl jp backToPage findFnme: - push hl - pop de + push hl : pop de ffnmlp: ld a, (hl) - cp 0 - jr z, ffnmend - - cp '/' - jr z, fslsh - + cp 0 : jr z, ffnmend + cp '/' : jr z, fslsh inc hl jp ffnmlp fslsh: - inc hl - push hl - pop de + inc hl : push hl : pop de jp ffnmlp ffnmend: - push de - pop hl + push de : pop hl ret showType: - ld a, (cursor_pos) - dec a - ld b, a - ld a, (show_offset) - add b - ld b, a + ld a, (cursor_pos) : dec a : ld b, a : ld a, (show_offset) : add b : ld b, a + call findLine - ld a, h - cp l - jr z, showTypeUnknown + + ld a, h : or l : jr z, showTypeUnknown ld a, (hl) - cp 'i' - jr z, showTypeInfo - - cp '9' - jr z, showTypeDown - - cp '1' - jr z, showTypePage - - cp '0' - jr z, showTypeText - - cp '7' - jr z, showTypeInput + cp 'i' : jr z, showTypeInfo + cp '9' : jr z, showTypeDown + cp '1' : jr z, showTypePage + cp '0' : jr z, showTypeText + cp '7' : jr z, showTypeInput jr showTypeUnknown showTypeInput: - ld hl, type_inpt - call showTypePrint - call showURI + ld hl, type_inpt : call showTypePrint : call showURI ret showTypeText: - ld hl, type_text - call showTypePrint - call showURI + ld hl, type_text : call showTypePrint : call showURI ret showTypeInfo: - ld hl, type_info - jp showTypePrint + ld hl, type_info : jp showTypePrint showTypePage: - ld hl, type_page - call showTypePrint - call showURI + ld hl, type_page : call showTypePrint : call showURI ret showTypeDown: - ld hl, type_down - call showTypePrint - call showURI + ld hl, type_down : call showTypePrint : call showURI ret showURI: - call extractInfo - ld hl, server_buffer - call printZ64 - - ld hl, file_buffer - call printZ64 + call extractInfo : ld hl, server_buffer : call printZ64 + ld hl, file_buffer : call printZ64 ret + showTypeUnknown: - ld hl, type_unkn - jp showTypePrint + ld hl, type_unkn : jp showTypePrint showTypePrint: push hl - ld b, 21 - ld c, 0 - call gotoXY - ld hl, cleanLine - call printZ64 - - ld b, 21 - ld c, 0 - call gotoXY - pop hl - call printZ64 - ret + ld b, 21 : ld c, 0 : call gotoXY : ld hl, cleanLine : call printZ64 + ld b, 21 : ld c, 0 : call gotoXY : pop hl : jp printZ64 renderHeader: - call clearScreen - ld bc, 0 - call gotoXY - - ld hl, head - call printZ64 - - ld d, 0 - call inverseLine - + call clearScreen : ld bc, 0 : call gotoXY + ld hl, head : call printZ64 + ld d, 0 : call inverseLine ret renderScreen: - call renderHeader + call renderHeader ld b, 20 renderLp: push bc - ld a, 20 - sub b - ld b, a - ld a, (show_offset) - add b - ld b, a + ld a, 20 : sub b : ld b, a : ld a, (show_offset) : add b : ld b, a call renderLine pop bc djnz renderLp @@ -487,17 +290,10 @@ renderLp: ; b - line number renderLine: call findLine - - ld a, h - or l - ret z - - ld a, (hl) - and a - ret z + ld a, h: or l: ret z + ld a, (hl) : and a : ret z inc hl - call printT64 - call mvCR + call printT64 : call mvCR ret ; B - line number @@ -505,85 +301,61 @@ renderLine: findLine: ld hl, page_buffer fndLnLp: - ld a, b - and a - ret z + ld a, b : and a : ret z ld a, (hl) + + ; Buffer ends? + and a : jr z, fndEnd - and a ; Buffer ends? - jr z, fndEnd + ; New line? + cp 10 : jr z, fndLnNL - cp 10 ; New line? - jr z, fndLnNL inc hl jp fndLnLp fndLnNL: - dec b - inc hl - jp fndLnLp + dec b : inc hl : jp fndLnLp fndEnd: - ld hl, 0 - ret + ld hl, 0 : ret extractInfo: - ld a, (cursor_pos) - dec a - ld b, a - ld a, (show_offset) - add b - ld b, a - call findLine - ld a, h - cp l - ret z + ld a, (cursor_pos) : dec a : ld b, a : ld a, (show_offset) : add b : ld b, a - call findNextBlock - inc hl - ld de, file_buffer - call extractCol - inc hl - ld de, server_buffer - call extractCol - inc hl - ld de, port_buffer - call extractCol + call findLine + + ld a, h : or l : ret z + + call findNextBlock + + inc hl : ld de, file_buffer : call extractCol + inc hl : ld de, server_buffer : call extractCol + inc hl : ld de, port_buffer : call extractCol ret extractCol: ld a, (hl) - cp 0 - jr z, endExtract - - cp 09 - jr z, endExtract - - cp 13 - jr z, endExtract - - ld (de), a - inc de - inc hl + cp 0 : jr z, endExtract + cp 09 : jr z, endExtract + cp 13 : jr z, endExtract + + ld (de), a : inc de : inc hl jr extractCol endExtract: - xor a - ld (de), a + xor a : ld (de), a ret findNextBlock: ld a, (hl) - cp 09 ; TAB - ret z - - cp 13 ; New line - ret z - - cp 0 ; End buffer - ret z +; TAB + cp 09 : ret z +; New line + cp 13 : ret z +; End of buffer + cp 0 : ret z inc hl jp findNextBlock @@ -591,7 +363,7 @@ findNextBlock: show_offset db 0 cursor_pos db 1 -head db " UGophy - ZX-UNO Gopher client v. 0.7c (c) Alexander Sharikhin", 13,0 +head db " UGophy - ZX-UNO Gopher client v. 0.8 (c) Alexander Sharikhin", 13,0 cleanLine db " ",0 playing db "Playing... Hold to stop!", 0 diff --git a/software/ugophy/ring.asm b/software/ugophy/ring.asm index c989326..e420b5d 100644 --- a/software/ugophy/ring.asm +++ b/software/ugophy/ring.asm @@ -1,67 +1,38 @@ ; Pushes A to ring buffer pushRing push af - ld b, 32 - ld hl, ring_buffer + 1 - ld de, ring_buffer + ld b, 32 : ld hl, ring_buffer + 1 : ld de, ring_buffer ringL - ld a, (hl) - ld (de), a - inc hl - inc de - djnz ringL + ld a, (hl) : ld (de), a : inc hl : inc de : djnz ringL pop af - ld hl, ring_buffer + 31 - ld (hl), a + ld hl, ring_buffer + 31 : ld (hl), a ret ; HL - Compare string(null terminated) ; A - 0 NOT Found ; 1 Found searchRing: - ld b, 0 - push hl + ld b, 0 : push hl serlp: - ld a, (hl) - inc hl - inc b - and a - jp nz, serlp - dec b - pop hl - push bc - push hl + ld a, (hl) : inc hl : inc b : and a : jp nz, serlp + dec b : pop hl : push bc : push hl SRWork: - pop hl + pop hl ld de, ring_buffer + 32 srcLp - dec de - djnz srcLp + dec de : djnz srcLp pop bc ringCmpLp - push bc - push af - ld a, (de) - ld b, a - pop af - ld a, (hl) - cp b - pop bc - ld a, 0 - ret nz - inc de - inc hl + push bc : push af + ld a, (de) : ld b, a + pop af : ld a, (hl) : cp b : pop bc : ld a, 0 : ret nz + inc de : inc hl djnz ringCmpLp ld a, 1 ret clearRing: - xor a - ld hl, ring_buffer - ld de, ring_buffer + 1 - ld bc, 32 - ld (hl), a - ldir + xor a : ld hl, ring_buffer : ld de, ring_buffer + 1 : ld bc, 32 : ld (hl), a : ldir ret ring_buffer dup 33 diff --git a/software/ugophy/textrender.asm b/software/ugophy/textrender.asm index 80ba77a..616ca53 100644 --- a/software/ugophy/textrender.asm +++ b/software/ugophy/textrender.asm @@ -1,12 +1,10 @@ showText: - xor a - ld (show_offset), a + xor a : ld (show_offset), a call renderTextScreen showTxLp: call txControls - xor a - call changeBank + xor a : call changeBank dup 5 halt @@ -16,37 +14,27 @@ showTxLp: txControls: call inkey - and a - ret z + and a : ret z - cp 'q' - jp z, txUp - - cp 'a' - jp z, txDn - - cp 'b' - jp z, historyBack - - cp 'o' - jp z, openURI + cp 'q' : jp z, txUp + cp 'a' : jp z, txDn + cp 'b' : jp z, historyBack + cp 'n' : jp z, openURI ret txUp: ld a, (show_offset) - and a - ret z + and a : ret z - sub 20 - ld (show_offset), a + sub 20 : ld (show_offset), a call renderTextScreen ret txDn: - ld a, (show_offset) - add 20 - ld (show_offset), a + ld a, (show_offset) + add 20 : ld (show_offset), a + call renderTextScreen ret @@ -55,13 +43,10 @@ renderTextScreen: ld b, 20 txRenderLp: push bc - ld a, 20 - sub b - ld b, a - ld a, (show_offset) - add b - ld b, a + + ld a, 20 : sub b : ld b, a : ld a, (show_offset) : add b : ld b, a call renderTextLine + pop bc djnz txRenderLp ret @@ -70,13 +55,9 @@ txRenderLp: renderTextLine: call findLine - ld a, h - or l - ret z + ld a, h : or l : ret z + ld a, (hl) : and a : ret z - ld a, (hl) - and a - ret z call printL64 call mvCR ret diff --git a/software/ugophy/uart.asm b/software/ugophy/uart.asm index abdc792..7b4ccf2 100644 --- a/software/ugophy/uart.asm +++ b/software/ugophy/uart.asm @@ -7,29 +7,16 @@ UART_BYTE_SENDING = #40 ; Cleaning all flags by reading UART regs ; Wastes AF and BC uartBegin: - ld bc, ZXUNO_ADDR - ld a, UART_STAT_REG - out (c), a - - ld bc, ZXUNO_REG - in A, (c) - - ld bc, ZXUNO_ADDR - ld a, UART_DATA_REG - out (c), a - - ld bc, ZXUNO_REG - in A, (c) + ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a + ld bc, ZXUNO_REG : in A, (c) + ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a + ld bc, ZXUNO_REG : in A, (c) ret ; Blocking read one byte uartReadBlocking: call uartRead - push af - ld a, 1 - cp b - jr z, urb - pop af + push af : ld a, 1 : cp b : jr z, urb : pop af ret nz jp uartReadBlocking urb: @@ -41,72 +28,45 @@ urb: ; BC will be wasted uartWriteByte: push af - ld bc, ZXUNO_ADDR - ld a, UART_STAT_REG - out (c), a - + ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a waitWriteReady: - ld bc, ZXUNO_REG - in A, (c) - and UART_BYTE_RECIVED + ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_RECIVED jr nz, is_recvF checkSent: - ld bc, ZXUNO_REG - in A, (c) - and UART_BYTE_SENDING + ld bc, ZXUNO_REG : in A, (c) : and UART_BYTE_SENDING jr nz, checkSent - ld bc, ZXUNO_ADDR - ld a, UART_DATA_REG - out (c), a - ld bc, ZXUNO_REG - pop af - out (c), a + ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a + + ld bc, ZXUNO_REG : pop af : out (c), a ret is_recvF: - push af - push hl - ld hl, is_recv - ld a, 1 - ld (hl), a - pop hl - pop af + push af : push hl + + ld hl, is_recv : ld a, 1 : ld (hl), a + + pop hl : pop af jr checkSent ; Is data avail in UART ; NZ - Data Presents ; Z - Data absent uartAvail: - ld a, (is_recv) - and 1 - ret nz - - ld a, (poked_byte) - and 1 - ret nz + ld a, (is_recv) : and 1 : ret nz + ld a, (poked_byte) : and 1 : ret nz call uartRead + push af : ld a, b : and 1 : jr z, noneData : pop af + push af - ld a, b - and 1 - jr z, noneData - pop af - push af - ld hl, byte_buff - ld (hl), a - ld hl, poked_byte - ld a, 1 - ld (hl), a + ld hl, byte_buff : ld (hl), a : ld hl, poked_byte : ld a, 1 : ld (hl), a pop af - ld b, a - ld a, 1 - or a - ld a, b + + ld b, a : ld a, 1 : or a : ld a, b ret noneData: - pop bc - xor a + pop bc : xor a ret ; Read byte from UART @@ -115,63 +75,38 @@ noneData: ; 1 - Was read ; 0 - Nothing to read uartRead: - ld a, (poked_byte) - and 1 - jr nz, retBuff + ld a, (poked_byte) : and 1 : jr nz, retBuff - ld a, (is_recv) - and 1 - jr nz, recvRet + ld a, (is_recv) : and 1 : jr nz, recvRet - ld bc, ZXUNO_ADDR - ld a, UART_STAT_REG - out (c), a - - ld bc, ZXUNO_REG - in a, (c) - and UART_BYTE_RECIVED + ld bc, ZXUNO_ADDR : ld a, UART_STAT_REG : out (c), a + ld bc, ZXUNO_REG : in a, (c) : and UART_BYTE_RECIVED jr nz, retReadByte ld b, 0 ret retReadByte: - ld a, 0 - ld (poked_byte), a - ld (is_recv), a + xor a : ld (poked_byte), a : ld (is_recv), a - ld bc, ZXUNO_ADDR - ld a, UART_DATA_REG - out (c), a - - ld bc, ZXUNO_REG - in a, (c) + ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c), a + ld bc, ZXUNO_REG : in a, (c) ld b, 1 ret recvRet: - ld bc, ZXUNO_ADDR - ld a, UART_DATA_REG - out (c),a + ld bc, ZXUNO_ADDR : ld a, UART_DATA_REG : out (c),a - ld bc, ZXUNO_REG - in a, (c) - - ld hl, is_recv - ld (hl), 0 - - ld hl, poked_byte - ld (hl), 0 + ld bc, ZXUNO_REG : in a, (c) + ld hl, is_recv : ld (hl), 0 + ld hl, poked_byte : ld (hl), 0 ld b, 1 ret retBuff - ld a, 0 - ld (poked_byte), a - - ld a, (byte_buff) + ld a, 0 : ld (poked_byte), a : ld a, (byte_buff) ld b, 1 ret diff --git a/software/ugophy/utils.asm b/software/ugophy/utils.asm index cb14b85..2055871 100644 --- a/software/ugophy/utils.asm +++ b/software/ugophy/utils.asm @@ -2,56 +2,45 @@ SCANDBLCTRL_REG = #0B ZXUNO_ADDR = #FC3B ZXUNO_REG = #FD3B +; This routine checks availability of extended(128K) memory. +; Output: +; Flag: Z - High memory available +checkHighMem: + xor a : call changeBank: ld hl, #c000 : xor a :ld (hl), a ; Let's write in zero page zero value + inc a : call changeBank : ld a, 13 : ld (hl), a ; In other page - any other value. Let's write luck 13 + xor a : call changeBank : ld a, (hl) : and a ; When we back to zero page - still there zero?! + ret + ; A - memory bank changeBank: - ld bc, #7ffd - or #18 - out (c), a + ld bc, #7ffd : or #18 : out (c), a ret setNoTurboMode: - push af - push bc + push af : push bc - ld a, SCANDBLCTRL_REG - ld bc, ZXUNO_ADDR - out (c), a - - ld bc, ZXUNO_REG - in a, (c) - and #3f - out (c), a + ld a, SCANDBLCTRL_REG : ld bc, ZXUNO_ADDR : out (c), a + ld bc, ZXUNO_REG : in a, (c) : and #3f : out (c), a ; And #3F - keep scandoubler settings - pop bc - pop af + pop bc : pop af ret setTurbo4Mode: - push af - push bc - ld a, SCANDBLCTRL_REG - ld bc, ZXUNO_ADDR - out (c), a + push af : push bc - ld bc, ZXUNO_REG - in a, (c) - and #3f - or #80 - out (c), a + ld a, SCANDBLCTRL_REG : ld bc, ZXUNO_ADDR : out (c), a + ld bc, ZXUNO_REG : in a, (c) : and #3f : or #80 : out (c), a - pop bc - pop af + pop bc : pop af ret ; Pushes to UART zero-terminated string ; HL - string poiner uartWriteStringZ: - ld a, (hl) - and a - ret z - push hl - call uartWriteByte - pop hl + ld a, (hl) : and a : ret z + + push hl : call uartWriteByte : pop hl + inc hl jp uartWriteStringZ @@ -59,54 +48,40 @@ uartWriteStringZ: ; HL - string pointer putStringZ: printZ64: - ld a,(hl) - and a - ret z - push hl - call putC - pop hl + ld a,(hl) : and a : ret z + + push hl : call putC : pop hl + inc hl jr printZ64 printT64: ld b, 63 ptlp: - ld a, 0 - or b - ret z - ld a, (hl) + ld a, 0 : or b : ret z - and a - ret z + ld a, (hl) - cp 09 - ret z + and a : ret z + cp 09 : ret z - push bc - push hl - call putC - pop hl - inc hl - pop bc - dec b + push bc + + push hl : call putC : pop hl + + inc hl : pop bc : dec b jr ptlp printL64: ld a, (hl) - and a - ret z - - cp #0A - ret z + and a : ret z + cp #0A : ret z + cp #0D : ret z - cp #0D - ret z - - push hl - call putC - pop hl - inc hl + push hl : call putC : pop hl + + inc hl jr printL64 ; HL - string @@ -114,24 +89,24 @@ printL64: getStringLength: ld bc, 0 strLnLp - ld a, (hl) - and a - ret z - inc bc + ld a, (hl) : and a : ret z + inc bc inc hl jr strLnLp SkipWhitespace: - ld a, (hl) - cp ' ' - ret nz - inc hl + ld a, (hl) + + cp ' ' : ret nz + + inc hl jr SkipWhitespace findEnd: ld a,(hl) - and a - ret z + + and a : ret z + inc hl jr findEnd diff --git a/software/ugophy/vtpl.asm b/software/ugophy/vtpl.asm index 1b1934c..13927b0 100644 --- a/software/ugophy/vtpl.asm +++ b/software/ugophy/vtpl.asm @@ -1,1555 +1,1680 @@ -;Universal PT2 and PT3 player for ZX Spectrum and MSX -;(c)2004-2007 S.V.Bulba -;http://bulba.untergrund.net (http://bulba.at.kz) - -;Release number -Release EQU "1" - DEVICE ZXSPECTRUM48 - -;Conditional assembly -;1) Version of ROUT (ZX or MSX standards) -ZX=1 -MSX=0 -;2) Current position counter at (START+11) -CurPosCounter=0 -;3) Allow channels allocation bits at (START+10) -ACBBAC=0 -;4) Allow loop checking and disabling -LoopChecker=0 -;5) Insert official identificator -Id=0 - -;Features -;-------- -;-Can be compiled at any address (i.e. no need rounding ORG -; address). -;-Variables (VARS) can be located at any address (not only after -;code block). -;-INIT subprogram checks PT3-module version and rightly -; generates both note and volume tables outside of code block -; (in VARS). -;-Two portamento (spc. command 3xxx) algorithms (depending of -; PT3 module version). -;-New 1.XX and 2.XX special command behaviour (only for PT v3.7 -; and higher). -;-Any Tempo value are accepted (including Tempo=1 and Tempo=2). -;-Fully compatible with Ay_Emul PT3 and PT2 players codes. -;-See also notes at the end of this source code. - -;Limitations -;----------- -;-Can run in RAM only (self-modified code is used). -;-PT2 position list must be end by #FF marker only. - -;Warning!!! PLAY subprogram can crash if no module are loaded -;into RAM or INIT subprogram was not called before. - -;Call MUTE or INIT one more time to mute sound after stopping -;playing - - ORG #4000 - -;Test codes (commented) -; LD A,2 ;PT2,ABC,Looped -; LD (START+10),A -; CALL START -; EI -;_LP HALT -; CALL START+5 -; XOR A -; IN A,(#FE) -; CPL -; AND 15 -; JR Z,_LP -; JR START+8 - -TonA EQU 0 -TonB EQU 2 -TonC EQU 4 -Noise EQU 6 -Mixer EQU 7 -AmplA EQU 8 -AmplB EQU 9 -AmplC EQU 10 -Env EQU 11 -EnvTp EQU 13 - -;Entry and other points -;START initialize playing of module at MDLADDR -;START+3 initialization with module address in HL -;START+5 play one quark -;START+8 mute -;START+10 setup and status flags -;START+11 current position value (byte) (optional) - -START - LD HL,MDLADDR - JR INIT - JP PLAY - JR MUTE -SETUP DB 0 ;set bit0, if you want to play without looping - ;(optional); - ;set bit1 for PT2 and reset for PT3 before - ;calling INIT; - ;bits2-3: %00-ABC, %01 ACB, %10 BAC (optional); - ;bits4-6 are not used - ;bit7 is set each time, when loop point is passed - ;(optional) - IF CurPosCounter -CurPos DB 0 ;for visualization only (i.e. no need for playing) - ENDIF - -;Identifier - IF Id - DB "=Uni PT2 and PT3 Player r.",Release,"=" - ENDIF - - IF LoopChecker -CHECKLP LD HL,SETUP - SET 7,(HL) - BIT 0,(HL) - RET Z - POP HL - LD HL,DelyCnt - INC (HL) - LD HL,ChanA+CHP.NtSkCn - INC (HL) - ENDIF - -MUTE XOR A - LD H,A - LD L,A - LD (AYREGS+AmplA),A - LD (AYREGS+AmplB),HL - JP ROUT - -INIT -;HL - AddressOfModule - LD A,(START+10) - AND 2 - JR NZ,INITPT2 - - CALL SETMDAD - PUSH HL - LD DE,100 - ADD HL,DE - LD A,(HL) - LD (Delay),A - PUSH HL - POP IX - ADD HL,DE - LD (CrPsPtr),HL - LD E,(IX+102-100) - INC HL - - IF CurPosCounter - LD A,L - LD (PosSub+1),A - ENDIF - - ADD HL,DE - LD (LPosPtr),HL - POP DE - LD L,(IX+103-100) - LD H,(IX+104-100) - ADD HL,DE - LD (PatsPtr),HL - LD HL,169 - ADD HL,DE - LD (OrnPtrs),HL - LD HL,105 - ADD HL,DE - LD (SamPtrs),HL - LD A,(IX+13-100) ;EXTRACT VERSION NUMBER - SUB #30 - JR C,L20 - CP 10 - JR C,L21 -L20 LD A,6 -L21 LD (Version),A - PUSH AF ;VolTable version - CP 4 - LD A,(IX+99-100) ;TONE TABLE NUMBER - RLA - AND 7 - PUSH AF ;NoteTable number - LD HL,(e_-SamCnv-2)*256+#18 - LD (SamCnv),HL - LD A,#BA - LD (OrnCP),A - LD (SamCP),A - LD A,#7B - LD (OrnLD),A - LD (SamLD),A - LD A,#87 - LD (SamClc2),A - LD BC,PT3PD - LD HL,0 - LD DE,PT3EMPTYORN - JR INITCOMMON - -INITPT2 LD A,(HL) - LD (Delay),A - PUSH HL - PUSH HL - PUSH HL - INC HL - INC HL - LD A,(HL) - INC HL - LD (SamPtrs),HL - LD E,(HL) - INC HL - LD D,(HL) - POP HL - AND A - SBC HL,DE - CALL SETMDAD - POP HL - LD DE,67 - ADD HL,DE - LD (OrnPtrs),HL - LD E,32 - ADD HL,DE - LD C,(HL) - INC HL - LD B,(HL) - LD E,30 - ADD HL,DE - LD (CrPsPtr),HL - LD E,A - INC HL - - IF CurPosCounter - LD A,L - LD (PosSub+1),A - ENDIF - - ADD HL,DE - LD (LPosPtr),HL - POP HL - ADD HL,BC - LD (PatsPtr),HL - LD A,5 - LD (Version),A - PUSH AF - LD A,2 - PUSH AF - LD HL,#51CB - LD (SamCnv),HL - LD A,#BB - LD (OrnCP),A - LD (SamCP),A - LD A,#7A - LD (OrnLD),A - LD (SamLD),A - LD A,#80 - LD (SamClc2),A - LD BC,PT2PD - LD HL,#8687 - LD DE,PT2EMPTYORN - -INITCOMMON - - LD (PTDECOD+1),BC - LD (PsCalc),HL - PUSH DE - -;note table data depacker -;(c) Ivan Roshin - LD DE,T_PACK - LD BC,T1_+(2*49)-1 -TP_0 LD A,(DE) - INC DE - CP 15*2 - JR NC,TP_1 - LD H,A - LD A,(DE) - LD L,A - INC DE - JR TP_2 -TP_1 PUSH DE - LD D,0 - LD E,A - ADD HL,DE - ADD HL,DE - POP DE -TP_2 LD A,H - LD (BC),A - DEC BC - LD A,L - LD (BC),A - DEC BC - SUB #F8*2 - JR NZ,TP_0 - - IF LoopChecker - LD HL,SETUP - RES 7,(HL) - - IF CurPosCounter - INC HL - LD (HL),A - ENDIF - - ELSE - - IF CurPosCounter - LD (CurPos),A - ENDIF - - ENDIF - - LD HL,VARS - LD (HL),A - LD DE,VARS+1 - LD BC,VAR0END-VARS-1 - LDIR - LD (AdInPtA),HL ;ptr to zero - INC A - LD (DelyCnt),A - LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn - LD (ChanA+CHP.NtSkCn),HL - LD (ChanB+CHP.NtSkCn),HL - LD (ChanC+CHP.NtSkCn),HL - POP HL - LD (ChanA+CHP.OrnPtr),HL - LD (ChanB+CHP.OrnPtr),HL - LD (ChanC+CHP.OrnPtr),HL - - POP AF - -;NoteTableCreator (c) Ivan Roshin -;A - NoteTableNumber*2+VersionForNoteTable -;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0) - - LD HL,NT_DATA - PUSH DE - LD D,B - ADD A,A - LD E,A - ADD HL,DE - LD E,(HL) - INC HL - SRL E - SBC A,A - AND #A7 ;#00 (NOP) or #A7 (AND A) - LD (L3),A - EX DE,HL - POP BC ;BC=T1_ - ADD HL,BC - - LD A,(DE) - ADD A,T_ - LD C,A - ADC A,T_/256 - SUB C - LD B,A - PUSH BC - LD DE,NT_ - PUSH DE - - LD B,12 -L1 PUSH BC - LD C,(HL) - INC HL - PUSH HL - LD B,(HL) - - PUSH DE - EX DE,HL - LD DE,23 - LD IXH,8 - -L2 SRL B - RR C -L3 DB #19 ;AND A or NOP - LD A,C - ADC A,D ;=ADC 0 - LD (HL),A - INC HL - LD A,B - ADC A,D - LD (HL),A - ADD HL,DE - DEC IXH - JR NZ,L2 - - POP DE - INC DE - INC DE - POP HL - INC HL - POP BC - DJNZ L1 - - POP HL - POP DE - - LD A,E - CP TCOLD_1 - JR NZ,CORR_1 - LD A,#FD - LD (NT_+#2E),A - -CORR_1 LD A,(DE) - AND A - JR Z,TC_EXIT - RRA - PUSH AF - ADD A,A - LD C,A - ADD HL,BC - POP AF - JR NC,CORR_2 - DEC (HL) - DEC (HL) -CORR_2 INC (HL) - AND A - SBC HL,BC - INC DE - JR CORR_1 - -TC_EXIT - - POP AF - -;VolTableCreator (c) Ivan Roshin -;A - VersionForVolumeTable (0..4 - 3.xx..3.4x; - ;5.. - 2.x,3.5x..3.6x..VTII1.0) - - CP 5 - LD HL,#11 - LD D,H - LD E,H - LD A,#17 - JR NC,M1 - DEC L - LD E,L - XOR A -M1 LD (M2),A - - LD IX,VT_+16 - - LD C,#F -INITV2 PUSH HL - - ADD HL,DE - EX DE,HL - SBC HL,HL - - LD B,#10 -INITV1 LD A,L -M2 DB #7D - LD A,H - ADC A,0 - LD (IX),A - INC IX - ADD HL,DE - DJNZ INITV1 - - POP HL - LD A,E - CP #77 - JR NZ,M3 - INC E -M3 DEC C - JR NZ,INITV2 - - JP ROUT - -SETMDAD LD (MODADDR),HL - LD (MDADDR1),HL - LD (MDADDR2),HL - RET - -PTDECOD JP #C3C3 - -;PT2 pattern decoder -PD2_SAM CALL SETSAM - JR PD2_LOOP - -PD2_EOff LD (IX-12+CHP.Env_En),A - JR PD2_LOOP - -PD2_ENV LD (IX-12+CHP.Env_En),16 - LD (AYREGS+EnvTp),A - LD A,(BC) - INC BC - LD L,A - LD A,(BC) - INC BC - LD H,A - LD (EnvBase),HL - JR PD2_LOOP - -PD2_ORN CALL SETORN - JR PD2_LOOP - -PD2_SKIP INC A - LD (IX-12+CHP.NNtSkp),A - JR PD2_LOOP - -PD2_VOL RRCA - RRCA - RRCA - RRCA - LD (IX-12+CHP.Volume),A - JR PD2_LOOP - -PD2_DEL CALL C_DELAY - JR PD2_LOOP - -PD2_GLIS SET 2,(IX-12+CHP.Flags) - INC A - LD (IX-12+CHP.TnSlDl),A - LD (IX-12+CHP.TSlCnt),A - LD A,(BC) - INC BC - LD (IX-12+CHP.TSlStp),A - ADD A,A - SBC A,A - LD (IX-12+CHP.TSlStp+1),A - SCF - JR PD2_LP2 - -PT2PD AND A - -PD2_LP2 EX AF,AF' - -PD2_LOOP LD A,(BC) - INC BC - ADD A,#20 - JR Z,PD2_REL - JR C,PD2_SAM - ADD A,96 - JR C,PD2_NOTE - INC A - JR Z,PD2_EOff - ADD A,15 - JP Z,PD_FIN - JR C,PD2_ENV - ADD A,#10 - JR C,PD2_ORN - ADD A,#40 - JR C,PD2_SKIP - ADD A,#10 - JR C,PD2_VOL - INC A - JR Z,PD2_DEL - INC A - JR Z,PD2_GLIS - INC A - JR Z,PD2_PORT - INC A - JR Z,PD2_STOP - LD A,(BC) - INC BC - LD (IX-12+CHP.CrNsSl),A - JR PD2_LOOP - -PD2_PORT RES 2,(IX-12+CHP.Flags) - LD A,(BC) - INC BC - INC BC ;ignoring precalc delta to right sound - INC BC - SCF - JR PD2_LP2 - -PD2_STOP LD (IX-12+CHP.TSlCnt),A - JR PD2_LOOP - -PD2_REL LD (IX-12+CHP.Flags),A - JR PD2_EXIT - -PD2_NOTE LD L,A - LD A,(IX-12+CHP.Note) - LD (PrNote+1),A - LD (IX-12+CHP.Note),L - XOR A - LD (IX-12+CHP.TSlCnt),A - SET 0,(IX-12+CHP.Flags) - EX AF,AF' - JR NC,NOGLIS2 - BIT 2,(IX-12+CHP.Flags) - JR NZ,NOPORT2 - LD (LoStep),A - ADD A,A - SBC A,A - EX AF,AF' - LD H,A - LD L,A - INC A - CALL SETPORT -NOPORT2 LD (IX-12+CHP.TSlCnt),1 -NOGLIS2 XOR A - - -PD2_EXIT LD (IX-12+CHP.PsInSm),A - LD (IX-12+CHP.PsInOr),A - LD (IX-12+CHP.CrTnSl),A - LD (IX-12+CHP.CrTnSl+1),A - JP PD_FIN - -;PT3 pattern decoder -PD_OrSm LD (IX-12+CHP.Env_En),0 - CALL SETORN -PD_SAM_ LD A,(BC) - INC BC - RRCA - -PD_SAM CALL SETSAM - JR PD_LOOP - -PD_VOL RRCA - RRCA - RRCA - RRCA - LD (IX-12+CHP.Volume),A - JR PD_LP2 - -PD_EOff LD (IX-12+CHP.Env_En),A - LD (IX-12+CHP.PsInOr),A - JR PD_LP2 - -PD_SorE DEC A - JR NZ,PD_ENV - LD A,(BC) - INC BC - LD (IX-12+CHP.NNtSkp),A - JR PD_LP2 - -PD_ENV CALL SETENV - JR PD_LP2 - -PD_ORN CALL SETORN - JR PD_LOOP - -PD_ESAM LD (IX-12+CHP.Env_En),A - LD (IX-12+CHP.PsInOr),A - CALL NZ,SETENV - JR PD_SAM_ - -PT3PD LD A,(IX-12+CHP.Note) - LD (PrNote+1),A - LD L,(IX-12+CHP.CrTnSl) - LD H,(IX-12+CHP.CrTnSl+1) - LD (PrSlide+1),HL - -PD_LOOP LD DE,#2010 -PD_LP2 LD A,(BC) - INC BC - ADD A,E - JR C,PD_OrSm - ADD A,D - JR Z,PD_FIN - JR C,PD_SAM - ADD A,E - JR Z,PD_REL - JR C,PD_VOL - ADD A,E - JR Z,PD_EOff - JR C,PD_SorE - ADD A,96 - JR C,PD_NOTE - ADD A,E - JR C,PD_ORN - ADD A,D - JR C,PD_NOIS - ADD A,E - JR C,PD_ESAM - ADD A,A - LD E,A - LD HL,SPCCOMS+#FF20-#2000 - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - PUSH DE - JR PD_LOOP - -PD_NOIS LD (Ns_Base),A - JR PD_LP2 - -PD_REL RES 0,(IX-12+CHP.Flags) - JR PD_RES - -PD_NOTE LD (IX-12+CHP.Note),A - SET 0,(IX-12+CHP.Flags) - XOR A - -PD_RES LD (PDSP_+1),SP - LD SP,IX - LD H,A - LD L,A - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL - PUSH HL -PDSP_ LD SP,#3131 - -PD_FIN LD A,(IX-12+CHP.NNtSkp) - LD (IX-12+CHP.NtSkCn),A - RET - -C_PORTM LD A,(BC) - INC BC -;SKIP PRECALCULATED TONE DELTA (BECAUSE -;CANNOT BE RIGHT AFTER PT3 COMPILATION) - INC BC - INC BC - EX AF,AF' - LD A,(BC) ;SIGNED TONE STEP - INC BC - LD (LoStep),A - LD A,(BC) - INC BC - AND A - EX AF,AF' - LD L,(IX-12+CHP.CrTnSl) - LD H,(IX-12+CHP.CrTnSl+1) - -;Set portamento variables -;A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl - -SETPORT RES 2,(IX-12+CHP.Flags) - LD (IX-12+CHP.TnSlDl),A - LD (IX-12+CHP.TSlCnt),A - PUSH HL - LD DE,NT_ - LD A,(IX-12+CHP.Note) - LD (IX-12+CHP.SlToNt),A - ADD A,A - LD L,A - LD H,0 - ADD HL,DE - LD A,(HL) - INC HL - LD H,(HL) - LD L,A - PUSH HL -PrNote LD A,#3E - LD (IX-12+CHP.Note),A - ADD A,A - LD L,A - LD H,0 - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) - POP HL - SBC HL,DE - LD (IX-12+CHP.TnDelt),L - LD (IX-12+CHP.TnDelt+1),H - POP DE -Version EQU $+1 - LD A,#3E - CP 6 - JR C,OLDPRTM ;Old 3xxx for PT v3.5- -PrSlide LD DE,#1111 - LD (IX-12+CHP.CrTnSl),E - LD (IX-12+CHP.CrTnSl+1),D -LoStep EQU $+1 -OLDPRTM LD A,#3E - EX AF,AF' - JR Z,NOSIG - EX DE,HL -NOSIG SBC HL,DE - JP P,SET_STP - CPL - EX AF,AF' - NEG - EX AF,AF' -SET_STP LD (IX-12+CHP.TSlStp+1),A - EX AF,AF' - LD (IX-12+CHP.TSlStp),A - LD (IX-12+CHP.COnOff),0 - RET - -C_GLISS SET 2,(IX-12+CHP.Flags) - LD A,(BC) - INC BC - LD (IX-12+CHP.TnSlDl),A - AND A - JR NZ,GL36 - LD A,(Version) ;AlCo PT3.7+ - CP 7 - SBC A,A - INC A -GL36 LD (IX-12+CHP.TSlCnt),A - LD A,(BC) - INC BC - EX AF,AF' - LD A,(BC) - INC BC - JR SET_STP - -C_SMPOS LD A,(BC) - INC BC - LD (IX-12+CHP.PsInSm),A - RET - -C_ORPOS LD A,(BC) - INC BC - LD (IX-12+CHP.PsInOr),A - RET - -C_VIBRT LD A,(BC) - INC BC - LD (IX-12+CHP.OnOffD),A - LD (IX-12+CHP.COnOff),A - LD A,(BC) - INC BC - LD (IX-12+CHP.OffOnD),A - XOR A - LD (IX-12+CHP.TSlCnt),A - LD (IX-12+CHP.CrTnSl),A - LD (IX-12+CHP.CrTnSl+1),A - RET - -C_ENGLS LD A,(BC) - INC BC - LD (Env_Del),A - LD (CurEDel),A - LD A,(BC) - INC BC - LD L,A - LD A,(BC) - INC BC - LD H,A - LD (ESldAdd),HL - RET - -C_DELAY LD A,(BC) - INC BC - LD (Delay),A - RET - -SETENV LD (IX-12+CHP.Env_En),E - LD (AYREGS+EnvTp),A - LD A,(BC) - INC BC - LD H,A - LD A,(BC) - INC BC - LD L,A - LD (EnvBase),HL - XOR A - LD (IX-12+CHP.PsInOr),A - LD (CurEDel),A - LD H,A - LD L,A - LD (CurESld),HL -C_NOP RET - -SETORN ADD A,A - LD E,A - LD D,0 - LD (IX-12+CHP.PsInOr),D -OrnPtrs EQU $+1 - LD HL,#2121 - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) -MDADDR2 EQU $+1 - LD HL,#2121 - ADD HL,DE - LD (IX-12+CHP.OrnPtr),L - LD (IX-12+CHP.OrnPtr+1),H - RET - -SETSAM ADD A,A - LD E,A - LD D,0 -SamPtrs EQU $+1 - LD HL,#2121 - ADD HL,DE - LD E,(HL) - INC HL - LD D,(HL) -MDADDR1 EQU $+1 - LD HL,#2121 - ADD HL,DE - LD (IX-12+CHP.SamPtr),L - LD (IX-12+CHP.SamPtr+1),H - RET - -;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES -SPCCOMS DW C_NOP - DW C_GLISS - DW C_PORTM - DW C_SMPOS - DW C_ORPOS - DW C_VIBRT - DW C_NOP - DW C_NOP - DW C_ENGLS - DW C_DELAY - DW C_NOP - DW C_NOP - DW C_NOP - DW C_NOP - DW C_NOP - DW C_NOP - -CHREGS XOR A - LD (Ampl),A - BIT 0,(IX+CHP.Flags) - PUSH HL - JP Z,CH_EXIT - LD (CSP_+1),SP - LD L,(IX+CHP.OrnPtr) - LD H,(IX+CHP.OrnPtr+1) - LD SP,HL - POP DE - LD H,A - LD A,(IX+CHP.PsInOr) - LD L,A - ADD HL,SP - INC A - ;PT2 PT3 -OrnCP INC A ;CP E CP D - JR C,CH_ORPS -OrnLD DB 1 ;LD A,D LD A,E -CH_ORPS LD (IX+CHP.PsInOr),A - LD A,(IX+CHP.Note) - ADD A,(HL) - JP P,CH_NTP - XOR A -CH_NTP CP 96 - JR C,CH_NOK - LD A,95 -CH_NOK ADD A,A - EX AF,AF' - LD L,(IX+CHP.SamPtr) - LD H,(IX+CHP.SamPtr+1) - LD SP,HL - POP DE - LD H,0 - LD A,(IX+CHP.PsInSm) - LD B,A - ADD A,A -SamClc2 ADD A,A ;or ADD A,B for PT2 - LD L,A - ADD HL,SP - LD SP,HL - LD A,B - INC A - ;PT2 PT3 -SamCP INC A ;CP E CP D - JR C,CH_SMPS -SamLD DB 1 ;LD A,D LD A,E -CH_SMPS LD (IX+CHP.PsInSm),A - POP BC - POP HL - -;Convert PT2 sample to PT3 - ;PT2 PT3 -SamCnv POP HL ;BIT 2,C JR e_ - POP HL - LD H,B - JR NZ,$+8 - EX DE,HL - AND A - SBC HL,HL - SBC HL,DE - LD D,C - RR C - SBC A,A - CPL - AND #3E - RR C - RR B - AND C - LD C,A - LD A,B - RRA - RRA - RR D - RRA - AND #9F - LD B,A - -e_ LD E,(IX+CHP.TnAcc) - LD D,(IX+CHP.TnAcc+1) - ADD HL,DE - BIT 6,B - JR Z,CH_NOAC - LD (IX+CHP.TnAcc),L - LD (IX+CHP.TnAcc+1),H -CH_NOAC EX DE,HL - EX AF,AF' - ADD A,NT_ - LD L,A - ADC A,NT_/256 - SUB L - LD H,A - LD SP,HL - POP HL - ADD HL,DE - LD E,(IX+CHP.CrTnSl) - LD D,(IX+CHP.CrTnSl+1) - ADD HL,DE -CSP_ LD SP,#3131 - EX (SP),HL - XOR A - OR (IX+CHP.TSlCnt) - JR Z,CH_AMP - DEC (IX+CHP.TSlCnt) - JR NZ,CH_AMP - LD A,(IX+CHP.TnSlDl) - LD (IX+CHP.TSlCnt),A - LD L,(IX+CHP.TSlStp) - LD H,(IX+CHP.TSlStp+1) - LD A,H - ADD HL,DE - LD (IX+CHP.CrTnSl),L - LD (IX+CHP.CrTnSl+1),H - BIT 2,(IX+CHP.Flags) - JR NZ,CH_AMP - LD E,(IX+CHP.TnDelt) - LD D,(IX+CHP.TnDelt+1) - AND A - JR Z,CH_STPP - EX DE,HL -CH_STPP SBC HL,DE - JP M,CH_AMP - LD A,(IX+CHP.SlToNt) - LD (IX+CHP.Note),A - XOR A - LD (IX+CHP.TSlCnt),A - LD (IX+CHP.CrTnSl),A - LD (IX+CHP.CrTnSl+1),A -CH_AMP LD A,(IX+CHP.CrAmSl) - BIT 7,C - JR Z,CH_NOAM - BIT 6,C - JR Z,CH_AMIN - CP 15 - JR Z,CH_NOAM - INC A - JR CH_SVAM -CH_AMIN CP -15 - JR Z,CH_NOAM - DEC A -CH_SVAM LD (IX+CHP.CrAmSl),A -CH_NOAM LD L,A - LD A,B - AND 15 - ADD A,L - JP P,CH_APOS - XOR A -CH_APOS CP 16 - JR C,CH_VOL - LD A,15 -CH_VOL OR (IX+CHP.Volume) - ADD A,VT_ - LD L,A - ADC A,VT_/256 - SUB L - LD H,A - LD A,(HL) -CH_ENV BIT 0,C - JR NZ,CH_NOEN - OR (IX+CHP.Env_En) -CH_NOEN LD (Ampl),A - BIT 7,B - LD A,C - JR Z,NO_ENSL - RLA - RLA - SRA A - SRA A - SRA A - ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW - BIT 5,B - JR Z,NO_ENAC - LD (IX+CHP.CrEnSl),A -NO_ENAC LD HL,AddToEn - ADD A,(HL) ;BUG IN PT3 - NEED WORD HERE - LD (HL),A - JR CH_MIX -NO_ENSL RRA - ADD A,(IX+CHP.CrNsSl) - LD (AddToNs),A - BIT 5,B - JR Z,CH_MIX - LD (IX+CHP.CrNsSl),A -CH_MIX LD A,B - RRA - AND #48 -CH_EXIT LD HL,AYREGS+Mixer - OR (HL) - RRCA - LD (HL),A - POP HL - XOR A - OR (IX+CHP.COnOff) - RET Z - DEC (IX+CHP.COnOff) - RET NZ - XOR (IX+CHP.Flags) - LD (IX+CHP.Flags),A - RRA - LD A,(IX+CHP.OnOffD) - JR C,CH_ONDL - LD A,(IX+CHP.OffOnD) -CH_ONDL LD (IX+CHP.COnOff),A - RET - -PLAY XOR A - LD (AddToEn),A - LD (AYREGS+Mixer),A - DEC A - LD (AYREGS+EnvTp),A - LD HL,DelyCnt - DEC (HL) - JP NZ,PL2 - LD HL,ChanA+CHP.NtSkCn - DEC (HL) - JR NZ,PL1B -AdInPtA EQU $+1 - LD BC,#0101 - LD A,(BC) - AND A - JR NZ,PL1A - LD D,A - LD (Ns_Base),A -CrPsPtr EQU $+1 - LD HL,#2121 - INC HL - LD A,(HL) - INC A - JR NZ,PLNLP - - IF LoopChecker - CALL CHECKLP - ENDIF - -LPosPtr EQU $+1 - LD HL,#2121 - LD A,(HL) - INC A -PLNLP LD (CrPsPtr),HL - DEC A - ;PT2 PT3 -PsCalc DEC A ;ADD A,A NOP - DEC A ;ADD A,(HL) NOP - ADD A,A - LD E,A - RL D - - IF CurPosCounter - LD A,L -PosSub SUB #D6 - LD (CurPos),A - ENDIF - -PatsPtr EQU $+1 - LD HL,#2121 - ADD HL,DE -MODADDR EQU $+1 - LD DE,#1111 - LD (PSP_+1),SP - LD SP,HL - POP HL - ADD HL,DE - LD B,H - LD C,L - POP HL - ADD HL,DE - LD (AdInPtB),HL - POP HL - ADD HL,DE - LD (AdInPtC),HL -PSP_ LD SP,#3131 -PL1A LD IX,ChanA+12 - CALL PTDECOD - LD (AdInPtA),BC - -PL1B LD HL,ChanB+CHP.NtSkCn - DEC (HL) - JR NZ,PL1C - LD IX,ChanB+12 -AdInPtB EQU $+1 - LD BC,#0101 - CALL PTDECOD - LD (AdInPtB),BC - -PL1C LD HL,ChanC+CHP.NtSkCn - DEC (HL) - JR NZ,PL1D - LD IX,ChanC+12 -AdInPtC EQU $+1 - LD BC,#0101 - CALL PTDECOD - LD (AdInPtC),BC - -Delay EQU $+1 -PL1D LD A,#3E - LD (DelyCnt),A - -PL2 LD IX,ChanA - LD HL,(AYREGS+TonA) - CALL CHREGS - LD (AYREGS+TonA),HL - LD A,(Ampl) - LD (AYREGS+AmplA),A - LD IX,ChanB - LD HL,(AYREGS+TonB) - CALL CHREGS - LD (AYREGS+TonB),HL - LD A,(Ampl) - LD (AYREGS+AmplB),A - LD IX,ChanC - LD HL,(AYREGS+TonC) - CALL CHREGS - LD (AYREGS+TonC),HL - - LD HL,(Ns_Base_AddToNs) - LD A,H - ADD A,L - LD (AYREGS+Noise),A - -AddToEn EQU $+1 - LD A,#3E - LD E,A - ADD A,A - SBC A,A - LD D,A - LD HL,(EnvBase) - ADD HL,DE - LD DE,(CurESld) - ADD HL,DE - LD (AYREGS+Env),HL - - XOR A - LD HL,CurEDel - OR (HL) - JR Z,ROUT - DEC (HL) - JR NZ,ROUT -Env_Del EQU $+1 - LD A,#3E - LD (HL),A -ESldAdd EQU $+1 - LD HL,#2121 - ADD HL,DE - LD (CurESld),HL - -ROUT - IF ACBBAC - LD A,(SETUP) - AND 12 - JR Z,ABC - ADD A,CHTABLE - LD E,A - ADC A,CHTABLE/256 - SUB E - LD D,A - LD B,0 - LD IX,AYREGS - LD HL,AYREGS - LD A,(DE) - INC DE - LD C,A - ADD HL,BC - LD A,(IX+TonB) - LD C,(HL) - LD (IX+TonB),C - LD (HL),A - INC HL - LD A,(IX+TonB+1) - LD C,(HL) - LD (IX+TonB+1),C - LD (HL),A - LD A,(DE) - INC DE - LD C,A - ADD HL,BC - LD A,(IX+AmplB) - LD C,(HL) - LD (IX+AmplB),C - LD (HL),A - LD A,(DE) - INC DE - LD (RxCA1),A - XOR 8 - LD (RxCA2),A - LD HL,AYREGS+Mixer - LD A,(DE) - AND (HL) - LD E,A - LD A,(HL) -RxCA1 LD A,(HL) - AND %010010 - OR E - LD E,A - LD A,(HL) - AND %010010 -RxCA2 OR E - OR E - LD (HL),A -ABC - ENDIF - - IF ZX - XOR A - LD DE,#FFBF - LD BC,#FFFD - LD HL,AYREGS -LOUT OUT (C),A - LD B,E - OUTI - LD B,D - INC A - CP 13 - JR NZ,LOUT - OUT (C),A - LD A,(HL) - AND A - RET M - LD B,E - OUT (C),A - RET - ENDIF - - IF MSX -;MSX version of ROUT (c)Dioniso - XOR A - LD C,#A0 - LD HL,AYREGS -LOUT OUT (C),A - INC C - OUTI - DEC C - INC A - CP 13 - JR NZ,LOUT - OUT (C),A - LD A,(HL) - AND A - RET M - INC C - OUT (C),A - RET - ENDIF - - IF ACBBAC -CHTABLE EQU $-4 - DB 4,5,15,%001001,0,7,7,%100100 - ENDIF - -NT_DATA DB (T_NEW_0-T1_)*2 - DB TCNEW_0-T_ - DB (T_OLD_0-T1_)*2+1 - DB TCOLD_0-T_ - DB (T_NEW_1-T1_)*2+1 - DB TCNEW_1-T_ - DB (T_OLD_1-T1_)*2+1 - DB TCOLD_1-T_ - DB (T_NEW_2-T1_)*2 - DB TCNEW_2-T_ - DB (T_OLD_2-T1_)*2 - DB TCOLD_2-T_ - DB (T_NEW_3-T1_)*2 - DB TCNEW_3-T_ - DB (T_OLD_3-T1_)*2 - DB TCOLD_3-T_ - -T_ - -TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1 - DB #18+1,#24+1,#3C+1,0 -TCOLD_1 DB #5C+1,0 -TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C - DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0 -TCNEW_3 DB #56+1 -TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0 -TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1 - DB #BC+1,#BE+1,0 -TCNEW_1 EQU TCOLD_1 -TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1 - DB #BA+1,#BC+1,#BE+1,0 - -PT3EMPTYORN EQU $-1 - DB 1,0 - -;first 12 values of tone tables (packed) - -T_PACK DB #06EC*2/256,#06EC*2 - DB #0755-#06EC - DB #07C5-#0755 - DB #083B-#07C5 - DB #08B8-#083B - DB #093D-#08B8 - DB #09CA-#093D - DB #0A5F-#09CA - DB #0AFC-#0A5F - DB #0BA4-#0AFC - DB #0C55-#0BA4 - DB #0D10-#0C55 - DB #066D*2/256,#066D*2 - DB #06CF-#066D - DB #0737-#06CF - DB #07A4-#0737 - DB #0819-#07A4 - DB #0894-#0819 - DB #0917-#0894 - DB #09A1-#0917 - DB #0A33-#09A1 - DB #0ACF-#0A33 - DB #0B73-#0ACF - DB #0C22-#0B73 - DB #0CDA-#0C22 - DB #0704*2/256,#0704*2 - DB #076E-#0704 - DB #07E0-#076E - DB #0858-#07E0 - DB #08D6-#0858 - DB #095C-#08D6 - DB #09EC-#095C - DB #0A82-#09EC - DB #0B22-#0A82 - DB #0BCC-#0B22 - DB #0C80-#0BCC - DB #0D3E-#0C80 - DB #07E0*2/256,#07E0*2 - DB #0858-#07E0 - DB #08E0-#0858 - DB #0960-#08E0 - DB #09F0-#0960 - DB #0A88-#09F0 - DB #0B28-#0A88 - DB #0BD8-#0B28 - DB #0C80-#0BD8 - DB #0D60-#0C80 - DB #0E10-#0D60 - DB #0EF8-#0E10 - -;vars from here can be stripped -;you can move VARS to any other address - -VARS - -;ChannelsVars - STRUCT CHP -;reset group -PsInOr DB 0 -PsInSm DB 0 -CrAmSl DB 0 -CrNsSl DB 0 -CrEnSl DB 0 -TSlCnt DB 0 -CrTnSl DW 0 -TnAcc DW 0 -COnOff DB 0 -;reset group - -OnOffD DB 0 - -;IX for PTDECOD here (+12) -OffOnD DB 0 -OrnPtr DW 0 -SamPtr DW 0 -NNtSkp DB 0 -Note DB 0 -SlToNt DB 0 -Env_En DB 0 -Flags DB 0 - ;Enabled - 0,SimpleGliss - 2 -TnSlDl DB 0 -TSlStp DW 0 -TnDelt DW 0 -NtSkCn DB 0 -Volume DB 0 - ENDS - -ChanA DS CHP -ChanB DS CHP -ChanC DS CHP - -;GlobalVars -DelyCnt DB 0 -CurESld DW 0 -CurEDel DB 0 -Ns_Base_AddToNs -Ns_Base DB 0 -AddToNs DB 0 - -AYREGS - -VT_ DS 256 ;CreatedVolumeTableAddress - -EnvBase EQU VT_+14 - -T1_ EQU VT_+16 ;Tone tables data depacked here - -T_OLD_1 EQU T1_ -T_OLD_2 EQU T_OLD_1+24 -T_OLD_3 EQU T_OLD_2+24 -T_OLD_0 EQU T_OLD_3+2 -T_NEW_0 EQU T_OLD_0 -T_NEW_1 EQU T_OLD_1 -T_NEW_2 EQU T_NEW_0+24 -T_NEW_3 EQU T_OLD_3 - -PT2EMPTYORN EQU VT_+31 ;1,0,0 sequence - -NT_ DS 192 ;CreatedNoteTableAddress - -;local var -Ampl EQU AYREGS+AmplC - -VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1 - -VARSEND EQU $ - -MDLADDR EQU $ - -;Release 0 steps: -;02/27/2005 -;Merging PT2 and PT3 players; debug -;02/28/2005 -;debug; optimization -;03/01/2005 -;Migration to SjASM; conditional assembly (ZX, MSX and -;visualization) -;03/03/2005 -;SETPORT subprogram (35 bytes shorter) -;03/05/2005 -;fixed CurPosCounter error -;03/06/2005 -;Added ACB and BAC channels swapper (for Spectre); more cond. -;assembly keys; optimization -;Release 1 steps: -;04/15/2005 -;Removed loop bit resetting for no loop build (5 bytes shorter) -;04/30/2007 -;New 1.xx and 2.xx interpretation for PT 3.7+. - -;Tests in IMMATION TESTER V1.0 by Andy Man/POS -;(for minimal build) -;Module name/author Min tacts Max tacts -;PT3 (a little slower than standalone player) -;Spleen/Nik-O 1720 9368 -;Chuta/Miguel 1720 9656 -;Zhara/Macros 4536 8792 -;PT2 (more slower than standalone player) -;Epilogue/Nik-O 3928 10232 -;NY tHEMEs/zHenYa 3848 9208 -;GUEST 4/Alex Job 2824 9352 -;KickDB/Fatal Snipe 1720 9880 - -;Size (minimal build for ZX Spectrum): -;Code block #7B9 bytes -;Variables #21D bytes (can be stripped) -;Size in RAM #7B9+#21D=#9D6 (2518) bytes - -;Notes: -;Pro Tracker 3.4r can not be detected by header, so PT3.4r tone -;tables realy used only for modules of 3.3 and older versions. - SAVEBIN "player.bin", #4000, $ - #4000 \ No newline at end of file +;Universal PT2'n'PT3 Turbo Sound player for ZX Spectrum +;(c)2004-2007 S.V.Bulba +;Specially for AlCo +;http://bulba.untergrund.net/ (http://bulba.at.kz/) + +;Release number +Release EQU "0" + +;Conditional assembly +;1) Current position counters at (Vars1+0) and (Vars2+0) +CurPosCounter=0 +;2) Allow channels allocation bits at (START+10) +ACBBAC=0 +;3) Allow loop checking and disabling +LoopChecker=1 +;4) Insert official identificator +Id=0 +;5) Set IY for correct return to ZX Basic +Basic=1 + +;Features +;-------- +;-Can be compiled at any address (i.e. no need rounding ORG +; address). +;-Variables (VARS) can be located at any address (not only after +; code block). +;-INIT subprogram checks PT3-module version and rightly +; generates both note and volume tables outside of code block +; (in VARS). +;-Two portamento (spc. command 3xxx) algorithms (depending of +; PT3 module version). +;-New 1.XX and 2.XX special command behaviour (only for PT v3.7 +; and higher). +;-Any Tempo value are accepted (including Tempo=1 and Tempo=2). +;-TS modes: 2xPT3, 2xPT2 and PT v3.7 TS standard. +;-Fully compatible with Ay_Emul PT3 and PT2 players codes. +;-See also notes at the end of this source code. + +;Limitations +;----------- +;-Can run in RAM only (self-modified code is used). +;-PT2 position list must be end by #FF marker only. + +;Warning!!! PLAY subprogram can crash if no module are loaded +;into RAM or INIT subprogram was not called before. + +;Call MUTE or INIT one more time to mute sound after stopping +;playing + + DISP #4000 + +;Test codes (commented) +; LD A,32 ;SinglePT3(TS if TSPT3.7),ABC,Looped +; LD (START+10),A +; LD HL,#8000 ;Mod1 +; LD DE,#A000 ;Mod2 (optional) +; CALL START+3 +; EI +;_LP HALT +; CALL START+5 +; XOR A +; IN A,(#FE) +; CPL +; AND 15 +; JR Z,_LP +; JR START+8 + +TonA EQU 0 +TonB EQU 2 +TonC EQU 4 +Noise EQU 6 +Mixer EQU 7 +AmplA EQU 8 +AmplB EQU 9 +AmplC EQU 10 +Env EQU 11 +EnvTp EQU 13 + +;Entry and other points +;START initialize playing of modules at MDLADDR (single module) +;START+3 initialization with module address in HL and DE (TS) +;START+5 play one quark +;START+8 mute +;START+10 setup and status flags + +START + LD HL,MDLADDR ;DE - address of 2nd module for TS + JR INIT + JP PLAY + JR MUTE +SETUP DB 0 ;set bit0, if you want to play without looping + ;(optional); + ;set bit1 for PT2 and reset for PT3 before + ;calling INIT; + ;bits2-3: %00-ABC, %01-ACB, %10-BAC (optional); + ;bits4-5: %00-no TS, %01-2 modules TS, %10- + ;autodetect PT3 TS-format by AlCo (PT 3.7+); + ;Remark: old PT3 TS-format by AlCo (PT 3.6) is not + ;documented and must be converted to new standard. + ;bit6 is set each time, when loop point of 2nd TS + ;module is passed (optional). + ;bit7 is set each time, when loop point of 1st TS + ;or of single module is passed (optional). + +;Identifier + IF Id + DB "=UniPT2/PT3/TS-Player r.",Release,"=" + ENDIF + + IF LoopChecker +CHECKLP LD HL,SETUP + BIT 0,(IY-100+VRS.ModNum) + JR Z,CHL1 + SET 6,(HL) + JR CHL2 +CHL1 SET 7,(HL) +CHL2 BIT 0,(HL) + RET Z + POP HL + INC (IY-100+VRS.DelyCnt) + INC (IY-100+VRS.ChanA+CHP.NtSkCn) + XOR A + LD (IY-100+VRS.AYREGS+AmplA),A + LD (IY-100+VRS.AYREGS+AmplB),A + LD (IY-100+VRS.AYREGS+AmplC),A + RET + ENDIF + +MUTE XOR A + LD H,A + LD L,A + LD (VARS1+VRS.AYREGS+AmplA),A + LD (VARS1+VRS.AYREGS+AmplB),HL + LD (VARS2+VRS.AYREGS+AmplA),A + LD (VARS2+VRS.AYREGS+AmplB),HL + JP ROUT + +INIT +;HL - AddressOfModule +;DE - AddresOf2ndModule + PUSH DE + PUSH HL + LD HL,VARS + LD (HL),0 + LD DE,VARS+1 + LD BC,VAR0END-VARS-1 + LDIR + INC HL + LD (VARS1+VRS.AdInPtA),HL ;ptr to zero + LD (VARS2+VRS.AdInPtA),HL + + POP HL + LD IY,VARS1+100 + LD A,(START+10) + AND 2 + JP NZ,I_PT2 + + CALL INITPT3 + LD HL,(e_-SamCnv-2)*256+#18 + LD (SamCnv),HL + LD A,#BA + LD (OrnCP),A + LD (SamCP),A + LD A,#7B + LD (OrnLD),A + LD (SamLD),A + LD A,#87 + LD (SamClc2),A + POP HL + ;Use version and ton table of 1st module + LD A,(IX+13-100) ;EXTRACT VERSION NUMBER + SUB #30 + JR C,L20 + CP 10 + JR C,L21 +L20 LD A,6 +L21 LD (Version),A + PUSH AF ;VolTable version + CP 4 + LD A,(IX+99-100) ;TONE TABLE NUMBER + RLA + AND 7 + PUSH AF ;NoteTable number + + LD IY,VARS2+100 + LD A,(START+10) + AND 48 + JR Z,NOTS + CP 16 + JR Z,TwoPT3s + LD A,(Version) + CP 7 + JR C,NOTS + LD A,(IX+98-100) ;ALCO TS MARKER + CP #20 + JR Z,NOTS + LD HL,VARS1 + LD DE,VARS2 + LD BC,VRS + LDIR + SET 1,(IY-100+VRS.ModNum) + LD C,A + ADD A,A + ADD A,C + SUB 2 + LD (TSSub),A + JR AlCoTS_ +TwoPT3s CALL INITPT3 +AlCoTS_ LD A,1 + LD (is_ts),A + SET 0,(IY-100+VRS.ModNum) + +NOTS LD BC,PT3PD + LD HL,0 + LD DE,PT3EMPTYORN + JR INITCOMMON + +I_PT2 CALL INITPT2 + LD HL,#51CB + LD (SamCnv),HL + LD A,#BB + LD (OrnCP),A + LD (SamCP),A + LD A,#7A + LD (OrnLD),A + LD (SamLD),A + LD A,#80 + LD (SamClc2),A + POP HL + LD A,5 + LD (Version),A + PUSH AF + LD A,2 + PUSH AF + + LD A,(START+10) + AND 48 + JR Z,NOTS2 + + LD IY,VARS2+100 + LD A,1 + LD (is_ts),A + SET 0,(IY-100+VRS.ModNum) + CALL INITPT2 + +NOTS2 LD BC,PT2PD + LD HL,#8687 + LD DE,PT2EMPTYORN + +INITCOMMON + + IF Basic + LD IY,#5C3A + ENDIF + + LD (PTDEC),BC + LD (PsCalc),HL + PUSH DE + +;note table data depacker +;(c) Ivan Roshin + LD DE,T_PACK + LD BC,T1_+(2*49)-1 +TP_0 LD A,(DE) + INC DE + CP 15*2 + JR NC,TP_1 + LD H,A + LD A,(DE) + LD L,A + INC DE + JR TP_2 +TP_1 PUSH DE + LD D,0 + LD E,A + ADD HL,DE + ADD HL,DE + POP DE +TP_2 LD A,H + LD (BC),A + DEC BC + LD A,L + LD (BC),A + DEC BC + SUB #F8*2 + JR NZ,TP_0 + + INC A + LD (VARS1+VRS.DelyCnt),A + LD (VARS2+VRS.DelyCnt),A + LD HL,#F001 ;H - CHP.Volume, L - CHP.NtSkCn + LD (VARS1+VRS.ChanA+CHP.NtSkCn),HL + LD (VARS1+VRS.ChanB+CHP.NtSkCn),HL + LD (VARS1+VRS.ChanC+CHP.NtSkCn),HL + LD (VARS2+VRS.ChanA+CHP.NtSkCn),HL + LD (VARS2+VRS.ChanB+CHP.NtSkCn),HL + LD (VARS2+VRS.ChanC+CHP.NtSkCn),HL + POP HL + LD (VARS1+VRS.ChanA+CHP.OrnPtr),HL + LD (VARS1+VRS.ChanB+CHP.OrnPtr),HL + LD (VARS1+VRS.ChanC+CHP.OrnPtr),HL + LD (VARS2+VRS.ChanA+CHP.OrnPtr),HL + LD (VARS2+VRS.ChanB+CHP.OrnPtr),HL + LD (VARS2+VRS.ChanC+CHP.OrnPtr),HL + + POP AF + +;NoteTableCreator (c) Ivan Roshin +;A - NoteTableNumber*2+VersionForNoteTable +;(xx1b - 3.xx..3.4r, xx0b - 3.4x..3.6x..VTII1.0) + + LD HL,NT_DATA + LD D,0 + ADD A,A + LD E,A + ADD HL,DE + LD E,(HL) + INC HL + SRL E + SBC A,A + AND #A7 ;#00 (NOP) or #A7 (AND A) + LD (L3),A + EX DE,HL + LD BC,T1_ + ADD HL,BC + + LD A,(DE) + ADD A,T_ + LD C,A + ADC A,T_/256 + SUB C + LD B,A + PUSH BC + LD DE,NT_ + PUSH DE + + LD B,12 +L1 PUSH BC + LD C,(HL) + INC HL + PUSH HL + LD B,(HL) + + PUSH DE + EX DE,HL + LD DE,23 + LD IXH,8 + +L2 SRL B + RR C +L3 DB #19 ;AND A or NOP + LD A,C + ADC A,D ;=ADC 0 + LD (HL),A + INC HL + LD A,B + ADC A,D + LD (HL),A + ADD HL,DE + DEC IXH + JR NZ,L2 + + POP DE + INC DE + INC DE + POP HL + INC HL + POP BC + DJNZ L1 + + POP HL + POP DE + + LD A,E + CP TCOLD_1 + JR NZ,CORR_1 + LD A,#FD + LD (NT_+#2E),A + +CORR_1 LD A,(DE) + AND A + JR Z,TC_EXIT + RRA + PUSH AF + ADD A,A + LD C,A + ADD HL,BC + POP AF + JR NC,CORR_2 + DEC (HL) + DEC (HL) +CORR_2 INC (HL) + AND A + SBC HL,BC + INC DE + JR CORR_1 + +TC_EXIT + + POP AF + +;VolTableCreator (c) Ivan Roshin +;A - VersionForVolumeTable (0..4 - 3.xx..3.4x; + ;5.. - 2.x,3.5x..3.6x..VTII1.0) + + CP 5 + LD HL,#11 + LD D,H + LD E,H + LD A,#17 + JR NC,M1 + DEC L + LD E,L + XOR A +M1 LD (M2),A + + LD IX,VT_+16 + + LD C,#F +INITV2 PUSH HL + + ADD HL,DE + EX DE,HL + SBC HL,HL + + LD B,#10 +INITV1 LD A,L +M2 DB #7D + LD A,H + ADC A,0 + LD (IX),A + INC IX + ADD HL,DE + DJNZ INITV1 + + POP HL + LD A,E + CP #77 + JR NZ,M3 + INC E +M3 DEC C + JR NZ,INITV2 + + JP ROUT + +INITPT3 CALL SETMDAD + PUSH HL + LD DE,100 + ADD HL,DE + LD A,(HL) + LD (IY-100+VRS.Delay),A + PUSH HL + POP IX + ADD HL,DE + CALL SETCPPT + LD E,(IX+102-100) + INC HL + + IF CurPosCounter + LD (IY-100+VRS.PosSub),L + ENDIF + + ADD HL,DE + CALL SETLPPT + POP DE + LD L,(IX+103-100) + LD H,(IX+104-100) + ADD HL,DE + CALL SETPTPT + LD HL,169 + ADD HL,DE + CALL SETORPT + LD HL,105 + ADD HL,DE + +SETSMPT LD (IY-100+VRS.SamPtrs),L + LD (IY-100+VRS.SamPtrs+1),H + RET + +INITPT2 LD A,(HL) + LD (IY-100+VRS.Delay),A + PUSH HL + PUSH HL + PUSH HL + INC HL + INC HL + LD A,(HL) + INC HL + CALL SETSMPT + LD E,(HL) + INC HL + LD D,(HL) + POP HL + AND A + SBC HL,DE + CALL SETMDAD + POP HL + LD DE,67 + ADD HL,DE + CALL SETORPT + LD E,32 + ADD HL,DE + LD C,(HL) + INC HL + LD B,(HL) + LD E,30 + ADD HL,DE + CALL SETCPPT + LD E,A + INC HL + + IF CurPosCounter + LD (IY-100+VRS.PosSub),L + ENDIF + + ADD HL,DE + CALL SETLPPT + POP HL + ADD HL,BC + +SETPTPT LD (IY-100+VRS.PatsPtr),L + LD (IY-100+VRS.PatsPtr+1),H + RET + +SETMDAD LD (IY-100+VRS.MODADDR),L + LD (IY-100+VRS.MODADDR+1),H + RET + +SETORPT LD (IY-100+VRS.OrnPtrs),L + LD (IY-100+VRS.OrnPtrs+1),H + RET + +SETCPPT LD (IY-100+VRS.CrPsPtr),L + LD (IY-100+VRS.CrPsPtr+1),H + RET + +SETLPPT LD (IY-100+VRS.LPosPtr),L + LD (IY-100+VRS.LPosPtr+1),H + RET + +SETENBS LD (IY-100+VRS.EnvBase),L + LD (IY-100+VRS.EnvBase+1),H + RET + +SETESLD LD (IY-100+VRS.CurESld),L + LD (IY-100+VRS.CurESld+1),H + RET + +GETIX PUSH IY + POP IX + ADD IX,DE + RET + +PTDECOD CALL GETIX +PTDEC EQU $+1 + JP #C3C3 + +;PT2 pattern decoder +PD2_SAM CALL SETSAM + JR PD2_LOOP + +PD2_EOff LD (IX-12+CHP.Env_En),A + JR PD2_LOOP + +PD2_ENV LD (IX-12+CHP.Env_En),16 + LD (IY-100+VRS.AYREGS+EnvTp),A + LD A,(BC) + INC BC + LD L,A + LD A,(BC) + INC BC + LD H,A + CALL SETENBS + JR PD2_LOOP + +PD2_ORN CALL SETORN + JR PD2_LOOP + +PD2_SKIP INC A + LD (IX-12+CHP.NNtSkp),A + JR PD2_LOOP + +PD2_VOL RRCA + RRCA + RRCA + RRCA + LD (IX-12+CHP.Volume),A + JR PD2_LOOP + +PD2_DEL CALL C_DELAY + JR PD2_LOOP + +PD2_GLIS SET 2,(IX-12+CHP.Flags) + INC A + LD (IX-12+CHP.TnSlDl),A + LD (IX-12+CHP.TSlCnt),A + LD A,(BC) + INC BC + LD (IX-12+CHP.TSlStp),A + ADD A,A + SBC A,A + LD (IX-12+CHP.TSlStp+1),A + SCF + JR PD2_LP2 + +PT2PD AND A + +PD2_LP2 EX AF,AF' + +PD2_LOOP LD A,(BC) + INC BC + ADD A,#20 + JR Z,PD2_REL + JR C,PD2_SAM + ADD A,96 + JR C,PD2_NOTE + INC A + JR Z,PD2_EOff + ADD A,15 + JP Z,PD_FIN + JR C,PD2_ENV + ADD A,#10 + JR C,PD2_ORN + ADD A,#40 + JR C,PD2_SKIP + ADD A,#10 + JR C,PD2_VOL + INC A + JR Z,PD2_DEL + INC A + JR Z,PD2_GLIS + INC A + JR Z,PD2_PORT + INC A + JR Z,PD2_STOP + LD A,(BC) + INC BC + LD (IX-12+CHP.CrNsSl),A + JR PD2_LOOP + +PD2_PORT RES 2,(IX-12+CHP.Flags) + LD A,(BC) + INC BC + INC BC ;ignoring precalc delta to right sound + INC BC + SCF + JR PD2_LP2 + +PD2_STOP LD (IX-12+CHP.TSlCnt),A + JR PD2_LOOP + +PD2_REL LD (IX-12+CHP.Flags),A + JR PD2_EXIT + +PD2_NOTE LD L,A + LD A,(IX-12+CHP.Note) + LD (PrNote+1),A + LD (IX-12+CHP.Note),L + XOR A + LD (IX-12+CHP.TSlCnt),A + SET 0,(IX-12+CHP.Flags) + EX AF,AF' + JR NC,NOGLIS2 + BIT 2,(IX-12+CHP.Flags) + JR NZ,NOPORT2 + LD (LoStep),A + ADD A,A + SBC A,A + EX AF,AF' + LD H,A + LD L,A + INC A + CALL SETPORT +NOPORT2 LD (IX-12+CHP.TSlCnt),1 +NOGLIS2 XOR A + + +PD2_EXIT LD (IX-12+CHP.PsInSm),A + LD (IX-12+CHP.PsInOr),A + LD (IX-12+CHP.CrTnSl),A + LD (IX-12+CHP.CrTnSl+1),A + JP PD_FIN + +;PT3 pattern decoder +PD_OrSm LD (IX-12+CHP.Env_En),0 + CALL SETORN +PD_SAM_ LD A,(BC) + INC BC + RRCA + +PD_SAM CALL SETSAM + JR PD_LOOP + +PD_VOL RRCA + RRCA + RRCA + RRCA + LD (IX-12+CHP.Volume),A + JR PD_LP2 + +PD_EOff LD (IX-12+CHP.Env_En),A + LD (IX-12+CHP.PsInOr),A + JR PD_LP2 + +PD_SorE DEC A + JR NZ,PD_ENV + LD A,(BC) + INC BC + LD (IX-12+CHP.NNtSkp),A + JR PD_LP2 + +PD_ENV CALL SETENV + JR PD_LP2 + +PD_ORN CALL SETORN + JR PD_LOOP + +PD_ESAM LD (IX-12+CHP.Env_En),A + LD (IX-12+CHP.PsInOr),A + CALL NZ,SETENV + JR PD_SAM_ + +PT3PD LD A,(IX-12+CHP.Note) + LD (PrNote+1),A + LD L,(IX-12+CHP.CrTnSl) + LD H,(IX-12+CHP.CrTnSl+1) + LD (PrSlide+1),HL + +PD_LOOP LD DE,#2010 +PD_LP2 LD A,(BC) + INC BC + ADD A,E + JR C,PD_OrSm + ADD A,D + JR Z,PD_FIN + JR C,PD_SAM + ADD A,E + JR Z,PD_REL + JR C,PD_VOL + ADD A,E + JR Z,PD_EOff + JR C,PD_SorE + ADD A,96 + JR C,PD_NOTE + ADD A,E + JR C,PD_ORN + ADD A,D + JR C,PD_NOIS + ADD A,E + JR C,PD_ESAM + ADD A,A + LD E,A + LD HL,SPCCOMS+#FF20-#2000 + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + PUSH DE + JR PD_LOOP + +PD_NOIS LD (IY-100+VRS.Ns_Base),A + JR PD_LP2 + +PD_REL RES 0,(IX-12+CHP.Flags) + JR PD_RES + +PD_NOTE LD (IX-12+CHP.Note),A + SET 0,(IX-12+CHP.Flags) + XOR A + +PD_RES LD (PDSP_+1),SP + LD SP,IX + LD H,A + LD L,A + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL + PUSH HL +PDSP_ LD SP,#3131 + +PD_FIN LD A,(IX-12+CHP.NNtSkp) + LD (IX-12+CHP.NtSkCn),A + RET + +C_PORTM LD A,(BC) + INC BC +;SKIP PRECALCULATED TONE DELTA (BECAUSE +;CANNOT BE RIGHT AFTER PT3 COMPILATION) + INC BC + INC BC + EX AF,AF' + LD A,(BC) ;SIGNED TONE STEP + INC BC + LD (LoStep),A + LD A,(BC) + INC BC + AND A + EX AF,AF' + LD L,(IX-12+CHP.CrTnSl) + LD H,(IX-12+CHP.CrTnSl+1) + +;Set portamento variables +;A - Delay; A' - Hi(Step); ZF' - (A'=0); HL - CrTnSl + +SETPORT RES 2,(IX-12+CHP.Flags) + LD (IX-12+CHP.TnSlDl),A + LD (IX-12+CHP.TSlCnt),A + PUSH HL + LD DE,NT_ + LD A,(IX-12+CHP.Note) + LD (IX-12+CHP.SlToNt),A + ADD A,A + LD L,A + LD H,0 + ADD HL,DE + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + PUSH HL +PrNote LD A,#3E + LD (IX-12+CHP.Note),A + ADD A,A + LD L,A + LD H,0 + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + POP HL + SBC HL,DE + LD (IX-12+CHP.TnDelt),L + LD (IX-12+CHP.TnDelt+1),H + POP DE +Version EQU $+1 + LD A,#3E + CP 6 + JR C,OLDPRTM ;Old 3xxx for PT v3.5- +PrSlide LD DE,#1111 + LD (IX-12+CHP.CrTnSl),E + LD (IX-12+CHP.CrTnSl+1),D +LoStep EQU $+1 +OLDPRTM LD A,#3E + EX AF,AF' + JR Z,NOSIG + EX DE,HL +NOSIG SBC HL,DE + JP P,SET_STP + CPL + EX AF,AF' + NEG + EX AF,AF' +SET_STP LD (IX-12+CHP.TSlStp+1),A + EX AF,AF' + LD (IX-12+CHP.TSlStp),A + LD (IX-12+CHP.COnOff),0 + RET + +C_GLISS SET 2,(IX-12+CHP.Flags) + LD A,(BC) + INC BC + LD (IX-12+CHP.TnSlDl),A + AND A + JR NZ,GL36 + LD A,(Version) ;AlCo PT3.7+ + CP 7 + SBC A,A + INC A +GL36 LD (IX-12+CHP.TSlCnt),A + LD A,(BC) + INC BC + EX AF,AF' + LD A,(BC) + INC BC + JR SET_STP + +C_SMPOS LD A,(BC) + INC BC + LD (IX-12+CHP.PsInSm),A + RET + +C_ORPOS LD A,(BC) + INC BC + LD (IX-12+CHP.PsInOr),A + RET + +C_VIBRT LD A,(BC) + INC BC + LD (IX-12+CHP.OnOffD),A + LD (IX-12+CHP.COnOff),A + LD A,(BC) + INC BC + LD (IX-12+CHP.OffOnD),A + XOR A + LD (IX-12+CHP.TSlCnt),A + LD (IX-12+CHP.CrTnSl),A + LD (IX-12+CHP.CrTnSl+1),A + RET + +C_ENGLS LD A,(BC) + INC BC + LD (IY-100+VRS.Env_Del),A + LD (IY-100+VRS.CurEDel),A + LD A,(BC) + INC BC + LD L,A + LD A,(BC) + INC BC + LD H,A + LD (IY-100+VRS.ESldAdd),L + LD (IY-100+VRS.ESldAdd+1),H + RET + +C_DELAY LD A,(BC) + INC BC + LD (IY-100+VRS.Delay),A + LD HL,VARS2+VRS.ModNum ;if AlCo_TS + BIT 1,(HL) + RET Z + LD (VARS1+VRS.Delay),A + LD (VARS1+VRS.DelyCnt),A + LD (VARS2+VRS.Delay),A + RET + +SETENV LD (IX-12+CHP.Env_En),E + LD (IY-100+VRS.AYREGS+EnvTp),A + LD A,(BC) + INC BC + LD H,A + LD A,(BC) + INC BC + LD L,A + CALL SETENBS + XOR A + LD (IX-12+CHP.PsInOr),A + LD (IY-100+VRS.CurEDel),A + LD H,A + LD L,A + JP SETESLD + +SETORN ADD A,A + LD E,A + LD D,0 + LD (IX-12+CHP.PsInOr),D + LD L,(IY-100+VRS.OrnPtrs) + LD H,(IY-100+VRS.OrnPtrs+1) + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD L,(IY-100+VRS.MODADDR) + LD H,(IY-100+VRS.MODADDR+1) + ADD HL,DE + LD (IX-12+CHP.OrnPtr),L + LD (IX-12+CHP.OrnPtr+1),H +C_NOP RET + +SETSAM ADD A,A + LD E,A + LD D,0 + LD L,(IY-100+VRS.SamPtrs); + LD H,(IY-100+VRS.SamPtrs+1); + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + LD L,(IY-100+VRS.MODADDR) + LD H,(IY-100+VRS.MODADDR+1) + ADD HL,DE + LD (IX-12+CHP.SamPtr),L + LD (IX-12+CHP.SamPtr+1),H + RET + +;ALL 16 ADDRESSES TO PROTECT FROM BROKEN PT3 MODULES +SPCCOMS DW C_NOP + DW C_GLISS + DW C_PORTM + DW C_SMPOS + DW C_ORPOS + DW C_VIBRT + DW C_NOP + DW C_NOP + DW C_ENGLS + DW C_DELAY + DW C_NOP + DW C_NOP + DW C_NOP + DW C_NOP + DW C_NOP + DW C_NOP + +CHREGS CALL GETIX + XOR A + LD (Ampl),A + BIT 0,(IX+CHP.Flags) + PUSH HL + JP Z,CH_EXIT + LD (CSP_+1),SP + LD L,(IX+CHP.OrnPtr) + LD H,(IX+CHP.OrnPtr+1) + LD SP,HL + POP DE + LD H,A + LD A,(IX+CHP.PsInOr) + LD L,A + ADD HL,SP + INC A + ;PT2 PT3 +OrnCP INC A ;CP E CP D + JR C,CH_ORPS +OrnLD DB 1 ;LD A,D LD A,E +CH_ORPS LD (IX+CHP.PsInOr),A + LD A,(IX+CHP.Note) + ADD A,(HL) + JP P,CH_NTP + XOR A +CH_NTP CP 96 + JR C,CH_NOK + LD A,95 +CH_NOK ADD A,A + EX AF,AF' + LD L,(IX+CHP.SamPtr) + LD H,(IX+CHP.SamPtr+1) + LD SP,HL + POP DE + LD H,0 + LD A,(IX+CHP.PsInSm) + LD B,A + ADD A,A +SamClc2 ADD A,A ;or ADD A,B for PT2 + LD L,A + ADD HL,SP + LD SP,HL + LD A,B + INC A + ;PT2 PT3 +SamCP INC A ;CP E CP D + JR C,CH_SMPS +SamLD DB 1 ;LD A,D LD A,E +CH_SMPS LD (IX+CHP.PsInSm),A + POP BC + POP HL + +;Convert PT2 sample to PT3 + ;PT2 PT3 +SamCnv POP HL ;BIT 2,C JR e_ + POP HL + LD H,B + JR NZ,$+8 + EX DE,HL + AND A + SBC HL,HL + SBC HL,DE + LD D,C + RR C + SBC A,A + CPL + AND #3E + RR C + RR B + AND C + LD C,A + LD A,B + RRA + RRA + RR D + RRA + AND #9F + LD B,A + +e_ LD E,(IX+CHP.TnAcc) + LD D,(IX+CHP.TnAcc+1) + ADD HL,DE + BIT 6,B + JR Z,CH_NOAC + LD (IX+CHP.TnAcc),L + LD (IX+CHP.TnAcc+1),H +CH_NOAC EX DE,HL + EX AF,AF' + ADD A,NT_ + LD L,A + ADC A,NT_/256 + SUB L + LD H,A + LD SP,HL + POP HL + ADD HL,DE + LD E,(IX+CHP.CrTnSl) + LD D,(IX+CHP.CrTnSl+1) + ADD HL,DE +CSP_ LD SP,#3131 + EX (SP),HL + XOR A + OR (IX+CHP.TSlCnt) + JR Z,CH_AMP + DEC (IX+CHP.TSlCnt) + JR NZ,CH_AMP + LD A,(IX+CHP.TnSlDl) + LD (IX+CHP.TSlCnt),A + LD L,(IX+CHP.TSlStp) + LD H,(IX+CHP.TSlStp+1) + LD A,H + ADD HL,DE + LD (IX+CHP.CrTnSl),L + LD (IX+CHP.CrTnSl+1),H + BIT 2,(IX+CHP.Flags) + JR NZ,CH_AMP + LD E,(IX+CHP.TnDelt) + LD D,(IX+CHP.TnDelt+1) + AND A + JR Z,CH_STPP + EX DE,HL +CH_STPP SBC HL,DE + JP M,CH_AMP + LD A,(IX+CHP.SlToNt) + LD (IX+CHP.Note),A + XOR A + LD (IX+CHP.TSlCnt),A + LD (IX+CHP.CrTnSl),A + LD (IX+CHP.CrTnSl+1),A +CH_AMP LD A,(IX+CHP.CrAmSl) + BIT 7,C + JR Z,CH_NOAM + BIT 6,C + JR Z,CH_AMIN + CP 15 + JR Z,CH_NOAM + INC A + JR CH_SVAM +CH_AMIN CP -15 + JR Z,CH_NOAM + DEC A +CH_SVAM LD (IX+CHP.CrAmSl),A +CH_NOAM LD L,A + LD A,B + AND 15 + ADD A,L + JP P,CH_APOS + XOR A +CH_APOS CP 16 + JR C,CH_VOL + LD A,15 +CH_VOL OR (IX+CHP.Volume) + ADD A,VT_ + LD L,A + ADC A,VT_/256 + SUB L + LD H,A + LD A,(HL) +CH_ENV BIT 0,C + JR NZ,CH_NOEN + OR (IX+CHP.Env_En) +CH_NOEN LD (Ampl),A + BIT 7,B + LD A,C + JR Z,NO_ENSL + RLA + RLA + SRA A + SRA A + SRA A + ADD A,(IX+CHP.CrEnSl) ;SEE COMMENT BELOW + BIT 5,B + JR Z,NO_ENAC + LD (IX+CHP.CrEnSl),A +NO_ENAC ADD A,(IY-100+VRS.AddToEn) ;BUG IN PT3 - NEED WORD HERE + LD (IY-100+VRS.AddToEn),A + JR CH_MIX +NO_ENSL RRA + ADD A,(IX+CHP.CrNsSl) + LD (IY-100+VRS.AddToNs),A + BIT 5,B + JR Z,CH_MIX + LD (IX+CHP.CrNsSl),A +CH_MIX LD A,B + RRA + AND #48 +CH_EXIT OR (IY-100+VRS.AYREGS+Mixer) + RRCA + LD (IY-100+VRS.AYREGS+Mixer),A + POP HL + XOR A + OR (IX+CHP.COnOff) + RET Z + DEC (IX+CHP.COnOff) + RET NZ + XOR (IX+CHP.Flags) + LD (IX+CHP.Flags),A + RRA + LD A,(IX+CHP.OnOffD) + JR C,CH_ONDL + LD A,(IX+CHP.OffOnD) +CH_ONDL LD (IX+CHP.COnOff),A + RET + +PLAY_ XOR A + LD (IY-100+VRS.AddToEn),A + LD (IY-100+VRS.AYREGS+Mixer),A + DEC A + LD (IY-100+VRS.AYREGS+EnvTp),A + DEC (IY-100+VRS.DelyCnt) + JP NZ,PL2 + DEC (IY-100+VRS.ChanA+CHP.NtSkCn) + JR NZ,PL1B + LD C,(IY-100+VRS.AdInPtA) + LD B,(IY-100+VRS.AdInPtA+1) + LD A,(BC) + AND A + JR NZ,PL1A + LD D,A + LD (IY-100+VRS.Ns_Base),A + LD L,(IY-100+VRS.CrPsPtr) + LD H,(IY-100+VRS.CrPsPtr+1) + INC HL + LD A,(HL) + INC A + JR NZ,PLNLP + + IF LoopChecker + CALL CHECKLP + ENDIF + + LD L,(IY-100+VRS.LPosPtr) + LD H,(IY-100+VRS.LPosPtr+1) + LD A,(HL) + INC A +PLNLP CALL SETCPPT + DEC A + BIT 1,(IY-100+VRS.ModNum) + JR Z,NoAlCo +TSSub EQU $+1 + SUB #D6 + CPL +NoAlCo + ;PT2 PT3 +PsCalc DEC A ;ADD A,A NOP + DEC A ;ADD A,(HL) NOP + ADD A,A + LD E,A + RL D + + IF CurPosCounter + LD A,L + SUB (IY-100+VRS.PosSub) + LD (IY-100+VRS.CurPos),A + ENDIF + + LD L,(IY-100+VRS.PatsPtr) + LD H,(IY-100+VRS.PatsPtr+1) + ADD HL,DE + LD E,(IY-100+VRS.MODADDR) + LD D,(IY-100+VRS.MODADDR+1) + LD (PSP_+1),SP + LD SP,HL + POP HL + ADD HL,DE + LD B,H + LD C,L + POP HL + ADD HL,DE + LD (IY-100+VRS.AdInPtB),L + LD (IY-100+VRS.AdInPtB+1),H + POP HL + ADD HL,DE + LD (IY-100+VRS.AdInPtC),L + LD (IY-100+VRS.AdInPtC+1),H +PSP_ LD SP,#3131 +PL1A LD DE,VRS.ChanA+12-100 + CALL PTDECOD + LD (IY-100+VRS.AdInPtA),C + LD (IY-100+VRS.AdInPtA+1),B + +PL1B DEC (IY-100+VRS.ChanB+CHP.NtSkCn) + JR NZ,PL1C + LD DE,VRS.ChanB+12-100 + LD C,(IY-100+VRS.AdInPtB) + LD B,(IY-100+VRS.AdInPtB+1) + CALL PTDECOD + LD (IY-100+VRS.AdInPtB),C + LD (IY-100+VRS.AdInPtB+1),B + +PL1C DEC (IY-100+VRS.ChanC+CHP.NtSkCn) + JR NZ,PL1D + LD DE,VRS.ChanC+12-100 + LD C,(IY-100+VRS.AdInPtC) + LD B,(IY-100+VRS.AdInPtC+1) + CALL PTDECOD + LD (IY-100+VRS.AdInPtC),C + LD (IY-100+VRS.AdInPtC+1),B + +PL1D LD A,(IY-100+VRS.Delay) + LD (IY-100+VRS.DelyCnt),A + +PL2 LD DE,VRS.ChanA-100 + LD L,(IY-100+VRS.AYREGS+TonA) + LD H,(IY-100+VRS.AYREGS+TonA+1) + CALL CHREGS + LD (IY-100+VRS.AYREGS+TonA),L + LD (IY-100+VRS.AYREGS+TonA+1),H +Ampl EQU $+1 + LD A,#3E + LD (IY-100+VRS.AYREGS+AmplA),A + LD DE,VRS.ChanB-100 + LD L,(IY-100+VRS.AYREGS+TonB) + LD H,(IY-100+VRS.AYREGS+TonB+1) + CALL CHREGS + LD (IY-100+VRS.AYREGS+TonB),L + LD (IY-100+VRS.AYREGS+TonB+1),H + LD A,(Ampl) + LD (IY-100+VRS.AYREGS+AmplB),A + LD DE,VRS.ChanC-100 + LD L,(IY-100+VRS.AYREGS+TonC) + LD H,(IY-100+VRS.AYREGS+TonC+1) + CALL CHREGS + LD (IY-100+VRS.AYREGS+TonC),L + LD (IY-100+VRS.AYREGS+TonC+1),H + LD A,(Ampl) + LD (IY-100+VRS.AYREGS+AmplC),A + + LD A,(IY-100+VRS.Ns_Base) + ADD (IY-100+VRS.AddToNs) + LD (IY-100+VRS.AYREGS+Noise),A + + LD A,(IY-100+VRS.AddToEn) + LD E,A + ADD A,A + SBC A,A + LD D,A + LD L,(IY-100+VRS.EnvBase) + LD H,(IY-100+VRS.EnvBase+1) + ADD HL,DE + LD E,(IY-100+VRS.CurESld) + LD D,(IY-100+VRS.CurESld+1) + ADD HL,DE + LD (IY-100+VRS.AYREGS+Env),L + LD (IY-100+VRS.AYREGS+Env+1),H + + XOR A + OR (IY-100+VRS.CurEDel) + RET Z + DEC (IY-100+VRS.CurEDel) + RET NZ + LD A,(IY-100+VRS.Env_Del) + LD (IY-100+VRS.CurEDel),A + LD L,(IY-100+VRS.ESldAdd) + LD H,(IY-100+VRS.ESldAdd+1) + ADD HL,DE + JP SETESLD + +PLAY LD IY,VARS1+100 + CALL PLAY_ + LD A,(is_ts) + AND A + JR Z,PL_nts + LD IY,VARS2+100 + CALL PLAY_ +PL_nts + IF Basic + LD IY,#5C3A + ENDIF + +ROUT LD BC,#FFFD + LD A,(is_ts) + AND A + JR Z,r_nts ;keep old standard + OUT (C),B +r_nts EX AF,AF' + + IF ACBBAC + LD IX,VARS1+VRS.AYREGS + ELSE + LD HL,VARS1+VRS.AYREGS + ENDIF + + CALL ROUT_ + EX AF,AF' + RET Z + LD B,D + CPL + OUT (C),A + + IF ACBBAC + LD IX,VARS2+VRS.AYREGS + ELSE + LD HL,VARS2+VRS.AYREGS + ENDIF + +ROUT_ + IF ACBBAC + LD A,(SETUP) + AND 12 + JR Z,ABC + ADD A,CHTABLE + LD E,A + ADC A,CHTABLE/256 + SUB E + LD D,A + LD B,0 + PUSH IX + POP HL + LD A,(DE) + INC DE + LD C,A + ADD HL,BC + LD A,(IX+TonB) + LD C,(HL) + LD (IX+TonB),C + LD (HL),A + INC HL + LD A,(IX+TonB+1) + LD C,(HL) + LD (IX+TonB+1),C + LD (HL),A + LD A,(DE) + INC DE + LD C,A + ADD HL,BC + LD A,(IX+AmplB) + LD C,(HL) + LD (IX+AmplB),C + LD (HL),A + LD A,(DE) + INC DE + LD (RxCA1),A + XOR 8 + LD (RxCA2),A + LD A,(DE) + AND (IX+Mixer) + LD E,A + LD A,(IX+Mixer) +RxCA1 DB #E6 + AND %010010 + OR E + LD E,A + LD A,(IX+Mixer) + AND %010010 +RxCA2 OR E + OR E + LD (IX+Mixer),A +ABC + ENDIF + + XOR A + LD DE,#FFBF + + IF ACBBAC + LD BC,#FFFD + PUSH IX + POP HL + ENDIF + +LOUT OUT (C),A + LD B,E + OUTI + LD B,D + INC A + CP 13 + JR NZ,LOUT + OUT (C),A + LD A,(HL) + AND A + RET M + LD B,E + OUT (C),A + RET + + IF ACBBAC +CHTABLE EQU $-4 + DB 4,5,15,%001001,0,7,7,%100100 + ENDIF + +NT_DATA DB (T_NEW_0-T1_)*2 + DB TCNEW_0-T_ + DB (T_OLD_0-T1_)*2+1 + DB TCOLD_0-T_ + DB (T_NEW_1-T1_)*2+1 + DB TCNEW_1-T_ + DB (T_OLD_1-T1_)*2+1 + DB TCOLD_1-T_ + DB (T_NEW_2-T1_)*2 + DB TCNEW_2-T_ + DB (T_OLD_2-T1_)*2 + DB TCOLD_2-T_ + DB (T_NEW_3-T1_)*2 + DB TCNEW_3-T_ + DB (T_OLD_3-T1_)*2 + DB TCOLD_3-T_ + +T_ + +TCOLD_0 DB #00+1,#04+1,#08+1,#0A+1,#0C+1,#0E+1,#12+1,#14+1 + DB #18+1,#24+1,#3C+1,0 +TCOLD_1 DB #5C+1,0 +TCOLD_2 DB #30+1,#36+1,#4C+1,#52+1,#5E+1,#70+1,#82,#8C,#9C + DB #9E,#A0,#A6,#A8,#AA,#AC,#AE,#AE,0 +TCNEW_3 DB #56+1 +TCOLD_3 DB #1E+1,#22+1,#24+1,#28+1,#2C+1,#2E+1,#32+1,#BE+1,0 +TCNEW_0 DB #1C+1,#20+1,#22+1,#26+1,#2A+1,#2C+1,#30+1,#54+1 + DB #BC+1,#BE+1,0 +TCNEW_1 EQU TCOLD_1 +TCNEW_2 DB #1A+1,#20+1,#24+1,#28+1,#2A+1,#3A+1,#4C+1,#5E+1 + DB #BA+1,#BC+1,#BE+1,0 + +PT3EMPTYORN EQU $-1 + DB 1,0 + +;first 12 values of tone tables (packed) + +T_PACK DB #06EC*2/256,#06EC*2 + DB #0755-#06EC + DB #07C5-#0755 + DB #083B-#07C5 + DB #08B8-#083B + DB #093D-#08B8 + DB #09CA-#093D + DB #0A5F-#09CA + DB #0AFC-#0A5F + DB #0BA4-#0AFC + DB #0C55-#0BA4 + DB #0D10-#0C55 + DB #066D*2/256,#066D*2 + DB #06CF-#066D + DB #0737-#06CF + DB #07A4-#0737 + DB #0819-#07A4 + DB #0894-#0819 + DB #0917-#0894 + DB #09A1-#0917 + DB #0A33-#09A1 + DB #0ACF-#0A33 + DB #0B73-#0ACF + DB #0C22-#0B73 + DB #0CDA-#0C22 + DB #0704*2/256,#0704*2 + DB #076E-#0704 + DB #07E0-#076E + DB #0858-#07E0 + DB #08D6-#0858 + DB #095C-#08D6 + DB #09EC-#095C + DB #0A82-#09EC + DB #0B22-#0A82 + DB #0BCC-#0B22 + DB #0C80-#0BCC + DB #0D3E-#0C80 + DB #07E0*2/256,#07E0*2 + DB #0858-#07E0 + DB #08E0-#0858 + DB #0960-#08E0 + DB #09F0-#0960 + DB #0A88-#09F0 + DB #0B28-#0A88 + DB #0BD8-#0B28 + DB #0C80-#0BD8 + DB #0D60-#0C80 + DB #0E10-#0D60 + DB #0EF8-#0E10 + +;vars from here can be stripped +;you can move VARS to any other address + +VARS + +is_ts DB 0 + +;ChannelsVars + STRUCT CHP +;reset group +PsInOr DB 0 +PsInSm DB 0 +CrAmSl DB 0 +CrNsSl DB 0 +CrEnSl DB 0 +TSlCnt DB 0 +CrTnSl DW 0 +TnAcc DW 0 +COnOff DB 0 +;reset group + +OnOffD DB 0 + +;IX for PTDECOD here (+12) +OffOnD DB 0 +OrnPtr DW 0 +SamPtr DW 0 +NNtSkp DB 0 +Note DB 0 +SlToNt DB 0 +Env_En DB 0 +Flags DB 0 + ;Enabled - 0, SimpleGliss - 2 +TnSlDl DB 0 +TSlStp DW 0 +TnDelt DW 0 +NtSkCn DB 0 +Volume DB 0 + ENDS + + STRUCT VRS + +;IF not works in STRUCT in SjASM :( +; IF CurPosCounter +CurPos DB 0 +PosSub DB 0 +; ENDIF + +ModNum DB 0 ;bit0: ChipNum + ;bit1: 1-reversed patterns order (AlCo TS) + +ChanA DS CHP +ChanB DS CHP +ChanC DS CHP + +;GlobalVars +MODADDR DW 0 +OrnPtrs DW 0 +SamPtrs DW 0 +PatsPtr DW 0 +AdInPtA DW 0 +AdInPtB DW 0 +AdInPtC DW 0 +CrPsPtr DW 0 +LPosPtr DW 0 +Delay DB 0 +DelyCnt DB 0 +ESldAdd DW 0 +CurESld DW 0 +Env_Del DB 0 +CurEDel DB 0 +Ns_Base DB 0 +AddToNs DB 0 +AddToEn DB 0 +EnvBase DW 0 +AYREGS DS 14 + ENDS + +VARS1 DS VRS +VARS2 DS VRS + +VT_ EQU $-16 + DS 256-16 ;CreatedVolumeTableAddress + +T1_ EQU VT_+16 ;Tone tables data depacked here + +T_OLD_1 EQU T1_ +T_OLD_2 EQU T_OLD_1+24 +T_OLD_3 EQU T_OLD_2+24 +T_OLD_0 EQU T_OLD_3+2 +T_NEW_0 EQU T_OLD_0 +T_NEW_1 EQU T_OLD_1 +T_NEW_2 EQU T_NEW_0+24 +T_NEW_3 EQU T_OLD_3 + +PT2EMPTYORN EQU VT_+31 ;1,0,0 sequence + +NT_ DS 192 ;CreatedNoteTableAddress + +VAR0END EQU VT_+16 ;INIT zeroes from VARS to VAR0END-1 + +VARSEND EQU $ + +MDLADDR EQU $ + +;Release 0 steps: +;04/21/2007 +;Works start (PTxPlay adaptation); first beta. +;04/22/2007 +;Job finished; beta-testing. +;04/23/2007 +;PT v3.7 TS mode corrected (after AlCo remarks). +;04/29/2007 +;Added 1.XX and 2.XX special commands interpretation for PT3 +;modules of v3.7+. + +;Size (minimal build for ZX Spectrum): +;Code block #908 bytes +;Variables #2BF bytes (can be stripped) +;Total size #908+#2BF=#BC7 (3015) bytes diff --git a/software/ugophy/wifi.asm b/software/ugophy/wifi.asm index 28c329e..e54c85b 100644 --- a/software/ugophy/wifi.asm +++ b/software/ugophy/wifi.asm @@ -1,68 +1,39 @@ ; Initialize WiFi chip and connect to WiFi initWifi: - call setNoTurboMode - call loadWiFiConfig - call uartBegin - ld hl, cmd_plus - call uartWriteStringZ + call setNoTurboMode : call loadWiFiConfig : call uartBegin + + ld hl, cmd_plus : call uartWriteStringZ ld b,#ff wlp: - push bc - ld b, #ff - djnz $ - pop bc - djnz wlp + push bc : ld b, #ff : djnz $ : pop bc : djnz wlp - ld hl, cmd_rst - call uartWriteStringZ + ld hl, cmd_rst : call uartWriteStringZ rstLp: - call uartReadBlocking - call pushRing - ld hl, response_rdy - call searchRing - cp 1 - jr nz, rstLp + call uartReadBlocking : call pushRing - ld hl, cmd_at ; Disable ECHO. BTW Basic UART test - call okErrCmd - and 1 - jr z, errInit + ld hl, response_rdy : call searchRing : cp 1 : jr nz, rstLp +; Disable ECHO. BTW Basic UART test + + + ld hl, cmd_at : call okErrCmd : and 1 : jr z, errInit +; Lets disconnect from last AP + ld hl, cmd_cwqap : call okErrCmd : and 1 : jr z, errInit +; Single connection mode + ld hl, cmd_cmux : call okErrCmd : and 1 : jr z, errInit +; FTP enables this info? We doesn't need it :-) + ld hl, cmd_inf_off : call okErrCmd : and 1 : jr z, errInit + +; Access Point connection + ld hl, cmd_cwjap1 : call uartWriteStringZ : ld hl, ssid : call uartWriteStringZ : ld hl, cmd_cwjap2 : call uartWriteStringZ + ld hl, pass :call uartWriteStringZ : ld hl, cmd_cwjap3 : call okErrCmd + + and 1 :jr z, errInit - ld hl, cmd_cwqap ; Lets disconnect from last AP - call okErrCmd - and 1 - jr z, errInit - - ld hl, cmd_cmux ; Single connection mode - call okErrCmd - and 1 - jr z, errInit - - ld hl, cmd_inf_off ; FTP enables this info? We doesn't need it :-) - call okErrCmd - and 1 - jr z, errInit - - ld hl, cmd_cwjap1 ; Access Point connection - call uartWriteStringZ - ld hl, ssid - call uartWriteStringZ - ld hl, cmd_cwjap2 - call uartWriteStringZ - ld hl, pass - call uartWriteStringZ - ld hl, cmd_cwjap3 - call okErrCmd - and 1 - jr z, errInit - - ld hl, log_ok - call putStringZ + ld hl, log_ok : call putStringZ call setTurbo4Mode ret errInit - ld hl, log_err - call putStringZ + ld hl, log_err : call putStringZ jr $ @@ -74,25 +45,12 @@ errInit okErrCmd: call uartWriteStringZ okErrCmdLp: - call uartReadBlocking - call pushRing + call uartReadBlocking : call pushRing - ld hl, response_ok - call searchRing - cp 1 - jr z, okErrOk + ld hl, response_ok : call searchRing : cp 1 : jr z, okErrOk + ld hl, response_err : call searchRing : cp 1 : jr z, okErrErr + ld hl, response_fail : call searchRing : cp 1 : jr z, okErrErr - ld hl, response_err - call searchRing - cp 1 - jr z, okErrErr - - ld hl, response_fail - call searchRing - cp 1 - jr z, okErrErr - - jp okErrCmdLp okErrOk ld a, 1 @@ -107,59 +65,34 @@ okErrErr ; ; If connection was closed it calls 'closed_callback' getPacket - call uartReadBlocking - call pushRing + call uartReadBlocking : call pushRing - ld hl, closed - call searchRing - cp 1 - jp z, closed_callback + ld hl, closed : call searchRing : cp 1 : jp z, closed_callback + ld hl, ipd : call searchRing : cp 1 : jr nz, getPacket - ld hl, ipd - call searchRing - cp 1 - jr nz, getPacket - - call count_ipd_lenght - ld (bytes_avail), hl - push hl - pop bc - ld hl, output_buffer + call count_ipd_lenght : ld (bytes_avail), hl + push hl : pop bc + + ld hl, output_buffer readp: - push bc - push hl + push bc : push hl call uartReadBlocking pop hl - ld (hl), a + ld (hl), a pop bc - dec bc - inc hl - ld a, b - or c - jr nz, readp - ld hl, (bytes_avail) + + dec bc : inc hl + + ld a, b : or c : jr nz, readp + + ld hl, (bytes_avail) ret count_ipd_lenght ld hl,0 ; count lenght -cil1 push hl - call uartReadBlocking - push af - call pushRing - pop af - pop hl - cp ':' - ret z - sub 0x30 - ld c,l - ld b,h - add hl,hl - add hl,hl - add hl,bc - add hl,hl - ld c,a - ld b,0 - add hl,bc +cil1 push hl : call uartReadBlocking : push af : call pushRing : pop af : pop hl + cp ':' : ret z + sub 0x30 : ld c,l : ld b,h : add hl,hl : add hl,hl : add hl,bc : add hl,hl : ld c,a : ld b,0 : add hl,bc jr cil1 ; HL - z-string to hostname or ip @@ -167,36 +100,26 @@ cil1 push hl startTcp: push de push hl - ld hl, cmd_open1 - call uartWriteStringZ - pop hl - call uartWriteStringZ - ld hl, cmd_open2 - call uartWriteStringZ - pop de - call uartWriteStringZ - ld hl, cmd_open3 - call okErrCmd + ld hl, cmd_open1 : call uartWriteStringZ + pop hl : call uartWriteStringZ + ld hl, cmd_open2 : call uartWriteStringZ + pop de : call uartWriteStringZ + ld hl, cmd_open3 : call okErrCmd ret ; Returns: ; A: 1 - Success ; 0 - Failed sendByte: - push af - ld hl, cmd_send_b - call okErrCmd - cp 1 - jr nz, sbErr + push af + ld hl, cmd_send_b : call okErrCmd + cp 1 : jr nz, sbErr sbLp - call uartReadBlocking - ld hl, send_prompt - call searchRing - cp 1 - jr nz, sbLp + call uartReadBlocking + ld hl, send_prompt : call searchRing : cp 1 : jr nz, sbLp pop af - ld (sbyte_buff), a - call okErrCmd + + ld (sbyte_buff), a : call okErrCmd ret sbErr: pop af @@ -204,18 +127,11 @@ sbErr: ret loadWiFiConfig: - ld b, FMODE_READ - ld hl, conf_file - call fopen - - push af - ld hl, ssid - ld bc, 160 - call fread - pop af - + ld b, FMODE_READ : ld hl, conf_file : call fopen + push af : ld hl, ssid : ld bc, 160 : call fread : pop af call fclose ret + cmd_plus defb "+++", 0 cmd_rst defb "AT+RST",13, 10, 0 cmd_at defb "ATE0", 13, 10, 0 ; Disable echo - less to parse