From 9f17ba102b5b8c4da97cd0cd38a8e058db6b8934 Mon Sep 17 00:00:00 2001 From: b1ackmai1er Date: Fri, 15 Jan 2021 00:20:21 +0800 Subject: [PATCH] Update romldr.asm Add capability to change baud rates when changing console. --- Source/HBIOS/romldr.asm | 75 +++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/Source/HBIOS/romldr.asm b/Source/HBIOS/romldr.asm index aa8455b4..fafa28a6 100644 --- a/Source/HBIOS/romldr.asm +++ b/Source/HBIOS/romldr.asm @@ -435,7 +435,7 @@ devlst: ; setcon: ; On entry DE is expected to be pointing to start - ; of command + ; of command. Get unit number. call findws ; skip command call skipws ; and skip it call isnum ; do we have a number? @@ -444,19 +444,64 @@ setcon: jp c,err_nocon ; handle overflow error ; ; Check against max char unit + PUSH DE push af ; save requested unit ld b,BF_SYSGET ; HBIOS func: SYS GET ld c,BF_SYSGET_CIOCNT ; HBIOS subfunc: CIO unit count rst 08 ; E := unit count pop af ; restore requested unit cp e ; compare + POP DE jp nc,err_nocon ; handle invalid unit + ld (newcon),a ; save validated console +; + ; Get baud rate + call findws + call skipws ; skip whitespace + call isnum ; do we have a number? + jp nz,docon ; if no we don't change baudrate + call getnum ; parse a number + jp c,err_invcmd ; handle overflow error +; + cp 32 ; handle invalid + jp nc,err_invcmd ; baud rate + bit 0,a + jr z,iseven ; convert sequential + inc a ; baud rate code to + srl a ; encoded baud rate + jr setspd ; 13=9600 +iseven: dec a ; 15=19200 + srl a ; 17=38400 + add a,16 ; 20=115200 +setspd: ld (newspeed),a ; save validated baud rate +; + ld hl,str_chspeed ; notify user + call pstr ; to change + call cin ; speed +; + ; Get the current settings for chosen console + ld b,BF_CIOQUERY ; BIOS serial device query + ld a,(newcon) ; get device unit num + ld c,a ; ... and put in C + rst 08 ; call H/UBIOS, DE := line characteristics + jp nz,err_invcmd ; abort on error +; + ld a,d ; mask off current + and $11100000 ; baud rate + ld hl,newspeed ; and load in new + or (hl) ; baud rate + ld d,a +; + ld b,BF_CIOINIT ; BIOS serial init + ld a,(newcon) ; get serial device unit + ld c,a ; ... into C + rst 08 ; call HBIOS + jp nz,err_invcmd ; handle error ; ; Notify user, we're outta here.... - push af ; save new console unit - ld hl,str_newcon ; new console msg +docon: ld hl,str_newcon ; new console msg call pstr ; print string on cur console - pop af ; restore new console unit + ld a,(newcon) ; restore new console unit call prtdecb ; print unit num ; ; Set console unit @@ -470,7 +515,6 @@ setcon: call nl2 ; formatting ld hl,str_banner ; display boot banner call pstr ; do it -; ret ; done ; #endif @@ -1103,7 +1147,7 @@ rdln_nxt: jr rdln_nxt ; loop till done ; rdln_bs: - ld hl,cmdbuf ; start of buffer + ld hl,cmdbuf ; start of buffer or a ; clear carry sbc hl,de ; subtract from cur buf ptr jr z,rdln_bel ; at buf start, just beep @@ -1508,7 +1552,7 @@ cin: ; Input character from console via hbios ld c,CIO_CONSOLE ; console unit to c ld b,BF_CIOIN ; HBIOS func: input char - rst 08 ; HBIOS reads charactdr + rst 08 ; HBIOS reads character ld a,e ; move character to A for return ; ; Restore registers (AF is output) @@ -1833,7 +1877,7 @@ str_err_prefix .db bel,"\r\n\r\n*** ",0 str_err_invcmd .db "Invalid command",0 str_err_nodisk .db "Disk unit not available",0 str_err_noslice .db "Disk unit does not support slices",0 -str_err_nocon .db "Invalid character unit",0 +str_err_nocon .db "Invalid character unit specification",0 str_err_diskio .db "Disk I/O failure",0 str_err_sig .db "No system image on disk",0 str_err_api .db "Unexpected hardware BIOS API failure",0 @@ -1872,6 +1916,7 @@ str_prompt .db "Boot [H=Help]: ",0 str_bs .db bs,' ',bs,0 str_reboot .db "\r\n\r\nRestarting System...",0 str_newcon .db "\r\n\r\n Console on Unit #",0 +str_chspeed .db "\r\n\r\n Change speed now. Press a key to resume.",0 str_applst .db "\r\n\r\nROM Applications:",0 str_devlst .db "\r\n\r\nDisk Devices:",0 str_invcmd .db "\r\n\r\n*** Invalid Command ***",bel,0 @@ -1889,14 +1934,14 @@ str_ldsec .db ", Sector 0x",0 str_diaglvl .db "\r\n\r\nHBIOS Diagnostic Level: ",0 ; str_help .db "\r\n" - .db "\r\n L - List ROM Applications" - .db "\r\n D - Disk Device Inventory" - .db "\r\n R - Reboot System" + .db "\r\n L - List ROM Applications" + .db "\r\n D - Disk Device Inventory" + .db "\r\n R - Reboot System" #if (BIOS == BIOS_WBW) - .db "\r\n I - Set Console Interface" - .db "\r\n V [] - View/Set HBIOS Diagnostic Verbosity" + .db "\r\n I [] - Set Console Interface/Baud code" + .db "\r\n V [] - View/Set HBIOS Diagnostic Verbosity" #endif - .db "\r\n [.] - Boot Disk Unit/Slice" + .db "\r\n [.] - Boot Disk Unit/Slice" .db 0 ; #if (DSKYENABLE) @@ -2023,6 +2068,8 @@ str_tbas .db "Tasty BASIC",0 str_play .db "Play a Game",0 str_user .db "User App",0 str_egg .db "",0 +newcon .db 0 +newspeed .db 0 ; ;======================================================================= ; Pad remainder of ROM Loader