📄 paulmon2.asm
字号:
menu1e: cjne a, #upld_key, menu1f
mov dptr, #upld_cmd
acall pcstr_h
ajmp upld
menu1f: cjne a, #nloc_key, menu1g
mov dptr, #nloc_cmd
acall pcstr_h
ajmp nloc
menu1g: cjne a, #jump_key, menu1h
mov dptr, #jump_cmd
acall pcstr_h
ajmp jump
menu1h: cjne a, #dump_key, menu1i
mov dptr, #dump_cmd
acall pcstr_h
ajmp dump
menu1i: cjne a, #edit_key, menu1j
mov dptr, #edit_cmd
acall pcstr_h
ajmp edit
menu1j: cjne a, #clrm_key, menu1k
mov dptr, #clrm_cmd
acall pcstr_h
ajmp clrm
menu1k: cjne a, #erfr_key, menu1l
mov a, #has_flash
jz menu_end
mov dptr, #erfr_cmd
acall pcstr_h
ajmp erfr
menu1l: cjne a, #intm_key, menu1m
mov dptr, #intm_cmd
acall pcstr_h
ljmp intm
menu1m:
;invalid input, no commands to run...
menu_end: ;at this point, we have not found
ajmp newline ;anything to run, so we give up.
;remember, we pushed menu, so newline
;will just return to menu.
;..........................................................
;---------------------------------------------------------;
;dnlds1 = "Begin sending Intel HEX format file <ESC> to abort"
;dnlds2 = "Download aborted"
;dnlds3 = "Download completed"
;16 byte parameter table: (eight 16 bit values)
; * 0 = lines received
; * 1 = bytes received
; * 2 = bytes written
; * 3 = bytes unable to write
; * 4 = incorrect checksums
; * 5 = unexpected begin of line
; * 6 = unexpected hex digits (while waiting for bol)
; * 7 = unexpected non-hex digits (in middle of a line)
dnld:
mov dptr, #dnlds1
acall pcstr_h ;"begin sending file <ESC> to abort"
mov r0, #dnld_parm
mov r2, #16
dnld0: mov @r0, #0 ;initialize all parameters to 0
inc r0
djnz r2, dnld0
;look for begining of line marker ':'
dnld1: acall cin
cjne a, #27, dnld2 ;Test for escape
sjmp dnld_esc
dnld2: cjne a, #':', dnld2b
mov r1, #0
acall dnld_inc
sjmp dnld3
dnld2b: ;check to see if it's a hex digit, error if it is
acall asc2hex
jc dnld1
mov r1, #6
acall dnld_inc
sjmp dnld1
;begin taking in the line of data
dnld3: mov a, #'.'
acall cout
mov r4, #0 ;r4 will count up checksum
acall dnld_ghex
mov r0, a ;R0 = # of data bytes
acall dnld_ghex
mov dph, a ;High byte of load address
acall dnld_ghex
mov dpl, a ;Low byte of load address
acall dnld_ghex ;Record type
cjne a, #1, dnld4 ;End record?
sjmp dnld_end
dnld4: jnz dnld_unknown ;is it a unknown record type???
dnld5: mov a, r0
jz dnld_get_cksum
acall dnld_ghex ;Get data byte
mov r2, a
mov r1, #1
acall dnld_inc ;count total data bytes received
mov a, r2
lcall smart_wr ;c=1 if an error writing
clr a
addc a, #2
mov r1, a
; 2 = bytes written
; 3 = bytes unable to write
acall dnld_inc
inc dptr
djnz r0, dnld5
dnld_get_cksum:
acall dnld_ghex ;get checksum
mov a, r4
jz dnld1 ;should always add to zero
dnld_sumerr:
mov r1, #4
acall dnld_inc ;all we can do it count # of cksum errors
sjmp dnld1
dnld_unknown: ;handle unknown line type
mov a, r0
jz dnld_get_cksum ;skip data if size is zero
dnld_ukn2:
acall dnld_ghex ;consume all of unknown data
djnz r0, dnld_ukn2
sjmp dnld_get_cksum
dnld_end: ;handles the proper end-of-download marker
mov a, r0
jz dnld_end_3 ;should usually be zero
dnld_end_2:
acall dnld_ghex ;consume all of useless data
djnz r0, dnld_ukn2
dnld_end_3:
acall dnld_ghex ;get the last checksum
mov a, r4
jnz dnld_sumerr
acall dnld_dly
mov dptr, #dnlds3
acall pcstr_h ;"download went ok..."
;consume any cr or lf character that may have been
;on the end of the last line
jnb ri, dnld_sum
acall cin
sjmp dnld_sum
dnld_esc: ;handle esc received in the download stream
acall dnld_dly
mov dptr, #dnlds2
acall pcstr_h ;"download aborted."
sjmp dnld_sum
dnld_dly: ;a short delay since most terminal emulation programs
;won't be ready to receive anything immediately after
;they've transmitted a file... even on a fast Pentium(tm)
;machine with 16550 uarts!
mov r0, #0
dnlddly2:mov r1, #0
djnz r1, * ;roughly 128k cycles, appox 0.1 sec
djnz r0, dnlddly2
ret
dnld_inc: ;increment parameter specified by R1
;note, values in Acc and R1 are destroyed
mov a, r1
anl a, #00000111b ;just in case
rl a
add a, #dnld_parm
mov r1, a ;now r1 points to lsb
inc @r1
mov a, @r1
jnz dnldin2
inc r1
inc @r1
dnldin2:ret
dnld_gp: ;get parameter, and inc to next one (@r1)
;carry clear if parameter is zero.
;16 bit value returned in dptr
setb c
mov dpl, @r1
inc r1
mov dph, @r1
inc r1
mov a, dpl
jnz dnldgp2
mov a, dph
jnz dnldgp2
clr c
dnldgp2:ret
;a spacial version of ghex just for the download. Does not
;look for carriage return or backspace. Handles ESC key by
;poping the return address (I know, nasty, but it saves many
;bytes of code in this 4k ROM) and then jumps to the esc
;key handling. This ghex doesn't echo characters, and if it
;sees ':', it pops the return and jumps to an error handler
;for ':' in the middle of a line. Non-hex digits also jump
;to error handlers, depending on which digit.
dnld_ghex:
dnldgh1:acall cin
acall upper
cjne a, #27, dnldgh3
dnldgh2:pop acc
pop acc
sjmp dnld_esc
dnldgh3:cjne a, #':', dnldgh5
dnldgh4:mov r1, #5 ;handle unexpected beginning of line
acall dnld_inc
pop acc
pop acc
ajmp dnld3 ;and now we're on a new line!
dnldgh5:acall asc2hex
jnc dnldgh6
mov r1, #7
acall dnld_inc
sjmp dnldgh1
dnldgh6:mov r2, a ;keep first digit in r2
dnldgh7:acall cin
acall upper
cjne a, #27, dnldgh8
sjmp dnldgh2
dnldgh8:cjne a, #':', dnldgh9
sjmp dnldgh4
dnldgh9:acall asc2hex
jnc dnldghA
mov r1, #7
acall dnld_inc
sjmp dnldgh7
dnldghA:xch a, r2
swap a
orl a, r2
mov r2, a
add a, r4 ;add into checksum
mov r4, a
mov a, r2 ;return value in acc
ret
;dnlds4 = "Summary:"
;dnlds5 = " lines received"
;dnlds6a = " bytes received"
;dnlds6b = " bytes written"
dnld_sum: ;print out download summary
mov a, r6
push acc
mov a, r7
push acc
mov dptr, #dnlds4
acall pcstr_h
mov r1, #dnld_parm
mov r6, #dnlds5 & 255
mov r7, #dnlds5 >> 8
acall dnld_i0
mov r6, #dnlds6a & 255
mov r7, #dnlds6a >> 8
acall dnld_i0
mov r6, #dnlds6b & 255
mov r7, #dnlds6b >> 8
acall dnld_i0
dnld_err: ;now print out error summary
mov r2, #5
dnlder2:acall dnld_gp
jc dnlder3 ;any errors?
djnz r2, dnlder2
;no errors, so we print the nice message
mov dptr, #dnlds13
acall pcstr_h
sjmp dlnd_sum_done
dnlder3: ;there were errors, so now we print 'em
mov dptr, #dnlds7
acall pcstr_h
;but let's not be nasty... only print if necessary
mov r1, #(dnld_parm+6)
mov r6, #dnlds8 & 255
mov r7, #dnlds8 >> 8
acall dnld_item
mov r6, #dnlds9 & 255
mov r7, #dnlds9 >> 8
acall dnld_item
mov r6, #dnlds10 & 255
mov r7, #dnlds10 >> 8
acall dnld_item
mov r6, #dnlds11 & 255
mov r7, #dnlds11 >> 8
acall dnld_item
mov r6, #dnlds12 & 255
mov r7, #dnlds12 >> 8
acall dnld_item
dlnd_sum_done:
pop acc
mov r7, a
pop acc
mov r6, a
ajmp newline
dnld_item:
acall dnld_gp ;error conditions
jnc dnld_i3
dnld_i2:acall space
lcall pint16u
acall r6r7todptr
acall pcstr_h
dnld_i3:ret
dnld_i0:acall dnld_gp ;non-error conditions
sjmp dnld_i2
;dnlds7: = "Errors:"
;dnlds8: = " bytes unable to write"
;dnlds9: = " incorrect checksums"
;dnlds10: = " unexpected begin of line"
;dnlds11: = " unexpected hex digits"
;dnlds12: = " unexpected non-hex digits"
;dnlds13: = "No errors detected"
;---------------------------------------------------------;
jump:
mov dptr, #prompt8
acall pcstr_h
acall r6r7todptr
acall phex16
mov dptr, #prompt4
acall pcstr_h
acall ghex16
jb psw.5, jump3
jnc jump2
ajmp abort2
jump2:
acall dptrtor6r7
jump3: acall newline
mov dptr, #runs1
acall pcstr_h
acall r6r7todptr
jump_doit: ;jump to user code @dptr (this used by run command also)
clr a
mov psw, a
mov b, a
mov r0, a
mov r1, a
mov r2, a
mov r3, a
mov r4, a
mov r5, a
mov r6, a
mov r7, a
mov sp, #8 ;start w/ sp=7, like a real reset
push acc ;unlike a real reset, push 0000
push acc ;in case they end with a RET
jmp @a+dptr
;---------------------------------------------------------;
dump:
mov r2, #16 ;number of lines to print
acall newline2
dump1: acall r6r7todptr
acall phex16 ;tell 'em the memory location
mov a,#':'
acall cout_sp
mov r3, #16 ;r3 counts # of bytes to print
acall r6r7todptr
dump2: clr a
movc a, @a+dptr
inc dptr
acall phex ;print each byte in hex
acall space
djnz r3, dump2
acall dspace ;print a couple extra space
mov r3, #16
acall r6r7todptr
dump3: clr a
movc a, @a+dptr
inc dptr
anl a, #01111111b ;avoid unprintable characters
cjne a, #127, dump3b
clr a ;avoid 127/255 (delete/rubout) char
dump3b: add a, #224
jc dump4
clr a ;avoid control characters
dump4: add a, #32
acall cout
djnz r3, dump3
acall newline
acall line_dly
acall dptrtor6r7
acall esc
jc dump5
djnz r2, dump1 ;loop back up to print next line
dump5: ajmp newline
;---------------------------------------------------------;
edit: ;edit external ram...
mov dptr, #edits1
acall pcstr_h
acall r6r7todptr
edit1: acall phex16
mov a,#':'
acall cout_sp
mov a,#'('
acall cout
acall dptrtor6r7
clr a
movc a, @a+dptr
acall phex
mov dptr,#prompt10
acall pcstr_h
acall ghex
jb psw.5,edit2
jc edit2
acall r6r7todptr
lcall smart_wr
acall newline
acall r6r7todptr
inc dptr
acall dptrtor6r7
ajmp edit1
edit2: mov dptr,#edits2
ajmp pcstr_h
;---------------------------------------------------------;
dir:
mov dptr, #prompt9
acall pcstr_h
mov r0, #21
dir0a: acall space
djnz r0, dir0a
;mov dptr, #prompt9b
acall pcstr_h
mov dph, #(bmem >> 8)
dir1: acall find ;find the next program in memory
jc dir2
dir_end:ajmp newline ;we're done if no more found
dir2:
acall dspace
mov dpl, #32 ;print its name
acall pstr
mov dpl, #32 ;how long is the name
acall lenstr
mov a, #33
clr c
subb a, r0
mov r0, a
mov a, #' ' ;print the right # of spaces
dir3: acall cout
djnz r0, dir3
mov dpl, #0
acall phex16 ;print the memory location
mov r0, #6
mov a, #' '
dir4: acall cout
djnz r0, dir4
mov dpl, #4 ;now figure out what type it is
clr a
movc a, @a+dptr
mov r2, dph ;save this, we're inside a search
dir5: cjne a, #254, dir5b
mov dptr, #type1 ;it's an external command
sjmp dir7
dir5b: cjne a, #253, dir5c
dir5bb: mov dptr, #type4 ;it's a startup routine
sjmp dir7
dir5c: cjne a, #35, dir5d
mov dptr, #type2 ;it's an ordinary program
sjmp dir7
dir5d: cjne a, #249, dir5e
sjmp dir5bb
dir5e:
dir6: mov dptr, #type5 ;who knows what the hell it is
dir7: acall pcstr_h ;print out the type
mov dph, r2 ;go back and find the next one
acall newline
mov a, #(emem >> 8)
cjne a, dph, dir8 ;did we just print the last one?
ajmp dir_end
dir8: inc dph
mov a, dph
cjne a, #((emem+1) >> 8) & 255, dir1
ajmp dir_end
;type1=Ext Command
;type4=Startup
;type2=Program
;type5=???
;---------------------------------------------------------;
run:
acall newline2
mov r2, #255 ;first print the menu, count items
mov dptr, #bmem
dec dph
run2: inc dph
mov a, dph
cjne a, #((emem+1) >> 8) & 255, run2b
sjmp run3
run2b: acall find
jnc run3 ;have we found 'em all??
mov dpl, #4
clr a
movc a, @a+dptr
orl a, #00000011b
cpl a
jz run2 ;this one doesn't run... find next
acall dspace
inc r2
mov a, #'A' ;print the key to press
add a, r2
acall cout_sp
acall dash_sp
mov dpl, #32
acall pstr ;and the command name
acall newline
ajmp run2 ;and continue doing this
run3: cjne r2, #255, run4 ;are there any to run??
mov dptr, #prompt5
ajmp pcstr_h
run4: mov dptr, #prompt3 ;ask the big question!
acall pcstr_h
mov a, #'A'
acall cout
acall dash
mov a, #'A' ;such user friendliness...
add a, r2 ;even tell 'em the choices
acall cout
mov dptr, #prompt4
acall pcstr_h
acall cin_filter_h
cjne a, #27, run4aa ;they they hit <ESC>
ajmp newline
run4aa: mov r3, a
mov a, #31
clr c
subb a, r2
mov a, r3
jc run4a
acall upper
run4a: acall cout
mov r3, a
acall newline
;check to see if it's under 32, if so convert to uppercase
mov a, r3
clr c
subb a, #'A'
jc run4 ;if they typed less than 'A'
mov r3, a ;R3 has the number they typed
mov a, r2 ;A=R2 has the maximum number
clr c
subb a, r3
jc run4 ;if they typed over the max
inc r3
mov dptr, #bmem
dec dph
run5: inc dph
mov a, dph
cjne a, #((emem+1) >> 8) & 255, run5b
sjmp run8
run5b: acall find
jnc run8 ;Shouldn't ever do this jump!
mov dpl, #4
clr a
movc a, @a+dptr
orl a, #00000011b
cpl a
jz run5 ;this one doesn't run... find next
djnz r3, run5 ;count til we find the one they want
acall newline
mov dpl, #64
ajmp jump_doit
run8: ret
;---------------------------------------------------------;
help:
mov dptr, #help1txt
acall pcstr_h
mov r4, #help_key
mov dptr, #help_cmd
acall help2
mov r4, #dir_key
;mov dptr, #dir_cmd
acall help2
mov r4, #run_key
;mov dptr, #run_cmd
acall help2
mov r4, #dnld_key
;mov dptr, #dnld_cmd
acall help2
mov r4, #upld_key
;mov dptr, #upld_cmd
acall help2
mov r4, #nloc_key
;mov dptr, #nloc_cmd
acall help2
mov r4, #jump_key
;mov dptr, #jump_cmd
acall help2
mov r4, #dump_key
;mov dptr, #dump_cmd
acall help2
mov r4, #intm_key
;mov dptr, #intm_cmd
acall help2
mov r4, #edit_key
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -