diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/FunctionCallAsmGen.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/FunctionCallAsmGen.kt index 58a97786f..39e0191b3 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/FunctionCallAsmGen.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/FunctionCallAsmGen.kt @@ -164,7 +164,7 @@ internal class FunctionCallAsmGen(private val program: PtProgram, private val as if(requiredDt!=value.type) throw AssemblyError("for statusflag, byte value is required") if (statusflag == Statusflag.Pc) { - // this param needs to be set last, right before the jsr + // this boolean param needs to be set last, right before the jsr // for now, this is already enforced on the subroutine definition by the Ast Checker when(value) { is PtNumber -> { @@ -183,12 +183,7 @@ internal class FunctionCallAsmGen(private val program: PtProgram, private val as } else -> { asmgen.assignExpressionToRegister(value, RegisterOrPair.A) - asmgen.out(""" - beq + - sec - bcs ++ -+ clc -+""") + asmgen.out(" ror a") } } } else throw AssemblyError("can only use Carry as status flag parameter") diff --git a/compiler/res/prog8lib/atari/textio.p8 b/compiler/res/prog8lib/atari/textio.p8 index 81aa574f2..0e7f82f2e 100644 --- a/compiler/res/prog8lib/atari/textio.p8 +++ b/compiler/res/prog8lib/atari/textio.p8 @@ -70,7 +70,7 @@ sub uppercase() { ; TODO } -asmsub scroll_left (ubyte alsocolors @ Pc) clobbers(A, Y) { +asmsub scroll_left (bool alsocolors @ Pc) clobbers(A, Y) { ; ---- scroll the whole screen 1 character to the left ; contents of the rightmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -81,7 +81,7 @@ asmsub scroll_left (ubyte alsocolors @ Pc) clobbers(A, Y) { }} } -asmsub scroll_right (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_right (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character to the right ; contents of the leftmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -91,7 +91,7 @@ asmsub scroll_right (ubyte alsocolors @ Pc) clobbers(A) { }} } -asmsub scroll_up (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_up (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character up ; contents of the bottom row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -101,7 +101,7 @@ asmsub scroll_up (ubyte alsocolors @ Pc) clobbers(A) { }} } -asmsub scroll_down (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_down (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character down ; contents of the top row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -210,7 +210,7 @@ asmsub print_b (byte value @ A) clobbers(A,Y) { }} } -asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubhex (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -228,7 +228,7 @@ asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubbin (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -249,7 +249,7 @@ asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwbin (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ pha @@ -261,7 +261,7 @@ asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwhex (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwhex (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in hexadecimal form (4 digits) ; (if Carry is set, a radix prefix '$' is printed as well) %asm {{ diff --git a/compiler/res/prog8lib/c128/syslib.p8 b/compiler/res/prog8lib/c128/syslib.p8 index 6b28a3116..03d0380d3 100644 --- a/compiler/res/prog8lib/c128/syslib.p8 +++ b/compiler/res/prog8lib/c128/syslib.p8 @@ -63,12 +63,12 @@ romsub $FF81 = CINT() clobbers(A,X,Y) ; (alias: SCINIT romsub $FF84 = IOINIT() clobbers(A, X) ; initialize I/O devices (CIA, SID, IRQ) romsub $FF87 = RAMTAS() clobbers(A,X,Y) ; initialize RAM, tape buffer, screen romsub $FF8A = RESTOR() clobbers(A,X,Y) ; restore default I/O vectors -romsub $FF8D = VECTOR(uword userptr @ XY, ubyte dir @ Pc) clobbers(A,Y) ; read/set I/O vector table +romsub $FF8D = VECTOR(uword userptr @ XY, bool dir @ Pc) clobbers(A,Y) ; read/set I/O vector table romsub $FF90 = SETMSG(ubyte value @ A) ; set Kernal message control flag romsub $FF93 = SECOND(ubyte address @ A) clobbers(A) ; (alias: LSTNSA) send secondary address after LISTEN romsub $FF96 = TKSA(ubyte address @ A) clobbers(A) ; (alias: TALKSA) send secondary address after TALK -romsub $FF99 = MEMTOP(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set top of memory pointer -romsub $FF9C = MEMBOT(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer +romsub $FF99 = MEMTOP(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set top of memory pointer +romsub $FF9C = MEMBOT(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer romsub $FF9F = SCNKEY() clobbers(A,X,Y) ; scan the keyboard romsub $FFA2 = SETTMO(ubyte timeout @ A) ; set time-out flag for IEEE bus romsub $FFA5 = ACPTR() -> ubyte @ A ; (alias: IECIN) input byte from serial bus @@ -80,23 +80,23 @@ romsub $FFB4 = TALK(ubyte device @ A) clobbers(A) ; command serial romsub $FFB7 = READST() -> ubyte @ A ; read I/O status word romsub $FFBA = SETLFS(ubyte logical @ A, ubyte device @ X, ubyte secondary @ Y) ; set logical file parameters romsub $FFBD = SETNAM(ubyte namelen @ A, str filename @ XY) ; set filename parameters -romsub $FFC0 = OPEN() clobbers(X,Y) -> ubyte @Pc, ubyte @A ; (via 794 ($31A)) open a logical file +romsub $FFC0 = OPEN() clobbers(X,Y) -> bool @Pc, ubyte @A ; (via 794 ($31A)) open a logical file romsub $FFC3 = CLOSE(ubyte logical @ A) clobbers(A,X,Y) ; (via 796 ($31C)) close a logical file -romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> ubyte @Pc ; (via 798 ($31E)) define an input channel +romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> bool @Pc ; (via 798 ($31E)) define an input channel romsub $FFC9 = CHKOUT(ubyte logical @ X) clobbers(A,X) ; (via 800 ($320)) define an output channel romsub $FFCC = CLRCHN() clobbers(A,X) ; (via 802 ($322)) restore default devices romsub $FFCF = CHRIN() clobbers(X, Y) -> ubyte @ A ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. romsub $FFD2 = CHROUT(ubyte char @ A) ; (via 806 ($326)) output a character -romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> ubyte @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device -romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> ubyte @ Pc, ubyte @ A ; (via 818 ($332)) save to a device +romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> bool @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device +romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> bool @ Pc, ubyte @ A ; (via 818 ($332)) save to a device romsub $FFDB = SETTIM(ubyte low @ A, ubyte middle @ X, ubyte high @ Y) ; set the software clock romsub $FFDE = RDTIM() -> ubyte @ A, ubyte @ X, ubyte @ Y ; read the software clock (A=lo,X=mid,Y=high) -romsub $FFE1 = STOP() clobbers(X) -> ubyte @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) -romsub $FFE4 = GETIN() clobbers(X,Y) -> ubyte @Pc, ubyte @ A ; (via 810 ($32A)) get a character +romsub $FFE1 = STOP() clobbers(X) -> bool @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) +romsub $FFE4 = GETIN() clobbers(X,Y) -> bool @Pc, ubyte @ A ; (via 810 ($32A)) get a character romsub $FFE7 = CLALL() clobbers(A,X) ; (via 812 ($32C)) close all files romsub $FFEA = UDTIM() clobbers(A,X) ; update the software clock romsub $FFED = SCREEN() -> ubyte @ X, ubyte @ Y ; read number of screen rows and columns -romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, ubyte dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. +romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, bool dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. romsub $FFF3 = IOBASE() -> uword @ XY ; read base address of I/O devices ; ---- end of C64 compatible ROM kernal routines ---- @@ -395,7 +395,7 @@ asmsub enable_runstop_and_charsetswitch() clobbers(A) { }} } -asmsub set_irq(uword handler @AY, ubyte useKernal @Pc) clobbers(A) { +asmsub set_irq(uword handler @AY, bool useKernal @Pc) clobbers(A) { %asm {{ sta _modified+1 sty _modified+2 @@ -489,7 +489,7 @@ asmsub restore_irq() clobbers(A) { }} } -asmsub set_rasterirq(uword handler @AY, uword rasterpos @R0, ubyte useKernal @Pc) clobbers(A) { +asmsub set_rasterirq(uword handler @AY, uword rasterpos @R0, bool useKernal @Pc) clobbers(A) { %asm {{ sta _modified+1 sty _modified+2 diff --git a/compiler/res/prog8lib/c128/textio.p8 b/compiler/res/prog8lib/c128/textio.p8 index f77e55621..15875a68a 100644 --- a/compiler/res/prog8lib/c128/textio.p8 +++ b/compiler/res/prog8lib/c128/textio.p8 @@ -96,7 +96,7 @@ sub uppercase() { c128.VM1 &= ~2 } -asmsub scroll_left (ubyte alsocolors @ Pc) clobbers(A, Y) { +asmsub scroll_left (bool alsocolors @ Pc) clobbers(A, Y) { ; ---- scroll the whole screen 1 character to the left ; contents of the rightmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -137,7 +137,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_right (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_right (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character to the right ; contents of the leftmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -173,7 +173,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_up (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_up (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character up ; contents of the bottom row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -209,7 +209,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_down (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_down (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character down ; contents of the top row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -322,7 +322,7 @@ asmsub print_b (byte value @ A) clobbers(A,Y) { }} } -asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubhex (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -340,7 +340,7 @@ asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubbin (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -361,7 +361,7 @@ asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwbin (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ pha @@ -373,7 +373,7 @@ asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwhex (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwhex (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in hexadecimal form (4 digits) ; (if Carry is set, a radix prefix '$' is printed as well) %asm {{ diff --git a/compiler/res/prog8lib/c64/syslib.p8 b/compiler/res/prog8lib/c64/syslib.p8 index b444f26cf..cdaa0a958 100644 --- a/compiler/res/prog8lib/c64/syslib.p8 +++ b/compiler/res/prog8lib/c64/syslib.p8 @@ -66,12 +66,12 @@ romsub $FF81 = CINT() clobbers(A,X,Y) ; (alias: SCINIT romsub $FF84 = IOINIT() clobbers(A, X) ; initialize I/O devices (CIA, SID, IRQ) romsub $FF87 = RAMTAS() clobbers(A,X,Y) ; initialize RAM, tape buffer, screen romsub $FF8A = RESTOR() clobbers(A,X,Y) ; restore default I/O vectors -romsub $FF8D = VECTOR(uword userptr @ XY, ubyte dir @ Pc) clobbers(A,Y) ; read/set I/O vector table +romsub $FF8D = VECTOR(uword userptr @ XY, bool dir @ Pc) clobbers(A,Y) ; read/set I/O vector table romsub $FF90 = SETMSG(ubyte value @ A) ; set Kernal message control flag romsub $FF93 = SECOND(ubyte address @ A) clobbers(A) ; (alias: LSTNSA) send secondary address after LISTEN romsub $FF96 = TKSA(ubyte address @ A) clobbers(A) ; (alias: TALKSA) send secondary address after TALK -romsub $FF99 = MEMTOP(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set top of memory pointer -romsub $FF9C = MEMBOT(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer +romsub $FF99 = MEMTOP(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set top of memory pointer +romsub $FF9C = MEMBOT(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer romsub $FF9F = SCNKEY() clobbers(A,X,Y) ; scan the keyboard romsub $FFA2 = SETTMO(ubyte timeout @ A) ; set time-out flag for IEEE bus romsub $FFA5 = ACPTR() -> ubyte @ A ; (alias: IECIN) input byte from serial bus @@ -83,23 +83,23 @@ romsub $FFB4 = TALK(ubyte device @ A) clobbers(A) ; command serial romsub $FFB7 = READST() -> ubyte @ A ; read I/O status word romsub $FFBA = SETLFS(ubyte logical @ A, ubyte device @ X, ubyte secondary @ Y) ; set logical file parameters romsub $FFBD = SETNAM(ubyte namelen @ A, str filename @ XY) ; set filename parameters -romsub $FFC0 = OPEN() clobbers(X,Y) -> ubyte @Pc, ubyte @A ; (via 794 ($31A)) open a logical file +romsub $FFC0 = OPEN() clobbers(X,Y) -> bool @Pc, ubyte @A ; (via 794 ($31A)) open a logical file romsub $FFC3 = CLOSE(ubyte logical @ A) clobbers(A,X,Y) ; (via 796 ($31C)) close a logical file -romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> ubyte @Pc ; (via 798 ($31E)) define an input channel +romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> bool @Pc ; (via 798 ($31E)) define an input channel romsub $FFC9 = CHKOUT(ubyte logical @ X) clobbers(A,X) ; (via 800 ($320)) define an output channel romsub $FFCC = CLRCHN() clobbers(A,X) ; (via 802 ($322)) restore default devices romsub $FFCF = CHRIN() clobbers(X, Y) -> ubyte @ A ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. romsub $FFD2 = CHROUT(ubyte char @ A) ; (via 806 ($326)) output a character -romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> ubyte @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device -romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> ubyte @ Pc, ubyte @ A ; (via 818 ($332)) save to a device +romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> bool @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device +romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> bool @ Pc, ubyte @ A ; (via 818 ($332)) save to a device romsub $FFDB = SETTIM(ubyte low @ A, ubyte middle @ X, ubyte high @ Y) ; set the software clock romsub $FFDE = RDTIM() -> ubyte @ A, ubyte @ X, ubyte @ Y ; read the software clock (A=lo,X=mid,Y=high) -romsub $FFE1 = STOP() clobbers(X) -> ubyte @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) -romsub $FFE4 = GETIN() clobbers(X,Y) -> ubyte @Pc, ubyte @ A ; (via 810 ($32A)) get a character +romsub $FFE1 = STOP() clobbers(X) -> bool @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) +romsub $FFE4 = GETIN() clobbers(X,Y) -> bool @Pc, ubyte @ A ; (via 810 ($32A)) get a character romsub $FFE7 = CLALL() clobbers(A,X) ; (via 812 ($32C)) close all files romsub $FFEA = UDTIM() clobbers(A,X) ; update the software clock romsub $FFED = SCREEN() -> ubyte @ X, ubyte @ Y ; read number of screen rows and columns -romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, ubyte dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. +romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, bool dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. romsub $FFF3 = IOBASE() -> uword @ XY ; read base address of I/O devices asmsub STOP2() -> ubyte @A { @@ -360,7 +360,7 @@ asmsub enable_runstop_and_charsetswitch() clobbers(A) { }} } -asmsub set_irq(uword handler @AY, ubyte useKernal @Pc) clobbers(A) { +asmsub set_irq(uword handler @AY, bool useKernal @Pc) clobbers(A) { %asm {{ sta _modified+1 sty _modified+2 @@ -454,7 +454,7 @@ asmsub restore_irq() clobbers(A) { }} } -asmsub set_rasterirq(uword handler @AY, uword rasterpos @R0, ubyte useKernal @Pc) clobbers(A) { +asmsub set_rasterirq(uword handler @AY, uword rasterpos @R0, bool useKernal @Pc) clobbers(A) { %asm {{ sta _modified+1 sty _modified+2 diff --git a/compiler/res/prog8lib/c64/textio.p8 b/compiler/res/prog8lib/c64/textio.p8 index 25b1b81c5..6ea1b9229 100644 --- a/compiler/res/prog8lib/c64/textio.p8 +++ b/compiler/res/prog8lib/c64/textio.p8 @@ -94,7 +94,7 @@ sub uppercase() { c64.VMCSB &= ~2 } -asmsub scroll_left (ubyte alsocolors @ Pc) clobbers(A, Y) { +asmsub scroll_left (bool alsocolors @ Pc) clobbers(A, Y) { ; ---- scroll the whole screen 1 character to the left ; contents of the rightmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -135,7 +135,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_right (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_right (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character to the right ; contents of the leftmost column are unchanged, you should clear/refill this yourself ; Carry flag determines if screen color data must be scrolled too @@ -171,7 +171,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_up (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_up (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character up ; contents of the bottom row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -207,7 +207,7 @@ _scroll_screen ; scroll only the screen memory }} } -asmsub scroll_down (ubyte alsocolors @ Pc) clobbers(A) { +asmsub scroll_down (bool alsocolors @ Pc) clobbers(A) { ; ---- scroll the whole screen 1 character down ; contents of the top row are unchanged, you should refill/clear this yourself ; Carry flag determines if screen color data must be scrolled too @@ -320,7 +320,7 @@ asmsub print_b (byte value @ A) clobbers(A,Y) { }} } -asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubhex (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -338,7 +338,7 @@ asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubbin (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ stx P8ZP_SCRATCH_REG @@ -359,7 +359,7 @@ asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwbin (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ pha @@ -371,7 +371,7 @@ asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwhex (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwhex (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in hexadecimal form (4 digits) ; (if Carry is set, a radix prefix '$' is printed as well) %asm {{ diff --git a/compiler/res/prog8lib/cx16/syslib.p8 b/compiler/res/prog8lib/cx16/syslib.p8 index 559727da9..51a758b62 100644 --- a/compiler/res/prog8lib/cx16/syslib.p8 +++ b/compiler/res/prog8lib/cx16/syslib.p8 @@ -13,12 +13,12 @@ romsub $FF81 = CINT() clobbers(A,X,Y) ; (alias: SCINIT romsub $FF84 = IOINIT() clobbers(A, X) ; initialize I/O devices (CIA, SID, IRQ) romsub $FF87 = RAMTAS() clobbers(A,X,Y) ; initialize RAM, tape buffer, screen romsub $FF8A = RESTOR() clobbers(A,X,Y) ; restore default I/O vectors -romsub $FF8D = VECTOR(uword userptr @ XY, ubyte dir @ Pc) clobbers(A,Y) ; read/set I/O vector table +romsub $FF8D = VECTOR(uword userptr @ XY, bool dir @ Pc) clobbers(A,Y) ; read/set I/O vector table romsub $FF90 = SETMSG(ubyte value @ A) ; set Kernal message control flag romsub $FF93 = SECOND(ubyte address @ A) clobbers(A) ; (alias: LSTNSA) send secondary address after LISTEN romsub $FF96 = TKSA(ubyte address @ A) clobbers(A) ; (alias: TALKSA) send secondary address after TALK -romsub $FF99 = MEMTOP(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set top of memory pointer. NOTE: as a Cx16 extension, also returns the number of RAM memory banks in register A ! See cx16.numbanks() -romsub $FF9C = MEMBOT(uword address @ XY, ubyte dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer +romsub $FF99 = MEMTOP(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set top of memory pointer. NOTE: as a Cx16 extension, also returns the number of RAM memory banks in register A ! See cx16.numbanks() +romsub $FF9C = MEMBOT(uword address @ XY, bool dir @ Pc) -> uword @ XY ; read/set bottom of memory pointer romsub $FF9F = SCNKEY() clobbers(A,X,Y) ; scan the keyboard romsub $FFA2 = SETTMO(ubyte timeout @ A) ; set time-out flag for IEEE bus romsub $FFA5 = ACPTR() -> ubyte @ A ; (alias: IECIN) input byte from serial bus @@ -30,23 +30,23 @@ romsub $FFB4 = TALK(ubyte device @ A) clobbers(A) ; command serial romsub $FFB7 = READST() -> ubyte @ A ; read I/O status word romsub $FFBA = SETLFS(ubyte logical @ A, ubyte device @ X, ubyte secondary @ Y) ; set logical file parameters romsub $FFBD = SETNAM(ubyte namelen @ A, str filename @ XY) ; set filename parameters -romsub $FFC0 = OPEN() clobbers(X,Y) -> ubyte @Pc, ubyte @A ; (via 794 ($31A)) open a logical file +romsub $FFC0 = OPEN() clobbers(X,Y) -> bool @Pc, ubyte @A ; (via 794 ($31A)) open a logical file romsub $FFC3 = CLOSE(ubyte logical @ A) clobbers(A,X,Y) ; (via 796 ($31C)) close a logical file -romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> ubyte @Pc ; (via 798 ($31E)) define an input channel +romsub $FFC6 = CHKIN(ubyte logical @ X) clobbers(A,X) -> bool @Pc ; (via 798 ($31E)) define an input channel romsub $FFC9 = CHKOUT(ubyte logical @ X) clobbers(A,X) ; (via 800 ($320)) define an output channel romsub $FFCC = CLRCHN() clobbers(A,X) ; (via 802 ($322)) restore default devices romsub $FFCF = CHRIN() clobbers(X, Y) -> ubyte @ A ; (via 804 ($324)) input a character (for keyboard, read a whole line from the screen) A=byte read. romsub $FFD2 = CHROUT(ubyte char @ A) ; (via 806 ($326)) output a character -romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> ubyte @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device -romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> ubyte @ Pc, ubyte @ A ; (via 818 ($332)) save to a device +romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> bool @Pc, ubyte @ A, uword @ XY ; (via 816 ($330)) load from device +romsub $FFD8 = SAVE(ubyte zp_startaddr @ A, uword endaddr @ XY) -> bool @ Pc, ubyte @ A ; (via 818 ($332)) save to a device romsub $FFDB = SETTIM(ubyte low @ A, ubyte middle @ X, ubyte high @ Y) ; set the software clock romsub $FFDE = RDTIM() -> ubyte @ A, ubyte @ X, ubyte @ Y ; read the software clock (A=lo,X=mid,Y=high) -romsub $FFE1 = STOP() clobbers(X) -> ubyte @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) -romsub $FFE4 = GETIN() clobbers(X,Y) -> ubyte @Pc, ubyte @ A ; (via 810 ($32A)) get a character +romsub $FFE1 = STOP() clobbers(X) -> bool @ Pz, ubyte @ A ; (via 808 ($328)) check the STOP key (and some others in A) +romsub $FFE4 = GETIN() clobbers(X,Y) -> bool @Pc, ubyte @ A ; (via 810 ($32A)) get a character romsub $FFE7 = CLALL() clobbers(A,X) ; (via 812 ($32C)) close all files romsub $FFEA = UDTIM() clobbers(A,X) ; update the software clock romsub $FFED = SCREEN() -> ubyte @ X, ubyte @ Y ; read number of screen rows and columns -romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, ubyte dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. +romsub $FFF0 = PLOT(ubyte col @ Y, ubyte row @ X, bool dir @ Pc) -> ubyte @ X, ubyte @ Y ; read/set position of cursor on screen. Use txt.plot for a 'safe' wrapper that preserves X. romsub $FFF3 = IOBASE() -> uword @ XY ; read base address of I/O devices ; ---- utility @@ -320,7 +320,7 @@ cx16 { romsub $ff4a = close_all(ubyte device @A) clobbers(A,X,Y) romsub $ff59 = lkupla(ubyte la @A) clobbers(A,X,Y) romsub $ff5c = lkupsa(ubyte sa @Y) clobbers(A,X,Y) -romsub $ff5f = screen_mode(ubyte mode @A, ubyte getCurrent @Pc) clobbers(A, X, Y) -> ubyte @Pc +romsub $ff5f = screen_mode(ubyte mode @A, bool getCurrent @Pc) clobbers(A, X, Y) -> bool @Pc romsub $ff62 = screen_set_charset(ubyte charset @A, uword charsetptr @XY) clobbers(A,X,Y) ; incompatible with C128 dlchr() ; not yet supported: romsub $ff65 = pfkey() clobbers(A,X,Y) romsub $ff6e = jsrfar() ; following word = address to call, byte after that=rom/ram bank it is in @@ -337,12 +337,12 @@ romsub $ff23 = GRAPH_clear() clobbers(A,X,Y) romsub $ff26 = GRAPH_set_window(uword x @R0, uword y @R1, uword width @R2, uword height @R3) clobbers(A,X,Y) romsub $ff29 = GRAPH_set_colors(ubyte stroke @A, ubyte fill @X, ubyte background @Y) clobbers (A,X,Y) romsub $ff2c = GRAPH_draw_line(uword x1 @R0, uword y1 @R1, uword x2 @R2, uword y2 @R3) clobbers(A,X,Y) -romsub $ff2f = GRAPH_draw_rect(uword x @R0, uword y @R1, uword width @R2, uword height @R3, uword cornerradius @R4, ubyte fill @Pc) clobbers(A,X,Y) +romsub $ff2f = GRAPH_draw_rect(uword x @R0, uword y @R1, uword width @R2, uword height @R3, uword cornerradius @R4, bool fill @Pc) clobbers(A,X,Y) romsub $ff32 = GRAPH_move_rect(uword sx @R0, uword sy @R1, uword tx @R2, uword ty @R3, uword width @R4, uword height @R5) clobbers(A,X,Y) -romsub $ff35 = GRAPH_draw_oval(uword x @R0, uword y @R1, uword width @R2, uword height @R3, ubyte fill @Pc) clobbers(A,X,Y) +romsub $ff35 = GRAPH_draw_oval(uword x @R0, uword y @R1, uword width @R2, uword height @R3, bool fill @Pc) clobbers(A,X,Y) romsub $ff38 = GRAPH_draw_image(uword x @R0, uword y @R1, uword ptr @R2, uword width @R3, uword height @R4) clobbers(A,X,Y) romsub $ff3b = GRAPH_set_font(uword fontptr @R0) clobbers(A,X,Y) -romsub $ff3e = GRAPH_get_char_size(ubyte baseline @A, ubyte width @X, ubyte height_or_style @Y, ubyte is_control @Pc) clobbers(A,X,Y) +romsub $ff3e = GRAPH_get_char_size(ubyte baseline @A, ubyte width @X, ubyte height_or_style @Y, bool is_control @Pc) clobbers(A,X,Y) romsub $ff41 = GRAPH_put_char(uword x @R0, uword y @R1, ubyte char @A) clobbers(A,X,Y) romsub $ff41 = GRAPH_put_next_char(ubyte char @A) clobbers(A,X,Y) ; alias for the routine above that doesn't reset the position of the initial character @@ -364,16 +364,16 @@ romsub $ff1a = FB_filter_pixels(uword pointer @ R0, uword count @R1) clobbers(A romsub $ff1d = FB_move_pixels(uword sx @R0, uword sy @R1, uword tx @R2, uword ty @R3, uword count @R4) clobbers(A,X,Y) ; misc -romsub $fec6 = i2c_read_byte(ubyte device @X, ubyte offset @Y) clobbers (X,Y) -> ubyte @A, ubyte @Pc -romsub $fec9 = i2c_write_byte(ubyte device @X, ubyte offset @Y, ubyte data @A) clobbers (A,X,Y) -> ubyte @Pc -romsub $fef0 = sprite_set_image(uword pixels @R0, uword mask @R1, ubyte bpp @R2, ubyte number @A, ubyte width @X, ubyte height @Y, ubyte apply_mask @Pc) clobbers(A,X,Y) -> ubyte @Pc +romsub $fec6 = i2c_read_byte(ubyte device @X, ubyte offset @Y) clobbers (X,Y) -> ubyte @A, bool @Pc +romsub $fec9 = i2c_write_byte(ubyte device @X, ubyte offset @Y, ubyte data @A) clobbers (A,X,Y) -> bool @Pc +romsub $fef0 = sprite_set_image(uword pixels @R0, uword mask @R1, ubyte bpp @R2, ubyte number @A, ubyte width @X, ubyte height @Y, bool apply_mask @Pc) clobbers(A,X,Y) -> bool @Pc romsub $fef3 = sprite_set_position(uword x @R0, uword y @R1, ubyte number @A) clobbers(A,X,Y) romsub $fee4 = memory_fill(uword address @R0, uword num_bytes @R1, ubyte value @A) clobbers(A,X,Y) romsub $fee7 = memory_copy(uword source @R0, uword target @R1, uword num_bytes @R2) clobbers(A,X,Y) romsub $feea = memory_crc(uword address @R0, uword num_bytes @R1) clobbers(A,X,Y) -> uword @R2 romsub $feed = memory_decompress(uword input @R0, uword output @R1) clobbers(A,X,Y) -> uword @R1 ; last address +1 is result in R1 romsub $fedb = console_init(uword x @R0, uword y @R1, uword width @R2, uword height @R3) clobbers(A,X,Y) -romsub $fede = console_put_char(ubyte char @A, ubyte wrapping @Pc) clobbers(A,X,Y) +romsub $fede = console_put_char(ubyte char @A, bool wrapping @Pc) clobbers(A,X,Y) romsub $fee1 = console_get_char() clobbers(X,Y) -> ubyte @A romsub $fed8 = console_put_image(uword pointer @R0, uword width @R1, uword height @R2) clobbers(A,X,Y) romsub $fed5 = console_set_paging_message(uword msgptr @R0) clobbers(A,X,Y) @@ -381,7 +381,7 @@ romsub $fecf = entropy_get() -> ubyte @A, ubyte @X, ubyte @Y romsub $fecc = monitor() clobbers(A,X,Y) romsub $ff44 = macptr(ubyte length @A, uword buffer @XY, bool dontAdvance @Pc) clobbers(A) -> bool @Pc, uword @XY -romsub $ff47 = enter_basic(ubyte cold_or_warm @Pc) clobbers(A,X,Y) +romsub $ff47 = enter_basic(bool cold_or_warm @Pc) clobbers(A,X,Y) romsub $ff4d = clock_set_date_time(uword yearmonth @R0, uword dayhours @R1, uword minsecs @R2, ubyte jiffies @R3) clobbers(A, X, Y) romsub $ff50 = clock_get_date_time() clobbers(A, X, Y) -> uword @R0, uword @R1, uword @R2, ubyte @R3 ; result registers see clock_set_date_time() @@ -400,9 +400,9 @@ romsub $ff56 = joystick_get2(ubyte joynr @A) clobbers(Y) -> uword @AX ; altern ; Audio (bank 10) romsub $C04B = psg_init() clobbers(A,X,Y) -romsub $C063 = ym_init() clobbers(A,X,Y) -> ubyte @Pc ; (re)init YM chip -romsub $C066 = ym_loaddefpatches() clobbers(A,X,Y) -> ubyte @Pc ; load default YM patches -romsub $C09F = audio_init() clobbers(A,X,Y) -> ubyte @Pc ; (re)initialize PSG and YM audio chips +romsub $C063 = ym_init() clobbers(A,X,Y) -> bool @Pc ; (re)init YM chip +romsub $C066 = ym_loaddefpatches() clobbers(A,X,Y) -> bool @Pc ; load default YM patches +romsub $C09F = audio_init() clobbers(A,X,Y) -> bool @Pc ; (re)initialize PSG and YM audio chips ; TODO: add more of the audio routines? @@ -748,7 +748,7 @@ asmsub cleanup_at_exit() { }} } -asmsub set_irq(uword handler @AY, ubyte useKernal @Pc) clobbers(A) { +asmsub set_irq(uword handler @AY, bool useKernal @Pc) clobbers(A) { %asm {{ sta _modified+1 sty _modified+2 diff --git a/compiler/res/prog8lib/cx16/textio.p8 b/compiler/res/prog8lib/cx16/textio.p8 index de13d8847..7c456b9b4 100644 --- a/compiler/res/prog8lib/cx16/textio.p8 +++ b/compiler/res/prog8lib/cx16/textio.p8 @@ -473,7 +473,7 @@ asmsub print_b (byte value @ A) clobbers(A,Y) { }} } -asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubhex (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in hex form (if Carry is set, a radix prefix '$' is printed as well) %asm {{ phx @@ -491,7 +491,7 @@ asmsub print_ubhex (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_ubbin (ubyte value @ A, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the ubyte in A in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ phx @@ -512,7 +512,7 @@ asmsub print_ubbin (ubyte value @ A, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwbin (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in binary form (if Carry is set, a radix prefix '%' is printed as well) %asm {{ pha @@ -524,7 +524,7 @@ asmsub print_uwbin (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { }} } -asmsub print_uwhex (uword value @ AY, ubyte prefix @ Pc) clobbers(A,Y) { +asmsub print_uwhex (uword value @ AY, bool prefix @ Pc) clobbers(A,Y) { ; ---- print the uword in A/Y in hexadecimal form (4 digits) ; (if Carry is set, a radix prefix '$' is printed as well) %asm {{ diff --git a/compiler/res/prog8lib/string.p8 b/compiler/res/prog8lib/string.p8 index dcf5fc38f..49e170a21 100644 --- a/compiler/res/prog8lib/string.p8 +++ b/compiler/res/prog8lib/string.p8 @@ -127,7 +127,7 @@ _startloop dey }} } - asmsub find(uword string @R0, ubyte character @A) -> ubyte @A, ubyte @Pc { + asmsub find(uword string @R0, ubyte character @A) -> ubyte @A, bool @Pc { ; Locates the first position of the given character in the string, ; returns Carry set if found + index in A, or A=0 + Carry clear if not found. %asm {{ diff --git a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt index 5ba88ec6d..2bc7a3d35 100644 --- a/compiler/src/prog8/compiler/astprocessing/AstChecker.kt +++ b/compiler/src/prog8/compiler/astprocessing/AstChecker.kt @@ -333,7 +333,7 @@ internal class AstChecker(private val program: Program, for(param in subroutine.parameters.zip(subroutine.asmParameterRegisters)) { if(param.second.registerOrPair in arrayOf(RegisterOrPair.A, RegisterOrPair.X, RegisterOrPair.Y)) { if (param.first.type != DataType.UBYTE && param.first.type != DataType.BYTE && param.first.type != DataType.BOOL) - err("parameter '${param.first.name}' should be (u)byte or bool") + errors.err("parameter '${param.first.name}' should be (u)byte or bool", param.first.position) } else if(param.second.registerOrPair in arrayOf(RegisterOrPair.AX, RegisterOrPair.AY, RegisterOrPair.XY)) { if (param.first.type != DataType.UWORD && param.first.type != DataType.WORD @@ -341,8 +341,8 @@ internal class AstChecker(private val program: Program, err("parameter '${param.first.name}' should be (u)word (an address) or str") } else if(param.second.statusflag!=null) { - if (param.first.type != DataType.UBYTE && param.first.type != DataType.BOOL) - err("parameter '${param.first.name}' should be bool or ubyte") + if (param.first.type != DataType.BOOL) + errors.err("parameter '${param.first.name}' should be of type bool", param.first.position) } } subroutine.returntypes.zip(subroutine.asmReturnvaluesRegisters).forEachIndexed { index, pair -> @@ -356,8 +356,8 @@ internal class AstChecker(private val program: Program, err("return type #${index + 1} should be (u)word/address") } else if(pair.second.statusflag!=null) { - if (pair.first != DataType.UBYTE && pair.first != DataType.BOOL) - err("return type #${index + 1} should be bool or ubyte") + if (pair.first != DataType.BOOL) + err("return type #${index + 1} should be bool") } } @@ -428,7 +428,6 @@ internal class AstChecker(private val program: Program, val statusFlagsNoCarry = subroutine.asmParameterRegisters.mapNotNull { it.statusflag }.toSet() - Statusflag.Pc if(statusFlagsNoCarry.isNotEmpty()) err("can only use Carry as status flag parameter") - } // Non-string and non-ubytearray Pass-by-reference datatypes can not occur as parameters to a subroutine directly diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index 063fb1230..04fb22a41 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -626,7 +626,7 @@ Assembly / ROM subroutines Subroutines implemented in ROM are usually defined by compiler library files, with the following syntax:: - romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> clobbers() -> ubyte @Pc, ubyte @ A, ubyte @ X, ubyte @ Y + romsub $FFD5 = LOAD(ubyte verify @ A, uword address @ XY) -> clobbers() -> bool @Pc, ubyte @ A, ubyte @ X, ubyte @ Y This defines the ``LOAD`` subroutine at ROM memory address $FFD5, taking arguments in all three registers A, X and Y, and returning stuff in several registers as well. The ``clobbers`` clause is used to signify to the compiler diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 28ef844dc..4d89139c6 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -11,6 +11,7 @@ For 9.0 major changes - DONE: cx16diskio module merged into diskio (which got specialized for commander x16 target). load() and load_raw() with extra ram bank parameter are gone. - DONE: drivenumber parameter removed from all routines in diskio module. The drive to work on is now simply stored as a diskio.drivenumber variable, which defaults to 8. - DONE: for loops now skip the whole loop if from value already outside the loop range (this is what all other programming languages also do) +- DONE: asmsub params or return values passed in cpu flags (like carry) now must be declared as booleans (previously ubyte was still accepted). - once 9.0 is stable, upgrade other programs (assem, shell, etc) to it. + add migration guide to the manual. - [much work:] add special (u)word array type (or modifier such as @fast? ) that puts the array into memory as 2 separate byte-arrays 1 for LSB 1 for MSB -> allows for word arrays of length 256 and faster indexing diff --git a/examples/cx16/vtui/testvtui.p8 b/examples/cx16/vtui/testvtui.p8 index d6bc1db65..1c47740a0 100644 --- a/examples/cx16/vtui/testvtui.p8 +++ b/examples/cx16/vtui/testvtui.p8 @@ -116,9 +116,9 @@ vtui $1000 { ; The routines below are for VTUI 1.0 romsub $1000 = initialize() clobbers(A, X, Y) romsub $1002 = screen_set(ubyte mode @A) clobbers(A, X, Y) - romsub $1005 = set_bank(ubyte bank @Pc) clobbers(A) + romsub $1005 = set_bank(bool bank1 @Pc) clobbers(A) romsub $1008 = set_stride(ubyte stride @A) clobbers(A) - romsub $100b = set_decr(ubyte incrdecr @Pc) clobbers(A) + romsub $100b = set_decr(bool incrdecr @Pc) clobbers(A) romsub $100e = clr_scr(ubyte char @A, ubyte colors @X) clobbers(Y) romsub $1011 = gotoxy(ubyte column @A, ubyte row @Y) romsub $1014 = plot_char(ubyte char @A, ubyte colors @X) @@ -130,15 +130,15 @@ vtui $1000 { romsub $1026 = pet2scr(ubyte char @A) -> ubyte @A romsub $1029 = scr2pet(ubyte char @A) -> ubyte @A romsub $102c = border(ubyte mode @A, ubyte width @R1, ubyte height @R2, ubyte colors @X) clobbers(Y) ; NOTE: mode 6 means 'custom' characters taken from r3 - r6 - romsub $102f = save_rect(ubyte ramtype @A, ubyte vbank @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y) - romsub $1032 = rest_rect(ubyte ramtype @A, ubyte vbank @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y) + romsub $102f = save_rect(ubyte ramtype @A, bool vbank1 @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y) + romsub $1032 = rest_rect(ubyte ramtype @A, bool vbank1 @Pc, uword address @R0, ubyte width @R1, ubyte height @R2) clobbers(A, X, Y) romsub $1035 = input_str(uword buffer @R0, ubyte buflen @Y, ubyte colors @X) clobbers (A) -> ubyte @Y - romsub $1038 = get_bank() clobbers (A) -> ubyte @Pc + romsub $1038 = get_bank() clobbers (A) -> bool @Pc romsub $103b = get_stride() -> ubyte @A - romsub $103e = get_decr() clobbers (A) -> ubyte @Pc + romsub $103e = get_decr() clobbers (A) -> bool @Pc ; -- helper function to do string length counting for you internally, and turn the convertchars flag into a boolean again - asmsub print_str2(str txtstring @R0, ubyte colors @X, ubyte convertchars @Pc) clobbers(A, Y) { + asmsub print_str2(str txtstring @R0, ubyte colors @X, bool convertchars @Pc) clobbers(A, Y) { %asm {{ lda #0 bcs + diff --git a/examples/cx16/zsound/play-zsound.p8 b/examples/cx16/zsound/play-zsound.p8 index 56da71934..e7e935634 100644 --- a/examples/cx16/zsound/play-zsound.p8 +++ b/examples/cx16/zsound/play-zsound.p8 @@ -28,7 +28,7 @@ zsound_lib: romsub $0832 = zsm_init() clobbers(A) romsub $0835 = zsm_play() clobbers(A, X, Y) romsub $0838 = zsm_playIRQ() clobbers(A, X, Y) - romsub $083b = zsm_start(ubyte bank @A, uword song_address @XY) clobbers(A, X, Y) -> ubyte @Pc + romsub $083b = zsm_start(ubyte bank @A, uword song_address @XY) clobbers(A, X, Y) -> bool @Pc romsub $083e = zsm_stop() romsub $0841 = zsm_setspeed(uword hz @XY) clobbers(A, X, Y) romsub $0844 = zsm_setloop(ubyte count @A) diff --git a/examples/cx16/zsound/stream-test-zcm.p8 b/examples/cx16/zsound/stream-test-zcm.p8 index 0509a4876..941bd1aae 100644 --- a/examples/cx16/zsound/stream-test-zcm.p8 +++ b/examples/cx16/zsound/stream-test-zcm.p8 @@ -19,7 +19,7 @@ zsound_lib: romsub $0832 = zsm_init() clobbers(A) romsub $0835 = zsm_play() clobbers(A, X, Y) romsub $0838 = zsm_playIRQ() clobbers(A, X, Y) - romsub $083b = zsm_start(ubyte bank @A, uword song_address @XY) clobbers(A, X, Y) -> ubyte @Pc + romsub $083b = zsm_start(ubyte bank @A, uword song_address @XY) clobbers(A, X, Y) -> bool @Pc romsub $083e = zsm_stop() romsub $0841 = zsm_setspeed(uword hz @XY) clobbers(A, X, Y) romsub $0844 = zsm_setloop(ubyte count @A) diff --git a/examples/test.p8 b/examples/test.p8 index 7f4fa2eef..e68d2405f 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -1,111 +1,24 @@ %import textio -%import floats %option no_sysinit %zeropage basicsafe main { + ; TODO + asmsub derp(bool flag @Pc) -> bool @Pc { + %asm {{ + bcc + + lda #'1' + jmp cbm.CHROUT ++ lda #'0' + jmp cbm.CHROUT + }} + } sub start() { - ubyte from = 20 - ubyte target = 10 - - ubyte xx - for xx in from to target { - txt.print_ub(xx) - txt.spc() - } - txt.print("done\n\n") - for xx in target downto from { - txt.print_ub(xx) - txt.spc() - } - txt.print("done\n\n") - - byte sfrom = -10 - byte starget = -20 - - byte sxx - for sxx in sfrom to starget { - txt.print_b(sxx) - txt.spc() - } - txt.print("done\n\n") - for sxx in starget downto sfrom { - txt.print_b(sxx) - txt.spc() - } - txt.print("done\n\n") - - uword wfrom = 1020 - uword wtarget = 1010 - - uword ww - for ww in wfrom to wtarget { - txt.print_uw(ww) - txt.spc() - } - txt.print("done\n\n") - for ww in wtarget downto wfrom { - txt.print_uw(ww) - txt.spc() - } - txt.print("done\n\n") - - word swfrom = -1010 - word swtarget = -1020 - word sww - for sww in swfrom to swtarget { - txt.print_w(sww) - txt.spc() - } - txt.print("done\n\n") - for sww in swtarget downto swfrom { - txt.print_w(sww) - txt.spc() - } - txt.print("done\n\n") - - ; all of the above with stepsize 2 / -2 - for xx in from to target step 2{ - txt.print_ub(xx) - txt.spc() - } - txt.print("done\n\n") - for xx in target downto from step -2 { - txt.print_ub(xx) - txt.spc() - } - txt.print("done\n\n") - for sxx in sfrom to starget step 2 { - txt.print_b(sxx) - txt.spc() - } - txt.print("done\n\n") - for sxx in starget downto sfrom step -2 { - txt.print_b(sxx) - txt.spc() - } - txt.print("done\n\n") - for ww in wfrom to wtarget step 2 { - txt.print_uw(ww) - txt.spc() - } - txt.print("done\n\n") - for ww in wtarget downto wfrom step -2 { - txt.print_uw(ww) - txt.spc() - } - txt.print("done\n\n") - for sww in swfrom to swtarget step 2 { - txt.print_w(sww) - txt.spc() - } - txt.print("done\n\n") - for sww in swtarget downto swfrom step -2 { - txt.print_w(sww) - txt.spc() - } - txt.print("done\n\n") - + ubyte xx = 0 + ubyte yy=0 + void derp(xx+1) + void derp(xx+42) + void derp(xx-yy) } }