From 96393257a43ac52f2b911594d106741245dec5f0 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Fri, 4 Dec 2020 15:20:28 -0500 Subject: - Started work on writing the new version of the assembler. - Did alot of stuff in the emulator. - Did alot of stuff in the SuB Suite. --- programs/sub-suite/libc.s | 77 ++++++++------------ programs/sub-suite/shift_line.c | 79 +++++++++++++++++++++ programs/sub-suite/subasm.s | 61 ++++++++-------- programs/sub-suite/subeditor.s | 154 ++++++++++++++++++++-------------------- programs/sub-suite/subsuite.s | 3 +- programs/sub-suite/utils.s | 105 ++++++++++++++++++--------- 6 files changed, 290 insertions(+), 189 deletions(-) create mode 100644 programs/sub-suite/shift_line.c (limited to 'programs/sub-suite') diff --git a/programs/sub-suite/libc.s b/programs/sub-suite/libc.s index 74ad654..3dc9d63 100644 --- a/programs/sub-suite/libc.s +++ b/programs/sub-suite/libc.s @@ -126,53 +126,49 @@ isdigit: sbc #'0' ; Subtract $30 from the passed character. and #$FF ; Make sure that we have only one byte. cmp #10 ; Is the subtracted value, less than 10? - bcs @false ; No, so return false. -@true: - lda #1 ; Yes, so return true. - bra @end ; We are done. -@false: - lda #0 ; Return false. -@end: + lcc #1 ; Yes, so return true. + lcs #0 ; No, so return false. +; bcs @false ; No, so return false. +;@true: +; lda #1 ; Yes, so return true. +; bra @end ; We are done. +;@false: +; lda #0 ; Return false. +;@end: rts ; End of isdigit. isxdigit: pha ; Preserve the character. jsr isdigit ; Is this character, a decimal digit? pla ; Get the character back. - bne @true ; Yes, so return true. + bne @end ; Yes, so return true. @alpha: - sec ; No, so prepare for a non carrying subtract. - ora #$20 ; Convert it to lowercase. - sbc #'a' ; Subtract $61 from the character. + ora #$20 ; No, so convert it to lowercase. + sub #'a' ; Subtract $61 from the character. and #$FF ; Make sure that we have only one byte. cmp #6 ; Is the subtracted value, less than 6? - bcs @false ; No, so return false. -@true: - lda #1 ; Yes, so return true. - bra @end ; We are done. -@false: - lda #0 ; Return false. + lcc #1 ; Yes, so return true. + lcs #0 ; No, so return false. +; bcs @false ; No, so return false. +;@true: +; lda #1 ; Yes, so return true. +; bra @end ; We are done. +;@false: +; lda #0 ; Return false. @end: rts ; End of isxdigit. isupper: - sec ; Prepare for a non carrying subtraction. - sbc #'A' ; Subtract $41 from the passed character. + sub #'A' ; Subtract $41 from the passed character. bra isletter ; Check if it's less than 26. islower: - sec ; Prepare for a non carrying subtraction. - sbc #'a' ; Subtract $61 from the passed character. + sub #'a' ; Subtract $61 from the passed character. isletter: and #$FF ; Make sure that we have only one byte. cmp #26 ; Is the subtracted value, less than 26? - bcs @false ; No, so return false. -@true: - lda #1 ; Yes, so return true. - bra @end ; We are done. -@false: - lda #0 ; Return false. -@end: + lcc #1 ; Yes, so return true. + lcs #0 ; No, so return false rts ; End of isletter. @@ -209,8 +205,7 @@ malloc: pha.q ; Preserve the size. and #0 ; Reset A. tay ; Reset Y. - pha.q ; Create two more local variables. - pha.q ; + sbs #$10 ; Allocate 2 local variables onto the stack. lda.q sp+17 ; Get the size. ora.d sp+21 ; Is the size zero? beq @end ; Yes, so we're done. @@ -300,9 +295,7 @@ malloc: clc ; Prepare for a non carrying add. adc #ublk ; Return the pointer to the real memory block. @end: - ply.q ; Clean up the stack frame. - ply.q ; - ply.q ; + ads #$18 ; Clean up the stack frame. ply.q ; Restore Y. rts ; End of malloc. @@ -320,9 +313,7 @@ free: pha.q ; Push the pointer argument to the stack. and #0 ; Reset A. tay ; Reset Y. - pha.q ; Add 3 more local variables. - pha.q ; - pha.q ; + sbs #$18 ; Allocate 3 local variables onto the stack. lda.q sp+25 ; Get the passed pointer. ora.d sp+29 ; Is the passed pointer NULL? bne @getrealblk ; No, so get the real block. @@ -373,10 +364,7 @@ free: ldy #fblk.next ; Delete the next block. sta.q (sp+25), y; @end: - pla.q ; Clean up the stack frame. - pla.q ; - pla.q ; - pla.q ; + ads #$20 ; Clean up the stack frame. ply.q ; Restore Y. plb.q ; Restore B. pla.q ; Restore A. @@ -500,10 +488,7 @@ free: ldy #fblk.prev ; Set the previous block, to the left pointer. sta.q (sp+25), y; @end2: - pla.q ; Clean up the stack frame. - pla.q ; - pla.q ; - pla.q ; + ads #$20 ; Clean up the stack frame. ply.q ; Restore Y. plb.q ; Restore B. pla.q ; Restore A. @@ -534,8 +519,6 @@ memcpy: beq @end ; The size is zero, so we're done. bra @loop ; Keep looping. @end: - pla.q ; Clean up the stack frame. - pla.q ; - pla.q ; + ads #$18 ; Clean up the stack frame. pla.q ; Restore the return value. rts ; End of memcpy. diff --git a/programs/sub-suite/shift_line.c b/programs/sub-suite/shift_line.c new file mode 100644 index 0000000..255d21b --- /dev/null +++ b/programs/sub-suite/shift_line.c @@ -0,0 +1,79 @@ +#include + +const uint8_t bits[8] = { + 0x80, + 0x40, + 0x20, + 0x10, + 0x08, + 0x04, + 0x02, + 0x01 +}; + +int maxcol = 80; +int scr_str = 0; +int scr_row = 0; +int scr_col = 0; +uint8_t bitabl[16]; + +uint8_t bitpos(unsigned int row, uint8_t *mask) { + uint8_t bit = row & 7; + *mask = bits[bit]; + return row >> 3; + +} + +void setbit(unsigned int row) { + uint8_t mask; + uint8_t byte = bitpos(row, &mask); + bitabl[byte] |= mask; +} + +void clrbit(unsigned int row) { + uint8_t mask; + uint8_t byte = bitpos(row, &mask); + bitabl[byte] &= ~mask; +} + +int find_end(char *str, int start) { + int i; + for (i = start; str[i]; i++); + return i; +} + +void shift_line(char *str, int cursor, int left) { + /*int cursor = ((scr_row+scr_str)*maxcol)+scr_col;*/ + int end = find_end(str, cursor); + if (left) { + int i = end-1; + int j = end; + for (; i > cursor; i--, j--) { + if (i < 0) { + i = 0; + str[i] = 0; + break; + } + str[j] = str[i]; + str[i] = 0; + + } + /*str[i+1] = (!str[i+1]) ? ' ' : str[i+1];*/ + end = find_end(str, i+2); + /*str[i+1] = (str[i+1] == ' ') ? 0 : str[i+1];*/ + if ((end/maxcol) > scr_row) { + setbit(end/maxcol); + } + } else { + int i = cursor; + int j = cursor-1; + for (; str[i]; i++, j++) { + str[j] = str[i]; + str[i] = 0; + } + end = find_end(str, i); + if ((end % maxcol) == 0 && (end/maxcol) > scr_row) { + clrbit(end/maxcol); + } + } +} diff --git a/programs/sub-suite/subasm.s b/programs/sub-suite/subasm.s index 0a3ee80..7b2b8b9 100644 --- a/programs/sub-suite/subasm.s +++ b/programs/sub-suite/subasm.s @@ -16,21 +16,17 @@ subasm: jsr lex ; No, so start lexing this line. bra @end ; We are done. @cmd: - ldb #1 ; Set the second pointer - lda.d #cmd_srt ; to the command subroutine table. - jsr set_ptr ; - deb ; Reset B. - tba ; Reset A. lda regf ; Get the command ID. cmp #8 ; Is the command ID greater than the command count? bcs @end ; Yes, so we're done. lsl #1 ; No, so multiply the command ID by two. - tay ; Set the index to the offset that we just calculated. - lda.w (ptr2), y ; Get the command subroutine, from the command subroutine table. - ldb #2 ; Save it in the third pointer. - jsr set_ptr ; - ldb #0 ; Reset B. - jsr (ptr3) ; Run the command's subroutine. + phx.q ; Preserve X. + tax ; Set the index to the offset that we just calculated. + lea.w (cmd_srt, x); Get the pointer, from the command subroutine table. + plx.q ; Restore X. + and #0 ; Reset A. + tab ; Reset B. + jsr (e) ; Run the command's subroutine. @end: and #0 ; Reset A. jsr update_ptr ; Get the screen buffer index. @@ -39,12 +35,14 @@ subasm: rts ; End of subasm. chk_shcmd: - tba ; Reset A. - inb ; Set the second pointer - lda.w #sh_cmds ; to the shortend command table. - jsr set_ptr ; - deb ; Reset B. - tba ; Reset A. + and #0 ; Reset A. + tab ; Reset B. +; inb ; Set the second pointer +; lda.w #sh_cmds ; to the shortend command table. +; jsr set_ptr ; +; deb ; Reset B. +; tba ; Reset A. + lea sh_cmds ; Get the address of the short command table. phy.w ; Preserve the screen buffer position. txy ; Set our index to zero. lda (ptr), y ; Is there nothing in the command buffer? @@ -53,27 +51,31 @@ chk_shcmd: beq @false ; Yes, so return that we failed. jsr tolower ; No, so convert it to lowercase. @loop: - ldb (ptr2), y ; Are we at the end of the table? +; ldb (ptr2), y ; Are we at the end of the table? + ldb (e) ; Are we at the end of the table? beq @false ; Yes, so return that we failed. cmp b ; No, so did the character match? beq @found ; Yes, so check if there are any arguments. - iny ; No, so check the next command. + ine ; No, so check the next command. + iny ; bra @loop ; Keep looping. @found: sty regf ; Save the command ID. - ldy #1 ; Check the next character in the command buffer. - lda (ptr), y ; Is this the end of the buffer? - beq @true ; Yes, so return that we succeded. + lea (ptr) ; Get the address of the next character. + ine ; +; ldy #1 ; Check the next character in the command buffer. +; lda (ptr), y ; Is this the end of the buffer? + lda (e) ; Is this the end of the buffer? + beq @true ; Yes, so return true. cmp #' ' ; No, but is this a space? - beq @true ; Yes, so return that we succeded. - bra @false ; No, so return that we failed. -@true: - lda #1 ; Return true. - bra @end ; We are done. + beq @true ; Yes, so return true. @false: ldb #0 ; Reset B. tba ; Return false. tax ; Reset X. + bra @end ; We are done. +@true: + lda #1 ; Return true. @end: ply.w ; Get back the screen buffer position. rts ; End of chk_shcmd. @@ -130,8 +132,9 @@ viewmem: jsr print_char ; jsr print_hi ; Place the address in the string buffer. jsr print_chunk ; Place the next 16 bytes in the string buffer. - lda.d #strbuf ; Print the string buffer. - jsr print_str ; + lea strbuf ; Print the string buffer. +; jsr print_str ; + jsr print_sfast ; inc idx1 ; Increment the chunk count. ldb idx1 ; Get the chunk count. cpb #$10 ; Did we print 16 chunks? diff --git a/programs/sub-suite/subeditor.s b/programs/sub-suite/subeditor.s index bec3f41..43768f7 100644 --- a/programs/sub-suite/subeditor.s +++ b/programs/sub-suite/subeditor.s @@ -6,18 +6,18 @@ .org $8000 reset: cps ; Reset the processor status register. - ldx.d #$2FFFF ; Reset the stack pointer. - txs ; + lds.d #$2FFFF ; Reset the stack pointer. + lea 0 ; Reset E. ldy #0 ; Reset Y. tyx ; Reset X. jsr init_heap ; Initialize the heap. tax ; Set the stack pointer to the end of RAM. txs ; - sec ; Prepare for a non borrowing subtract. - sbc.d #STKSIZE ; Subtract the stack size, from the end of RAM. + sub.d #STKSIZE ; Subtract the stack size, from the end of RAM. sta.q heapend ; Save the end of the heap. and #0 ; Reset A. tax ; Reset X. + clc ; Reset the carry flag, just in case. jsr init_tables ; Initialize the main tables. ; jsr test_free ; jsr clr_scr ; Clear the screen. @@ -26,14 +26,9 @@ reset: init_heap: - and #0 ; Reset A. - lda.d #HEAPORG ; Get the heap's starting point. - sta.q heapptr ; - phb.q ; Preserve the value in B. - phx.q ; Preserve the value in X. + lea HEAPORG ; Get the heap's starting point. + ste.q heapptr ; jsr findramend ; Find the end of the heap. - plb.q ; Restore the value in B. - plx.q ; Restore the value in X. rts ; End of init_heap. @@ -79,50 +74,32 @@ init_tables: clr_arr: - phb ; Preserve whatever was in B. - ldb #0 ; Clear B. - jsr set_ptr ; Set the first pointer to the parameter. - adc #8 ; Set the second pointer to the parameter, plus eight. - inb ; Tell set_ptr to set the second pointer. - jsr set_ptr ; - deb ; Set B back to zero. - tba ; -@loop: - cpy.w scr_ptr ; Did we clear all of the array? - bcs @end ; Yes, so we're done. - sta.q (ptr), y ; No, so clear eight bytes. - sta.q (ptr2), y ; Clear eight more bytes. - tya ; Copy the array index. - adc #$10 ; Increment the index by 16. - tay ; Update the index. - tba ; Reset the Accumulator. - sta.q (ptr), y ; Do this one more time, to clear 32 bytes. - sta.q (ptr2), y ; - tya ; - adc #$10 ; - tay ; - tba ; - bra @loop ; Keep looping. + stz.q (e) ; Clear eight bytes. + ade #8 ; Increment the pointer by 8. + stz.q (e) ; Clear eight bytes. + ade #8 ; Increment the pointer by 8. + sub #$10 ; Subtract 16 from the size. + bcc @end ; We've reached the end of the array, so we're done. + beq @end ; + bra clr_arr ; Keep looping. @end: - ldy.w zero ; Set the index back to zero. - plb ; Get whatever was in the B register, back. rts ; End of clr_arr. pnt_strt: - lda.w #ed_name ; Print the name of the editor. + lea ed_name ; Print the name of the editor. jsr print_str ; - lda.w #ver_str ; Print the version text. + lea ver_str ; Print the version text. jsr print_str ; - lda.w #ed_ver ; Print the version number. + lea ed_ver ; Print the version number. jsr print_str ; - lda.w #ed_sver ; Print the sub version number. + lea ed_sver ; Print the sub version number. jsr print_str ; lda #'\n' ; Print a newline. jsr print_char ; - lda.w #made ; Print the "Created by" text. + lea made ; Print the "Created by" text. jsr print_str ; - lda.w #author ; Print the name of the author. + lea author ; Print the name of the author. jsr print_str ; lda #'\n' ; Print a newline. jsr print_char ; @@ -133,8 +110,7 @@ clr_cmd: and #0 ; Reset A. tay ; Reset Y. lda.w #CMDSIZE ; Set the clear count to CMDSIZE. - sta.w scr_ptr ; - lda.q cmd_buf ; Set the array to be cleared to the command buffer. + lea (cmd_buf) ; Set the array to be cleared to the command buffer. jsr clr_arr ; Clear the command buffer. rts ; End of clr_cmd. @@ -173,37 +149,59 @@ getchar: print_str: - ldx #0 ; Reset X. - sta.q end ; Save the parameter. -@reset: - lda.q end ; Get the parameter. - ldb #0 ; Clear the B register. - jsr set_ptr ; Set the first pointer to the parameter. - tba ; Clear the Accumulator. + and #0 ; Reset A. + tba ; Reset B. @loop: ldb #1 ; Enable replace mode. stb regb ; - lda.q ptr ; Get the first pointer. - cmp.q end ; Did the pointer change? - bne @reset ; Yes, so set it back. and #0 ; No, reset the accumulator. - txy ; Copy the string index into Y. - ldb (ptr), y ; Are we at the end of the string? + ldb (e) ; Are we at the end of the string? beq @end ; Yes, so we're done. jsr update_ptr ; No, so get the screen buffer index. tay ; Save it in Y. tba ; Get the character back. - inx ; Increment the string index. - phx ; Preserve the string index. + ine ; Increment the string pointer. jsr print_char ; Print the character. - plx ; Get the string index back. bra @loop ; Keep looping. @end: - ldb #0 ; Enable insert mode. - stb regb ; - tba ; Reset A. + stz regb ; Enable insert mode. + and #0 ; Reset A. + tab ; Reset B. rts ; End of print_str. + +;print_str: +; ldx #0 ; Reset X. +; sta.q end ; Save the parameter. +;@reset: +; lda.q end ; Get the parameter. +; ldb #0 ; Clear the B register. +; jsr set_ptr ; Set the first pointer to the parameter. +; tba ; Clear the Accumulator. +;@loop: +; ldb #1 ; Enable replace mode. +; stb regb ; +; lda.q ptr ; Get the first pointer. +; cmp.q end ; Did the pointer change? +; bne @reset ; Yes, so set it back. +; and #0 ; No, reset the accumulator. +; txy ; Copy the string index into Y. +; ldb (ptr), y ; Are we at the end of the string? +; beq @end ; Yes, so we're done. +; jsr update_ptr ; No, so get the screen buffer index. +; tay ; Save it in Y. +; tba ; Get the character back. +; inx ; Increment the string index. +; phx ; Preserve the string index. +; jsr print_char ; Print the character. +; plx ; Get the string index back. +; bra @loop ; Keep looping. +;@end: +; stz regb ; Enable insert mode. +; and #0 ; Reset A. +; tab ; Reset B. +; rts ; End of print_str. + getbit: clc ; Clear the carry flag. lda scr_str ; Has the screen been scrolled? @@ -432,21 +430,27 @@ findend: print_char: + phe.q ; Preserve E. sta rega ; Preserve the character. ldb #2 ; Make sure that set_ptr sets the third pointer. lda.q buffer ; Set the third pointer to the start of the screen buffer. jsr set_ptr ; deb ; Set B to one. tba ; Reset A. +; inc step ; lda rega ; Get the character back. jsr get_ctrlidx ; Get the control code jump table index. lsl #1 ; Multiply the return value by two, to get the index. tax ; - lda.w ct_jtb, x ; Get the address of the control code handler. - jsr set_ptr ; Set the second pointer to the control code handler. + lea.w (ct_jtb, x); Get the address of the control code handler. +; pha.q ; +; ple.q ; +; jsr set_ptr ; Set the second pointer to the control code handler. deb ; Reset B. tba ; Reset A. - jmp (ptr2) ; Jump to the handler for that control code. + jsr (e) ; Jump to the handler for that control code. + ple.q ; Restore E. + rts printc: lda #0 ; start trying to print a character. sta regd ; @@ -567,24 +571,19 @@ nl: clr_scr: lda #maxrow ; sta scr_end ; - lda #0 ; - sta scr_str ; + stz scr_str ; tay ; lda.w #LWSIZE ; Set the clear count to LWSIZE. - sta.w scr_ptr ; - lda.q bitabl ; Set the array to be cleared to the linewrap table. + lea (bitabl) ; Set the array to be cleared to the linewrap table. jsr clr_arr ; Clear the linewrap table. lda.w #SCRSIZE ; Set the clear count to SCRSIZE. - sta.w scr_ptr ; - lda.q buffer ; Set the array to be cleared to the screen buffer. + lea (buffer) ; Set the array to be cleared to the screen buffer. jsr clr_arr ; Clear the screen buffer. -; tay ; ; lda.w #CMDSIZE ; Set the clear count to CMDSIZE. -; sta.w scr_ptr ; -; lda.d #cmd_buf ; Set the array to be cleared to the command buffer. +; lea (cmd_buf) ; Set the array to be cleared to the command buffer. ; jsr clr_arr ; Clear the screen buffer. - sta scr_col ; - sta scr_row ; + stz scr_col ; + stz scr_row ; jsr update_pos ; lda #$C ; sta scr ; @@ -767,6 +766,7 @@ shftln: @end5: rts ; End of shftln. + esc: lda status ; Get the next character. lda kbd ; diff --git a/programs/sub-suite/subsuite.s b/programs/sub-suite/subsuite.s index d28b4f2..b276209 100644 --- a/programs/sub-suite/subsuite.s +++ b/programs/sub-suite/subsuite.s @@ -17,7 +17,8 @@ .qword reset a ;l a -;.org reset +;.org reset+$F50 ;v +;f "subsuite.bin" $8000 ;q d diff --git a/programs/sub-suite/utils.s b/programs/sub-suite/utils.s index 21539eb..3813a05 100644 --- a/programs/sub-suite/utils.s +++ b/programs/sub-suite/utils.s @@ -48,12 +48,20 @@ print_lo: pla ; Get the nibble offset back. bra @loop ; Keep looping. @end: - lda #0 ; Null terminate the string buffer. - sta strbuf, x ; + and #0 ; Reset A. + sta strbuf, x ; Null terminate the string buffer. tax ; Reset X. - lda.d #strbuf ; Print the string buffer. - jsr print_str ; + lea strbuf ; Print the string buffer. +; jsr print_str ; + jsr print_sfast ; Use the faster, but less robust print string routine. rts ; End of print_lo. +;@end: +; lda #0 ; Null terminate the string buffer. +; sta strbuf, x ; +; tax ; Reset X. +; lea strbuf ; Print the string buffer. +; jsr print_str ; +; rts ; End of print_lo. print_chunk: @@ -302,49 +310,76 @@ get_ptok: get_ctrlidx: - cmp #$7F ; Is this a delete character? - beq @del ; Yes, so return the same value as backspace. - sec ; Do a non borrowing subtract. - sbc #8 ; Subtract 8 from the character, to get the index. +; phe.q ; Preserve E. +; cmp #$7F ; Is this a delete character? +; beq @del ; Yes, so return the same value as backspace. +; sec ; Do a non borrowing subtract. +; sbc #8 ; Subtract 8 from the character, to get the index. + sub #8 ; Subtract 8 from the character, to get the index. tax ; Copy the index to X. and #0 ; Reset A. - cpx #19 ; Are we less than, or equal to the max size of the table? - bcc @get_rtval ; Yes, so get the return value from the table. - beq @get_rtval ; - rts ; End of get_ctrlidx. -@get_rtval: - lda ct_rtb, x ; Get the return value from the table. - rts ; End of get_ctrlidx. -@del: - lda #2 ; Return 2. + cpx #19 ; Are we within the range of the table? + lea ct_rtb, x ; Get the address of the value to return. + lcc (e) ; Read from the table if we're within the range of the table. + leq (e) ; + cmp #$7F ; Is this a delete character? + leq #2 ; Return 2 if this is the delete character. +; bcc @get_rtval ; Yes, so get the return value from the table. +; beq @get_rtval ; +; ple.q ; Restore E. rts ; End of get_ctrlidx. +;@get_rtval: +; lda ct_rtb, x ; Get the return value from the table. +; rts ; End of get_ctrlidx. +;@del: +; lda #2 ; Return 2. +; rts ; End of get_ctrlidx. findramend: - pha.q ; Set the end of RAM pointer to the argument. + phx.q ; Preserve X. and #0 ; Reset A. - tab ; Reset B. lda #MAGIC ; Set A to a magic number. @loop: - ldx (sp+1) ; Preserve the value. - sta (sp+1) ; Write the magic number to the current end of RAM. - cmp (sp+1) ; Is the value in RAM, the same as the magic number we wrote? + ldx (e) ; Preserve the value. + sta (e) ; Write the magic number to the current end of RAM. + cmp (e) ; Is the value in RAM, the same as the magic number we wrote? bne @moveback ; No, so move back until we find the last writable memory location. - stx (sp+1) ; Yes, so restore the previous value. - pha.q ; Preserve the magic number. - lda.q sp+9 ; Get the end of RAM pointer. - clc ; Prepare for a non carrying add. - adc.w #$4000 ; Increment the end of RAM pointer by 16K. - sta.q sp+9 ; Save the new end of RAM pointer. - pla.q ; Restore the magic number. + stx (e) ; Yes, so restore the previous value. + ade.w #$4000 ; Increment the end of RAM pointer by 16K. bra @loop ; Keep looping. @moveback: - dec.q sp+1 ; Decrement the end of RAM pointer. - ldx (sp+1) ; Preserve the value. - sta (sp+1) ; Write the magic number to the current end of RAM. - cmp (sp+1) ; Is the value in RAM, the same as the magic number we wrote? + dee ; Decrement the end of RAM pointer. + ldx (e) ; Preserve the value. + sta (e) ; Write the magic number to the current end of RAM. + cmp (e) ; Is the value in RAM, the same as the magic number we wrote? bne @moveback ; No, so keep looping. - stx (sp+1) ; Yes, so restore the previous value. + stx (e) ; Yes, so restore the previous value. @end: - pla.q ; Restore the argument. + phe.q ; Return the end of RAM pointer. + pla.q ; + plx.q ; Restore X. rts ; End of findramend. + + +print_sfast: +; inc step ; + pea (buffer), y ; Push the address of the cursor's postion in the screen buffer to the stack. +@loop: + lda (e) ; Get the character. + beq @end ; We've hit the end of the string, so we're done. + cmp #'\n' ; Did we get a newline? + beq @nl ; Yes, so move the cursor to the next line. + sta (sp+1) ; Print the character to the screen buffer. + sta scr ; Print the character to the screen. + inc scr_col ; Move the cursor left by one character. + ine ; Increment the string pointer. + inc.q sp+1 ; Increment the screen buffer pointer. + bra @loop ; Keep looping. +@nl: + stz scr_col ; Move the cursor to the start of the line. + inc scr_row ; Move the cursor down by one line. + bra @loop ; Keep looping. +@end: + ads #8 ; Cleanup the stack frame. + rts ; End of print_sfast. -- cgit v1.2.3-13-gbd6f