Sunday, April 8, 2012
0x42c scrolling
SET PC, initialstate
; string definitions (currently using C-style strings)
:version dat "0x42c v.0.1 128K MEM READY", 0
:input dat "> ", 0
; commands
:reddit dat "reddit", 0
:date dat "date", 0
:clean dat "clear", 0
:vers dat "version", 0
:echo dat "echo", 0
; outputs
:redditoutput dat "Reddit, the frontpage of the internet.", 0
:dateoutput dat "00:00:00 UTC on 1 January 1970", 0
:unrecognized dat "Unrecognized command '", 0
:unrecognizedEnd dat "'.", 0
:initialstate
set [0x1335], 0x8000 ; vidmem
set [0x1337], 0x1338 ; input buffer
:main
set a, version
jsr printnl ; printnl(version)
:inputready
set a, input
jsr print ; printnl(input)
set pc, kbloop
:kbloop
ife [0x9000], 0 ; if there's no input...
set pc, kbloop
ife [0x9000], 0xA ; enter
jsr enteredcommand
ife [0x9000], 0x8 ; backspace
jsr backspace
set a, [0x9000]
jsr printchar ; printchar([0x9000])
set a, [0x1337] ; 0x1337 is the pointer to my buffer string
set b, [0x9000]
jsr strcat ; strcat([0x1337], [0x9000])
add [0x1337], 1
set [0x9000], 0
set pc, kbloop
:backspace
sub [0x1335], 1 ; video pointer
sub [0x1337], 1 ; delete last char
set a, [0x1337]
set [a], 0
set a, 0
jsr printchar ; printchar(0)
sub [0x1335], 1
set [0x9000], 0
set pc, kbloop
:reset
set [0x1337], 0x1338 ; reset pointer
set [0x1338], 0 ; reset string
set [0x9000], 0 ; reset keyboard
set [0x1336], 0 ; reset command recognized
set pc, pop
:enteredcommand
set a, echo
set b, 0x1338
jsr startswith ; startswith(echo, 0x1338)
ife y, 1
jsr echof
set a, reddit
set b, 0x1338
jsr strcmp ; strcmp(reddit, 0x1338)
ife y, 1
jsr redditf
set a, date
set b, 0x1338
jsr strcmp ; strcmp(date, 0x1338)
ife y, 1
jsr datef
set a, clean
set b, 0x1338
jsr strcmp ; strcmp(date, 0x1338)
ife y, 1
jsr cleanf
set a, vers
set b, 0x1338
jsr strcmp ; strcmp(vers, 0x1338)
ife y, 1
jsr versionf
ifn a, 1
jsr unrecognizedf
:enterdone
jsr reset
set pc, inputready
:echof
jsr newline
set a, echo
jsr strlen
add a, 1 ; +1 to strlen,
; for the space
set b, 0x1338
add b, a ; start at `strlen'
set a, b ; string pointer
jsr printnl
set a, 1
set pc, enterdone
:cleanf
jsr clearScreen
set [0x1335], 0x8000
set a, 1
set pc, enterdone
:clearScreen
set i, sp
set sp, 0x8200
:clearScreen_loop
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
set push, 0
ifg 0x8000, sp
set pc, clearScreen_done
set pc, clearScreen_loop
:clearScreen_done
set sp, i
set pc, pop
:versionf
jsr newline
jsr reset
set a, 1 ; return 1
set pc, main
:unrecognizedf
jsr newline
set a, unrecognized
jsr print
set a, 0x1338
jsr print
set a, unrecognizedEnd
jsr printnl
set a, 1 ; return 1
set pc, enterdone
:redditf
set x, 1337
jsr printnl
set a, redditoutput
jsr printnl
set a, 1 ; return 1
set pc, enterdone
:datef
jsr printnl
set a, dateoutput
jsr printnl
set a, 1 ; return 1
set pc, enterdone
; === STANDARD FUNCTIONS OVER HERE ===
:startswith
set y, 0
ife [a], 0
set pc, startswith_end_success
ife [a], [b]
jsr checkzero
ifn [a], [b]
set pc, pop
ife y, 1
set pc, pop
add a, 1
add b, 1
set pc, startswith
:startswith_end_success
set y, 1
set pc, pop
:strlen
set y, 0
:strlen_begin
ife [a], 0
set pc, strlen_end
add y, 1
add a, 1
set pc, strlen_begin
:strlen_end
set a, y
set pc, pop
:strcmp
set y, 0
ife [a], [b]
jsr checkzero
ife y, 1
set pc, pop
ifn [a], [b]
set pc, pop
add a, 1
add b, 1
set pc, strcmp
:checkzero
ife [a], 0
set y, 1
set pc, pop
:strcat
set [a], b
add a, 1
add b, 1
set [a], 0
set pc, pop
:printnl ; shortcut
jsr print
jsr newline
set pc, pop
set i, a
:doprint
ifg [0x1335], 0x81ff ; end of vidmem
jsr scroll
ife [i], 0
set pc, pop
set a, [i]
jsr printchar
add i, 1
set pc, doprint
:printchar
set b, [0x1335]
bor a, 0xf000 ; color :D
set [b], a
add [0x1335], 1
set pc, pop
:newline
set i, [0x1335]
mod i, 32 ; width
set z, 32
sub z, i
add [0x1335], z
set pc, pop
:scroll
set a, 0x8000
set b, 0x8020
:scroll_loop
set [a], [b]
add a, 1
add b, 1
ifg b, 0x81ff
set pc, scroll_clear_ll
set pc, scroll_loop
:scroll_clear_ll
set [a], 0
add a, 1
ifg a, 0x81ff
set pc, scroll_end
set pc, scroll_clear_ll
:scroll_end
set [0x1335], 0x81e0
set pc, pop
:end set pc, end
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment