- Parameter parsing and command table working for AppleSoft API

- String and integer vector parameters supported
This commit is contained in:
Quinn Dunki 2014-09-11 14:04:30 -07:00
parent 663f7278f9
commit f5c4af0201
5 changed files with 183 additions and 22 deletions

View File

@ -11,12 +11,21 @@
; Applesoft ROM entry points and constants ; Applesoft ROM entry points and constants
; ;
WG_AMPVECTOR = $03f5 WG_AMPVECTOR = $03f5
CHRGET = $00b1 CHRGET = $00b1 ; Advances text point and gets character in A
ERROR = $d412 CHRGOT = $00b7 ; Returns character at text pointer in A
SYNCHR = $dec0 ; Validates current character is what's in A
TXTPTR = $00b8 ; (and $b9) ; Current location in BASIC listing
ERROR = $d412 ; Reports error in X
CHKCOM = $debe ; Validates current character is a ',', then gets it
GETBYT = $e6f8 ; Gets an integer at text pointer, stores in X
GETNUM = $e746 ; Gets an 8-bit, stores it X, skips past a comma
ERR_UNDEFINEDFUNC = 224 ERR_UNDEFINEDFUNC = 224
ERR_SYNTAX = 16 ERR_SYNTAX = 16
ERR_TOOLONG = 176
MAXCMDLEN = 14
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGInitApplesoft ; WGInitApplesoft
@ -46,15 +55,16 @@ WGInitApplesoft:
WGAmpersand: WGAmpersand:
sta SCRATCH0 sta SCRATCH0
SAVE_AXY SAVE_AXY
SAVE_ZPP
ldy #0 ldy #0
ldx SCRATCH0 ldx SCRATCH0
WGAmpersand_parseLoop: WGAmpersand_parseLoop:
txa txa
beq WGAmpersand_parseMatchStart ; Check for end-of-statement beq WGAmpersand_parseFail ; Check for end-of-statement (CHRGET handles : and EOL)
cmp #':' cmp #'('
beq WGAmpersand_parseMatchStart beq WGAmpersand_matchStart
sta WGAmpersandCommandBuffer,y sta WGAmpersandCommandBuffer,y
@ -62,25 +72,33 @@ WGAmpersand_parseLoop:
tax tax
iny iny
cpy #14 cpy #MAXCMDLEN
bne WGAmpersand_parseLoop bne WGAmpersand_parseLoop
WGAmpersand_parseMatchStart: WGAmpersand_parseFail:
ldx #ERR_SYNTAX
jsr ERROR
bra WGAmpersand_done
WGAmpersand_matchStart:
lda #0
sta WGAmpersandCommandBuffer,y ; Null terminate the buffer for matching
ldy #0 ldy #0
ldx #0 ; Command buffer now contains our API call ldx #0 ; Command buffer now contains our API call
phx ; We stash the current command number on the stack phx ; We stash the current command number on the stack
WGAmpersand_parseMatchLoop: WGAmpersand_matchLoop:
lda WGAmpersandCommandBuffer,y lda WGAmpersandCommandBuffer,y
beq WGAmpersand_parseMatchFound ; Made it to the end beq WGAmpersand_matchFound ; Got one!
cmp WGAmpersandCommandTable,x cmp WGAmpersandCommandTable,x
bne WGAmpersand_parseMatchNext ; Not this one bne WGAmpersand_matchNext ; Not this one
iny iny
inx inx
bra WGAmpersand_parseMatchLoop bra WGAmpersand_matchLoop
WGAmpersand_parseMatchNext: WGAmpersand_matchNext:
pla ; Advance index to next commmand in table pla ; Advance index to next commmand in table
inc inc
pha pha
@ -91,12 +109,12 @@ WGAmpersand_parseMatchNext:
tax tax
cpx #WGAmpersandCommandTableEnd-WGAmpersandCommandTable cpx #WGAmpersandCommandTableEnd-WGAmpersandCommandTable
beq WGAmpersand_parseFail ; Hit the end of the table beq WGAmpersand_matchFail ; Hit the end of the table
ldy #0 ldy #0
bra WGAmpersand_parseMatchLoop bra WGAmpersand_matchLoop
WGAmpersand_parseMatchFound: WGAmpersand_matchFound:
pla ; This is now the matching command number pla ; This is now the matching command number
inc inc
asl asl
@ -105,26 +123,131 @@ WGAmpersand_parseMatchFound:
asl asl
tay tay
lda WGAmpersandCommandTable-2,y ; Prepare an indirect JSR to our command lda WGAmpersandCommandTable-2,y ; Prepare an indirect JSR to our command
sta WGAmpersand_commandJSR+1 sta WGAmpersand_commandJSR+1 ; Self-modifying code!
lda WGAmpersandCommandTable-1,y lda WGAmpersandCommandTable-1,y
sta WGAmpersand_commandJSR+2 sta WGAmpersand_commandJSR+2
; Self modifying code: ; Self-modifying code!
WGAmpersand_commandJSR: WGAmpersand_commandJSR:
jsr WGAmpersand_done ; Address here overwritten with command jsr WGAmpersand_done ; Address here overwritten with command
bra WGAmpersand_done bra WGAmpersand_done
WGAmpersand_parseFail: WGAmpersand_matchFail:
pla ; We left command number on the stack while matching pla ; We left command number on the stack while matching
ldx #ERR_UNDEFINEDFUNC ldx #ERR_UNDEFINEDFUNC
jsr ERROR jsr ERROR
WGAmpersand_done: WGAmpersand_done:
RESTORE_ZPP
RESTORE_AXY RESTORE_AXY
rts rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGAmpersandIntArguments
; Buffers integer arguments for the current command in PARAMx
; TXTPTR: Start of argument list (after opening parenthesis)
; OUT PARAMx : The arguments
WGAmpersandIntArguments:
SAVE_AXY
ldy #0
phy ; Can't rely on Applesoft routines to be register-safe
lda #'('
jsr SYNCHR ; Expect opening parenthesis
WGAmpersandIntArguments_loop:
jsr GETBYT
txa
ply
sta PARAM0,y
phy
jsr CHRGOT
cmp #')' ; All done!
beq WGAmpersandIntArguments_cleanup
jsr CHKCOM ; Verify parameter separator
ply
iny
phy
cpy #4 ; Check for too many arguments
bne WGAmpersandIntArguments_loop
WGAmpersandIntArguments_fail:
ldx #ERR_TOOLONG
jsr ERROR
bra WGAmpersandIntArguments_done
WGAmpersandIntArguments_cleanup:
jsr CHRGET ; Consume closing parenthesis
WGAmpersandIntArguments_done:
ply
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGAmpersandStrArgument
; Buffers a string argument for the current command in PARAM0/1
; TXTPTR: Start of argument list (after opening parenthesis)
; OUT PARAM0/1 : The argument
WGAmpersandStrArguments:
SAVE_AXY
ldy #0
phy ; Can't rely on Applesoft routines to be register-safe
lda #'('
jsr SYNCHR ; Expect opening parenthesis
WGAmpersandStrArguments_loop:
jsr CHRGOT
beq WGAmpersandStrArguments_tooShort
cmp #')'
beq WGAmpersandStrArguments_cleanup
ply
sta WGAmpersandCommandBuffer,y
iny
phy
cpy #WGAmpersandCommandBufferEnd-WGAmpersandCommandBuffer
beq WGAmpersandStrArguments_tooLong
jsr CHRGET
bra WGAmpersandStrArguments_loop
WGAmpersandStrArguments_tooLong:
ldx #ERR_TOOLONG
jsr ERROR
bra WGAmpersandStrArguments_done
WGAmpersandStrArguments_tooShort:
ldx #ERR_SYNTAX
jsr ERROR
bra WGAmpersandStrArguments_done
WGAmpersandStrArguments_cleanup:
jsr CHRGET ; Consume closing parenthesis
WGAmpersandStrArguments_done:
ply ; Null-terminate result
lda #0
sta WGAmpersandCommandBuffer,y
lda #<WGAmpersandCommandBuffer
sta PARAM0
lda #>WGAmpersandCommandBuffer
sta PARAM1
RESTORE_AXY
rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Ampersand API entry points ; Ampersand API entry points
@ -133,14 +256,49 @@ WGAmpersand_done:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGAmpersand_view ; WGAmpersand_VIEW
; Create a view ; Create a view
; ;
WGAmpersand_VIEW: WGAmpersand_VIEW:
jsr WGAmpersandStrArguments
; lda WGAmpersandCommandBuffer
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+1
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+2
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+3
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+4
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+5
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+6
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+7
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+8
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+9
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+10
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+11
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+12
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+13
; jsr PRBYTE
; lda WGAmpersandCommandBuffer+14
; jsr PRBYTE
jsr WGCreateView
jsr WGPaintView
rts rts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; WGAmpersand_desk ; WGAmpersand_DESK
; Render the desktop ; Render the desktop
; ;
WGAmpersand_DESK: WGAmpersand_DESK:
@ -155,7 +313,10 @@ WGAmpersand_DESK:
; ;
WGAmpersandCommandBuffer: WGAmpersandCommandBuffer:
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 .byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
WGAmpersandCommandBufferEnd:
.byte 0 ; Make sure this last byte is always kept as a terminator
; Jump table for ampersand commands. ; Jump table for ampersand commands.

BIN
guidemo Normal file

Binary file not shown.

Binary file not shown.

BIN
guidemo.o Normal file

Binary file not shown.

View File

@ -26,7 +26,7 @@
WGCreateView: WGCreateView:
SAVE_AXY SAVE_AXY
SAVE_ZPS SAVE_ZPS
ldy #0 ldy #0
jsr scanHex8 jsr scanHex8
pha pha