From 1a582eced63d7577fd18aae3fce5b957c2e478d4 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 10:46:14 +0900 Subject: [PATCH 1/9] Convert tabs to spaces --- SRC/NETWORK/ftp.asm | 9105 +++++++++++++++++++++---------------------- 1 file changed, 4552 insertions(+), 4553 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 70338696a..99c022771 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -1,7 +1,7 @@ - ;--- FTP 1.0 - FTP client for the TCP/IP UNAPI - ; By Konami Man, 4/2010 + ;--- FTP 1.0 - FTP client for the TCP/IP UNAPI + ; By Konami Man, 4/2010 - .label 20 + .label 20 ;****************************** ;*** *** @@ -9,164 +9,164 @@ ;*** *** ;****************************** -nesman: macro @f ;Llamada indirecta a las funciones de NestorMan - ld c,@f - ld de,#2202 - call #FFCA - endm - -print: macro @d ;Imprime una cadena acabada en "$" - ld de,@d - ld c,_STROUT - call DO_DOS - endm - -printl: macro @d ;Imprime una cadena acabada en CRLF - ld de,@d - call PRINT_L - endm - -printz: macro @d ;Imprime una cadena acabada en cero - ld de,@d - call PRINT_Z - endm - -_TERM0: equ #00 -_CONOUT: equ #02 ;Some DOS function calls -_DIRIO: equ #06 -_INNOE: equ #08 -_STROUT: equ #09 -_BUFIN: equ #0A -_CONST: equ #0B -_SELDSK: equ #0E -_CURDRV: equ #19 -_ALLOC: equ #1B -_FFIRST: equ #40 -_FNEXT: equ #41 -_OPEN: equ #43 -_CREATE: equ #44 -_CLOSE: equ #45 -_READ: equ #48 -_WRITE: equ #49 -_DELETE: equ #4D -_RENAME: equ #4E -_ATTR: equ #50 -_GETCD: equ #59 -_CHDIR: equ #5A -_PARSE: equ #5B -_TERM: equ #62 -_DEFAB: equ #63 -_ERROR: equ #65 -_EXPLAIN: equ #66 -_GENV: equ #6B -_DOSVER: equ #6F - -ENASLT: equ #0024 ;Slot swithcing BIOS routine -BEEP: equ #00C0 ;Generates a BEEP -CALSLT: equ #001C ;Calls a routine on another slot - -TPASLOT1: equ #F342 -ARG: equ #F847 -H_CHPH: equ #FDA4 ;Gancho CHPUT -EXTBIO: equ #FFCA - - ;--- TCP/IP UNAPI routines - -TCPIP_GET_CAPAB: equ 1 -TCPIP_GET_IPINFO: equ 2 -TCPIP_NET_STATE: equ 3 -TCPIP_DNS_Q: equ 6 -TCPIP_DNS_S: equ 7 -TCPIP_TCP_OPEN: equ 13 -TCPIP_TCP_CLOSE: equ 14 -TCPIP_TCP_ABORT: equ 15 -TCPIP_TCP_STATE: equ 16 -TCPIP_TCP_SEND: equ 17 -TCPIP_TCP_RCV: equ 18 -TCPIP_WAIT: equ 29 - - ;--- TCP/IP UNAPI error codes - -ERR_OK: equ 0 -ERR_NOT_IMP: equ 1 -ERR_NO_NETWORK: equ 2 -ERR_NO_DATA: equ 3 -ERR_INV_PARAM: equ 4 -ERR_QUERY_EXISTS: equ 5 -ERR_INV_IP: equ 6 -ERR_NO_DNS: equ 7 -ERR_DNS: equ 8 -ERR_NO_FREE_CONN: equ 9 -ERR_CONN_EXISTS: equ 10 -ERR_NO_CONN: equ 11 -ERR_CONN_STATE: equ 12 -ERR_BUFFER: equ 13 -ERR_LARGE_DGRAM: equ 14 -ERR_INV_OPER: equ 15 - -debug: macro @c - push af,bc,de,hl - ld e,@c - ld c,2 - call DO_DOS - pop hl,de,bc,af - endm +nesman: macro @f ;Llamada indirecta a las funciones de NestorMan + ld c,@f + ld de,#2202 + call #FFCA + endm + +print: macro @d ;Imprime una cadena acabada en "$" + ld de,@d + ld c,_STROUT + call DO_DOS + endm + +printl: macro @d ;Imprime una cadena acabada en CRLF + ld de,@d + call PRINT_L + endm + +printz: macro @d ;Imprime una cadena acabada en cero + ld de,@d + call PRINT_Z + endm + +_TERM0: equ #00 +_CONOUT: equ #02 ;Some DOS function calls +_DIRIO: equ #06 +_INNOE: equ #08 +_STROUT: equ #09 +_BUFIN: equ #0A +_CONST: equ #0B +_SELDSK: equ #0E +_CURDRV: equ #19 +_ALLOC: equ #1B +_FFIRST: equ #40 +_FNEXT: equ #41 +_OPEN: equ #43 +_CREATE: equ #44 +_CLOSE: equ #45 +_READ: equ #48 +_WRITE: equ #49 +_DELETE: equ #4D +_RENAME: equ #4E +_ATTR: equ #50 +_GETCD: equ #59 +_CHDIR: equ #5A +_PARSE: equ #5B +_TERM: equ #62 +_DEFAB: equ #63 +_ERROR: equ #65 +_EXPLAIN: equ #66 +_GENV: equ #6B +_DOSVER: equ #6F + +ENASLT: equ #0024 ;Slot swithcing BIOS routine +BEEP: equ #00C0 ;Generates a BEEP +CALSLT: equ #001C ;Calls a routine on another slot + +TPASLOT1: equ #F342 +ARG: equ #F847 +H_CHPH: equ #FDA4 ;Gancho CHPUT +EXTBIO: equ #FFCA + + ;--- TCP/IP UNAPI routines + +TCPIP_GET_CAPAB: equ 1 +TCPIP_GET_IPINFO: equ 2 +TCPIP_NET_STATE: equ 3 +TCPIP_DNS_Q: equ 6 +TCPIP_DNS_S: equ 7 +TCPIP_TCP_OPEN: equ 13 +TCPIP_TCP_CLOSE: equ 14 +TCPIP_TCP_ABORT: equ 15 +TCPIP_TCP_STATE: equ 16 +TCPIP_TCP_SEND: equ 17 +TCPIP_TCP_RCV: equ 18 +TCPIP_WAIT: equ 29 + + ;--- TCP/IP UNAPI error codes + +ERR_OK: equ 0 +ERR_NOT_IMP: equ 1 +ERR_NO_NETWORK: equ 2 +ERR_NO_DATA: equ 3 +ERR_INV_PARAM: equ 4 +ERR_QUERY_EXISTS: equ 5 +ERR_INV_IP: equ 6 +ERR_NO_DNS: equ 7 +ERR_DNS: equ 8 +ERR_NO_FREE_CONN: equ 9 +ERR_CONN_EXISTS: equ 10 +ERR_NO_CONN: equ 11 +ERR_CONN_STATE: equ 12 +ERR_BUFFER: equ 13 +ERR_LARGE_DGRAM: equ 14 +ERR_INV_OPER: equ 15 + +debug: macro @c + push af,bc,de,hl + ld e,@c + ld c,2 + call DO_DOS + pop hl,de,bc,af + endm ; Conditional relative jumps -jri: macro @a ;A = x - jr z,@a - endm +jri: macro @a ;A = x + jr z,@a + endm -jrni: macro @a ;A <> x - jr nz,@a - endm +jrni: macro @a ;A <> x + jr nz,@a + endm -jrmn: macro @a ;A < x - jr c,@a - endm +jrmn: macro @a ;A < x + jr c,@a + endm -jrmy: macro @a ;A > x - jr z,$+4 - jr nc,@a - endm +jrmy: macro @a ;A > x + jr z,$+4 + jr nc,@a + endm -jrmni: macro @a ;A <= x - jr c,@a - jr z,@a - endm +jrmni: macro @a ;A <= x + jr c,@a + jr z,@a + endm -jrmyi: macro @a ;A >= x - jr nc,@a - endm +jrmyi: macro @a ;A >= x + jr nc,@a + endm ; Conditional absolute jumps -jpi: macro @a ;A = x - jp z,@a - endm +jpi: macro @a ;A = x + jp z,@a + endm -jpni: macro @a ;A <> x - jp nz,@a - endm +jpni: macro @a ;A <> x + jp nz,@a + endm -jpmn: macro @a ;A < x - jp c,@a - endm +jpmn: macro @a ;A < x + jp c,@a + endm -jpmy: macro @a ;A > x - jr z,$+5 - jp nc,@a - endm +jpmy: macro @a ;A > x + jr z,$+5 + jp nc,@a + endm -jpmni: macro @a ;A <= x - jp c,@a - jp z,@a - endm +jpmni: macro @a ;A <= x + jp c,@a + jp z,@a + endm -jpmyi: macro @a ;A >=x - jp nc,@a - endm +jpmyi: macro @a ;A >=x + jp nc,@a + endm @@ -176,294 +176,294 @@ jpmyi: macro @a ;A >=x ;*** *** ;************************** - org #100 + org #100 - ld hl,DATA - ld de,#8000 - ld bc,DATA_END-DATA_START - ldir + ld hl,DATA + ld de,#8000 + ld bc,DATA_END-DATA_START + ldir - ld a,#FF - ld (USER_COM_BUF),a + ld a,#FF + ld (USER_COM_BUF),a - ;--- Muestra la cadena inicial + ;--- Muestra la cadena inicial - print PRESEN_S ;Presentation string - ld (SAVESP),sp + print PRESEN_S ;Presentation string + ld (SAVESP),sp - ;--- Comprueba la version del DOS + ;--- Comprueba la version del DOS - ld c,_DOSVER - call DO_DOS - or a - jr nz,NODOS2 - ld a,b - cp 2 - jr z,OKDOS2 + ld c,_DOSVER + call DO_DOS + or a + jr nz,NODOS2 + ld a,b + cp 2 + jr z,OKDOS2 -NODOS2: print NODOS2_S - ld c,_TERM0 - jp DO_DOS +NODOS2: print NODOS2_S + ld c,_TERM0 + jp DO_DOS -NODOS2_S: db "*** Sorry, this program is for DOS 2 only$" +NODOS2_S: db "*** Sorry, this program is for DOS 2 only$" OKDOS2: - ;--- Search the TCP/IP UNAPI implementation - - ld hl,TCPIP_S - ld de,ARG - ld bc,15 - ldir - - xor a - ld b,0 - ld de,#2222 - call EXTBIO - ld a,b - or a - jr nz,OKINS - - print NOTCPIP_S - ld c,_TERM0 - jp DO_DOS - -TCPIP_S: db "TCP/IP",0 -NOTCPIP_S: db "*** No TCP/IP UNAPI implementation found.",13,10,"$" -OKINS: ; - - ;--- Setup the UNAPI calling code - - ld a,1 - ld de,#2222 - call EXTBIO - - ld (DO_UNAPI+1),hl - ld c,a - ld a,h - cp #C0 - ld a,c - jr c,NO_UNAPI_P3 - - ld a,#C9 - ld (SET_UNAPI),a - jr OK_SET_UNAPI + ;--- Search the TCP/IP UNAPI implementation + + ld hl,TCPIP_S + ld de,ARG + ld bc,15 + ldir + + xor a + ld b,0 + ld de,#2222 + call EXTBIO + ld a,b + or a + jr nz,OKINS + + print NOTCPIP_S + ld c,_TERM0 + jp DO_DOS + +TCPIP_S: db "TCP/IP",0 +NOTCPIP_S: db "*** No TCP/IP UNAPI implementation found.",13,10,"$" +OKINS: ; + + ;--- Setup the UNAPI calling code + + ld a,1 + ld de,#2222 + call EXTBIO + + ld (DO_UNAPI+1),hl + ld c,a + ld a,h + cp #C0 + ld a,c + jr c,NO_UNAPI_P3 + + ld a,#C9 + ld (SET_UNAPI),a + jr OK_SET_UNAPI NO_UNAPI_P3: - ld (UNAPI_SLOT+1),a - ld a,b - cp #FF - jr nz,NO_UNAPI_ROM + ld (UNAPI_SLOT+1),a + ld a,b + cp #FF + jr nz,NO_UNAPI_ROM - ld a,#C9 - ld (UNAPI_SEG),a - jr OK_SET_UNAPI + ld a,#C9 + ld (UNAPI_SEG),a + jr OK_SET_UNAPI NO_UNAPI_ROM: - ld (UNAPI_SEG+1),a + ld (UNAPI_SEG+1),a OK_SET_UNAPI: - ;--- Get mapper support routines (we need GET_P1 and PUT_P1) + ;--- Get mapper support routines (we need GET_P1 and PUT_P1) - ld de,#0402 - xor a - call EXTBIO - or a - jr z,NOMAPPER + ld de,#0402 + xor a + call EXTBIO + or a + jr z,NOMAPPER - ld bc,10*3 ;Skip ALL_SEG to GET_P0 - add hl,bc - ld de,PUT_P1 - ld bc,2*3 - ldir + ld bc,10*3 ;Skip ALL_SEG to GET_P0 + add hl,bc + ld de,PUT_P1 + ld bc,2*3 + ldir - call GET_P1 - ld (TPASEG1),a + call GET_P1 + ld (TPASEG1),a NOMAPPER: - ;--- Comprueba que realmente estemos conectados, - ; en caso contrario muestra error y termina + ;--- Comprueba que realmente estemos conectados, + ; en caso contrario muestra error y termina - ld a,TCPIP_NET_STATE ;La red esta disponible? - call CALL_UNAPI - or a - jr z,CONNECT_OK ;Assume ok if "unknown" - cp 2 - jr z,CONNECT_OK + ld a,TCPIP_NET_STATE ;La red esta disponible? + call CALL_UNAPI + or a + jr z,CONNECT_OK ;Assume ok if "unknown" + cp 2 + jr z,CONNECT_OK - print NOCON_S - jp TERM + print NOCON_S + jp TERM -NOCON_S: db "*** No network connection",13,10,"$" -CONNECT_OK: ; +NOCON_S: db "*** No network connection",13,10,"$" +CONNECT_OK: ; - ;--- Check if this implementation can open active and passive TCP connections + ;--- Check if this implementation can open active and passive TCP connections - ld b,1 - ld a,TCPIP_GET_CAPAB - call CALL_UNAPI + ld b,1 + ld a,TCPIP_GET_CAPAB + call CALL_UNAPI - bit 3,l - jr nz,CAN_ACTIVE - print NOTCPA_S - jp TERM + bit 3,l + jr nz,CAN_ACTIVE + print NOTCPA_S + jp TERM -NOTCPA_S: db "*** This TCP/IP UNAPI implementation does not support",13,10 - db " opening active TCP connections.",13,10,"$" +NOTCPA_S: db "*** This TCP/IP UNAPI implementation does not support",13,10 + db " opening active TCP connections.",13,10,"$" CAN_ACTIVE: - bit 5,l - jp nz,CAN_PASSIVE - print NOTCPPU_S - jp TERM + bit 5,l + jp nz,CAN_PASSIVE + print NOTCPPU_S + jp TERM -NOTCPPU_S: db "*** This TCP/IP UNAPI implementation does not support",13,10 - db " opening passive TCP connections with remote socket unespecified.",13,10,"$" +NOTCPPU_S: db "*** This TCP/IP UNAPI implementation does not support",13,10 + db " opening passive TCP connections with remote socket unespecified.",13,10,"$" CAN_PASSIVE: - ;--- Clear all transient connections + ;--- Clear all transient connections - ld a,TCPIP_TCP_CLOSE - ld b,0 - call CALL_UNAPI + ld a,TCPIP_TCP_CLOSE + ld b,0 + call CALL_UNAPI - ;--- Comprueba que haya al menos dos conexiones TCP libres + ;--- Comprueba que haya al menos dos conexiones TCP libres - ld b,2 - ld a,TCPIP_GET_CAPAB - call CALL_UNAPI - ld a,d - cp 2 - jr nc,OKFRCON + ld b,2 + ld a,TCPIP_GET_CAPAB + call CALL_UNAPI + ld a,d + cp 2 + jr nc,OKFRCON - print NOFRCON_S - jp TERM -NOFRCON_S: db "*** Not enough free TCP connections available (I need two)$" + print NOFRCON_S + jp TERM +NOFRCON_S: db "*** Not enough free TCP connections available (I need two)$" OKFRCON: - ;--- Comprueba que NestorMan 1.21 o superior este instalado, - ; y establece HAY_NMAN en ese caso + ;--- Comprueba que NestorMan 1.21 o superior este instalado, + ; y establece HAY_NMAN en ese caso - xor a ;Installed? - nesman 1 - or a - jr z,OKNMAN + xor a ;Installed? + nesman 1 + or a + jr z,OKNMAN -OKNMAN1: ld hl,#0201 ;Installed: now check version - ex de,hl - call COMP - jr nc,OKNMAN +OKNMAN1: ld hl,#0201 ;Installed: now check version + ex de,hl + call COMP + jr nc,OKNMAN - ld a,#FF - ld (HAY_NMAN),a + ld a,#FF + ld (HAY_NMAN),a OKNMAN: - ;--- Obtiene la IP local. - ; Con esta informacion compone la primera parte - ; de la cadena que forma el comando "PORT". - - ld a,TCPIP_GET_IPINFO - ld b,1 - call CALL_UNAPI - ld (IP_LOCAL),hl - ld (IP_LOCAL+2),de - - ld a,l - call SET_IP - ld a,h - call SET_IP - ld a,e - call SET_IP - ld a,d - call SET_IP - jr OK_SET_PORT - -SET_IP: push hl,de - ld e,a - ld d,0 - ld b,1 - xor a - ld hl,(PORT_C_PNT) - call NUMTOASC - ld c,b - ld b,0 - add hl,bc - ld (hl),"," - inc hl - ld (PORT_C_PNT),hl - pop de,hl - ret -OK_SET_PORT: ; - - ;--- Compone DEF_USER y DEF_PASSWORD - - ld hl,ENV_USER - ld de,DEF_USER - ld b,255 - ld c,_GENV - call DO_DOS - - ld hl,ENV_PASSWORD - ld de,DEF_PASSWORD - ld b,255 - ld c,_GENV - call DO_DOS - - ld hl,ENV_ACCOUNT - ld de,DEF_ACCOUNT - ld b,255 - ld c,_GENV - call DO_DOS - - ld a,(DEF_USER) - or a - jr nz,OK_DEFUSER - ld hl,ANONYMOUS_S - ld de,DEF_USER ;Por si no hay variable FTP_USER - ld bc,10 - ldir -OK_DEFUSER: ; - - ;--- Copia el codigo del gancho CHPUT - - ld hl,HOOK_CODE0 - ld de,HOOK_CODE - ld bc,HOOK_CODE0_END-HOOK_CODE0 - ldir - - ld hl,H_CHPH - ld de,HOOK_OLD - ld bc,5 - ldir - - xor a - ld (ESC_CHAR),a - - ;--- Define la rutina de terminacion - - ld de,R_ABORT - ld c,_DEFAB - call DO_DOS - - ;--- Si hay parametros, salta a OPEN - - ld hl,#80 - ld de,USER_COM_BUF+1 - ld a,1 - call EXTPAR - jr c,NOPARS - - ld hl,#81 ;Copia el comando ficticio "X" - ld de,USER_COM_BUF+3 - ld bc,255 ;y los parametros a USER_COM_BUF, - ldir - ld a,(#80) ;entonces salta a OPEN - inc a - inc a - ld (USER_COM_BUF+1),a - ld hl," X" - ld (USER_COM_BUF+2),hl - call R_OPEN -NOPARS: ; + ;--- Obtiene la IP local. + ; Con esta informacion compone la primera parte + ; de la cadena que forma el comando "PORT". + + ld a,TCPIP_GET_IPINFO + ld b,1 + call CALL_UNAPI + ld (IP_LOCAL),hl + ld (IP_LOCAL+2),de + + ld a,l + call SET_IP + ld a,h + call SET_IP + ld a,e + call SET_IP + ld a,d + call SET_IP + jr OK_SET_PORT + +SET_IP: push hl,de + ld e,a + ld d,0 + ld b,1 + xor a + ld hl,(PORT_C_PNT) + call NUMTOASC + ld c,b + ld b,0 + add hl,bc + ld (hl),"," + inc hl + ld (PORT_C_PNT),hl + pop de,hl + ret +OK_SET_PORT: ; + + ;--- Compone DEF_USER y DEF_PASSWORD + + ld hl,ENV_USER + ld de,DEF_USER + ld b,255 + ld c,_GENV + call DO_DOS + + ld hl,ENV_PASSWORD + ld de,DEF_PASSWORD + ld b,255 + ld c,_GENV + call DO_DOS + + ld hl,ENV_ACCOUNT + ld de,DEF_ACCOUNT + ld b,255 + ld c,_GENV + call DO_DOS + + ld a,(DEF_USER) + or a + jr nz,OK_DEFUSER + ld hl,ANONYMOUS_S + ld de,DEF_USER ;Por si no hay variable FTP_USER + ld bc,10 + ldir +OK_DEFUSER: ; + + ;--- Copia el codigo del gancho CHPUT + + ld hl,HOOK_CODE0 + ld de,HOOK_CODE + ld bc,HOOK_CODE0_END-HOOK_CODE0 + ldir + + ld hl,H_CHPH + ld de,HOOK_OLD + ld bc,5 + ldir + + xor a + ld (ESC_CHAR),a + + ;--- Define la rutina de terminacion + + ld de,R_ABORT + ld c,_DEFAB + call DO_DOS + + ;--- Si hay parametros, salta a OPEN + + ld hl,#80 + ld de,USER_COM_BUF+1 + ld a,1 + call EXTPAR + jr c,NOPARS + + ld hl,#81 ;Copia el comando ficticio "X" + ld de,USER_COM_BUF+3 + ld bc,255 ;y los parametros a USER_COM_BUF, + ldir + ld a,(#80) ;entonces salta a OPEN + inc a + inc a + ld (USER_COM_BUF+1),a + ld hl," X" + ld (USER_COM_BUF+2),hl + call R_OPEN +NOPARS: ; @@ -473,79 +473,79 @@ NOPARS: ; ;*** *** ;*************************** -MAIN_LOOP: ld sp,(SAVESP) +MAIN_LOOP: ld sp,(SAVESP) - ;--- Pone ABORT_STAT a 1 o a 2 + ;--- Pone ABORT_STAT a 1 o a 2 - ld a,(CONTROL_CON) - cp #FF - ld a,1 - jr z,MAINLOP_2 - inc a -MAINLOP_2: ld (ABORT_STAT),a + ld a,(CONTROL_CON) + cp #FF + ld a,1 + jr z,MAINLOP_2 + inc a +MAINLOP_2: ld (ABORT_STAT),a - ;--- Imprime prompt y queda a la espera de un comando + ;--- Imprime prompt y queda a la espera de un comando - xor a - ld (ES_XCOM),a - print FTP_S + xor a + ld (ES_XCOM),a + print FTP_S - ld de,USER_COM_BUF - ld c,_BUFIN - call DO_DOS - call LF + ld de,USER_COM_BUF + ld c,_BUFIN + call DO_DOS + call LF - ld a,(USER_COM_BUF+1) ;Anyade 0 al final - ld c,a - ld b,0 - ld hl,USER_COM_BUF+2 - add hl,bc - ld (hl),0 + ld a,(USER_COM_BUF+1) ;Anyade 0 al final + ld c,a + ld b,0 + ld hl,USER_COM_BUF+2 + add hl,bc + ld (hl),0 - ;--- Busca en la tabla el comando adecuado, - ; y salta a su rutina. - ; Si no existe, muestra "Unknown command". + ;--- Busca en la tabla el comando adecuado, + ; y salta a su rutina. + ; Si no existe, muestra "Unknown command". - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,1 - call EXTPAR - jr c,MAIN_LOOP + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,1 + call EXTPAR + jr c,MAIN_LOOP - ld a,(PARSE_BUF) - cp "!" - jr nz,NOADMIRA + ld a,(PARSE_BUF) + cp "!" + jr nz,NOADMIRA - ld hl,R_LITERAL! - jr COM_OK + ld hl,R_LITERAL! + jr COM_OK -NOADMIRA: ld hl,PARSE_BUF - call SEARCH_COM - jr nc,COM_OK +NOADMIRA: ld hl,PARSE_BUF + call SEARCH_COM + jr nc,COM_OK - print UNKCOM_S - jr MAIN_LOOP + print UNKCOM_S + jr MAIN_LOOP -COM_OK: ld a,(CONTROL_CON) ;Flushea datos si hay conexion - cp #FF - jr z,COM_OK2 - ;call TCP_STATUS - ;jr c,COM_OK2 - ;cp 4 - ;jr nz,COM_OK2 - push hl - call R_FLUSH - pop hl -COM_OK2: call JP_HL ;Ejecuta comando +COM_OK: ld a,(CONTROL_CON) ;Flushea datos si hay conexion + cp #FF + jr z,COM_OK2 + ;call TCP_STATUS + ;jr c,COM_OK2 + ;cp 4 + ;jr nz,COM_OK2 + push hl + call R_FLUSH + pop hl +COM_OK2: call JP_HL ;Ejecuta comando - ld a,(BELL) - or a - jr z,MAIN_LOOP + ld a,(BELL) + or a + jr z,MAIN_LOOP - ld iy,(#FCC1-1) ;Ejecuta BEEP si BELL=#FF - ld ix,BEEP - call CALSLT - jp MAIN_LOOP + ld iy,(#FCC1-1) ;Ejecuta BEEP si BELL=#FF + ld ix,BEEP + call CALSLT + jp MAIN_LOOP @@ -559,1850 +559,1850 @@ COM_OK2: call JP_HL ;Ejecuta comando ;--- ?, HELP --- ;----------------- -R_HELP: ld a,3 - ld (ABORT_STAT),a +R_HELP: ld a,3 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,2 - call EXTPAR - jr nc,COMM_HELP + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,2 + call EXTPAR + jr nc,COMM_HELP - print BIGHELP_H ;Solo "HELP": Muestra ayuda general - ret + print BIGHELP_H ;Solo "HELP": Muestra ayuda general + ret -COMM_HELP: cp 2 - jp nz,R_INVPAR ;Mas de un parametro: error +COMM_HELP: cp 2 + jp nz,R_INVPAR ;Mas de un parametro: error -COMM_HELP2: ld hl,PARSE_BUF - call SEARCH_COM - jr nc,COMM_HELP3 +COMM_HELP2: ld hl,PARSE_BUF + call SEARCH_COM + jr nc,COMM_HELP3 - ld e,34 - ld c,_CONOUT - call DO_DOS - printz PARSE_BUF - ld e,34 - ld c,_CONOUT - call DO_DOS - print NOHELP_S ;No existe ese comando: error - ret + ld e,34 + ld c,_CONOUT + call DO_DOS + printz PARSE_BUF + ld e,34 + ld c,_CONOUT + call DO_DOS + print NOHELP_S ;No existe ese comando: error + ret -COMM_HELP3: push de - call LF - pop de - ld c,_STROUT - call DO_DOS - jp LF +COMM_HELP3: push de + call LF + pop de + ld c,_STROUT + call DO_DOS + jp LF ;---------------- ;--- APPEND --- ;---------------- -R_APPEND: ld a,3 - ld hl,C_APPE +R_APPEND: ld a,3 + ld hl,C_APPE - jp R_SEND_APP + jp R_SEND_APP ;--------------- ;--- ASCII --- ;--------------- -R_ASCII: ld a,4 - ld (ABORT_STAT),a +R_ASCII: ld a,4 + ld (ABORT_STAT),a - xor a - push af - ld a,"A" + xor a + push af + ld a,"A" -R_ASCBIN: ld (SEND_COM_BUF+5),a - ld hl,#0A0D ;Vuelve con Cy=1 en caso de error - ld (SEND_COM_BUF+6),hl ;(usado por R_DIR) - ld hl,C_TYPE - call SET_COMMAND - call SET_SPACE - call AUTOMATA_NO1 - pop bc - ret c - ld a,b - ld (TYPE),a - or a - ret +R_ASCBIN: ld (SEND_COM_BUF+5),a + ld hl,#0A0D ;Vuelve con Cy=1 en caso de error + ld (SEND_COM_BUF+6),hl ;(usado por R_DIR) + ld hl,C_TYPE + call SET_COMMAND + call SET_SPACE + call AUTOMATA_NO1 + pop bc + ret c + ld a,b + ld (TYPE),a + or a + ret ;-------------- ;--- BELL --- ;-------------- -R_BELL: ld a,3 - ld (ABORT_STAT),a +R_BELL: ld a,3 + ld (ABORT_STAT),a - ld hl,BELL - ld de,BELL_M_S - jp TURN_ON_OFF + ld hl,BELL + ld de,BELL_M_S + jp TURN_ON_OFF ;---------------- ;--- BINARY --- ;---------------- -R_BINARY: ;ld a,4 - ;ld (ABORT_STAT),a +R_BINARY: ;ld a,4 + ;ld (ABORT_STAT),a - ld a,#FF - push af - ld a,"I" + ld a,#FF + push af + ld a,"I" - jp R_ASCBIN + jp R_ASCBIN ;------------ ;--- CD --- ;------------ -R_CD: call CHK_CON - ret c +R_CD: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+4 - ld a,2 - call EXTPAR - jp c,R_PWD + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+4 + ld a,2 + call EXTPAR + jp c,R_PWD - ld a,#FF - ld (ES_XCOM),a - ld hl,C_CWD - jp PARAM_XCOM + ld a,#FF + ld (ES_XCOM),a + ld hl,C_CWD + jp PARAM_XCOM ;-------------- ;--- CDUP --- ;-------------- -R_CDUP: call CHK_CON - ret c +R_CDUP: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,C_CDUP - ld a,(XCOM) - or a - jp z,SINGLE_COM - ld hl,C_XCUP - jp SINGLE_COM + ld hl,C_CDUP + ld a,(XCOM) + or a + jp z,SINGLE_COM + ld hl,C_XCUP + jp SINGLE_COM ;--------------- ;--- CLOSE --- ;--------------- -R_CLOSE: call CHK_CON - ret c - - ld a,5 - ld (ABORT_STAT),a - - ld a,#FF - ld (QUITTING),a - ld hl,C_QUIT - call SET_COMMAND - call APPEND_LF - call AUTOMATA_NO1 - ld a,(CONTROL_CON) - ld b,a - ld a,TCPIP_TCP_CLOSE - call CALL_UNAPI - ld a,#FF - ld (CONTROL_CON),a - xor a - ld (QUITTING),a - ld (GCDATA_COUNT),a - ld (TYPE),a - jp MAIN_LOOP +R_CLOSE: call CHK_CON + ret c + + ld a,5 + ld (ABORT_STAT),a + + ld a,#FF + ld (QUITTING),a + ld hl,C_QUIT + call SET_COMMAND + call APPEND_LF + call AUTOMATA_NO1 + ld a,(CONTROL_CON) + ld b,a + ld a,TCPIP_TCP_CLOSE + call CALL_UNAPI + ld a,#FF + ld (CONTROL_CON),a + xor a + ld (QUITTING),a + ld (GCDATA_COUNT),a + ld (TYPE),a + jp MAIN_LOOP ;--------------- ;--- DEBUG --- ;--------------- -R_DEBUG: ld a,3 - ld (ABORT_STAT),a +R_DEBUG: ld a,3 + ld (ABORT_STAT),a - ld hl,DEBUG - ld de,DEBUG_M_S - jp TURN_ON_OFF + ld hl,DEBUG + ld de,DEBUG_M_S + jp TURN_ON_OFF ;---------------- ;--- DELETE --- ;---------------- -R_DELETE: call CHK_CON - ret c +R_DELETE: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,2 - call EXTPAR - ld hl,C_DELE - jp nc,PARAM_COM - jp R_INVPAR + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,2 + call EXTPAR + ld hl,C_DELE + jp nc,PARAM_COM + jp R_INVPAR ;------------- ;--- DIR --- ;------------- -R_DIR: ld hl,C_LIST -R_DIR_LS: ld (RETR_COM),hl +R_DIR: ld hl,C_LIST +R_DIR_LS: ld (RETR_COM),hl - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 ;Busca tercer parametro - ld de,DATA_BUF ;(nombre de fichero) - ld a,3 - call EXTPAR - jr c,R_DIR_LS2 + ld hl,USER_COM_BUF+1 ;Busca tercer parametro + ld de,DATA_BUF ;(nombre de fichero) + ld a,3 + call EXTPAR + jr c,R_DIR_LS2 - call CLOSE_FILE ;Crea el fichero - ld c,_CREATE - ld de,DATA_BUF - xor a - ld b,0 - call DOS - ret c - ld a,b - ld (FILE_FH),a + call CLOSE_FILE ;Crea el fichero + ld c,_CREATE + ld de,DATA_BUF + xor a + ld b,0 + call DOS + ret c + ld a,b + ld (FILE_FH),a -R_DIR_LS2: ld a,2 ;Ejecuta comando - ld (RETR_PAR),a - ld a,#FF - ld (MUST_ASCII),a - jp RETRIEVE +R_DIR_LS2: ld a,2 ;Ejecuta comando + ld (RETR_PAR),a + ld a,#FF + ld (MUST_ASCII),a + jp RETRIEVE ;--------------- ;--- FLUSH --- (ejecutado por el bucle principal) ;--------------- -R_FLUSH: ld a,3 - ld (ABORT_STAT),a +R_FLUSH: ld a,3 + ld (ABORT_STAT),a - ;call CHK_CON - ;ret c + ;call CHK_CON + ;ret c R_FLUSH2: - ld a,(CONTROL_CON) ;Hay datos sin recoger? - ld b,a - ld hl,0 - ld a,TCPIP_TCP_STATE - call CALL_UNAPI - or a - ret z - ld a,h - or l - jr nz,R_FLUSH2! - - ld a,(GCDATA_COUNT) ;Hay datos recogidos pero no consumidos? - or a - ret z - -R_FLUSH2!: print FLUSHED_S -R_FLUSH3: call GET_CDATA - jr c,R_FLUSH_END - push af - ld e,a - ld c,_CONOUT - call DO_DOS - pop af - cp 10 - jr z,R_FLUSH2 - jr R_FLUSH3 - -R_FLUSH_END: call CRLF - ret + ld a,(CONTROL_CON) ;Hay datos sin recoger? + ld b,a + ld hl,0 + ld a,TCPIP_TCP_STATE + call CALL_UNAPI + or a + ret z + ld a,h + or l + jr nz,R_FLUSH2! + + ld a,(GCDATA_COUNT) ;Hay datos recogidos pero no consumidos? + or a + ret z + +R_FLUSH2!: print FLUSHED_S +R_FLUSH3: call GET_CDATA + jr c,R_FLUSH_END + push af + ld e,a + ld c,_CONOUT + call DO_DOS + pop af + cp 10 + jr z,R_FLUSH2 + jr R_FLUSH3 + +R_FLUSH_END: call CRLF + ret ;------------- ;--- GET --- ;------------- -R_GET: ld a,4 - ld (ABORT_STAT),a - - ld hl,C_RETR ;Coge el fichero - ld (RETR_COM),hl - ld hl,USER_COM_BUF+1 ;Error si no hay parametros - ld de,PARSE_BUF - ld a,2 - call EXTPAR - jp c,R_INVPAR - - call CLOSE_FILE ;Crea el fichero - ld c,_CREATE - ld de,PARSE_BUF - xor a - ld b,0 - call DOS - ret c - ld a,b - ld (FILE_FH),a - - ld hl,C_RETR ;Coge el fichero - ld (RETR_COM),hl - ld a,2 - ld (RETR_PAR),a - xor a - ld (MUST_ASCII),a - jp RETRIEVE +R_GET: ld a,4 + ld (ABORT_STAT),a + + ld hl,C_RETR ;Coge el fichero + ld (RETR_COM),hl + ld hl,USER_COM_BUF+1 ;Error si no hay parametros + ld de,PARSE_BUF + ld a,2 + call EXTPAR + jp c,R_INVPAR + + call CLOSE_FILE ;Crea el fichero + ld c,_CREATE + ld de,PARSE_BUF + xor a + ld b,0 + call DOS + ret c + ld a,b + ld (FILE_FH),a + + ld hl,C_RETR ;Coge el fichero + ld (RETR_COM),hl + ld a,2 + ld (RETR_PAR),a + xor a + ld (MUST_ASCII),a + jp RETRIEVE ;-------------- ;--- HASH --- ;-------------- -R_HASH: ld a,3 - ld (ABORT_STAT),a +R_HASH: ld a,3 + ld (ABORT_STAT),a - ld hl,HASH - ld de,HASH_M_S - jp TURN_ON_OFF + ld hl,HASH + ld de,HASH_M_S + jp TURN_ON_OFF ;------------- ;--- LCD --- ;------------- -R_LCD: ld a,3 - ld (ABORT_STAT),a +R_LCD: ld a,3 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,RESPONSE_BUF - ld a,2 - call EXTPAR - jr nc,LCD_SET + ld hl,USER_COM_BUF+1 + ld de,RESPONSE_BUF + ld a,2 + call EXTPAR + jr nc,LCD_SET - ;--- No se ha especificado parametro: - ; muestra unidad+dir actual + ;--- No se ha especificado parametro: + ; muestra unidad+dir actual - print CURPATH_S - jp PRINT_PATH + print CURPATH_S + jp PRINT_PATH - ;--- Se ha especificado parametro: - ; Establece unidad y/o directorio + ;--- Se ha especificado parametro: + ; Establece unidad y/o directorio -LCD_SET: ld c,_PARSE - ld b,0 - ld de,RESPONSE_BUF - call DO_DOS +LCD_SET: ld c,_PARSE + ld b,0 + ld de,RESPONSE_BUF + call DO_DOS - bit 2,b - ld de,RESPONSE_BUF - ld h,b - jr z,LCD_NODRIVE + bit 2,b + ld de,RESPONSE_BUF + ld h,b + jr z,LCD_NODRIVE - push bc - ld e,c ;Establece unidad - dec e - ld c,_SELDSK - call DO_DOS - ld c,_ERROR - call DO_DOS - pop hl - ld a,b - or a - jp nz,DOS2 - ld de,RESPONSE_BUF+2 + push bc + ld e,c ;Establece unidad + dec e + ld c,_SELDSK + call DO_DOS + ld c,_ERROR + call DO_DOS + pop hl + ld a,b + or a + jp nz,DOS2 + ld de,RESPONSE_BUF+2 -LCD_NODRIVE: ; - bit 0,h - jr z,LCD_NOPATH +LCD_NODRIVE: ; + bit 0,h + jr z,LCD_NOPATH - ld c,_CHDIR ;Establece directorio - call DOS - ret c + ld c,_CHDIR ;Establece directorio + call DOS + ret c -LCD_END: print PATHCHAN_S - jp PRINT_PATH +LCD_END: print PATHCHAN_S + jp PRINT_PATH -LCD_NOPATH: ld a,"\" ;Si se especifica unidad pero no dir, - ld (RESPONSE_BUF+2),a ;se muestra el dir actual - ld c,_GETCD - ld de,RESPONSE_BUF+3 - ld c,_GETCD - call DO_DOS +LCD_NOPATH: ld a,"\" ;Si se especifica unidad pero no dir, + ld (RESPONSE_BUF+2),a ;se muestra el dir actual + ld c,_GETCD + ld de,RESPONSE_BUF+3 + ld c,_GETCD + call DO_DOS - jr LCD_END + jr LCD_END ;----------------- ;--- LDELETE --- ;----------------- -R_LDELETE: ;ld a,#FF - ;ld (LDIR_EXE),a - call _R_LDELETE - xor a - ld (LDIR_EXE),a - ret - -_R_LDELETE: ld a,4 - ld (ABORT_STAT),a - - xor a - ld (ALSO_RONLY),a - ld (BORRALGUNO),a - ld a,(PROMPT) - cpl - ld (ALLFILES),a - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF ;Extrae nombre(s) - ld a,2 - call EXTPAR - jp c,R_INVPAR - - ld hl,USER_COM_BUF+1 ;Busca parametro "R", - ld de,RESPONSE_BUF ;si lo encuentra establece ALSO_RONLY - ld a,3 - call EXTPAR - jr c,RLDEL2 - ld a,(RESPONSE_BUF+1) - or a - jp nz,R_INVPAR - ld a,(RESPONSE_BUF) - or %00100000 - cp "r" - jp nz,R_INVPAR - ld a,#FF - ld (ALSO_RONLY),a -RLDEL2: ; - - ;--- Busca el primer (o siguiente) fichero disponible - - ld c,_FFIRST - ld de,PARSE_BUF - ld b,%00111 ;Incluye ficheros ocultos y de sistema -R_LDELLOOP: ld ix,USER_COM_BUF+1 - call DOS ;Realiza la busqueda - jr c,R_LDELEND - ld a,#FF ;Solo imprimira "file not found" - ld (LDIR_EXE),a ;si no encuentra el primero - - ;--- Comprueba si es de solo lectura, - ; en ese caso se lo salta si ALSO_RONLY=0 - - ld a,(USER_COM_BUF+15) - bit 0,a - jr z,LDEL_NORO - - ld a,(ALSO_RONLY) - or a - jr z,LDEL_NODEL -LDEL_NORO: ; - - ;--- Si ALLFILES=#FF, pregunta - ; si se quiere borrar; si no, lo borra directamente - - ld a,(ALLFILES) - or a - jr nz,LDEL_DEL - - print DELETE_S - printz USER_COM_BUF+2 - call ASK_YNAC - or a - jr z,LDEL_DEL - cp 1 - jr z,LDEL_NODEL - cp 3 - jr z,LDEL_CANCEL - ld a,#FF - ld (ALLFILES),a - - ;--- Borrar fichero: primero le quita - ; el atributo de solo lectura si lo tiene - -LDEL_DEL: ld a,(USER_COM_BUF+15) - bit 0,a - jr z,LDEL_DEL2 - ld l,a - res 0,l - ld c,_ATTR - ld de,USER_COM_BUF+1 ;Quita el atributo "Read only" - ld a,1 - call DOS - ret c - -LDEL_DEL2: ld de,USER_COM_BUF+1 ;Borra el fichero - ld c,_DELETE - call DOS - ret c - ld a,#FF - ld (BORRALGUNO),a - - ;--- Pasa al siguiente fichero - -LDEL_NODEL: ld c,_FNEXT - jp R_LDELLOOP - - ;--- Proceso completado - -R_LDELEND: ld a,(LDIR_EXE) - or a - ret z - ld a,(BORRALGUNO) - or a - ret z - print OPCOMP_S - ret - - ;--- Finalizacion - -LDEL_CANCEL: print OPCAN_S - ret - -BORRALGUNO: db 0 ;Al final sera 0 si no se ha borrado nada +R_LDELETE: ;ld a,#FF + ;ld (LDIR_EXE),a + call _R_LDELETE + xor a + ld (LDIR_EXE),a + ret + +_R_LDELETE: ld a,4 + ld (ABORT_STAT),a + + xor a + ld (ALSO_RONLY),a + ld (BORRALGUNO),a + ld a,(PROMPT) + cpl + ld (ALLFILES),a + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF ;Extrae nombre(s) + ld a,2 + call EXTPAR + jp c,R_INVPAR + + ld hl,USER_COM_BUF+1 ;Busca parametro "R", + ld de,RESPONSE_BUF ;si lo encuentra establece ALSO_RONLY + ld a,3 + call EXTPAR + jr c,RLDEL2 + ld a,(RESPONSE_BUF+1) + or a + jp nz,R_INVPAR + ld a,(RESPONSE_BUF) + or %00100000 + cp "r" + jp nz,R_INVPAR + ld a,#FF + ld (ALSO_RONLY),a +RLDEL2: ; + + ;--- Busca el primer (o siguiente) fichero disponible + + ld c,_FFIRST + ld de,PARSE_BUF + ld b,%00111 ;Incluye ficheros ocultos y de sistema +R_LDELLOOP: ld ix,USER_COM_BUF+1 + call DOS ;Realiza la busqueda + jr c,R_LDELEND + ld a,#FF ;Solo imprimira "file not found" + ld (LDIR_EXE),a ;si no encuentra el primero + + ;--- Comprueba si es de solo lectura, + ; en ese caso se lo salta si ALSO_RONLY=0 + + ld a,(USER_COM_BUF+15) + bit 0,a + jr z,LDEL_NORO + + ld a,(ALSO_RONLY) + or a + jr z,LDEL_NODEL +LDEL_NORO: ; + + ;--- Si ALLFILES=#FF, pregunta + ; si se quiere borrar; si no, lo borra directamente + + ld a,(ALLFILES) + or a + jr nz,LDEL_DEL + + print DELETE_S + printz USER_COM_BUF+2 + call ASK_YNAC + or a + jr z,LDEL_DEL + cp 1 + jr z,LDEL_NODEL + cp 3 + jr z,LDEL_CANCEL + ld a,#FF + ld (ALLFILES),a + + ;--- Borrar fichero: primero le quita + ; el atributo de solo lectura si lo tiene + +LDEL_DEL: ld a,(USER_COM_BUF+15) + bit 0,a + jr z,LDEL_DEL2 + ld l,a + res 0,l + ld c,_ATTR + ld de,USER_COM_BUF+1 ;Quita el atributo "Read only" + ld a,1 + call DOS + ret c + +LDEL_DEL2: ld de,USER_COM_BUF+1 ;Borra el fichero + ld c,_DELETE + call DOS + ret c + ld a,#FF + ld (BORRALGUNO),a + + ;--- Pasa al siguiente fichero + +LDEL_NODEL: ld c,_FNEXT + jp R_LDELLOOP + + ;--- Proceso completado + +R_LDELEND: ld a,(LDIR_EXE) + or a + ret z + ld a,(BORRALGUNO) + or a + ret z + print OPCOMP_S + ret + + ;--- Finalizacion + +LDEL_CANCEL: print OPCAN_S + ret + +BORRALGUNO: db 0 ;Al final sera 0 si no se ha borrado nada ;-------------- ;--- LDIR --- ;-------------- -R_LDIR: ld a,#FF - ld (LDIR_EXE),a - call _R_LDIR - xor a - ld (LDIR_EXE),a - ret - -_R_LDIR: ld a,3 - ld (ABORT_STAT),a - - xor a - ld (RESPONSE_BUF),a ;Extrae mascara - ld hl,USER_COM_BUF+1 - ld de,RESPONSE_BUF - ld a,2 - call EXTPAR - - ld de,RESPONSE_BUF ;Obtiene unidad a la que se refiere la mascara - ld b,0 - ld c,_PARSE - call DO_DOS - ld a,c - ld (LDIR_DRV),a - - ;print DIROF_S ;Muestra "Directory of "+ruta - ;call PRINT_PATH - call CRLF - ld hl,0 - ld (LDIR_FILES),hl - ld (LDIR_DIRS),hl - - ld c,_FFIRST - ld de,RESPONSE_BUF - ld b,%10111 ;Incluye directorios, ocultos y de sistema -R_LDIRLOOP: ld ix,USER_COM_BUF+1 - call DOS ;Realiza la busqueda - jp c,LDIR_END - - ld hl,USER_COM_BUF+2-1 ;Ajusta nombre de fichero - ld b,12 ;para que ocupe exatamente 12 caracteres -R_LDIRLOP2: inc hl ;(rellena con espacios) - ld a,(hl) - or a - jr z,R_LDIRLOP3 - djnz R_LDIRLOP2 - jr R_LDIRLOP4 -R_LDIRLOP3: ld (hl)," " - inc hl - djnz R_LDIRLOP3 -R_LDIRLOP4: xor a - ld (USER_COM_BUF+2+12),a - printz USER_COM_BUF+2 - - ld a," " - ld (ATRIB_S+1),a - ld (ATRIB_S+2),a - ld (ATRIB_S+3),a - ld a,(USER_COM_BUF+15) ;Imprime atributos - bit 0,a - jr z,LDIR_AT1 - push af - ld a,"r" ;Read only - ld (ATRIB_S+1),a - pop af -LDIR_AT1: bit 1,a - jr z,LDIR_AT2 - push af - ld a,"h" ;Hidden - ld (ATRIB_S+2),a - pop af -LDIR_AT2: bit 2,a - jr z,LDIR_AT3 - push af - ld a,"s" ;System - ld (ATRIB_S+3),a - pop af -LDIR_AT3: push af - print ATRIB_S - pop af - - bit 4,a - jr z,LDIR_ESFILE -LDIR_ESDIR: ;Es directorio? Imprime "" - print ESDIR_S - ld hl,(LDIR_DIRS) - inc hl - ld (LDIR_DIRS),hl - jr LDIR_OKFILE - -LDIR_ESFILE: ld hl,(LDIR_FILES) ;Es fichero? Imprime tamanyo - inc hl - ld (LDIR_FILES),hl - ld ix,USER_COM_BUF+22 ;IX=Tamanyo del fichero - ld a,(ix+2) - or (ix+3) - ld e,(ix) - ld d,(ix+1) - jr z,LDIR_PEQUEN ;"Grande" si es mayor de 64K - ;ld a,(ix+1) - ;and %11000000 - ;ld e,(ix) - ;ld d,(ix+1) - ;jr z,LDIR_PEQUEN - -LDIR_GRANDE: ld a,(ix+3) ;A-DE = Tamanyo en unidades de 256 bytes - ld e,(ix+1) - ld d,(ix+2) - sra a ;Lo convierte a K - rr d - rr e - sra a - rr d - rr e - inc de - scf - -LDIR_PEQUEN: ;Aqui, DE es el tamanyo a imprimir, y Cy=1 si es "K" - ld hl,RESPONSE_BUF - ld b,7 - ld c," " - push af - ld a,%1000 - call NUMTOASC - print RESPONSE_BUF - pop af - jr nc,LDIR_OKFILE - ld e,"K" - ld c,_CONOUT - call DO_DOS - -LDIR_OKFILE: call CRLF - ld c,_FNEXT - jp R_LDIRLOOP - -LDIR_END: ld (LDIR_ERRNUM),a - ld hl,(LDIR_DIRS) - ld de,(LDIR_FILES) - ld a,d - or e - or h - or l - call nz,CRLF - ld hl,RESPONSE_BUF ;Fin: muestra num de dirs y files encontrados - ld de,(LDIR_FILES) - ld b,1 - ld a,%1000 - call NUMTOASC - print RESPONSE_BUF - print FFOUND_S - - ld hl,RESPONSE_BUF - ld de,(LDIR_DIRS) - ld b,1 - ld a,%1000 - call NUMTOASC - print RESPONSE_BUF - print DFOUND_S - - ld a,(LDIR_ERRNUM) ;Si el error no era "file not found", - cp #D7 ;no calcula espacio libre - jr nz,LDIR_ENDL3 - - ld a,(LDIR_DRV) ;Consulta espacio libre en la unidad - ld e,a - ld c,_ALLOC - call DO_DOS - -LDIR_ENDL: sra a ;Convierte clusters a sectores - jr c,LDIR_ENDL2 - sla l - rl h - jr nc,LDIR_ENDL -LDIR_ENDL2: srl h ;Convierte sectores a K - rr l - - ex de,hl ;Muestra "XXX K free on drive X:" - ld hl,RESPONSE_BUF - ld b,1 - ld a,%1000 - call NUMTOASC - print RESPONSE_BUF - print KFREE_S - ld a,(LDIR_DRV) - add "A"-1 - ld e,a - ld c,_CONOUT - call DO_DOS - ld e,":" - ld c,_CONOUT - call DO_DOS - call CRLF -LDIR_ENDL3: jp LF - - -LDIR_EXE: db 0 -LDIR_FILES: dw 0 -LDIR_DIRS: dw 0 -LDIR_DRV: db 0 -ATRIB_S: db 9,"rhs",9,"$" -LDIR_ERRNUM: db 0 +R_LDIR: ld a,#FF + ld (LDIR_EXE),a + call _R_LDIR + xor a + ld (LDIR_EXE),a + ret + +_R_LDIR: ld a,3 + ld (ABORT_STAT),a + + xor a + ld (RESPONSE_BUF),a ;Extrae mascara + ld hl,USER_COM_BUF+1 + ld de,RESPONSE_BUF + ld a,2 + call EXTPAR + + ld de,RESPONSE_BUF ;Obtiene unidad a la que se refiere la mascara + ld b,0 + ld c,_PARSE + call DO_DOS + ld a,c + ld (LDIR_DRV),a + + ;print DIROF_S ;Muestra "Directory of "+ruta + ;call PRINT_PATH + call CRLF + ld hl,0 + ld (LDIR_FILES),hl + ld (LDIR_DIRS),hl + + ld c,_FFIRST + ld de,RESPONSE_BUF + ld b,%10111 ;Incluye directorios, ocultos y de sistema +R_LDIRLOOP: ld ix,USER_COM_BUF+1 + call DOS ;Realiza la busqueda + jp c,LDIR_END + + ld hl,USER_COM_BUF+2-1 ;Ajusta nombre de fichero + ld b,12 ;para que ocupe exatamente 12 caracteres +R_LDIRLOP2: inc hl ;(rellena con espacios) + ld a,(hl) + or a + jr z,R_LDIRLOP3 + djnz R_LDIRLOP2 + jr R_LDIRLOP4 +R_LDIRLOP3: ld (hl)," " + inc hl + djnz R_LDIRLOP3 +R_LDIRLOP4: xor a + ld (USER_COM_BUF+2+12),a + printz USER_COM_BUF+2 + + ld a," " + ld (ATRIB_S+1),a + ld (ATRIB_S+2),a + ld (ATRIB_S+3),a + ld a,(USER_COM_BUF+15) ;Imprime atributos + bit 0,a + jr z,LDIR_AT1 + push af + ld a,"r" ;Read only + ld (ATRIB_S+1),a + pop af +LDIR_AT1: bit 1,a + jr z,LDIR_AT2 + push af + ld a,"h" ;Hidden + ld (ATRIB_S+2),a + pop af +LDIR_AT2: bit 2,a + jr z,LDIR_AT3 + push af + ld a,"s" ;System + ld (ATRIB_S+3),a + pop af +LDIR_AT3: push af + print ATRIB_S + pop af + + bit 4,a + jr z,LDIR_ESFILE +LDIR_ESDIR: ;Es directorio? Imprime "" + print ESDIR_S + ld hl,(LDIR_DIRS) + inc hl + ld (LDIR_DIRS),hl + jr LDIR_OKFILE + +LDIR_ESFILE: ld hl,(LDIR_FILES) ;Es fichero? Imprime tamanyo + inc hl + ld (LDIR_FILES),hl + ld ix,USER_COM_BUF+22 ;IX=Tamanyo del fichero + ld a,(ix+2) + or (ix+3) + ld e,(ix) + ld d,(ix+1) + jr z,LDIR_PEQUEN ;"Grande" si es mayor de 64K + ;ld a,(ix+1) + ;and %11000000 + ;ld e,(ix) + ;ld d,(ix+1) + ;jr z,LDIR_PEQUEN + +LDIR_GRANDE: ld a,(ix+3) ;A-DE = Tamanyo en unidades de 256 bytes + ld e,(ix+1) + ld d,(ix+2) + sra a ;Lo convierte a K + rr d + rr e + sra a + rr d + rr e + inc de + scf + +LDIR_PEQUEN: ;Aqui, DE es el tamanyo a imprimir, y Cy=1 si es "K" + ld hl,RESPONSE_BUF + ld b,7 + ld c," " + push af + ld a,%1000 + call NUMTOASC + print RESPONSE_BUF + pop af + jr nc,LDIR_OKFILE + ld e,"K" + ld c,_CONOUT + call DO_DOS + +LDIR_OKFILE: call CRLF + ld c,_FNEXT + jp R_LDIRLOOP + +LDIR_END: ld (LDIR_ERRNUM),a + ld hl,(LDIR_DIRS) + ld de,(LDIR_FILES) + ld a,d + or e + or h + or l + call nz,CRLF + ld hl,RESPONSE_BUF ;Fin: muestra num de dirs y files encontrados + ld de,(LDIR_FILES) + ld b,1 + ld a,%1000 + call NUMTOASC + print RESPONSE_BUF + print FFOUND_S + + ld hl,RESPONSE_BUF + ld de,(LDIR_DIRS) + ld b,1 + ld a,%1000 + call NUMTOASC + print RESPONSE_BUF + print DFOUND_S + + ld a,(LDIR_ERRNUM) ;Si el error no era "file not found", + cp #D7 ;no calcula espacio libre + jr nz,LDIR_ENDL3 + + ld a,(LDIR_DRV) ;Consulta espacio libre en la unidad + ld e,a + ld c,_ALLOC + call DO_DOS + +LDIR_ENDL: sra a ;Convierte clusters a sectores + jr c,LDIR_ENDL2 + sla l + rl h + jr nc,LDIR_ENDL +LDIR_ENDL2: srl h ;Convierte sectores a K + rr l + + ex de,hl ;Muestra "XXX K free on drive X:" + ld hl,RESPONSE_BUF + ld b,1 + ld a,%1000 + call NUMTOASC + print RESPONSE_BUF + print KFREE_S + ld a,(LDIR_DRV) + add "A"-1 + ld e,a + ld c,_CONOUT + call DO_DOS + ld e,":" + ld c,_CONOUT + call DO_DOS + call CRLF +LDIR_ENDL3: jp LF + + +LDIR_EXE: db 0 +LDIR_FILES: dw 0 +LDIR_DIRS: dw 0 +LDIR_DRV: db 0 +ATRIB_S: db 9,"rhs",9,"$" +LDIR_ERRNUM: db 0 ;----------------- ;--- LITERAL --- ;----------------- -R_LITERAL: call CHK_CON - ret c - - ld a,4 - ld (ABORT_STAT),a - - ld a,2 ;Va cogiendo los elementos de la cadena - ;ld hl,USER_COM_BUF+1 ;pasada por el usuario, y los - ld de,SEND_COM_BUF ;copia a SEND_COM_BUF -LITELOOP: push af,de ;separados con un espacio - ld hl,USER_COM_BUF+1 - call EXTPAR - pop hl - jr c,LITERAL2 - ld c,b - ld b,0 - add hl,bc - ld (hl)," " - inc hl - ex de,hl - pop af - inc a - jr LITELOOP - -LITERAL2: pop af - dec hl - ld (hl),0 - call APPEND_LF - call SEND_COM - jp WAIT_REPLY +R_LITERAL: call CHK_CON + ret c + + ld a,4 + ld (ABORT_STAT),a + + ld a,2 ;Va cogiendo los elementos de la cadena + ;ld hl,USER_COM_BUF+1 ;pasada por el usuario, y los + ld de,SEND_COM_BUF ;copia a SEND_COM_BUF +LITELOOP: push af,de ;separados con un espacio + ld hl,USER_COM_BUF+1 + call EXTPAR + pop hl + jr c,LITERAL2 + ld c,b + ld b,0 + add hl,bc + ld (hl)," " + inc hl + ex de,hl + pop af + inc a + jr LITELOOP + +LITERAL2: pop af + dec hl + ld (hl),0 + call APPEND_LF + call SEND_COM + jp WAIT_REPLY ;----------- ;--- ! --- ;----------- -R_LITERAL!: call CHK_CON - ret c +R_LITERAL!: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld a,1 ;Como LITERAL, pero empieza por el primer - ;ld hl,USER_COM_BUF+1 ;elemento de la cadena - ld de,SEND_COM_BUF-1 ;excepto el "!" inicial - jr LITELOOP + ld a,1 ;Como LITERAL, pero empieza por el primer + ;ld hl,USER_COM_BUF+1 ;elemento de la cadena + ld de,SEND_COM_BUF-1 ;excepto el "!" inicial + jr LITELOOP ;---------------- ;--- LMKDIR --- ;---------------- -R_LMKDIR: ld a,3 - ld (ABORT_STAT),a +R_LMKDIR: ld a,3 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,2 - call EXTPAR - jp c,R_INVPAR + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,2 + call EXTPAR + jp c,R_INVPAR - ld c,_CREATE - ld de,PARSE_BUF - xor a - ld b,%10000 - call DOS - ret c + ld c,_CREATE + ld de,PARSE_BUF + xor a + ld b,%10000 + call DOS + ret c - print OPCOMP_S - ret + print OPCOMP_S + ret ;----------------- ;--- LRENAME --- ;----------------- -R_LRENAME: ;ld a,#FF - ;ld (LDIR_EXE),a - call _R_LRENAME - xor a - ld (LDIR_EXE),a - ret - -_R_LRENAME: ld a,3 - ld (ABORT_STAT),a - - ld hl,USER_COM_BUF+1 - ld de,RESPONSE_BUF ;Extrae nombre(s) de destino - ld a,3 - call EXTPAR - jp c,R_INVPAR - - ld hl,USER_COM_BUF+1 ;Extrae nombre(s) de origen - ld de,PARSE_BUF - ld a,2 - call EXTPAR - - ld c,_FFIRST - ld de,PARSE_BUF - ld b,%00111 ;Incluye ficheros ocultos y de sistema -R_LRENLOOP: ld ix,USER_COM_BUF+1 - call DOS ;Realiza la busqueda - jr c,R_LRENEND - ld a,#FF ;Solo imprimira "file not found" - ld (LDIR_EXE),a ;si no encuentra el primero - - ld de,USER_COM_BUF+1 ;Renombra cada fichero encontrado - ld hl,RESPONSE_BUF - ld c,_RENAME - call DOS - ret c - - ld c,_FNEXT - jr R_LRENLOOP - -R_LRENEND: ld a,(LDIR_EXE) - or a - ret z - print OPCOMP_S - ret +R_LRENAME: ;ld a,#FF + ;ld (LDIR_EXE),a + call _R_LRENAME + xor a + ld (LDIR_EXE),a + ret + +_R_LRENAME: ld a,3 + ld (ABORT_STAT),a + + ld hl,USER_COM_BUF+1 + ld de,RESPONSE_BUF ;Extrae nombre(s) de destino + ld a,3 + call EXTPAR + jp c,R_INVPAR + + ld hl,USER_COM_BUF+1 ;Extrae nombre(s) de origen + ld de,PARSE_BUF + ld a,2 + call EXTPAR + + ld c,_FFIRST + ld de,PARSE_BUF + ld b,%00111 ;Incluye ficheros ocultos y de sistema +R_LRENLOOP: ld ix,USER_COM_BUF+1 + call DOS ;Realiza la busqueda + jr c,R_LRENEND + ld a,#FF ;Solo imprimira "file not found" + ld (LDIR_EXE),a ;si no encuentra el primero + + ld de,USER_COM_BUF+1 ;Renombra cada fichero encontrado + ld hl,RESPONSE_BUF + ld c,_RENAME + call DOS + ret c + + ld c,_FNEXT + jr R_LRENLOOP + +R_LRENEND: ld a,(LDIR_EXE) + or a + ret z + print OPCOMP_S + ret ;---------------- ;--- LRMDIR --- ;---------------- -R_LRMDIR: ld a,3 - ld (ABORT_STAT),a - - ld hl,USER_COM_BUF+1 - ld de,RESPONSE_BUF ;Extrae nombre de directorio - ld a,2 - call EXTPAR - jp c,R_INVPAR - - ld de,RESPONSE_BUF ;Si hay comodines, error "Invalid filename" - ld b,0 - ld c,_PARSE - call DO_DOS - bit 5,b - ld a,#DA ;"Invalid filename" - jp nz,DOS2 - - ld c,_FFIRST ;Error si no encuentra el fichero/directorio - ld de,RESPONSE_BUF ;con ese nombre, o si lo encuentra pero - ld b,%10111 ;es un fichero - ld ix,USER_COM_BUF+1 - call DOS - ret c - ld a,(USER_COM_BUF+15) - bit 4,a - ld a,#D6 ;"Directory not found" - jp z,DOS2 - - ld de,USER_COM_BUF+1 ;Intenta borrar el directorio - ld c,_DELETE - call DOS - ret c - - print OPCOMP_S - ret +R_LRMDIR: ld a,3 + ld (ABORT_STAT),a + + ld hl,USER_COM_BUF+1 + ld de,RESPONSE_BUF ;Extrae nombre de directorio + ld a,2 + call EXTPAR + jp c,R_INVPAR + + ld de,RESPONSE_BUF ;Si hay comodines, error "Invalid filename" + ld b,0 + ld c,_PARSE + call DO_DOS + bit 5,b + ld a,#DA ;"Invalid filename" + jp nz,DOS2 + + ld c,_FFIRST ;Error si no encuentra el fichero/directorio + ld de,RESPONSE_BUF ;con ese nombre, o si lo encuentra pero + ld b,%10111 ;es un fichero + ld ix,USER_COM_BUF+1 + call DOS + ret c + ld a,(USER_COM_BUF+15) + bit 4,a + ld a,#D6 ;"Directory not found" + jp z,DOS2 + + ld de,USER_COM_BUF+1 ;Intenta borrar el directorio + ld c,_DELETE + call DOS + ret c + + print OPCOMP_S + ret ;------------ ;--- LS --- ;------------ -R_LS: ld hl,C_NLST +R_LS: ld hl,C_NLST - jp R_DIR_LS + jp R_DIR_LS ;--------------- ;--- LSHOW --- ;--------------- -R_LSHOW: ld a,3 - ld (ABORT_STAT),a - - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF ;Extrae nombre de fichero - ld a,2 - call EXTPAR - jp c,R_INVPAR - - ld de,PARSE_BUF ;Si hay comodines, error "Invalid filename" - ld b,0 - ld c,_PARSE - call DO_DOS - bit 5,b - ld a,#DA ;"Invalid filename" - jp nz,DOS2 - - ld a,(FILE_FH) ;Si ya hay un fichero abierto, - cp #FF ;lo cierra primero (no deberia pasar nunca) - jr z,R_LSHOW_OK1 - ld c,_CLOSE - ld b,a - call DO_DOS -R_LSHOW_OK1: ; - - ld a,1 ;Abre el fichero, termina si hay error - ld de,PARSE_BUF - ld c,_OPEN - call DOS - ret c - ld a,b - ld (FILE_FH),a - -R_LSHOW_LOOP1: xor a - ld (LINE_COUNT),a - ld (BYTE_COUNT),a - -R_LSHOW_LOOP: call GET_LDATA ;Obtiene un byte y lo imprime - jr c,GET_LSHOW_END - call PRINT_PAUSE - jr R_LSHOW_LOOP - -GET_LSHOW_END: ld a,(FILE_FH) ;No quedan datos: cierra el fichero - ld b,a - ld c,_CLOSE - call DO_DOS - ld a,#FF - ld (FILE_FH),a - ret +R_LSHOW: ld a,3 + ld (ABORT_STAT),a + + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF ;Extrae nombre de fichero + ld a,2 + call EXTPAR + jp c,R_INVPAR + + ld de,PARSE_BUF ;Si hay comodines, error "Invalid filename" + ld b,0 + ld c,_PARSE + call DO_DOS + bit 5,b + ld a,#DA ;"Invalid filename" + jp nz,DOS2 + + ld a,(FILE_FH) ;Si ya hay un fichero abierto, + cp #FF ;lo cierra primero (no deberia pasar nunca) + jr z,R_LSHOW_OK1 + ld c,_CLOSE + ld b,a + call DO_DOS +R_LSHOW_OK1: ; + + ld a,1 ;Abre el fichero, termina si hay error + ld de,PARSE_BUF + ld c,_OPEN + call DOS + ret c + ld a,b + ld (FILE_FH),a + +R_LSHOW_LOOP1: xor a + ld (LINE_COUNT),a + ld (BYTE_COUNT),a + +R_LSHOW_LOOP: call GET_LDATA ;Obtiene un byte y lo imprime + jr c,GET_LSHOW_END + call PRINT_PAUSE + jr R_LSHOW_LOOP + +GET_LSHOW_END: ld a,(FILE_FH) ;No quedan datos: cierra el fichero + ld b,a + ld c,_CLOSE + call DO_DOS + ld a,#FF + ld (FILE_FH),a + ret ;----------------- ;--- MDELETE --- ;----------------- -R_MDELETE: ld a,(HAY_NMAN) - or a - jr nz,R_MDEL2 +R_MDELETE: ld a,(HAY_NMAN) + or a + jr nz,R_MDEL2 - print NONMAN_S - ret + print NONMAN_S + ret -R_MDEL2: ld hl,R_DELETE - ld (MUL_COM),hl - ld hl,DELETER_S - ld (MUL_STR),hl - jp MULTIPLE +R_MDEL2: ld hl,R_DELETE + ld (MUL_COM),hl + ld hl,DELETER_S + ld (MUL_STR),hl + jp MULTIPLE ;-------------- ;--- MGET --- ;-------------- -R_MGET: ld a,(HAY_NMAN) - or a - jr nz,R_MGET2 +R_MGET: ld a,(HAY_NMAN) + or a + jr nz,R_MGET2 - print NONMAN_S - ret + print NONMAN_S + ret -R_MGET2: ld hl,R_GET - ld (MUL_COM),hl - ld hl,RECEIVE_S - ld (MUL_STR),hl - jp MULTIPLE +R_MGET2: ld hl,R_GET + ld (MUL_COM),hl + ld hl,RECEIVE_S + ld (MUL_STR),hl + jp MULTIPLE ;--------------- ;--- MKDIR --- ;--------------- -R_MKDIR: call CHK_CON - ret c +R_MKDIR: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld a,#FF - ld (ES_XCOM),a - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+4 - ld a,2 - call EXTPAR - ld hl,C_MKD - jp nc,PARAM_XCOM - jp R_INVPAR + ld a,#FF + ld (ES_XCOM),a + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+4 + ld a,2 + call EXTPAR + ld hl,C_MKD + jp nc,PARAM_XCOM + jp R_INVPAR ;-------------- ;--- MPUT --- ;-------------- -R_MPUT: ld a,(HAY_NMAN) - or a - jr nz,R_MPUT2 - - print NONMAN_S - ret - -R_MPUT2: ld a,4 - ld (ABORT_STAT),a - - ld a,#FF - ld (LDIR_EXE),a - ld a,(VERBOSE) - ld (OLD_VERBOSE_M),a - call _R_MPUT - xor a - ld (LDIR_EXE),a - ld a,(MUL_LISTA) - ld ix,0 - nesman 22 - ld a,#FF - ld (MUL_LISTA),a - ld a,(OLD_VERBOSE_M) - ld (VERBOSE),a - ret - -_R_MPUT: call CHK_CON - ret c - - ld hl,USER_COM_BUF+1 - ld de,RESPONSE_BUF ;Extrae mascara - ld a,2 - call EXTPAR - jp c,R_INVPAR - - or a ;Crea lista interna - nesman 20 - jr c,R_MPUT_OOME - ld (MUL_LISTA),a - - ;--- Primero busca todos los archivos y guarda - ; sus nombres en la lista - - ld c,_FFIRST - ld de,RESPONSE_BUF - ld b,0 -R_MPUTLOOP1: ld ix,USER_COM_BUF+1 - call DOS ;Realiza la busqueda - jp c,RMPUT_OKLIST - - ld a,(MUL_LISTA) - ld ix,0 - ld b,3 - ld hl,13 - ld iy,USER_COM_BUF+2 - nesman 24 - jr c,R_MPUT_OOME - ld c,_FNEXT - jr R_MPUTLOOP1 -RMPUT_OKLIST: ; - - ;--- Ya tenemos los nombres, ahora saltamos a MULTIPLE - - xor a - ld (MUST_ASCII),a - - ld hl,R_SEND - ld (MUL_COM),hl - ld hl,SENDFILE_S - ld (MUL_STR),hl - - jp MULTIPLE2 - -R_MPUT_OOME: print OUTOFM_S - ret +R_MPUT: ld a,(HAY_NMAN) + or a + jr nz,R_MPUT2 + + print NONMAN_S + ret + +R_MPUT2: ld a,4 + ld (ABORT_STAT),a + + ld a,#FF + ld (LDIR_EXE),a + ld a,(VERBOSE) + ld (OLD_VERBOSE_M),a + call _R_MPUT + xor a + ld (LDIR_EXE),a + ld a,(MUL_LISTA) + ld ix,0 + nesman 22 + ld a,#FF + ld (MUL_LISTA),a + ld a,(OLD_VERBOSE_M) + ld (VERBOSE),a + ret + +_R_MPUT: call CHK_CON + ret c + + ld hl,USER_COM_BUF+1 + ld de,RESPONSE_BUF ;Extrae mascara + ld a,2 + call EXTPAR + jp c,R_INVPAR + + or a ;Crea lista interna + nesman 20 + jr c,R_MPUT_OOME + ld (MUL_LISTA),a + + ;--- Primero busca todos los archivos y guarda + ; sus nombres en la lista + + ld c,_FFIRST + ld de,RESPONSE_BUF + ld b,0 +R_MPUTLOOP1: ld ix,USER_COM_BUF+1 + call DOS ;Realiza la busqueda + jp c,RMPUT_OKLIST + + ld a,(MUL_LISTA) + ld ix,0 + ld b,3 + ld hl,13 + ld iy,USER_COM_BUF+2 + nesman 24 + jr c,R_MPUT_OOME + ld c,_FNEXT + jr R_MPUTLOOP1 +RMPUT_OKLIST: ; + + ;--- Ya tenemos los nombres, ahora saltamos a MULTIPLE + + xor a + ld (MUST_ASCII),a + + ld hl,R_SEND + ld (MUL_COM),hl + ld hl,SENDFILE_S + ld (MUL_STR),hl + + jp MULTIPLE2 + +R_MPUT_OOME: print OUTOFM_S + ret ;-------------- ;--- OPEN --- ;-------------- -R_OPEN: ld a,#FF ;Primero actualiza informacion - ld (QUITTING),a ;sobre la conexion - call CHK_CON - ld a,0 - ld (QUITTING),a - jr c,R_OPEN1 - - ld de,ALCON_S ;Ya estamos conectados? - ld c,_STROUT - jp nz,DO_DOS - -R_OPEN1: ld a,4 - ld (ABORT_STAT),a - - ;--- Extrae segundo parametro si lo hay (numero de puerto) - ; y lo establece en el pseudo-TCB - - ld hl,21 ;Puertos por defecto - ld (PORT_REMOTE_C),hl - - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,3 - call EXTPAR - jr c,R_OPEN2 - - ld hl,PARSE_BUF - call EXTNUM - jp c,R_INVPAR - ld a,e - or a - jp nz,R_INVPAR - - ld (PORT_REMOTE_C),bc -R_OPEN2: ; - - ;--- Extrae el primer parametro (nombre de host) - ; y lo resuelve - - ld hl,USER_COM_BUF+1 ;Extrae nombre - ld de,SERVER_NAME - ld a,2 - call EXTPAR - jp c,R_INVPAR - - print CONNECTING_S - - ld b,0 - ld a,TCPIP_DNS_Q - ld hl,SERVER_NAME ;Hace el query al DNS - ;debug "1" - call CALL_UNAPI - ;debug "2" - or a - jr z,R_OPEN_L1 - - ld de,WHENDNS_S ;Error devuelto por IP_DNS_Q? - ld hl,DNSQERRS_T - jp SHOW_ERR - -R_OPEN_L1: ld a,TCPIP_WAIT ;Espera un resultado o un error del DNS - call CALL_UNAPI - ld b,0 - ld a,TCPIP_DNS_S - call CALL_UNAPI - or a - jr nz,R_OPEN_L1! - ld a,b - cp 1 - jr z,R_OPEN_L1 - jr R_OPEN3 +R_OPEN: ld a,#FF ;Primero actualiza informacion + ld (QUITTING),a ;sobre la conexion + call CHK_CON + ld a,0 + ld (QUITTING),a + jr c,R_OPEN1 + + ld de,ALCON_S ;Ya estamos conectados? + ld c,_STROUT + jp nz,DO_DOS + +R_OPEN1: ld a,4 + ld (ABORT_STAT),a + + ;--- Extrae segundo parametro si lo hay (numero de puerto) + ; y lo establece en el pseudo-TCB + + ld hl,21 ;Puertos por defecto + ld (PORT_REMOTE_C),hl + + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,3 + call EXTPAR + jr c,R_OPEN2 + + ld hl,PARSE_BUF + call EXTNUM + jp c,R_INVPAR + ld a,e + or a + jp nz,R_INVPAR + + ld (PORT_REMOTE_C),bc +R_OPEN2: ; + + ;--- Extrae el primer parametro (nombre de host) + ; y lo resuelve + + ld hl,USER_COM_BUF+1 ;Extrae nombre + ld de,SERVER_NAME + ld a,2 + call EXTPAR + jp c,R_INVPAR + + print CONNECTING_S + + ld b,0 + ld a,TCPIP_DNS_Q + ld hl,SERVER_NAME ;Hace el query al DNS + ;debug "1" + call CALL_UNAPI + ;debug "2" + or a + jr z,R_OPEN_L1 + + ld de,WHENDNS_S ;Error devuelto por IP_DNS_Q? + ld hl,DNSQERRS_T + jp SHOW_ERR + +R_OPEN_L1: ld a,TCPIP_WAIT ;Espera un resultado o un error del DNS + call CALL_UNAPI + ld b,0 + ld a,TCPIP_DNS_S + call CALL_UNAPI + or a + jr nz,R_OPEN_L1! + ld a,b + cp 1 + jr z,R_OPEN_L1 + jr R_OPEN3 R_OPEN_L1!: - ld a,b ;Error devuelto por IP_DNS_S? - ld de,WHENDNS_S - ld hl,DNSERRS_T - jp SHOW_ERR - -R_OPEN3: ld (IP_REMOTE_C),hl ;Establece las IPs en los TCBs - ld (IP_REMOTE_C+2),de - - ;--- Abre la conexion de control al servidor FTP - ; y la conexion para el protocolo IDENT - - ld hl,0 - ld de,0 - ld iy,113 ;Conx pasiva a nuestro puerto 113 - ld bc,0 - ld a,#FF - ;debug "3" - call TCP_OPEN - ;debug "4" - jr c,OK_IDENT - ld (IDENT_CON),a -OK_IDENT: ; - - ld hl,(IP_REMOTE_C) - ld de,(IP_REMOTE_C+2) - ld ix,(PORT_REMOTE_C) - ld iy,#FFFF - ld bc,0 - xor a - ;debug "5" - call TCP_OPEN ;Intenta abrir conexion - ;debug "6" - ld b,a - jr nc,R_OPEN_L2! - - push af - ld a,(IDENT_CON) - ;debug "7" - call TCP_ABORT - ;debug "8" - pop af - ld de,WHENCONN_S - ld hl,OPENERR_T - jp SHOW_ERR - -R_OPEN_L2!: ;ld (CONTROL_CON),a ;1.1 -R_OPEN_L2: call IDENT_AUTOM - push bc ;Espera hasta que este ESTABLISHED - call HALT - ld a,b ;o hasta que se cierre ("Error: connection refused") - call TCP_STATUS - pop bc - or a - jr nz,OPENNOREF - - ld a,(IDENT_CON) - call TCP_ABORT - ld a,#FF - ld (IDENT_CON),a - ld de,CONREF_S - ld c,_STROUT - or a - jp DO_DOS - -OPENNOREF: ld d,a - ld a,(#FBEC) ;El bit 2 de #FBEC es 0 - bit 2,a ;cuando se esta pulsando ESC - ld a,d - jr nz,NOOPCANCEL - - ld a,b - call TCP_ABORT - ld a,#FF - ld (CONTROL_CON),a - print CANCELLED_S - ret - -NOOPCANCEL: ;ld a,b - cp 4 - jr nz,R_OPEN_L2 - - ld a,b - ld (CONTROL_CON),a - print OK_S - - ;--- Espera una respuesta que no sea 1yz - -R_OPEN_L3: call IDENT_AUTOM - call WAIT_REPLY - ret c - cp 1 - jr z,R_OPEN_L3 - cp 4 ;Si la respuesta es 4yz, termina - ret z - cp 2 ;Si no es 2yz, "ERROR: Unexpected reply" y fin. - jr z,R_OPEN4 -R_UNEX: print UNEXPEC_S - ret -R_OPEN4: ; - - ;>>> Ahora empieza la secuencia USER - PASSWORD - ACCOUNT. - - call IDENT_AUTOM - ld a,(IDENT_CON) - call TCP_ABORT - - ;--- Pregunta el nombre de usuario, y lo envia mediante comando USER - -_R_USER: print USER._S ;Obtiene nombre de usuario - printz DEF_USER - print CIERRAPAR_S - ld de,USER_COM_BUF - ld c,_BUFIN - call DO_DOS - call CRLF - -_R_USER2: ld hl,C_USER ;Compone "USER usuario"+CRLF en SEND_COM_BUF - call SET_COMMAND - call SET_SPACE - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,1 - call EXTPAR - jr nc,RUSER2 - ld hl,DEF_USER ;DEF_USER si no se escribe nada - ld de,SEND_COM_BUF+5 - ld bc,255 - ldir -RUSER2: call APPEND_LF - - ;debug "1" - call SEND_COM ;Envia comando - ;debug "2" - ret c - - ;debug "3" - call WAIT_REPLY ;Respuesta 2, 4 o 5: termina - ;debug "4" - ret c - cp 4 - ret z - cp 5 - ret z - cp 2 - ret z - cp 3 ;Respuesta 3: continua; otra: error "Unexpected reply" - jp nz,R_UNEX - - ;--- Se requiere contrasenya: se pregunta y se envia - -RPASS2: print PASSWORD._S ;Obtiene password - ;debug "5" - ld a,(DEF_PASSWORD) - or a - ld de,NONE_S - jr z,RPASS2_0 - ld de,DEF_PASSWORD - call SET_HOOK -RPASS2_0: call PRINT_Z - call RESET_HOOK - print CIERRAPAR_S - ld de,USER_COM_BUF - call SET_HOOK - ld c,_BUFIN - call DO_DOS - call RESET_HOOK - - ld hl,C_PASS ;Compone "PASS password"+CRLF en SEND_COM_BUF - call SET_COMMAND - call SET_SPACE - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,1 - call EXTPAR - jr nc,RPASS2_1 - ld a,(DEF_PASSWORD) ;Si no se ha introducido password: - or a ;Comprueba si hay password por - jr z,RPASS2 ;defecto y en ese caso lo usa, - ld hl,DEF_PASSWORD ;en caso contrario vuelve a preguntarlo - ld de,SEND_COM_BUF+5 - ld bc,255 - ldir -RPASS2_1: call APPEND_LF - call LF - - call SEND_COM ;Envia comando - ret c - - call WAIT_REPLY ;Respuesta 2, 4 o 5: termina - ret c - cp 4 - ret z - cp 5 - ret z - cp 2 - ret z - cp 3 ;Respuesta 3: continua; otra: error "Unexpected reply" - jp nz,R_UNEX - - ;--- Se requiere "account": se pregunta y se envia - -RACCT2: print ACCOUNT._S ;Obtiene account - ld a,(DEF_ACCOUNT) - or a - ld de,NONE_S - jr z,RACCT2_0 - ld de,DEF_ACCOUNT -RACCT2_0: call PRINT_Z - print CIERRAPAR_S - ld de,USER_COM_BUF - ld c,_BUFIN - call DO_DOS - - ld hl,C_ACCT ;Compone "ACCT account"+CRLF en SEND_COM_BUF - call SET_COMMAND - call SET_SPACE - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,1 - call EXTPAR - jr nc,RACCT2_1 - ld a,(DEF_ACCOUNT) ;Si no se ha introducido account: - or a ;Comprueba si hay account por - jr z,RACCT2 ;defecto y en ese caso lo usa, - ld hl,DEF_ACCOUNT ;en caso contrario vuelve a preguntarlo - ld de,SEND_COM_BUF+5 - ld bc,255 - ldir -RACCT2_1: call APPEND_LF - call LF - - call SEND_COM ;Envia comando - ret c - - call WAIT_REPLY ;Respuesta 2, 4 o 5: termina - ret c - cp 4 - ret z - cp 5 - ret z - cp 2 - ret z - jp R_UNEX ;Otra: error "Unexpected reply" + ld a,b ;Error devuelto por IP_DNS_S? + ld de,WHENDNS_S + ld hl,DNSERRS_T + jp SHOW_ERR + +R_OPEN3: ld (IP_REMOTE_C),hl ;Establece las IPs en los TCBs + ld (IP_REMOTE_C+2),de + + ;--- Abre la conexion de control al servidor FTP + ; y la conexion para el protocolo IDENT + + ld hl,0 + ld de,0 + ld iy,113 ;Conx pasiva a nuestro puerto 113 + ld bc,0 + ld a,#FF + ;debug "3" + call TCP_OPEN + ;debug "4" + jr c,OK_IDENT + ld (IDENT_CON),a +OK_IDENT: ; + + ld hl,(IP_REMOTE_C) + ld de,(IP_REMOTE_C+2) + ld ix,(PORT_REMOTE_C) + ld iy,#FFFF + ld bc,0 + xor a + ;debug "5" + call TCP_OPEN ;Intenta abrir conexion + ;debug "6" + ld b,a + jr nc,R_OPEN_L2! + + push af + ld a,(IDENT_CON) + ;debug "7" + call TCP_ABORT + ;debug "8" + pop af + ld de,WHENCONN_S + ld hl,OPENERR_T + jp SHOW_ERR + +R_OPEN_L2!: ;ld (CONTROL_CON),a ;1.1 +R_OPEN_L2: call IDENT_AUTOM + push bc ;Espera hasta que este ESTABLISHED + call HALT + ld a,b ;o hasta que se cierre ("Error: connection refused") + call TCP_STATUS + pop bc + or a + jr nz,OPENNOREF + + ld a,(IDENT_CON) + call TCP_ABORT + ld a,#FF + ld (IDENT_CON),a + ld de,CONREF_S + ld c,_STROUT + or a + jp DO_DOS + +OPENNOREF: ld d,a + ld a,(#FBEC) ;El bit 2 de #FBEC es 0 + bit 2,a ;cuando se esta pulsando ESC + ld a,d + jr nz,NOOPCANCEL + + ld a,b + call TCP_ABORT + ld a,#FF + ld (CONTROL_CON),a + print CANCELLED_S + ret + +NOOPCANCEL: ;ld a,b + cp 4 + jr nz,R_OPEN_L2 + + ld a,b + ld (CONTROL_CON),a + print OK_S + + ;--- Espera una respuesta que no sea 1yz + +R_OPEN_L3: call IDENT_AUTOM + call WAIT_REPLY + ret c + cp 1 + jr z,R_OPEN_L3 + cp 4 ;Si la respuesta es 4yz, termina + ret z + cp 2 ;Si no es 2yz, "ERROR: Unexpected reply" y fin. + jr z,R_OPEN4 +R_UNEX: print UNEXPEC_S + ret +R_OPEN4: ; + + ;>>> Ahora empieza la secuencia USER - PASSWORD - ACCOUNT. + + call IDENT_AUTOM + ld a,(IDENT_CON) + call TCP_ABORT + + ;--- Pregunta el nombre de usuario, y lo envia mediante comando USER + +_R_USER: print USER._S ;Obtiene nombre de usuario + printz DEF_USER + print CIERRAPAR_S + ld de,USER_COM_BUF + ld c,_BUFIN + call DO_DOS + call CRLF + +_R_USER2: ld hl,C_USER ;Compone "USER usuario"+CRLF en SEND_COM_BUF + call SET_COMMAND + call SET_SPACE + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,1 + call EXTPAR + jr nc,RUSER2 + ld hl,DEF_USER ;DEF_USER si no se escribe nada + ld de,SEND_COM_BUF+5 + ld bc,255 + ldir +RUSER2: call APPEND_LF + + ;debug "1" + call SEND_COM ;Envia comando + ;debug "2" + ret c + + ;debug "3" + call WAIT_REPLY ;Respuesta 2, 4 o 5: termina + ;debug "4" + ret c + cp 4 + ret z + cp 5 + ret z + cp 2 + ret z + cp 3 ;Respuesta 3: continua; otra: error "Unexpected reply" + jp nz,R_UNEX + + ;--- Se requiere contrasenya: se pregunta y se envia + +RPASS2: print PASSWORD._S ;Obtiene password + ;debug "5" + ld a,(DEF_PASSWORD) + or a + ld de,NONE_S + jr z,RPASS2_0 + ld de,DEF_PASSWORD + call SET_HOOK +RPASS2_0: call PRINT_Z + call RESET_HOOK + print CIERRAPAR_S + ld de,USER_COM_BUF + call SET_HOOK + ld c,_BUFIN + call DO_DOS + call RESET_HOOK + + ld hl,C_PASS ;Compone "PASS password"+CRLF en SEND_COM_BUF + call SET_COMMAND + call SET_SPACE + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,1 + call EXTPAR + jr nc,RPASS2_1 + ld a,(DEF_PASSWORD) ;Si no se ha introducido password: + or a ;Comprueba si hay password por + jr z,RPASS2 ;defecto y en ese caso lo usa, + ld hl,DEF_PASSWORD ;en caso contrario vuelve a preguntarlo + ld de,SEND_COM_BUF+5 + ld bc,255 + ldir +RPASS2_1: call APPEND_LF + call LF + + call SEND_COM ;Envia comando + ret c + + call WAIT_REPLY ;Respuesta 2, 4 o 5: termina + ret c + cp 4 + ret z + cp 5 + ret z + cp 2 + ret z + cp 3 ;Respuesta 3: continua; otra: error "Unexpected reply" + jp nz,R_UNEX + + ;--- Se requiere "account": se pregunta y se envia + +RACCT2: print ACCOUNT._S ;Obtiene account + ld a,(DEF_ACCOUNT) + or a + ld de,NONE_S + jr z,RACCT2_0 + ld de,DEF_ACCOUNT +RACCT2_0: call PRINT_Z + print CIERRAPAR_S + ld de,USER_COM_BUF + ld c,_BUFIN + call DO_DOS + + ld hl,C_ACCT ;Compone "ACCT account"+CRLF en SEND_COM_BUF + call SET_COMMAND + call SET_SPACE + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,1 + call EXTPAR + jr nc,RACCT2_1 + ld a,(DEF_ACCOUNT) ;Si no se ha introducido account: + or a ;Comprueba si hay account por + jr z,RACCT2 ;defecto y en ese caso lo usa, + ld hl,DEF_ACCOUNT ;en caso contrario vuelve a preguntarlo + ld de,SEND_COM_BUF+5 + ld bc,255 + ldir +RACCT2_1: call APPEND_LF + call LF + + call SEND_COM ;Envia comando + ret c + + call WAIT_REPLY ;Respuesta 2, 4 o 5: termina + ret c + cp 4 + ret z + cp 5 + ret z + cp 2 + ret z + jp R_UNEX ;Otra: error "Unexpected reply" ;----------------- ;--- PASSIVE --- ;----------------- -R_PASSIVE: ld a,3 - ld (ABORT_STAT),a +R_PASSIVE: ld a,3 + ld (ABORT_STAT),a - ld hl,PASSIVE - ld de,PASSIVE_M_S - jp TURN_ON_OFF + ld hl,PASSIVE + ld de,PASSIVE_M_S + jp TURN_ON_OFF ;--------------- ;--- PAUSE --- ;--------------- -R_PAUSE: ld a,3 - ld (ABORT_STAT),a +R_PAUSE: ld a,3 + ld (ABORT_STAT),a - ld hl,PAUSE - ld de,PAUSE_M_S - jp TURN_ON_OFF + ld hl,PAUSE + ld de,PAUSE_M_S + jp TURN_ON_OFF ;---------------- ;--- PROMPT --- ;---------------- -R_PROMPT: ld a,3 - ld (ABORT_STAT),a +R_PROMPT: ld a,3 + ld (ABORT_STAT),a - ld hl,PROMPT - ld de,PROMPT_M_S - jp TURN_ON_OFF + ld hl,PROMPT + ld de,PROMPT_M_S + jp TURN_ON_OFF ;------------- ;--- PWD --- ;------------- -R_PWD: call CHK_CON - ret c +R_PWD: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld a,#FF - ld (ES_XCOM),a - ld a,(VERBOSE) - push af ;Siempre muestra el resultado, - ld a,#FF ;aunque "verbose" sea 0 - ld (VERBOSE),a - ld hl,C_PWD - call SINGLE_XCOM - pop af - ld (VERBOSE),a - ret + ld a,#FF + ld (ES_XCOM),a + ld a,(VERBOSE) + push af ;Siempre muestra el resultado, + ld a,#FF ;aunque "verbose" sea 0 + ld (VERBOSE),a + ld hl,C_PWD + call SINGLE_XCOM + pop af + ld (VERBOSE),a + ret ;-------------- ;--- QUIT --- ;-------------- -R_QUIT: ld a,#FF - ld (QUITTING),a - call CHK_CON - jp c,TERM +R_QUIT: ld a,#FF + ld (QUITTING),a + call CHK_CON + jp c,TERM - ld a,5 - ld (ABORT_STAT),a + ld a,5 + ld (ABORT_STAT),a - ld hl,C_QUIT - call SET_COMMAND - call APPEND_LF - call AUTOMATA_NO1 - call HALT - call HALT - call HALT - jp TERM + ld hl,C_QUIT + call SET_COMMAND + call APPEND_LF + call AUTOMATA_NO1 + call HALT + call HALT + call HALT + jp TERM ;-------------------- ;--- REMOTEHELP --- ;-------------------- -R_REMOTEHELP: call CHK_CON - ret c - - ld a,4 - ld (ABORT_STAT),a - - ld a,2 - ld hl,USER_COM_BUF+1 ;No hay parametros: solo envia "HELP" - ld de,PARSE_BUF - call EXTPAR - ld hl,C_HELP - jp c,SINGLE_COM - - ld hl,C_HELP ;Hay parametros: los envia todos - call SET_COMMAND ;tras el HELP, usando la rutina de "LITERAL" - call SET_SPACE - ld de,SEND_COM_BUF+5 - ld a,(VERBOSE) - push af - ld a,#FF ;Siempre muestra respuesta - ld (VERBOSE),a - ld a,2 - call LITELOOP - pop af - ld (VERBOSE),a - ret +R_REMOTEHELP: call CHK_CON + ret c + + ld a,4 + ld (ABORT_STAT),a + + ld a,2 + ld hl,USER_COM_BUF+1 ;No hay parametros: solo envia "HELP" + ld de,PARSE_BUF + call EXTPAR + ld hl,C_HELP + jp c,SINGLE_COM + + ld hl,C_HELP ;Hay parametros: los envia todos + call SET_COMMAND ;tras el HELP, usando la rutina de "LITERAL" + call SET_SPACE + ld de,SEND_COM_BUF+5 + ld a,(VERBOSE) + push af + ld a,#FF ;Siempre muestra respuesta + ld (VERBOSE),a + ld a,2 + call LITELOOP + pop af + ld (VERBOSE),a + ret ;---------------- ;--- RENAME --- ;---------------- -R_RENAME: call CHK_CON - ret c - - ld a,4 - ld (ABORT_STAT),a - - ld a,2 - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - call EXTPAR - cp 3 - jp nz,R_INVPAR ;Error si no hay dos parametros - ld hl,C_RNFR ;Envia "RNFR..." - call PARAM_COM - cp 3 - jr z,R_REN2 ;Si respuesta 2yz, termina con - cp 1 - ret z - cp 4 - ret z - cp 5 - ret z - print UNEXPEC_S ;error "Unexpected reply" - ret -R_REN2: ; - - ld a,3 ;Envia "RNTO..." - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - call EXTPAR - ld hl,C_RNTO - call PARAM_COM - cp 1 - ret z - cp 2 - ret z - cp 4 - ret z - cp 5 - ret z - ld c,_STROUT ;Si la respuesta no es "2yz", "4yz" o "5yz", - ld de,UNEXPEC_S ;imprime "Unexpected reply" - call z,5 - ret +R_RENAME: call CHK_CON + ret c + + ld a,4 + ld (ABORT_STAT),a + + ld a,2 + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + call EXTPAR + cp 3 + jp nz,R_INVPAR ;Error si no hay dos parametros + ld hl,C_RNFR ;Envia "RNFR..." + call PARAM_COM + cp 3 + jr z,R_REN2 ;Si respuesta 2yz, termina con + cp 1 + ret z + cp 4 + ret z + cp 5 + ret z + print UNEXPEC_S ;error "Unexpected reply" + ret +R_REN2: ; + + ld a,3 ;Envia "RNTO..." + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + call EXTPAR + ld hl,C_RNTO + call PARAM_COM + cp 1 + ret z + cp 2 + ret z + cp 4 + ret z + cp 5 + ret z + ld c,_STROUT ;Si la respuesta no es "2yz", "4yz" o "5yz", + ld de,UNEXPEC_S ;imprime "Unexpected reply" + call z,5 + ret ;--------------- ;--- RMDIR --- ;--------------- -R_RMDIR: call CHK_CON - ret c +R_RMDIR: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld a,#FF - ld (ES_XCOM),a - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+4 - ld a,2 - call EXTPAR - ld hl,C_RMD - jp nc,PARAM_XCOM - jp R_INVPAR + ld a,#FF + ld (ES_XCOM),a + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+4 + ld a,2 + call EXTPAR + ld hl,C_RMD + jp nc,PARAM_XCOM + jp R_INVPAR ;-------------- ;--- SEND --- ;-------------- -R_SEND: ld a,2 - ld hl,C_STOR - -R_SEND_APP: ld (PUTR_PAR),a ;Comprueba si existe el parametro - ld (PUTR_COM),hl ;2 (SEND) o 3 (APPEND) - push af - ld a,4 - ld (ABORT_STAT),a - pop af - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - call EXTPAR - jp c,R_INVPAR - - ld hl,USER_COM_BUF+1 ;Extrae el parametro 2 (fichero local) - ld de,PARSE_BUF - ld a,2 - call EXTPAR - - ld c,_OPEN - ld de,PARSE_BUF - ld a,1 - ld b,0 - call DOS - ret c - ld a,b - ld (FILE_FH),a - - ld a,#FF - ld (PUT_EXE),a - call PUTRIEVE - xor a - ld (PUT_EXE),a - ret +R_SEND: ld a,2 + ld hl,C_STOR + +R_SEND_APP: ld (PUTR_PAR),a ;Comprueba si existe el parametro + ld (PUTR_COM),hl ;2 (SEND) o 3 (APPEND) + push af + ld a,4 + ld (ABORT_STAT),a + pop af + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + call EXTPAR + jp c,R_INVPAR + + ld hl,USER_COM_BUF+1 ;Extrae el parametro 2 (fichero local) + ld de,PARSE_BUF + ld a,2 + call EXTPAR + + ld c,_OPEN + ld de,PARSE_BUF + ld a,1 + ld b,0 + call DOS + ret c + ld a,b + ld (FILE_FH),a + + ld a,#FF + ld (PUT_EXE),a + call PUTRIEVE + xor a + ld (PUT_EXE),a + ret ;-------------- ;--- SHOW --- ;-------------- -R_SHOW: ld hl,C_RETR +R_SHOW: ld hl,C_RETR - jp R_DIR_LS + jp R_DIR_LS ;---------------- ;--- STATUS --- ;---------------- -R_STATUS: ld a,3 - ld (ABORT_STAT),a +R_STATUS: ld a,3 + ld (ABORT_STAT),a - ld a,#FF ;Primero actualiza informacion - ld (QUITTING),a ;sobre la conexion - call CHK_CON - xor a - ld (QUITTING),a + ld a,#FF ;Primero actualiza informacion + ld (QUITTING),a ;sobre la conexion + call CHK_CON + xor a + ld (QUITTING),a - ld a,(CONTROL_CON) - cp #FF - jr nz,STATR_2 + ld a,(CONTROL_CON) + cp #FF + jr nz,STATR_2 - call CRLF - print DISCON_S - jr STATR_3 + call CRLF + print DISCON_S + jr STATR_3 -STATR_2: print CONNTO_S - printz SERVER_NAME - call CRLF -STATR_3: ; +STATR_2: print CONNTO_S + printz SERVER_NAME + call CRLF +STATR_3: ; - print TYPE_S - ld a,(TYPE) - or a - ld de,ASCII_S - jr z,STATR_4 - ld de,BINARY_S -STATR_4: ld c,_STROUT - call DO_DOS + print TYPE_S + ld a,(TYPE) + or a + ld de,ASCII_S + jr z,STATR_4 + ld de,BINARY_S +STATR_4: ld c,_STROUT + call DO_DOS - ld hl,VERBOSE - ld de,VERBOSE_S - call SHOW_ON_OFF + ld hl,VERBOSE + ld de,VERBOSE_S + call SHOW_ON_OFF - ld hl,DEBUG - ld de,DEBUG_S - call SHOW_ON_OFF + ld hl,DEBUG + ld de,DEBUG_S + call SHOW_ON_OFF - ld hl,PROMPT - ld de,PROMPT_S - call SHOW_ON_OFF + ld hl,PROMPT + ld de,PROMPT_S + call SHOW_ON_OFF - ld hl,HASH - ld de,HASH_S - call SHOW_ON_OFF + ld hl,HASH + ld de,HASH_S + call SHOW_ON_OFF - ld hl,BELL - ld de,BELL_S - call SHOW_ON_OFF + ld hl,BELL + ld de,BELL_S + call SHOW_ON_OFF - ld hl,PASSIVE - ld de,PASSIVE_S - call SHOW_ON_OFF + ld hl,PASSIVE + ld de,PASSIVE_S + call SHOW_ON_OFF - ld hl,PAUSE - ld de,PAUSE_S - call SHOW_ON_OFF + ld hl,PAUSE + ld de,PAUSE_S + call SHOW_ON_OFF - ld hl,XCOM - ld de,XCOM_S - call SHOW_ON_OFF + ld hl,XCOM + ld de,XCOM_S + call SHOW_ON_OFF - jp CRLF + jp CRLF ;-------------- ;--- TYPE --- ;-------------- -R_TYPE: call CHK_CON - ret c +R_TYPE: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,2 - call EXTPAR ;Error si no hay parametro - jp c,R_INVPAR + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,2 + call EXTPAR ;Error si no hay parametro + jp c,R_INVPAR - ld a,(PARSE_BUF+1) ;Error si el parametro es - or a ;de mas de una letra - jp nz,R_INVPAR + ld a,(PARSE_BUF+1) ;Error si el parametro es + or a ;de mas de una letra + jp nz,R_INVPAR - ld a,(PARSE_BUF) ;Error si no es "A" o "I", - or %00100000 ;si no hay error, salta a ASCII o BINARY - cp "a" - jp z,R_ASCII - cp "i" - jp z,R_BINARY + ld a,(PARSE_BUF) ;Error si no es "A" o "I", + or %00100000 ;si no hay error, salta a ASCII o BINARY + cp "a" + jp z,R_ASCII + cp "i" + jp z,R_BINARY ;-------------- ;--- USER --- ;-------------- -R_USER: call CHK_CON - ret c +R_USER: call CHK_CON + ret c - ld a,4 - ld (ABORT_STAT),a + ld a,4 + ld (ABORT_STAT),a - ld hl,USER_COM_BUF+1 - ld de,PARSE_BUF - ld a,2 - call EXTPAR - jp c,_R_USER + ld hl,USER_COM_BUF+1 + ld de,PARSE_BUF + ld a,2 + call EXTPAR + jp c,_R_USER - ld a,b - ld (USER_COM_BUF+1),a - ld c,a - ld b,0 - inc bc - ld hl,PARSE_BUF - ld de,USER_COM_BUF+2 - ldir - jp _R_USER2 + ld a,b + ld (USER_COM_BUF+1),a + ld c,a + ld b,0 + inc bc + ld hl,PARSE_BUF + ld de,USER_COM_BUF+2 + ldir + jp _R_USER2 ;----------------- ;--- VERBOSE --- ;----------------- -R_VERBOSE: ld a,3 - ld (ABORT_STAT),a +R_VERBOSE: ld a,3 + ld (ABORT_STAT),a - ld hl,VERBOSE - ld de,VERBOSE_M_S - jp TURN_ON_OFF + ld hl,VERBOSE + ld de,VERBOSE_M_S + jp TURN_ON_OFF ;------------------- ;--- XCOMMANDS --- ;------------------- -R_XCOMMANDS: ld a,3 - ld (ABORT_STAT),a +R_XCOMMANDS: ld a,3 + ld (ABORT_STAT),a - ld hl,XCOM - ld de,XCOM_M_S - jp TURN_ON_OFF + ld hl,XCOM + ld de,XCOM_M_S + jp TURN_ON_OFF ;--- Pruebas: comandos no implementados aun -NOIMP: macro @c -R_@c: ;jp R_NOIMP - endm +NOIMP: macro @c +R_@c: ;jp R_NOIMP + endm - ;NOIMP APPEND + ;NOIMP APPEND -R_NOIMP: print NOIMP_S - ret +R_NOIMP: print NOIMP_S + ret ;*** Rutinas auxiliares para la ejecucion de comandos ;--- SINGLE_COM: Ejecuta el comando HL sin parametros -SINGLE_COM: call SET_COMMAND - call APPEND_LF - jp AUTOMATA_NO1 +SINGLE_COM: call SET_COMMAND + call APPEND_LF + jp AUTOMATA_NO1 ;--- PARAM_COM: Ejecuta el comando HL con parametros ya establecidos ; (SEND_COM_BUF contiene "xxxxx") -PARAM_COM: call SET_COMMAND - call SET_SPACE - call APPEND_LF - jp AUTOMATA_NO1 +PARAM_COM: call SET_COMMAND + call SET_SPACE + call APPEND_LF + jp AUTOMATA_NO1 ;--- SINGLE_XCOM: Como SINGLE_COM, para comandos "X" -SINGLE_XCOM: call SET_COMMAND - call APPEND_LF - ld a,#FF - ld (ES_XCOM),a - jp AUTOMATA_NO1 +SINGLE_XCOM: call SET_COMMAND + call APPEND_LF + ld a,#FF + ld (ES_XCOM),a + jp AUTOMATA_NO1 ;--- PARAM_XCOM: Como SINGLE_COM, para comandos "X" -PARAM_XCOM: call SET_COMMAND - call SET_SPACE - call APPEND_LF - ld a,#FF - ld (ES_XCOM),a - jp AUTOMATA_NO1 +PARAM_XCOM: call SET_COMMAND + call SET_SPACE + call APPEND_LF + ld a,#FF + ld (ES_XCOM),a + jp AUTOMATA_NO1 ;--- R_INVPAR: Faltan parametros o son incorrectos -R_INVPAR: print INVPAR_S - ret +R_INVPAR: print INVPAR_S + ret @@ -2426,23 +2426,23 @@ R_INVPAR: print INVPAR_S ; C, Z if HL = DE ; NC, NZ if HL < DE -COMP: call _COMP - ccf - ret +COMP: call _COMP + ccf + ret -_COMP: ld a,h - sub d - ret nz - ld a,l - sub e - ret +_COMP: ld a,h + sub d + ret nz + ld a,l + sub e + ret ;--- NAME: EXTPAR ; Extracts a parameter from the command line ; INPUT: A = Parameter to extract (the first one is 1) ; DE = Buffer to put the extracted parameter -; HL = Direccion de la cadena (el primer byte es la longitud) +; HL = Direccion de la cadena (el primer byte es la longitud) ; OUTPUT: A = Total number of parameters in the command line ; CY = 1 -> The specified parameter does not exist ; B undefined, buffer unmodified @@ -2450,165 +2450,165 @@ _COMP: ld a,h ; Parameter extracted to DE, finished with a 0 byte ; DE preserved -EXTPAR: or a ;Terminates with error if A = 0 - scf - ret z - - ld b,a - ld a,(hl) ;Terminates with error if - or a ;there are no parameters - scf - ret z - ld a,b - - push hl,de,ix,iy - ld ix,0 ;IXl: Number of parameter - ld ixh,a ;IXh: Parameter to be extracted - inc hl - push hl - pop iy - - ;* Scans the command line and counts parameters - -PASASPC: ld a,(hl) ;Skips spaces until a parameter - or a ;is found - jr z,ENDPNUM - cp 13 - jr z,ENDPNUM - cp " " - inc hl - jri PASASPC - - inc ix ;Increases number of parameters -PASAPAR: ld a,(hl) ;Walks through the parameter - or a - jr z,ENDPNUM - cp " " - inc hl - jri PASASPC - jr PASAPAR - - ;* Here we know already how many parameters are available - -ENDPNUM: ld a,ixh ;Error if the parameter to extract - cp ixl ;is greater than the total number of - jrmy EXTPERR ;parameters available - - push iy - pop hl - ;ld hl,#81 - ld b,1 ;B = current parameter -PASAP2: ld a,(hl) ;Skips spaces until the next - cp " " ;parameter is found - inc hl - jri PASAP2 - - ld a,ixh ;If it is the parameter we are - cp b ;searching for, we extract it, - jri PUTINDE0 ;else... - - inc b -PASAP3: ld a,(hl) ;...we skip it and return to PASAP2 - cp " " - inc hl - jrni PASAP3 - jr PASAP2 - - ;* Parameter is located, now copy it to the user buffer - -PUTINDE0: ld b,0 - dec hl -PUTINDE: inc b - ld a,(hl) - cp " " - jri ENDPUT - or a - jr z,ENDPUT - cp 13 - jr z,ENDPUT - ld (de),a ;Paramete is copied to (DE) - inc de - inc hl - jr PUTINDE - -ENDPUT: xor a - ld (de),a - dec b - - ld a,ixl - or a - jr FINEXTP -EXTPERR: scf -FINEXTP: pop iy,ix,de,hl - ret +EXTPAR: or a ;Terminates with error if A = 0 + scf + ret z + + ld b,a + ld a,(hl) ;Terminates with error if + or a ;there are no parameters + scf + ret z + ld a,b + + push hl,de,ix,iy + ld ix,0 ;IXl: Number of parameter + ld ixh,a ;IXh: Parameter to be extracted + inc hl + push hl + pop iy + + ;* Scans the command line and counts parameters + +PASASPC: ld a,(hl) ;Skips spaces until a parameter + or a ;is found + jr z,ENDPNUM + cp 13 + jr z,ENDPNUM + cp " " + inc hl + jri PASASPC + + inc ix ;Increases number of parameters +PASAPAR: ld a,(hl) ;Walks through the parameter + or a + jr z,ENDPNUM + cp " " + inc hl + jri PASASPC + jr PASAPAR + + ;* Here we know already how many parameters are available + +ENDPNUM: ld a,ixh ;Error if the parameter to extract + cp ixl ;is greater than the total number of + jrmy EXTPERR ;parameters available + + push iy + pop hl + ;ld hl,#81 + ld b,1 ;B = current parameter +PASAP2: ld a,(hl) ;Skips spaces until the next + cp " " ;parameter is found + inc hl + jri PASAP2 + + ld a,ixh ;If it is the parameter we are + cp b ;searching for, we extract it, + jri PUTINDE0 ;else... + + inc b +PASAP3: ld a,(hl) ;...we skip it and return to PASAP2 + cp " " + inc hl + jrni PASAP3 + jr PASAP2 + + ;* Parameter is located, now copy it to the user buffer + +PUTINDE0: ld b,0 + dec hl +PUTINDE: inc b + ld a,(hl) + cp " " + jri ENDPUT + or a + jr z,ENDPUT + cp 13 + jr z,ENDPUT + ld (de),a ;Paramete is copied to (DE) + inc de + inc hl + jr PUTINDE + +ENDPUT: xor a + ld (de),a + dec b + + ld a,ixl + or a + jr FINEXTP +EXTPERR: scf +FINEXTP: pop iy,ix,de,hl + ret ;--- Rutina de terminacion ; Aborta las conexiones abiertas, si las hay ; y borra la cola de nombres de fichero -TERM: xor a ;Desde ahora, CTRL-C no tiene efecto - ld (ABORT_STAT),a - - ;ld a,(DATA_CON) - ;ld b,a - ;ld a,(CONTROL_CON) - ;and b - ;cp #FF - ;jr z,TERM_CON_OK - - ld a,(DATA_CON) - cp #FF - call nz,TCP_CLOSE ;TCP_ABORT - ld a,(CONTROL_CON) - cp #FF - call nz,TCP_CLOSE ;TCP_ABORT - ld a,(IDENT_CON) - cp #FF - call nz,TCP_CLOSE -TERM_CON_OK: ; - -TERM2: - ld a,(TPASLOT1) - ld h,#40 - call ENASLT - - ld a,(TPASEG1) ;Restaura TPA - call PUT_P1 - - ld a,(FILES_QUEUE) ;Borra cola de nombres de fichero - cp #FF - jr z,TERM_Q_OK - ld ix,0 - nesman 22 -TERM_Q_OK: ; - - ld de,0 ;Desdefine rutina de CTRL-C - ld c,_DEFAB - call DO_DOS - - ld bc,_TERM+0*256 ;Termina - jp DO_DOS +TERM: xor a ;Desde ahora, CTRL-C no tiene efecto + ld (ABORT_STAT),a + + ;ld a,(DATA_CON) + ;ld b,a + ;ld a,(CONTROL_CON) + ;and b + ;cp #FF + ;jr z,TERM_CON_OK + + ld a,(DATA_CON) + cp #FF + call nz,TCP_CLOSE ;TCP_ABORT + ld a,(CONTROL_CON) + cp #FF + call nz,TCP_CLOSE ;TCP_ABORT + ld a,(IDENT_CON) + cp #FF + call nz,TCP_CLOSE +TERM_CON_OK: ; + +TERM2: + ld a,(TPASLOT1) + ld h,#40 + call ENASLT + + ld a,(TPASEG1) ;Restaura TPA + call PUT_P1 + + ld a,(FILES_QUEUE) ;Borra cola de nombres de fichero + cp #FF + jr z,TERM_Q_OK + ld ix,0 + nesman 22 +TERM_Q_OK: ; + + ld de,0 ;Desdefine rutina de CTRL-C + ld c,_DEFAB + call DO_DOS + + ld bc,_TERM+0*256 ;Termina + jp DO_DOS ;--- Prints LF -CRLF: ld e,13 - ld c,_CONOUT - call DO_DOS -LF: ld e,10 - ld c,_CONOUT - jp DO_DOS +CRLF: ld e,13 + ld c,_CONOUT + call DO_DOS +LF: ld e,10 + ld c,_CONOUT + jp DO_DOS ;--- Segment switching routines for page 1, ; these are overwritten with calls to ; mapper support routines on DOS 2 -PUT_P1: out (#FD),a - ret -GET_P1: in a,(#FD) - ret +PUT_P1: out (#FD),a + ret +GET_P1: in a,(#FD) + ret -TPASEG1: db 2 ;TPA segment on page 1 +TPASEG1: db 2 ;TPA segment on page 1 ;--- NAME: NUMTOASC @@ -2661,263 +2661,263 @@ TPASEG1: db 2 ;TPA segment on page 1 ; Tailing "$" or 00 are not counted for the length ; All other registers are preserved -NUMTOASC: push af,ix,de,hl - ld ix,WorkNTOA - push af,af - and %00000111 - ld (ix+0),a ;Type - pop af - and %00011000 - rrca - rrca - rrca - ld (ix+1),a ;Finishing - pop af - and %11100000 - rlca - rlca - rlca - ld (ix+6),a ;Flags: Z(zero), P(+ sign), R(range) - ld (ix+2),b ;Number of final characters - ld (ix+3),c ;Padding character - xor a - ld (ix+4),a ;Total length - ld (ix+5),a ;Number length - ld a,10 - ld (ix+7),a ;Divisor = 10 - ld (ix+13),l ;User buffer - ld (ix+14),h - ld hl,BufNTOA - ld (ix+10),l ;Internal buffer - ld (ix+11),h - -ChkTipo: ld a,(ix+0) ;Set divisor to 2 or 16, - or a ;or leave it to 10 - jr z,ChkBoH - cp 5 - jp nc,EsBin -EsHexa: ld a,16 - jr GTipo -EsBin: ld a,2 - ld d,0 - res 0,(ix+6) ;If binary, range is 0-255 -GTipo: ld (ix+7),a - -ChkBoH: ld a,(ix+0) ;Checks if a final "H" or "B" - cp 7 ;is desired - jp z,PonB - cp 4 - jr nz,ChkTip2 -PonH: ld a,"H" - jr PonHoB -PonB: ld a,"B" -PonHoB: ld (hl),a - inc hl - inc (ix+4) - inc (ix+5) - -ChkTip2: ld a,d ;If the number is 0, never add sign - or e - jr z,NoSgn - bit 0,(ix+6) ;Checks range - jr z,SgnPos -ChkSgn: bit 7,d - jr z,SgnPos -SgnNeg: push hl ;Negates number - ld hl,0 ;Sign=0:no sign; 1:+; 2:- - xor a - sbc hl,de - ex de,hl - pop hl - ld a,2 - jr FinSgn -SgnPos: bit 1,(ix+6) - jr z,NoSgn - ld a,1 - jr FinSgn -NoSgn: xor a -FinSgn: ld (ix+12),a - -ChkDoH: ld b,4 - xor a - cp (ix+0) - jp z,EsDec - ld a,4 - cp (ix+0) - jp nc,EsHexa2 -EsBin2: ld b,8 - jr EsHexa2 -EsDec: ld b,5 - -EsHexa2: push de -Divide: push bc,hl ;DE/(IX+7)=DE, remaining A - ld a,d - ld c,e - ld d,0 - ld e,(ix+7) - ld hl,0 - ld b,16 -BucDiv: rl c - rla - adc hl,hl - sbc hl,de - jr nc,$+3 - add hl,de - ccf - djnz BucDiv - rl c - rla - ld d,a - ld e,c - ld a,l - pop hl,bc - -ChkRest9: cp 10 ;Converts the remaining - jp nc,EsMay9 ;to a character -EsMen9: add a,"0" - jr PonEnBuf -EsMay9: sub 10 - add a,"A" - -PonEnBuf: ld (hl),a ;Puts character in the buffer - inc hl - inc (ix+4) - inc (ix+5) - djnz Divide - pop de - -ChkECros: bit 2,(ix+6) ;Cchecks if zeros must be removed - jr nz,ChkAmp - dec hl - ld b,(ix+5) - dec b ;B=num. of digits to check -Chk1Cro: ld a,(hl) - cp "0" - jr nz,FinECeros - dec hl - dec (ix+4) - dec (ix+5) - djnz Chk1Cro -FinECeros: inc hl - -ChkAmp: ld a,(ix+0) ;Puts "#", "&H" or "&B" if necessary - cp 2 - jr z,PonAmpH - cp 3 - jr z,PonAlm - cp 6 - jr nz,PonSgn -PonAmpB: ld a,"B" - jr PonAmpHB -PonAlm: ld a,"#" - ld (hl),a - inc hl - inc (ix+4) - inc (ix+5) - jr PonSgn -PonAmpH: ld a,"H" -PonAmpHB: ld (hl),a - inc hl - ld a,"&" - ld (hl),a - inc hl - inc (ix+4) - inc (ix+4) - inc (ix+5) - inc (ix+5) - -PonSgn: ld a,(ix+12) ;Puts sign - or a - jr z,ChkLon -SgnTipo: cp 1 - jr nz,PonNeg -PonPos: ld a,"+" - jr PonPoN - jr ChkLon -PonNeg: ld a,"-" -PonPoN ld (hl),a - inc hl - inc (ix+4) - inc (ix+5) - -ChkLon: ld a,(ix+2) ;Puts padding if necessary - cp (ix+4) - jp c,Invert - jr z,Invert -PonCars: sub (ix+4) - ld b,a - ld a,(ix+3) -Pon1Car: ld (hl),a - inc hl - inc (ix+4) - djnz Pon1Car - -Invert: ld l,(ix+10) - ld h,(ix+11) - xor a ;Inverts the string - push hl - ld (ix+8),a - ld a,(ix+4) - dec a - ld e,a - ld d,0 - add hl,de - ex de,hl - pop hl ;HL=initial buffer, DE=final buffer - ld a,(ix+4) - srl a - ld b,a -BucInv: push bc - ld a,(de) - ld b,(hl) - ex de,hl - ld (de),a - ld (hl),b - ex de,hl - inc hl - dec de - pop bc - ld a,b ;*** This part was missing on the - or a ;*** original routine - jr z,ToBufUs ;*** - djnz BucInv -ToBufUs: ld l,(ix+10) - ld h,(ix+11) - ld e,(ix+13) - ld d,(ix+14) - ld c,(ix+4) - ld b,0 - ldir - ex de,hl - -ChkFin1: ld a,(ix+1) ;Checks if "$" or 00 finishing is desired - and %00000111 - or a - jr z,Fin - cp 1 - jr z,PonDolar - cp 2 - jr z,PonChr0 - -PonBit7: dec hl - ld a,(hl) - or %10000000 - ld (hl),a - jr Fin - -PonChr0: xor a - jr PonDo0 -PonDolar: ld a,"$" -PonDo0: ld (hl),a - inc (ix+4) - -Fin: ld b,(ix+5) - ld c,(ix+4) - pop hl,de,ix,af - ret - -WorkNTOA: defs 16 -BufNTOA: ds 10 +NUMTOASC: push af,ix,de,hl + ld ix,WorkNTOA + push af,af + and %00000111 + ld (ix+0),a ;Type + pop af + and %00011000 + rrca + rrca + rrca + ld (ix+1),a ;Finishing + pop af + and %11100000 + rlca + rlca + rlca + ld (ix+6),a ;Flags: Z(zero), P(+ sign), R(range) + ld (ix+2),b ;Number of final characters + ld (ix+3),c ;Padding character + xor a + ld (ix+4),a ;Total length + ld (ix+5),a ;Number length + ld a,10 + ld (ix+7),a ;Divisor = 10 + ld (ix+13),l ;User buffer + ld (ix+14),h + ld hl,BufNTOA + ld (ix+10),l ;Internal buffer + ld (ix+11),h + +ChkTipo: ld a,(ix+0) ;Set divisor to 2 or 16, + or a ;or leave it to 10 + jr z,ChkBoH + cp 5 + jp nc,EsBin +EsHexa: ld a,16 + jr GTipo +EsBin: ld a,2 + ld d,0 + res 0,(ix+6) ;If binary, range is 0-255 +GTipo: ld (ix+7),a + +ChkBoH: ld a,(ix+0) ;Checks if a final "H" or "B" + cp 7 ;is desired + jp z,PonB + cp 4 + jr nz,ChkTip2 +PonH: ld a,"H" + jr PonHoB +PonB: ld a,"B" +PonHoB: ld (hl),a + inc hl + inc (ix+4) + inc (ix+5) + +ChkTip2: ld a,d ;If the number is 0, never add sign + or e + jr z,NoSgn + bit 0,(ix+6) ;Checks range + jr z,SgnPos +ChkSgn: bit 7,d + jr z,SgnPos +SgnNeg: push hl ;Negates number + ld hl,0 ;Sign=0:no sign; 1:+; 2:- + xor a + sbc hl,de + ex de,hl + pop hl + ld a,2 + jr FinSgn +SgnPos: bit 1,(ix+6) + jr z,NoSgn + ld a,1 + jr FinSgn +NoSgn: xor a +FinSgn: ld (ix+12),a + +ChkDoH: ld b,4 + xor a + cp (ix+0) + jp z,EsDec + ld a,4 + cp (ix+0) + jp nc,EsHexa2 +EsBin2: ld b,8 + jr EsHexa2 +EsDec: ld b,5 + +EsHexa2: push de +Divide: push bc,hl ;DE/(IX+7)=DE, remaining A + ld a,d + ld c,e + ld d,0 + ld e,(ix+7) + ld hl,0 + ld b,16 +BucDiv: rl c + rla + adc hl,hl + sbc hl,de + jr nc,$+3 + add hl,de + ccf + djnz BucDiv + rl c + rla + ld d,a + ld e,c + ld a,l + pop hl,bc + +ChkRest9: cp 10 ;Converts the remaining + jp nc,EsMay9 ;to a character +EsMen9: add a,"0" + jr PonEnBuf +EsMay9: sub 10 + add a,"A" + +PonEnBuf: ld (hl),a ;Puts character in the buffer + inc hl + inc (ix+4) + inc (ix+5) + djnz Divide + pop de + +ChkECros: bit 2,(ix+6) ;Cchecks if zeros must be removed + jr nz,ChkAmp + dec hl + ld b,(ix+5) + dec b ;B=num. of digits to check +Chk1Cro: ld a,(hl) + cp "0" + jr nz,FinECeros + dec hl + dec (ix+4) + dec (ix+5) + djnz Chk1Cro +FinECeros: inc hl + +ChkAmp: ld a,(ix+0) ;Puts "#", "&H" or "&B" if necessary + cp 2 + jr z,PonAmpH + cp 3 + jr z,PonAlm + cp 6 + jr nz,PonSgn +PonAmpB: ld a,"B" + jr PonAmpHB +PonAlm: ld a,"#" + ld (hl),a + inc hl + inc (ix+4) + inc (ix+5) + jr PonSgn +PonAmpH: ld a,"H" +PonAmpHB: ld (hl),a + inc hl + ld a,"&" + ld (hl),a + inc hl + inc (ix+4) + inc (ix+4) + inc (ix+5) + inc (ix+5) + +PonSgn: ld a,(ix+12) ;Puts sign + or a + jr z,ChkLon +SgnTipo: cp 1 + jr nz,PonNeg +PonPos: ld a,"+" + jr PonPoN + jr ChkLon +PonNeg: ld a,"-" +PonPoN ld (hl),a + inc hl + inc (ix+4) + inc (ix+5) + +ChkLon: ld a,(ix+2) ;Puts padding if necessary + cp (ix+4) + jp c,Invert + jr z,Invert +PonCars: sub (ix+4) + ld b,a + ld a,(ix+3) +Pon1Car: ld (hl),a + inc hl + inc (ix+4) + djnz Pon1Car + +Invert: ld l,(ix+10) + ld h,(ix+11) + xor a ;Inverts the string + push hl + ld (ix+8),a + ld a,(ix+4) + dec a + ld e,a + ld d,0 + add hl,de + ex de,hl + pop hl ;HL=initial buffer, DE=final buffer + ld a,(ix+4) + srl a + ld b,a +BucInv: push bc + ld a,(de) + ld b,(hl) + ex de,hl + ld (de),a + ld (hl),b + ex de,hl + inc hl + dec de + pop bc + ld a,b ;*** This part was missing on the + or a ;*** original routine + jr z,ToBufUs ;*** + djnz BucInv +ToBufUs: ld l,(ix+10) + ld h,(ix+11) + ld e,(ix+13) + ld d,(ix+14) + ld c,(ix+4) + ld b,0 + ldir + ex de,hl + +ChkFin1: ld a,(ix+1) ;Checks if "$" or 00 finishing is desired + and %00000111 + or a + jr z,Fin + cp 1 + jr z,PonDolar + cp 2 + jr z,PonChr0 + +PonBit7: dec hl + ld a,(hl) + or %10000000 + ld (hl),a + jr Fin + +PonChr0: xor a + jr PonDo0 +PonDolar: ld a,"$" +PonDo0: ld (hl),a + inc (ix+4) + +Fin: ld b,(ix+5) + ld c,(ix+4) + pop hl,de,ix,af + ret + +WorkNTOA: defs 16 +BufNTOA: ds 10 ;--- NAME: EXTNUM @@ -2936,317 +2936,317 @@ BufNTOA: ds 10 ; only the first five digits. ; All other registers are preserved. -EXTNUM: push hl,ix - ld ix,ACA - res 0,(ix) - set 1,(ix) - ld bc,0 - ld de,0 -BUSNUM: ld a,(hl) ;Jumps to FINEXT if no numeric character - ld e,a ;IXh = last read character - cp "0" - jr c,FINEXT - cp "9"+1 - jr nc,FINEXT - ld a,d - cp 5 - jr z,FINEXT - call POR10 - -SUMA: push hl ;BC = BC + A - push bc - pop hl - ld bc,0 - ld a,e - sub "0" - ld c,a - add hl,bc - call c,BIT17 - push hl - pop bc - pop hl - - inc d - inc hl - jr BUSNUM - -BIT17: set 0,(ix) - ret -ACA: db 0 ;b0: num>65535. b1: more than 5 digits - -FINEXT: ld a,e - cp "0" - call c,NODESB - cp "9"+1 - call nc,NODESB - ld a,(ix) - pop ix,hl - srl a - ret - -NODESB: res 1,(ix) - ret - -POR10: push de,hl ;BC = BC * 10 - push bc - push bc - pop hl - pop de - ld b,3 -ROTA: sla l - rl h - djnz ROTA - call c,BIT17 - add hl,de - call c,BIT17 - add hl,de - call c,BIT17 - push hl - pop bc - pop hl,de - ret +EXTNUM: push hl,ix + ld ix,ACA + res 0,(ix) + set 1,(ix) + ld bc,0 + ld de,0 +BUSNUM: ld a,(hl) ;Jumps to FINEXT if no numeric character + ld e,a ;IXh = last read character + cp "0" + jr c,FINEXT + cp "9"+1 + jr nc,FINEXT + ld a,d + cp 5 + jr z,FINEXT + call POR10 + +SUMA: push hl ;BC = BC + A + push bc + pop hl + ld bc,0 + ld a,e + sub "0" + ld c,a + add hl,bc + call c,BIT17 + push hl + pop bc + pop hl + + inc d + inc hl + jr BUSNUM + +BIT17: set 0,(ix) + ret +ACA: db 0 ;b0: num>65535. b1: more than 5 digits + +FINEXT: ld a,e + cp "0" + call c,NODESB + cp "9"+1 + call nc,NODESB + ld a,(ix) + pop ix,hl + srl a + ret + +NODESB: res 1,(ix) + ret + +POR10: push de,hl ;BC = BC * 10 + push bc + push bc + pop hl + pop de + ld b,3 +ROTA: sla l + rl h + djnz ROTA + call c,BIT17 + add hl,de + call c,BIT17 + add hl,de + call c,BIT17 + push hl + pop bc + pop hl,de + ret ;--- PRINT_L: Imprime la cadena DE, acabada en CRLF -PRINT_L: ld a,(de) - push af,de - ld e,a - ld c,_CONOUT - call DO_DOS - pop de,af - cp 10 - ret z - inc de - jr PRINT_L +PRINT_L: ld a,(de) + push af,de + ld e,a + ld c,_CONOUT + call DO_DOS + pop de,af + cp 10 + ret z + inc de + jr PRINT_L ;--- PRINT_Z: Imprime la cadena DE, acabada en cero -PRINT_Z: ld a,(de) - or a - ret z - push de - ld e,a - ld c,_CONOUT - call DO_DOS - pop de - inc de - jr PRINT_Z +PRINT_Z: ld a,(de) + or a + ret z + push de + ld e,a + ld c,_CONOUT + call DO_DOS + pop de + inc de + jr PRINT_Z ;--- SHOW_ERR: Muestra la cadena DE, y a continuacion ; busca un error con codigo A en la tabla HL, y lo muestra. -SHOW_ERR push af,hl,de - print ERROR_S - pop de - ld c,_STROUT - call DO_DOS - pop de,af - ld b,a -SEARCH_ERROR: ld a,(de) - inc de - cp b - jr z,ERROR_FOUND -NEXT_ERROR: ld a,(de) - inc de - or a - jr z,ERROR_NOTF - cp "$" - jr nz,NEXT_ERROR - jr SEARCH_ERROR - -ERROR_NOTF: ld de,UNKERR_S -ERROR_FOUND: ld c,_STROUT ;Print error string - call DO_DOS - call LF - scf - ret +SHOW_ERR push af,hl,de + print ERROR_S + pop de + ld c,_STROUT + call DO_DOS + pop de,af + ld b,a +SEARCH_ERROR: ld a,(de) + inc de + cp b + jr z,ERROR_FOUND +NEXT_ERROR: ld a,(de) + inc de + or a + jr z,ERROR_NOTF + cp "$" + jr nz,NEXT_ERROR + jr SEARCH_ERROR + +ERROR_NOTF: ld de,UNKERR_S +ERROR_FOUND: ld c,_STROUT ;Print error string + call DO_DOS + call LF + scf + ret ;--- SEARCH_COM: Busca un comando en la tabla de idems ; Entrada: HL = Dir. del comando, acabado en 0 ; Salida: HL = Dir de la rutina del comando ; DE = Dir de la ayuda del comando -; Cy = 1 si no existe - -SEARCH_COM: ld (COMM_DIR),hl - - ld hl,COMMAND_TABLE -SRCH_C_START: ld de,(COMM_DIR) - ld a,(hl) - or a - scf - ret z - - dec hl - dec de -SRCH_C_LOOP: inc hl - inc de - ld a,(de) - cp "A" - jrmn SRCH_C_LP2 - and %11011111 ;Lo transforma a mayusculas -SRCH_C_LP2: cp (hl) - jr nz,NEXT_COM - or a - jr nz,SRCH_C_LOOP - - inc hl - push hl ;Comando encontrado - pop ix - ld l,(ix) - ld h,(ix+1) - ld e,(ix+2) - ld d,(ix+3) - or a - ret - -NEXT_COM: ld a,(hl) - inc hl - or a - jr nz,NEXT_COM - inc hl - inc hl - inc hl - inc hl - jr SRCH_C_START - -COMM_DIR: dw 0 +; Cy = 1 si no existe + +SEARCH_COM: ld (COMM_DIR),hl + + ld hl,COMMAND_TABLE +SRCH_C_START: ld de,(COMM_DIR) + ld a,(hl) + or a + scf + ret z + + dec hl + dec de +SRCH_C_LOOP: inc hl + inc de + ld a,(de) + cp "A" + jrmn SRCH_C_LP2 + and %11011111 ;Lo transforma a mayusculas +SRCH_C_LP2: cp (hl) + jr nz,NEXT_COM + or a + jr nz,SRCH_C_LOOP + + inc hl + push hl ;Comando encontrado + pop ix + ld l,(ix) + ld h,(ix+1) + ld e,(ix+2) + ld d,(ix+3) + or a + ret + +NEXT_COM: ld a,(hl) + inc hl + or a + jr nz,NEXT_COM + inc hl + inc hl + inc hl + inc hl + jr SRCH_C_START + +COMM_DIR: dw 0 ;--- TURN_ON_OFF: Intercambia el valor de una variable ; Entrada: HL = Variable ; DE = Cadena para imprimir "xxx turned ON/OFF" -TURN_ON_OFF: push de - ld a,(hl) - cpl - ld (hl),a - or a - ld hl,OFF_S - jr z,TONOFF2 - ld hl,ON_S -TONOFF2: pop de - push hl - ld c,_STROUT - call DO_DOS - print TURNED_S - pop de - ld c,_STROUT - call DO_DOS - jp CRLF +TURN_ON_OFF: push de + ld a,(hl) + cpl + ld (hl),a + or a + ld hl,OFF_S + jr z,TONOFF2 + ld hl,ON_S +TONOFF2: pop de + push hl + ld c,_STROUT + call DO_DOS + print TURNED_S + pop de + ld c,_STROUT + call DO_DOS + jp CRLF ;--- SHOW_ON_OFF: Muestra la cadena DE, y luego "ON" o "OFF" ; segun el valor de la variable HL. -SHOW_ON_OFF: push hl - ld c,_STROUT - call DO_DOS - pop hl - ld a,(hl) - or a - ld de,OFF_S - jr z,SHOWONOFF2 - ld de,ON_S -SHOWONOFF2: ld c,_STROUT - call DO_DOS - jp CRLF +SHOW_ON_OFF: push hl + ld c,_STROUT + call DO_DOS + pop hl + ld a,(hl) + or a + ld de,OFF_S + jr z,SHOWONOFF2 + ld de,ON_S +SHOWONOFF2: ld c,_STROUT + call DO_DOS + jp CRLF ;--- APPEND_LF: Aqade CRLF al final de la cadena en SEND_COM_BUF (acabada en 0) -APPEND_LF: ld hl,SEND_COM_BUF-1 -APLF_L: inc hl - ld a,(hl) - or a - jr nz,APLF_L - ld (hl),13 - inc hl - ld (hl),10 - ret +APPEND_LF: ld hl,SEND_COM_BUF-1 +APLF_L: inc hl + ld a,(hl) + or a + jr nz,APLF_L + ld (hl),13 + inc hl + ld (hl),10 + ret ;--- SET_COMMAND: Copia el comando HL a SEND_COM_BUF, acabado en 0 -SET_COMMAND: ld de,SEND_COM_BUF - ld bc,5 - push hl - inc hl - inc hl - inc hl - ld a,(hl) - pop hl - or a - jr nz,SETCOM2 - dec bc -SETCOM2: ldir - ret +SET_COMMAND: ld de,SEND_COM_BUF + ld bc,5 + push hl + inc hl + inc hl + inc hl + ld a,(hl) + pop hl + or a + jr nz,SETCOM2 + dec bc +SETCOM2: ldir + ret ;--- SET_SPACE: Pone un espacio tras el comando en SEND_COM_BUF ; (donde esta el 0) -SET_SPACE: ld hl,SEND_COM_BUF-1 -SETSPACE2: inc hl - ld a,(hl) - or a - jr nz,SETSPACE2 - ld (hl)," " - ret +SET_SPACE: ld hl,SEND_COM_BUF-1 +SETSPACE2: inc hl + ld a,(hl) + or a + jr nz,SETSPACE2 + ld (hl)," " + ret ;--- DOS: Llama a una funcion del DOS, y en caso de error, ; imprime su codigo y vuelve con Cy=1 -DOS: call DO_DOS - or a - ret z - -DOS2: push hl,de,bc - ld b,a ;Si se esta haciendo un DIR, el error #D7 - ld a,(LDIR_EXE) ;(file not found) no se imprime - or a - jr z,DOS3 - ld a,b - cp #D7 - jr z,DOS5 -DOS3: ld a,(PUT_EXE) ;Si se esta haciendo un PUT, - or a ;el error #C7 (end of file) - jr z,DOS4 ;no se imprime - ld a,b - cp #C7 - jr z,DOS5 -DOS4: ld de,RESPONSE_BUF - ld c,_EXPLAIN - call DO_DOS - print DISKERR_S - printz RESPONSE_BUF - call CRLF -DOS5: scf - pop bc,de,hl - ret +DOS: call DO_DOS + or a + ret z + +DOS2: push hl,de,bc + ld b,a ;Si se esta haciendo un DIR, el error #D7 + ld a,(LDIR_EXE) ;(file not found) no se imprime + or a + jr z,DOS3 + ld a,b + cp #D7 + jr z,DOS5 +DOS3: ld a,(PUT_EXE) ;Si se esta haciendo un PUT, + or a ;el error #C7 (end of file) + jr z,DOS4 ;no se imprime + ld a,b + cp #C7 + jr z,DOS5 +DOS4: ld de,RESPONSE_BUF + ld c,_EXPLAIN + call DO_DOS + print DISKERR_S + printz RESPONSE_BUF + call CRLF +DOS5: scf + pop bc,de,hl + ret ;--- PRINT_PATH: Muestra la unidad+directorio actual y un fin de linea -PRINT_PATH: ld c,_CURDRV ;Muestra unidad - call DO_DOS - add "A" - ld e,a - ld c,_CONOUT - call DO_DOS - ld e,":" - ld c,_CONOUT - call DO_DOS - ld e,"\" - ld c,_CONOUT - call DO_DOS - - ld b,0 ;Muestra dir y CRLF - ld de,RESPONSE_BUF - ld c,_GETCD - call DO_DOS - printz RESPONSE_BUF - jp CRLF +PRINT_PATH: ld c,_CURDRV ;Muestra unidad + call DO_DOS + add "A" + ld e,a + ld c,_CONOUT + call DO_DOS + ld e,":" + ld c,_CONOUT + call DO_DOS + ld e,"\" + ld c,_CONOUT + call DO_DOS + + ld b,0 ;Muestra dir y CRLF + ld de,RESPONSE_BUF + ld c,_GETCD + call DO_DOS + printz RESPONSE_BUF + jp CRLF ;--- ASK_YNAC @@ -3254,32 +3254,32 @@ PRINT_PATH: ld c,_CURDRV ;Muestra unidad ; - Obtiene un caracter del teclado ; - Devuelve 0,1,2,3 para y,n,a,c respectivamente. -ASK_YNAC: print YNAC_S - -ASK_YNAC2: ld c,_INNOE - call DO_DOS - ld c,a - or %00100000 - ld b,0 - cp "y" - jr z,ASK_YNAC3 - inc b - cp "n" - jr z,ASK_YNAC3 - inc b - cp "a" - jr z,ASK_YNAC3 - inc b - cp "c" - jr nz,ASK_YNAC2 - -ASK_YNAC3: push bc - ld e,c - ld c,_CONOUT - call DO_DOS - call CRLF - pop af - ret +ASK_YNAC: print YNAC_S + +ASK_YNAC2: ld c,_INNOE + call DO_DOS + ld c,a + or %00100000 + ld b,0 + cp "y" + jr z,ASK_YNAC3 + inc b + cp "n" + jr z,ASK_YNAC3 + inc b + cp "a" + jr z,ASK_YNAC3 + inc b + cp "c" + jr nz,ASK_YNAC2 + +ASK_YNAC3: push bc + ld e,c + ld c,_CONOUT + call DO_DOS + call CRLF + pop af + ret ;--- PRINT_PAUSE: Imprime el caracter A, y si PAUSE=#FF, @@ -3287,68 +3287,68 @@ ASK_YNAC3: push bc ; cuando se muestra una pantalla llena. ; Se ha de inicializar con BYTE_COUNT y LINE_COUNT a 0. -PRINT_PAUSE: cp #C ;Si es "borrar panrtalla", - jr z,PPAUSE_CLS ;actua como pantalla llena - push af - ld e,a - ld c,_CONOUT - call DO_DOS - pop bc - ld a,(PAUSE) - or a - ret z - - ld a,(BYTE_COUNT) - inc a ;Si se encuentra LF, o se han cogido 80 caracteres, - ld (BYTE_COUNT),a ;se cambia de linea - cp 80 - jr z,PPAUSE_NEWL - ld a,b - cp 10 - ret nz - -PPAUSE_NEWL: xor a - ld (BYTE_COUNT),a - ld a,(LINE_COUNT) ;Si era LF, PAUSE=#FF, y era la linea 23, - inc a ;imprime "Press any key" y hace una pausa - ld (LINE_COUNT),a - cp 23 - ret nz - -PPAUSE_NEWS: xor a ;Pantalla llena - ld (LINE_COUNT),a - ld (BYTE_COUNT),a - print PRESS_S - ld c,_INNOE - call DO_DOS - push af - call CRLF - pop af - or %00100000 - cp "p" - ret nz - xor a - ld (PAUSE),a - ret - -PPAUSE_CLS: call PPAUSE_NEWS - ld e,#C - ld c,_CONOUT - jp DO_DOS +PRINT_PAUSE: cp #C ;Si es "borrar panrtalla", + jr z,PPAUSE_CLS ;actua como pantalla llena + push af + ld e,a + ld c,_CONOUT + call DO_DOS + pop bc + ld a,(PAUSE) + or a + ret z + + ld a,(BYTE_COUNT) + inc a ;Si se encuentra LF, o se han cogido 80 caracteres, + ld (BYTE_COUNT),a ;se cambia de linea + cp 80 + jr z,PPAUSE_NEWL + ld a,b + cp 10 + ret nz + +PPAUSE_NEWL: xor a + ld (BYTE_COUNT),a + ld a,(LINE_COUNT) ;Si era LF, PAUSE=#FF, y era la linea 23, + inc a ;imprime "Press any key" y hace una pausa + ld (LINE_COUNT),a + cp 23 + ret nz + +PPAUSE_NEWS: xor a ;Pantalla llena + ld (LINE_COUNT),a + ld (BYTE_COUNT),a + print PRESS_S + ld c,_INNOE + call DO_DOS + push af + call CRLF + pop af + or %00100000 + cp "p" + ret nz + xor a + ld (PAUSE),a + ret + +PPAUSE_CLS: call PPAUSE_NEWS + ld e,#C + ld c,_CONOUT + jp DO_DOS ;--- CLOSE_FILE: Cierra fichero abierto si lo hay -CLOSE_FILE: ld a,(FILE_FH) - cp #FF - ret z +CLOSE_FILE: ld a,(FILE_FH) + cp #FF + ret z - ld b,a - ld c,_CLOSE - call DO_DOS - ld a,#FF - ld (FILE_FH),a - ret + ld b,a + ld c,_CLOSE + call DO_DOS + ld a,#FF + ld (FILE_FH),a + ret ;------------------------- @@ -3361,65 +3361,65 @@ CLOSE_FILE: ld a,(FILE_FH) ; Si no hay conexion y CONTROL_CON<>#FF, imprimer "ERROR" y devuelve Cy=1. ; Si QUITTING=#FF, no imprime nada. -CHK_CON: call _CHK_CON - ret nc - ld a,0 - ld (TYPE),a - ret - -_CHK_CON: ld a,(CONTROL_CON) - cp #FF - jr nz,CHK_CON2 - - ;CONTROL_CON es #FF: - ;Imprime "Disconnected" y devuelve Cy=1 - - ld a,(QUITTING) - or a - ld de,DISCON_S - ld c,_STROUT - call z,DO_DOS - scf - ret - - ;CONTROL_CON no es #FF: - ;En teoria hay alguna conexion abierta - -CHK_CON2: call TCP_STATUS - or a - jr z,CHK_CON3 - cp 4 - ret z ;Si estamos cerrando, no devolvemos error - ld a,(CONTROL_CON) - call TCP_CLOSE ;1.1 - ld a,(QUITTING) ;aunque no este ESTABLISHED, - or a ;ya que pueden quedar datos por recoger - ld a,#FF - ld (CONTROL_CON),a - scf - ret nz - -CHK_CON21: ;call GET_CDATA ;Si quedan datos pendientes, - ;jr c,CHK_CON22 ;los imprime - ;ld e,a ;(eliminado porque ahora siempre - ;ld c,_CONOUT ;llamamos a R_FLUSH antes de - ;call DO_DOS ;ejecutar cualquier comando) - ;jr CHK_CON21 -CHK_CON22: ;call CRLF - - ld a,(CONTROL_CON) - call TCP_CLOSE ;TCP_ABORT ;No hay conexion abierta: imprime "ERROR" -CHK_CON3: ld a,#FF - ld (CONTROL_CON),a - xor a - ld (GCDATA_COUNT),a - ld a,(QUITTING) - or a - ld de,CONLOST_S - ld c,_STROUT - call z,DO_DOS - scf - ret +CHK_CON: call _CHK_CON + ret nc + ld a,0 + ld (TYPE),a + ret + +_CHK_CON: ld a,(CONTROL_CON) + cp #FF + jr nz,CHK_CON2 + + ;CONTROL_CON es #FF: + ;Imprime "Disconnected" y devuelve Cy=1 + + ld a,(QUITTING) + or a + ld de,DISCON_S + ld c,_STROUT + call z,DO_DOS + scf + ret + + ;CONTROL_CON no es #FF: + ;En teoria hay alguna conexion abierta + +CHK_CON2: call TCP_STATUS + or a + jr z,CHK_CON3 + cp 4 + ret z ;Si estamos cerrando, no devolvemos error + ld a,(CONTROL_CON) + call TCP_CLOSE ;1.1 + ld a,(QUITTING) ;aunque no este ESTABLISHED, + or a ;ya que pueden quedar datos por recoger + ld a,#FF + ld (CONTROL_CON),a + scf + ret nz + +CHK_CON21: ;call GET_CDATA ;Si quedan datos pendientes, + ;jr c,CHK_CON22 ;los imprime + ;ld e,a ;(eliminado porque ahora siempre + ;ld c,_CONOUT ;llamamos a R_FLUSH antes de + ;call DO_DOS ;ejecutar cualquier comando) + ;jr CHK_CON21 +CHK_CON22: ;call CRLF + + ld a,(CONTROL_CON) + call TCP_CLOSE ;TCP_ABORT ;No hay conexion abierta: imprime "ERROR" +CHK_CON3: ld a,#FF + ld (CONTROL_CON),a + xor a + ld (GCDATA_COUNT),a + ld a,(QUITTING) + or a + ld de,CONLOST_S + ld c,_STROUT + call z,DO_DOS + scf + ret ;--- SEND_COM: Envia el comando que hay en SEND_COM_BUF (acabado en CRLF). @@ -3427,52 +3427,52 @@ CHK_CON3: ld a,#FF ; Si DEBUG=#FF, tambien lo imprime por pantalla. ; Devuelve Cy=1 si no hay conexion. -SEND_COM: ld hl,SEND_COM_BUF - ld bc,0 ;Mide la longitud del comando -SEND_COM2: inc bc - ld a,(hl) - inc hl - cp 10 - jr nz,SEND_COM2 - - push bc - call CHK_CON - pop bc - ret c - - ld hl,SEND_COM_BUF - ld de,(XCOM) - inc de - ld a,d - or e - jr nz,SEND_COM3 ;Decrementa el puntero al comando, - ld a,"X" ;incrementa la longitud y pone "X" al principio - ld (SEND_COM_BUF-1),a ;si XCOM y ES_XCOM son #FF - xor a - ld (ES_XCOM),a - dec hl - inc bc -SEND_COM3: push hl - ld a,(CONTROL_CON) - scf - call TCP_SEND - pop hl - jr c,SEND_COM_E - - ld a,(DEBUG) - or a - ret z - - push hl - print FLECHA_S - pop de - call PRINT_L - or a - ret - -SEND_COM_E: print NOMEM_S - scf - ret +SEND_COM: ld hl,SEND_COM_BUF + ld bc,0 ;Mide la longitud del comando +SEND_COM2: inc bc + ld a,(hl) + inc hl + cp 10 + jr nz,SEND_COM2 + + push bc + call CHK_CON + pop bc + ret c + + ld hl,SEND_COM_BUF + ld de,(XCOM) + inc de + ld a,d + or e + jr nz,SEND_COM3 ;Decrementa el puntero al comando, + ld a,"X" ;incrementa la longitud y pone "X" al principio + ld (SEND_COM_BUF-1),a ;si XCOM y ES_XCOM son #FF + xor a + ld (ES_XCOM),a + dec hl + inc bc +SEND_COM3: push hl + ld a,(CONTROL_CON) + scf + call TCP_SEND + pop hl + jr c,SEND_COM_E + + ld a,(DEBUG) + or a + ret z + + push hl + print FLECHA_S + pop de + call PRINT_L + or a + ret + +SEND_COM_E: print NOMEM_S + scf + ret ;--- WAIT_REPLY: Espera una respuesta del servidor y la encola en RESPONSE_BUF @@ -3481,257 +3481,257 @@ SEND_COM_E: print NOMEM_S ; Devuelve Cy=0 y A=primer digito de la respuesta en caso contrario. ; Imprime la respuesta si VERBOSE=#FF (cada vez que hay una linea disponible). -WAIT_REPLY: ld a,#FF - ld (LAST_REPLY),a - call _WAIT_REPLY - ret c ;Si tras llamar a la rutina quedan datos, - ld (LAST_REPLY),a - call HALT - ld e,a ;se vuelve a llamar - push de - ld a,(CONTROL_CON) - call TCP_STATUS - pop de - ld a,h - or l - jr nz,WAIT_REPLY - ld a,e - or a - ret - -_WAIT_REPLY: ; - xor a - ld (WREPLY_LINE),a - - ;--- Coge una linea completa - -WREPLY_LOOP1: ld hl,RESPONSE_BUF -WREPLY_LOOP2: call HALT - ld a,(IDENT_CON) - cp #FF - call nz,IDENT_AUTOM ;!!! Mejorar esto - push hl - call CHK_CON - pop hl - ret c -WREPLY_LOOP3: push hl - call GET_CDATA - pop hl - jr c,WREPLY_LOOP2 - ld (hl),a - inc hl - cp 10 - jr nz,WREPLY_LOOP3 - - ;--- Se ha cogido una linea completa: - ; Actuamos segun si es la primera linea o no - - ld a,(WREPLY_LINE) - or a - jr nz,WREPLY_NO1 - - ;--- Primera linea - - ;Comprueba que el primer caracter sea un numero, - ;de lo contrario ignora la linea - - ld a,(RESPONSE_BUF) - cp "0" - jr c,WREPLY_LOOP1 - cp "9"+1 - jr nc,WREPLY_LOOP1 - - ;Copia el codigo a WREPLY_CODE - - ld hl,RESPONSE_BUF - ld de,WREPLY_CODE - ld bc,4 - ldir - - ;Lo imprime si es un error, o si VERBOSE=#FF - - call WREPLY_PRINT - - ;Si no hay mas lineas, termina - -WREPLY_OK1: ld a,(RESPONSE_BUF+3) - cp " " - jr nz,WREPLY_HAYMAS - - ld a,(RESPONSE_BUF) - sub "0" - or a - ret - -WREPLY_HAYMAS: ld a,#FF - ld (WREPLY_LINE),a - jr WREPLY_LOOP1 - - ;--- Siguientes lineas - -WREPLY_NO1: ; - - ;Lo imprime si es un error, o si VERBOSE=#FF - - call WREPLY_PRINT - - ;Comprueba si el codigo coincide con el que hay en WREPLY_CODE, - ;en ese caso termina, si no, hay mas lineas - - ld hl,RESPONSE_BUF - ld de,WREPLY_CODE - ld b,3 -WREPLY_LOOP4: ld a,(de) - cp (hl) - inc hl - inc de - jp nz,WREPLY_LOOP1 - djnz WREPLY_LOOP4 - ld a,(hl) - cp " " - jp nz,WREPLY_LOOP1 - - ld a,(RESPONSE_BUF) - sub "0" - or a - ret +WAIT_REPLY: ld a,#FF + ld (LAST_REPLY),a + call _WAIT_REPLY + ret c ;Si tras llamar a la rutina quedan datos, + ld (LAST_REPLY),a + call HALT + ld e,a ;se vuelve a llamar + push de + ld a,(CONTROL_CON) + call TCP_STATUS + pop de + ld a,h + or l + jr nz,WAIT_REPLY + ld a,e + or a + ret + +_WAIT_REPLY: ; + xor a + ld (WREPLY_LINE),a + + ;--- Coge una linea completa + +WREPLY_LOOP1: ld hl,RESPONSE_BUF +WREPLY_LOOP2: call HALT + ld a,(IDENT_CON) + cp #FF + call nz,IDENT_AUTOM ;!!! Mejorar esto + push hl + call CHK_CON + pop hl + ret c +WREPLY_LOOP3: push hl + call GET_CDATA + pop hl + jr c,WREPLY_LOOP2 + ld (hl),a + inc hl + cp 10 + jr nz,WREPLY_LOOP3 + + ;--- Se ha cogido una linea completa: + ; Actuamos segun si es la primera linea o no + + ld a,(WREPLY_LINE) + or a + jr nz,WREPLY_NO1 + + ;--- Primera linea + + ;Comprueba que el primer caracter sea un numero, + ;de lo contrario ignora la linea + + ld a,(RESPONSE_BUF) + cp "0" + jr c,WREPLY_LOOP1 + cp "9"+1 + jr nc,WREPLY_LOOP1 + + ;Copia el codigo a WREPLY_CODE + + ld hl,RESPONSE_BUF + ld de,WREPLY_CODE + ld bc,4 + ldir + + ;Lo imprime si es un error, o si VERBOSE=#FF + + call WREPLY_PRINT + + ;Si no hay mas lineas, termina + +WREPLY_OK1: ld a,(RESPONSE_BUF+3) + cp " " + jr nz,WREPLY_HAYMAS + + ld a,(RESPONSE_BUF) + sub "0" + or a + ret + +WREPLY_HAYMAS: ld a,#FF + ld (WREPLY_LINE),a + jr WREPLY_LOOP1 + + ;--- Siguientes lineas + +WREPLY_NO1: ; + + ;Lo imprime si es un error, o si VERBOSE=#FF + + call WREPLY_PRINT + + ;Comprueba si el codigo coincide con el que hay en WREPLY_CODE, + ;en ese caso termina, si no, hay mas lineas + + ld hl,RESPONSE_BUF + ld de,WREPLY_CODE + ld b,3 +WREPLY_LOOP4: ld a,(de) + cp (hl) + inc hl + inc de + jp nz,WREPLY_LOOP1 + djnz WREPLY_LOOP4 + ld a,(hl) + cp " " + jp nz,WREPLY_LOOP1 + + ld a,(RESPONSE_BUF) + sub "0" + or a + ret - ;--- Esta subrutina imprime la linea de RESPONSE_BUF - ; si es un error o si VERBOSE=#FF + ;--- Esta subrutina imprime la linea de RESPONSE_BUF + ; si es un error o si VERBOSE=#FF -WREPLY_PRINT: ld a,(VERBOSE) - or a - jr nz,WREPLY_PRINT2 +WREPLY_PRINT: ld a,(VERBOSE) + or a + jr nz,WREPLY_PRINT2 - ld a,(RESPONSE_BUF) - cp "4" - jr z,WREPLY_PRE - cp "5" - ret nz + ld a,(RESPONSE_BUF) + cp "4" + jr z,WREPLY_PRE + cp "5" + ret nz -WREPLY_PRE: printl RESPONSE_BUF+4 - jr WREPLY_OK1 +WREPLY_PRE: printl RESPONSE_BUF+4 + jr WREPLY_OK1 -WREPLY_PRINT2: printl RESPONSE_BUF - ret +WREPLY_PRINT2: printl RESPONSE_BUF + ret -WREPLY_LINE: db 0 ;Linea: 0=1a, #FF=otras -WREPLY_CODE: db "000 " ;Codigo de la 1a linea +WREPLY_LINE: db 0 ;Linea: 0=1a, #FF=otras +WREPLY_CODE: db "000 " ;Codigo de la 1a linea ;--- GET_CDATA: Obtiene un byte de datos en A de la conexion de control, ; usando un bufer de 256 bytes -GET_CDATA: ld a,(GCDATA_COUNT) - or a - jr z,GCDATA_NEW - dec a - ld (GCDATA_COUNT),a - ld hl,(GCDATA_PNT) - ld a,(hl) - inc hl - ld (GCDATA_PNT),hl - or a - ret - -GCDATA_NEW: ld de,GDATA_CBUF - ld a,(CONTROL_CON) - ld bc,256 - call TCP_RCV - ret c - scf - ret z - - dec bc - ld a,c - ld (GCDATA_COUNT),a - ld hl,GDATA_CBUF+1 - ld (GCDATA_PNT),hl - ld a,(GDATA_CBUF) - or a - ret - -GCDATA_COUNT: db 0 -GCDATA_PNT: dw 0 +GET_CDATA: ld a,(GCDATA_COUNT) + or a + jr z,GCDATA_NEW + dec a + ld (GCDATA_COUNT),a + ld hl,(GCDATA_PNT) + ld a,(hl) + inc hl + ld (GCDATA_PNT),hl + or a + ret + +GCDATA_NEW: ld de,GDATA_CBUF + ld a,(CONTROL_CON) + ld bc,256 + call TCP_RCV + ret c + scf + ret z + + dec bc + ld a,c + ld (GCDATA_COUNT),a + ld hl,GDATA_CBUF+1 + ld (GCDATA_PNT),hl + ld a,(GDATA_CBUF) + or a + ret + +GCDATA_COUNT: db 0 +GCDATA_PNT: dw 0 ;--- GET_DDATA: Obtiene un byte de datos en A de la conexion de datos, ; usando un bufer de 256 bytes -GET_DDATA: ld a,(GDDATA_COUNT) - or a - jr z,GDDATA_NEW - dec a - ld (GDDATA_COUNT),a - ld hl,(GDDATA_PNT) - ld a,(hl) - inc hl - ld (GDDATA_PNT),hl - or a - ret - -GDDATA_NEW: ld de,GDATA_DBUF - ld a,(DATA_CON) - ld bc,256 - call TCP_RCV - ret c - scf - ret z - - dec bc - ld a,c - ld (GDDATA_COUNT),a - ld hl,GDATA_DBUF+1 - ld (GDDATA_PNT),hl - ld a,(GDATA_DBUF) - or a - ret - -GDDATA_COUNT: db 0 -GDDATA_PNT: dw 0 +GET_DDATA: ld a,(GDDATA_COUNT) + or a + jr z,GDDATA_NEW + dec a + ld (GDDATA_COUNT),a + ld hl,(GDDATA_PNT) + ld a,(hl) + inc hl + ld (GDDATA_PNT),hl + or a + ret + +GDDATA_NEW: ld de,GDATA_DBUF + ld a,(DATA_CON) + ld bc,256 + call TCP_RCV + ret c + scf + ret z + + dec bc + ld a,c + ld (GDDATA_COUNT),a + ld hl,GDATA_DBUF+1 + ld (GDDATA_PNT),hl + ld a,(GDATA_DBUF) + or a + ret + +GDDATA_COUNT: db 0 +GDDATA_PNT: dw 0 ;--- GET_LDATA: Obtiene un byte de datos en A del fichero abierto en FILE_FH, ; usando un bufer de 256 bytes (el mismo que GET_DDATA) -GET_LDATA: ld a,(GLDATA_COUNT) - or a - jr z,GLDATA_NEW - dec a - ld (GLDATA_COUNT),a - ld hl,(GLDATA_PNT) - ld a,(hl) - inc hl - ld (GLDATA_PNT),hl - or a - ret - -GLDATA_NEW: ld a,(FILE_FH) - cp #FF - scf - ret z - ld b,a - ld de,GDATA_DBUF - ld hl,256 - ld c,_READ - call DO_DOS - or a - scf - ret nz - - dec hl - ld a,l - ld (GLDATA_COUNT),a - ld hl,GDATA_DBUF+1 - ld (GLDATA_PNT),hl - or a - ld a,(GDATA_DBUF) - or a - ret - -GLDATA_COUNT: db 0 -GLDATA_PNT: dw 0 +GET_LDATA: ld a,(GLDATA_COUNT) + or a + jr z,GLDATA_NEW + dec a + ld (GLDATA_COUNT),a + ld hl,(GLDATA_PNT) + ld a,(hl) + inc hl + ld (GLDATA_PNT),hl + or a + ret + +GLDATA_NEW: ld a,(FILE_FH) + cp #FF + scf + ret z + ld b,a + ld de,GDATA_DBUF + ld hl,256 + ld c,_READ + call DO_DOS + or a + scf + ret nz + + dec hl + ld a,l + ld (GLDATA_COUNT),a + ld hl,GDATA_DBUF+1 + ld (GLDATA_PNT),hl + or a + ld a,(GDATA_DBUF) + or a + ret + +GLDATA_COUNT: db 0 +GLDATA_PNT: dw 0 ;--- AUTOMATA_NO1: Automata FTP para comandos simples, @@ -3739,40 +3739,40 @@ GLDATA_PNT: dw 0 ; Envia el comando que hay en SEND_COM_BUF y espera una respuesta. ; Si la respuesta no es 2yz, 4yz o 5yz, imprime "ERROR: Unexpected reply". -AUTOMATA_NO1: call SEND_COM - ret c +AUTOMATA_NO1: call SEND_COM + ret c - call WAIT_REPLY - ret c + call WAIT_REPLY + ret c - cp 2 - ret z - cp 4 - ret z - cp 5 - ret z + cp 2 + ret z + cp 4 + ret z + cp 5 + ret z - print UNEXPEC_S - scf - ret + print UNEXPEC_S + scf + ret ;--- HALT: Espera a la siguiente interrupcion -HALT: push af,bc,de,hl - ld a,TCPIP_WAIT - call CALL_UNAPI - ;ld c,#B - ;call DO_DOS - pop hl,de,bc,af - ret +HALT: push af,bc,de,hl + ld a,TCPIP_WAIT + call CALL_UNAPI + ;ld c,#B + ;call DO_DOS + pop hl,de,bc,af + ret ;--- OPEN_DCON: Abre una conexion de datos activa o pasiva -OPEN_DCON: ld a,(PASSIVE) - or a - jp z,OPEN_DCON_A +OPEN_DCON: ld a,(PASSIVE) + or a + jp z,OPEN_DCON_A ;--- OPEN_DCON_P: @@ -3782,71 +3782,71 @@ OPEN_DCON: ld a,(PASSIVE) ; - Si no puede abrir la conexion, o hay error al enviar el PORT, ; imprime el error y vuelve con Cy=1 -OPEN_DCON_P: ld a,(DATA_CON) - cp #FF - jr z,OPEN_DCONP2 - call TCP_ABORT -OPEN_DCONP2: call HALT - - ld hl,C_PASV - ld de,SEND_COM_BUF - ld bc,5 - ldir - call APPEND_LF - - call AUTOMATA_NO1 ;Envia comando PASV y espera respuesta, - cp 2 ;termina si no es 2yz - jp nz,OPEN_DCON_E - - ;* Busca en la respuesta el primer caracter numerico - - ld hl,RESPONSE_BUF+3 -OPEN_DCP_L1: inc hl - ld a,(hl) - cp "0" - jr c,OPEN_DCP_L1 - cp "9"+1 - jr nc,OPEN_DCP_L1 - - ;* Ahora extrae la IP y el puerto, los va guardando en DATA_BUF - - ld de,DATA_BUF - ld b,6 ;4 bytes para IP y 2 para puerto - -OPEN_DCP_L2: push bc,de - call EXTNUM - - ld e,d ;Hace que HL apunte al siguiente numero - ld d,0 - add hl,de - inc hl - - pop de ;Almacena el numero y pasa al siguiente - ld a,c - ld (de),a - inc de - pop bc - djnz OPEN_DCP_L2 - - ;* Abre la conexion con los datos obtenidos - - ld hl,(DATA_BUF) - ld de,(DATA_BUF+2) - ld a,(DATA_BUF+4) - ld ixh,a - ld a,(DATA_BUF+5) - ld ixl,a - ld iy,#FFFF - xor a - ld bc,0 - call TCP_OPEN - - ld de,WHENOPEND_S - ld hl,OPENERR_T - jp c,SHOW_ERR - ld (DATA_CON),a - or a - ret +OPEN_DCON_P: ld a,(DATA_CON) + cp #FF + jr z,OPEN_DCONP2 + call TCP_ABORT +OPEN_DCONP2: call HALT + + ld hl,C_PASV + ld de,SEND_COM_BUF + ld bc,5 + ldir + call APPEND_LF + + call AUTOMATA_NO1 ;Envia comando PASV y espera respuesta, + cp 2 ;termina si no es 2yz + jp nz,OPEN_DCON_E + + ;* Busca en la respuesta el primer caracter numerico + + ld hl,RESPONSE_BUF+3 +OPEN_DCP_L1: inc hl + ld a,(hl) + cp "0" + jr c,OPEN_DCP_L1 + cp "9"+1 + jr nc,OPEN_DCP_L1 + + ;* Ahora extrae la IP y el puerto, los va guardando en DATA_BUF + + ld de,DATA_BUF + ld b,6 ;4 bytes para IP y 2 para puerto + +OPEN_DCP_L2: push bc,de + call EXTNUM + + ld e,d ;Hace que HL apunte al siguiente numero + ld d,0 + add hl,de + inc hl + + pop de ;Almacena el numero y pasa al siguiente + ld a,c + ld (de),a + inc de + pop bc + djnz OPEN_DCP_L2 + + ;* Abre la conexion con los datos obtenidos + + ld hl,(DATA_BUF) + ld de,(DATA_BUF+2) + ld a,(DATA_BUF+4) + ld ixh,a + ld a,(DATA_BUF+5) + ld ixl,a + ld iy,#FFFF + xor a + ld bc,0 + call TCP_OPEN + + ld de,WHENOPEND_S + ld hl,OPENERR_T + jp c,SHOW_ERR + ld (DATA_CON),a + or a + ret ;--- OPEN_DCON_A: @@ -3855,65 +3855,65 @@ OPEN_DCP_L2: push bc,de ; - Si no puede abrir la conexion, o hay error al enviar el PORT, ; imprime el error y vuelve con Cy=1 -OPEN_DCON_A: ld a,(DATA_CON) - cp #FF - jr z,OPEN_DCON2 - call TCP_ABORT -OPEN_DCON2: call HALT - - ld hl,0 - ld de,0 - ld iy,#FFFF - ld bc,0 - ld a,#FF - call TCP_OPEN ;Abre conexion pasiva - ld de,WHENOPEND_S - ld hl,OPENERR_T - jp c,SHOW_ERR - ld (DATA_CON),a - - ld b,a - ld hl,TCP_INFO_BLOCK - ld a,TCPIP_TCP_STATE ;Establece lo que queda de la cadena - call CALL_UNAPI - or a - jr nz,OPEN_DCON_E - ld de,(TCP_INFO_BLOCK+6) ;Lee el puerto local - - ld bc,(PORT_C_PNT) - push bc - ld a,d - push de - call SET_IP - pop de - inc hl - ld a,e - call SET_IP - ld hl,(PORT_C_PNT) - dec hl - ld (hl),0 - pop hl - ld (PORT_C_PNT),hl - - ld hl,C_PORT - ld de,SEND_COM_BUF - ld bc,32 - ldir - call APPEND_LF - - call AUTOMATA_NO1 ;Envia comando PORT y espera respuesta, - cp 2 ;termina si no es 2yz - jr nz,OPEN_DCON_E - - or a - ret - -OPEN_DCON_E: ld a,(DATA_CON) - call TCP_ABORT - ld a,#FF - ld (DATA_CON),a - scf - ret +OPEN_DCON_A: ld a,(DATA_CON) + cp #FF + jr z,OPEN_DCON2 + call TCP_ABORT +OPEN_DCON2: call HALT + + ld hl,0 + ld de,0 + ld iy,#FFFF + ld bc,0 + ld a,#FF + call TCP_OPEN ;Abre conexion pasiva + ld de,WHENOPEND_S + ld hl,OPENERR_T + jp c,SHOW_ERR + ld (DATA_CON),a + + ld b,a + ld hl,TCP_INFO_BLOCK + ld a,TCPIP_TCP_STATE ;Establece lo que queda de la cadena + call CALL_UNAPI + or a + jr nz,OPEN_DCON_E + ld de,(TCP_INFO_BLOCK+6) ;Lee el puerto local + + ld bc,(PORT_C_PNT) + push bc + ld a,d + push de + call SET_IP + pop de + inc hl + ld a,e + call SET_IP + ld hl,(PORT_C_PNT) + dec hl + ld (hl),0 + pop hl + ld (PORT_C_PNT),hl + + ld hl,C_PORT + ld de,SEND_COM_BUF + ld bc,32 + ldir + call APPEND_LF + + call AUTOMATA_NO1 ;Envia comando PORT y espera respuesta, + cp 2 ;termina si no es 2yz + jr nz,OPEN_DCON_E + + or a + ret + +OPEN_DCON_E: ld a,(DATA_CON) + call TCP_ABORT + ld a,#FF + ld (DATA_CON),a + scf + ret ;--- PUTRIEVE: Rutina generica para enviar datos con el comando PUT: @@ -3924,151 +3924,151 @@ OPEN_DCON_E: ld a,(DATA_CON) ; en USER_COM_BUF en el lugar PUTR_PAR ; Vuelve con Cy=1 si hay cualquier error -PUTRIEVE: call CHK_CON - jp c,PUTR_END - - ;--- Abre conexion, - ; envia PORT, espera conexion OK - - call OPEN_DCON ;Abre conexion, envia PORT - jp c,PUTR_END - - ld hl,(PUTR_COM) ;Envia comando con el parametro - call SET_COMMAND - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,(PUTR_PAR) - call EXTPAR - call nc,SET_SPACE - call APPEND_LF - call SEND_COM - - call WAIT_REPLY ;Espera respuesta, que ha de - jp c,PUTR_E ;ser 1yz - cp 1 - jr z,PUTR_WAIT - cp 4 - jp z,PUTR_E - cp 5 - jp z,PUTR_E - jp PUTR_EX - -PUTR_WAIT: call HALT ;Espera a que la conexion este - ld a,(DATA_CON) ;o ESTABLISHED o cerrandose - call TCP_STATUS ;(ya se han recibido todos los datos) - or a - jp z,PUTR_E2 - cp 4 - jr c,PUTR_WAIT - - ;--- Conexion abierta: va leyendo datos del fichero - ; y los envia a la conexion - -PUTR_LOOP: ld a,(FILE_FH) - ld b,a - ld c,_READ - ld hl,512 - ld de,DATA_BUF - call DOS - jr nc,PUTR_RDOK - - ld a,(HASH) - or a - call nz,CRLF - ld a,(DATA_CON) - call TCP_CLOSE - call HALT - call WAIT_REPLY ;Fin del fichero: cierra conexcion de datos, - jp c,PUTR_END ;espera respuesta de la conexion de control, - cp 2 ;y termina - jp z,PUTR_END - cp 4 - jp z,PUTR_END - cp 5 - jp z,PUTR_END - print UNEXPEC_S - scf - jp PUTR_END - -PUTR_RDOK: push hl - pop bc -PUTR_LOP2: push bc - call HALT - ld a,(DATA_CON) - ld hl,DATA_BUF - scf - call TCP_SEND ;Intenta enviar datos - pop bc - jr nc,PUTR_OKDATA - - cp ERR_BUFFER - jr z,PUTR_LOP2 - - ld a,(DATA_CON) ;Conexion cerrada antes de tiempo? - call TCP_ABORT ;Entonces mostramos error - ld a,(HASH) - or a - call nz,CRLF - ld a,#FF - ld (DATA_CON),a - print DCONREF_S - ;call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, - ;jp c,PUTR_END ;espera respuesta de la conexion de control, - ;cp 2 ;y termina - ;jp z,PUTR_END - ;cp 4 - ;jp z,PUTR_END - ;cp 5 - ;jp z,PUTR_END - ;print UNEXPEC_S - scf - jr PUTR_END -PUTR_OKDATA: ; - - ld a,(HASH) - or a - ld e,"#" - ld c,_CONOUT - call nz,DO_DOS - - jp PUTR_LOOP - - ;--- Rutinas de terminacion - -PUTR_E: ld a,(DATA_CON) ;Error del comando "PORT": - call TCP_ABORT ;cierra conexion y termina - scf - jp PUTR_END - -PUTR_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar - ld a,(DATA_CON) - call TCP_ABORT - call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) - scf - jp PUTR_END - -PUTR_EX: ld a,(DATA_CON) ;Respuesta inesperada al - call TCP_ABORT ;comando "PORT" - call R_UNEX - scf - ;jp PUTR_END - -PUTR_END: push af - ld a,(FILE_FH) - cp #FF - jr z,PUTR_END2 - ld a,(FILE_FH) - ld b,a - ld c,_CLOSE - call DO_DOS - ld a,#FF - ld (FILE_FH),a -PUTR_END2: pop af - - ret - -PUT_EXE: db 0 -PUTR_COM: dw 0 +PUTRIEVE: call CHK_CON + jp c,PUTR_END + + ;--- Abre conexion, + ; envia PORT, espera conexion OK + + call OPEN_DCON ;Abre conexion, envia PORT + jp c,PUTR_END + + ld hl,(PUTR_COM) ;Envia comando con el parametro + call SET_COMMAND + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,(PUTR_PAR) + call EXTPAR + call nc,SET_SPACE + call APPEND_LF + call SEND_COM + + call WAIT_REPLY ;Espera respuesta, que ha de + jp c,PUTR_E ;ser 1yz + cp 1 + jr z,PUTR_WAIT + cp 4 + jp z,PUTR_E + cp 5 + jp z,PUTR_E + jp PUTR_EX + +PUTR_WAIT: call HALT ;Espera a que la conexion este + ld a,(DATA_CON) ;o ESTABLISHED o cerrandose + call TCP_STATUS ;(ya se han recibido todos los datos) + or a + jp z,PUTR_E2 + cp 4 + jr c,PUTR_WAIT + + ;--- Conexion abierta: va leyendo datos del fichero + ; y los envia a la conexion + +PUTR_LOOP: ld a,(FILE_FH) + ld b,a + ld c,_READ + ld hl,512 + ld de,DATA_BUF + call DOS + jr nc,PUTR_RDOK + + ld a,(HASH) + or a + call nz,CRLF + ld a,(DATA_CON) + call TCP_CLOSE + call HALT + call WAIT_REPLY ;Fin del fichero: cierra conexcion de datos, + jp c,PUTR_END ;espera respuesta de la conexion de control, + cp 2 ;y termina + jp z,PUTR_END + cp 4 + jp z,PUTR_END + cp 5 + jp z,PUTR_END + print UNEXPEC_S + scf + jp PUTR_END + +PUTR_RDOK: push hl + pop bc +PUTR_LOP2: push bc + call HALT + ld a,(DATA_CON) + ld hl,DATA_BUF + scf + call TCP_SEND ;Intenta enviar datos + pop bc + jr nc,PUTR_OKDATA + + cp ERR_BUFFER + jr z,PUTR_LOP2 + + ld a,(DATA_CON) ;Conexion cerrada antes de tiempo? + call TCP_ABORT ;Entonces mostramos error + ld a,(HASH) + or a + call nz,CRLF + ld a,#FF + ld (DATA_CON),a + print DCONREF_S + ;call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, + ;jp c,PUTR_END ;espera respuesta de la conexion de control, + ;cp 2 ;y termina + ;jp z,PUTR_END + ;cp 4 + ;jp z,PUTR_END + ;cp 5 + ;jp z,PUTR_END + ;print UNEXPEC_S + scf + jr PUTR_END +PUTR_OKDATA: ; + + ld a,(HASH) + or a + ld e,"#" + ld c,_CONOUT + call nz,DO_DOS + + jp PUTR_LOOP + + ;--- Rutinas de terminacion + +PUTR_E: ld a,(DATA_CON) ;Error del comando "PORT": + call TCP_ABORT ;cierra conexion y termina + scf + jp PUTR_END + +PUTR_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar + ld a,(DATA_CON) + call TCP_ABORT + call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) + scf + jp PUTR_END + +PUTR_EX: ld a,(DATA_CON) ;Respuesta inesperada al + call TCP_ABORT ;comando "PORT" + call R_UNEX + scf + ;jp PUTR_END + +PUTR_END: push af + ld a,(FILE_FH) + cp #FF + jr z,PUTR_END2 + ld a,(FILE_FH) + ld b,a + ld c,_CLOSE + call DO_DOS + ld a,#FF + ld (FILE_FH),a +PUTR_END2: pop af + + ret + +PUT_EXE: db 0 +PUTR_COM: dw 0 ;--- RETRIEVE: Rutina generica para obtener datos @@ -4082,219 +4082,219 @@ PUTR_COM: dw 0 ; en USER_COM_BUF en el lugar RETR_PAR ; Vuelve con Cy=1 si hay cualquier error -RETRIEVE: call CHK_CON - jp c,RETR_END - - ;--- Abre conexion, envia TYPE A si es necesario, - ; envia PORT, espera conexion OK - - ld a,(MUST_ASCII) - or a - jr z,RETRV2 - call SILENT_ASCII ;Pone modo ASCII si es necesario - jp c,RETR_END - - ld a,(LAST_REPLY) ;Si "TYPE A" genera error, - cp 2 ;no seguimos - jr z,RETRV2 - - xor a - ld (MUST_ASCII),a - jp RETR_END - -RETRV2: call OPEN_DCON ;Abre conexion, envia PORT - jr nc,RETRV3 - - ;xor a - ;ld (MUST_ASCII),a - jp RETR_END - -RETRV3: ld hl,(RETR_COM) ;Envia comando con el parametro - call SET_COMMAND - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,(RETR_PAR) - call EXTPAR - call nc,SET_SPACE - call APPEND_LF - call SEND_COM - - call _WAIT_REPLY ;Espera respuesta, que ha de - jp c,RETR_E ;ser 1yz - cp 1 - jr z,RETR_WAIT - cp 4 - jp z,RETR_E - cp 5 - jp z,RETR_E - jp RETR_EX - -RETR_WAIT: call HALT ;Espera a que la conexion este - ld a,(DATA_CON) ;o ESTABLISHED o cerrandose - call TCP_STATUS ;(ya se han recibido todos los datos) - or a - jp z,RETR_E2 - cp 4 - jr c,RETR_WAIT - - xor a - ld (LINE_COUNT),a - ld (BYTE_COUNT),a - - ;--- Conexion abierta: va leyendo datos - ; y los imprime o los guarda en el fichero - -RETR_LOOP: call HALT - ld a,(DATA_CON) - ld de,DATA_BUF - ld bc,512 - call TCP_RCV ;Intenta recibir datos - jr nz,RETR_OKDATA - - ;cp 5 ;Si no hay datos pero la conexion sigue ESTABLISHED - ;jp nz,RETR_E2 ;(puede recibir mas datos), sigue esperando - ld a,(DATA_CON) - call TCP_STATUS - cp 4 - jr z,RETR_LOOP - ld a,(DATA_CON) - call TCP_CLOSE ;TCP_ABORT - ld a,(HASH) - or a - call nz,CRLF - ld a,#FF - ld (DATA_CON),a - call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, - jp c,RETR_END ;espera respuesta de la conexion de control, - cp 2 ;y termina - jp z,RETR_END - cp 4 - jp z,RETR_END - cp 5 - jp z,RETR_END - print UNEXPEC_S - scf - jp RETR_END -RETR_OKDATA: ; - - ld a,(FILE_FH) - cp #FF - jr nz,RETR_FILE - - ;--- FILE_FH=#FF: Imprime los datos en pantalla - - ld hl,DATA_BUF ;Imprime todos los datos recibidos -RETR_LOOP2: push bc,hl - ld a,(hl) - call PRINT_PAUSE - pop hl - inc hl - pop bc - dec bc - ld a,b - or c - jr nz,RETR_LOOP2 - jp RETR_LOOP - - ;--- FILE_FH<>#FF: Guarda los datos en el fichero - -RETR_FILE: ld a,(HASH) - or a - ld e,"#" - push bc - ld c,_CONOUT - call nz,DO_DOS - pop hl - - ld a,(FILE_FH) - ld b,a - ld c,_WRITE - ld de,DATA_BUF - call DOS - jr c,RETR_E - - jp RETR_LOOP - - ;--- Rutinas de terminacion - -RETR_E: ld a,(DATA_CON) ;Error del comando "PORT": - call TCP_ABORT ;cierra conexion y termina - scf - jp RETR_END - -RETR_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar - ld a,(DATA_CON) - call TCP_ABORT - call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) - scf - jp RETR_END - -RETR_EX: ld a,(DATA_CON) ;Respuesta inesperada al - call TCP_ABORT ;comando "PORT" - call R_UNEX - scf - ;jp RETR_END - -RETR_END: push af - ld a,(FILE_FH) - cp #FF - jr z,RETR_END2 - ld a,(FILE_FH) - ld b,a - ld c,_CLOSE - call DO_DOS - ld a,#FF - ld (FILE_FH),a -RETR_END2: ; - - ld a,(MUST_ASCII) - or a - jr z,RETR_END2! - ld a,(CONTROL_CON) - cp #FF - call nz,SILENT_BIN ;Restaura TYPE antiguo -RETR_END2!: pop af - ret - -RETR_COM: dw 0 -RETR_PAR: db 0 -PUTR_PAR: equ RETR_PAR -MUST_ASCII: db 0 +RETRIEVE: call CHK_CON + jp c,RETR_END + + ;--- Abre conexion, envia TYPE A si es necesario, + ; envia PORT, espera conexion OK + + ld a,(MUST_ASCII) + or a + jr z,RETRV2 + call SILENT_ASCII ;Pone modo ASCII si es necesario + jp c,RETR_END + + ld a,(LAST_REPLY) ;Si "TYPE A" genera error, + cp 2 ;no seguimos + jr z,RETRV2 + + xor a + ld (MUST_ASCII),a + jp RETR_END + +RETRV2: call OPEN_DCON ;Abre conexion, envia PORT + jr nc,RETRV3 + + ;xor a + ;ld (MUST_ASCII),a + jp RETR_END + +RETRV3: ld hl,(RETR_COM) ;Envia comando con el parametro + call SET_COMMAND + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,(RETR_PAR) + call EXTPAR + call nc,SET_SPACE + call APPEND_LF + call SEND_COM + + call _WAIT_REPLY ;Espera respuesta, que ha de + jp c,RETR_E ;ser 1yz + cp 1 + jr z,RETR_WAIT + cp 4 + jp z,RETR_E + cp 5 + jp z,RETR_E + jp RETR_EX + +RETR_WAIT: call HALT ;Espera a que la conexion este + ld a,(DATA_CON) ;o ESTABLISHED o cerrandose + call TCP_STATUS ;(ya se han recibido todos los datos) + or a + jp z,RETR_E2 + cp 4 + jr c,RETR_WAIT + + xor a + ld (LINE_COUNT),a + ld (BYTE_COUNT),a + + ;--- Conexion abierta: va leyendo datos + ; y los imprime o los guarda en el fichero + +RETR_LOOP: call HALT + ld a,(DATA_CON) + ld de,DATA_BUF + ld bc,512 + call TCP_RCV ;Intenta recibir datos + jr nz,RETR_OKDATA + + ;cp 5 ;Si no hay datos pero la conexion sigue ESTABLISHED + ;jp nz,RETR_E2 ;(puede recibir mas datos), sigue esperando + ld a,(DATA_CON) + call TCP_STATUS + cp 4 + jr z,RETR_LOOP + ld a,(DATA_CON) + call TCP_CLOSE ;TCP_ABORT + ld a,(HASH) + or a + call nz,CRLF + ld a,#FF + ld (DATA_CON),a + call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, + jp c,RETR_END ;espera respuesta de la conexion de control, + cp 2 ;y termina + jp z,RETR_END + cp 4 + jp z,RETR_END + cp 5 + jp z,RETR_END + print UNEXPEC_S + scf + jp RETR_END +RETR_OKDATA: ; + + ld a,(FILE_FH) + cp #FF + jr nz,RETR_FILE + + ;--- FILE_FH=#FF: Imprime los datos en pantalla + + ld hl,DATA_BUF ;Imprime todos los datos recibidos +RETR_LOOP2: push bc,hl + ld a,(hl) + call PRINT_PAUSE + pop hl + inc hl + pop bc + dec bc + ld a,b + or c + jr nz,RETR_LOOP2 + jp RETR_LOOP + + ;--- FILE_FH<>#FF: Guarda los datos en el fichero + +RETR_FILE: ld a,(HASH) + or a + ld e,"#" + push bc + ld c,_CONOUT + call nz,DO_DOS + pop hl + + ld a,(FILE_FH) + ld b,a + ld c,_WRITE + ld de,DATA_BUF + call DOS + jr c,RETR_E + + jp RETR_LOOP + + ;--- Rutinas de terminacion + +RETR_E: ld a,(DATA_CON) ;Error del comando "PORT": + call TCP_ABORT ;cierra conexion y termina + scf + jp RETR_END + +RETR_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar + ld a,(DATA_CON) + call TCP_ABORT + call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) + scf + jp RETR_END + +RETR_EX: ld a,(DATA_CON) ;Respuesta inesperada al + call TCP_ABORT ;comando "PORT" + call R_UNEX + scf + ;jp RETR_END + +RETR_END: push af + ld a,(FILE_FH) + cp #FF + jr z,RETR_END2 + ld a,(FILE_FH) + ld b,a + ld c,_CLOSE + call DO_DOS + ld a,#FF + ld (FILE_FH),a +RETR_END2: ; + + ld a,(MUST_ASCII) + or a + jr z,RETR_END2! + ld a,(CONTROL_CON) + cp #FF + call nz,SILENT_BIN ;Restaura TYPE antiguo +RETR_END2!: pop af + ret + +RETR_COM: dw 0 +RETR_PAR: db 0 +PUTR_PAR: equ RETR_PAR +MUST_ASCII: db 0 ;--- SILENT_ASCII: Establece modo ASCII sin mostrar respuesta ; aunque VERBOSE este activado. ; Devuelve Cy=1 en caso de error. -SILENT_ASCII: ld a,(VERBOSE) - ld (OLD_VERBOSE),a - xor a - ld (VERBOSE),a - ld a,(TYPE) ;Primero pone tipo ASCII - ld (OLD_TYPE),a ;(no muestra el resultado del comando - call R_ASCII ;aunque VERBOSE este activado) - ld a,(OLD_VERBOSE) - ld (VERBOSE),a - ret +SILENT_ASCII: ld a,(VERBOSE) + ld (OLD_VERBOSE),a + xor a + ld (VERBOSE),a + ld a,(TYPE) ;Primero pone tipo ASCII + ld (OLD_TYPE),a ;(no muestra el resultado del comando + call R_ASCII ;aunque VERBOSE este activado) + ld a,(OLD_VERBOSE) + ld (VERBOSE),a + ret ;--- SILENT_BIN: Restaura el modo de OLD_TYPE sin mostrar respuesta ; aunque VERBOSE este activado. ; Devuelve Cy=1 en caso de error. -SILENT_BIN: ld hl,SILENT_BIN2 - push hl - ld a,(VERBOSE) ;Restaura TYPE antiguo - ld (OLD_VERBOSE),a - xor a - ld (VERBOSE),a - ld a,(OLD_TYPE) - or a - jp z,R_ASCII - jp R_BINARY -SILENT_BIN2: ld a,(OLD_VERBOSE) - ld (VERBOSE),a - ret +SILENT_BIN: ld hl,SILENT_BIN2 + push hl + ld a,(VERBOSE) ;Restaura TYPE antiguo + ld (OLD_VERBOSE),a + xor a + ld (VERBOSE),a + ld a,(OLD_TYPE) + or a + jp z,R_ASCII + jp R_BINARY +SILENT_BIN2: ld a,(OLD_VERBOSE) + ld (VERBOSE),a + ret ;--- MULTIPLE: Ejecuta un comando multiple (MGET, MPUT, MDELETE) @@ -4306,274 +4306,274 @@ SILENT_BIN2: ld a,(OLD_VERBOSE) ; la rutina (MUL_COM) ; - Al preguntar para cada fichero, muestra la cadena (MUL_STR) -MULTIPLE: call _MULTIPLE - push af - ld a,(MUL_LISTA) - ld ix,0 - nesman 22 - ld a,#FF - ld (MUL_LISTA),a - ld a,(OLD_VERBOSE_M) - ld (VERBOSE),a - pop af - ret - -_MULTIPLE: ;--- Crea una lista y si no hay memoria, termina con error - - ld a,4 - ld (ABORT_STAT),a - - ld a,(VERBOSE) - ld (OLD_VERBOSE_M),a - - or a ; Lista interna - nesman 20 - jr nc,MUL_OK1 - - print OUTOFM_S - ret - -MUL_OK1: ld (MUL_LISTA),a - - ;--- Abre conexion, envia TYPE A, - ; envia PORT, espera conexion OK, envia NLST - - xor a - ld (VERBOSE),a - - call SILENT_ASCII ;Pone modo ASCII si es necesario - jp c,MUL_END - ld a,#FF - ld (MUST_ASCII),a - - call OPEN_DCON ;Abre conexion, envia PORT - jp c,MUL_END - - ld hl,C_NLST ;Envia NLST con el 2o parametro - call SET_COMMAND - ld hl,USER_COM_BUF+1 - ld de,SEND_COM_BUF+5 - ld a,2 - call EXTPAR - call nc,SET_SPACE - call APPEND_LF - call SEND_COM - - ;debug "1" - call WAIT_REPLY ;Espera respuesta, que ha de - ;debug "2" - jp c,MUL_E ;ser 1yz - cp 1 - jr z,MUL_WAIT - cp 4 - jp z,MUL_E - cp 5 - jp z,MUL_E - jp MUL_EX - -MUL_WAIT: ;debug "3" - call HALT ;Espera a que la conexion este - ld a,(DATA_CON) ;o ESTABLISHED o cerrandose - call TCP_STATUS ;(ya se han recibido todos los datos) - or a - jp z,MUL_E2 - cp 4 - jr c,MUL_WAIT - - ;debug "4" - xor a - ld hl,DATA_BUF - - ;--- Va cogiendo Los nombres de fichero y los - ; inserta en la lista - -MUL_NLST_LOOP: push af,hl -MUL_NLST_LOOP2: call GET_DDATA - jr c,MUL_NODATA - cp 10 - jr z,MUL_NLST_LOOP2 - cp 13 - jr z,MUL_NEXT_NAME - pop hl - ld (hl),a - inc hl - pop af - inc a - jr MUL_NLST_LOOP - -MUL_NEXT_NAME: ;Nombre completo obtenido, HL apunta a su direccion - ;y A contiene su longitud (en la pila) - - pop hl,af ;Inserta nombre en la lista - ld l,a - ld h,0 - ld a,(MUL_LISTA) - ld ix,0 - ld b,3 - ld iy,DO_DOS - nesman 24 - jp c,MUL_MEME - - ld hl,DO_DOS - ld a,0 - jr MUL_NLST_LOOP - - ;--- No se pueden coger mas datos: esperamos o - ; pasamos a tratar los nombres de fichero recibidos - -MUL_NODATA: pop hl,bc - push af - ld (MUL_NAME_PNT),hl - ld a,b - ld (MUL_NAME_SIZE),a - pop af - - ;cp 5 ;Si no hay datos pero la conexion sigue ESTABLISHED - ;jp nz,MUL_E2 ;(puede recibir mas datos), sigue esperando - ld a,(DATA_CON) - call TCP_STATUS - cp 4 - jr nz,MUL_NODATA2 - - call HALT ;Esperamos una interrupcion y - ld a,(MUL_NAME_SIZE) ;volvemos a intentarlo - ld hl,(MUL_NAME_PNT) - jr MUL_NLST_LOOP - -MUL_NODATA2: ld a,(DATA_CON) - call TCP_CLOSE ;TCP_ABORT - ld a,#FF - ld (DATA_CON),a - call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, - jp c,MUL_END ;espera respuesta de la conexion de control, - cp 2 ;y termina - jp z,MUL_OK_LIST - cp 4 - jp z,MUL_END - cp 5 - jp z,MUL_END - print UNEXPEC_S - scf - jp MUL_END - - ;--- Ya tenemos la lista completa de ficheros, - ; ahora ejecutamos el comando adecuado - -MUL_OK_LIST: xor a - ld (MUST_ASCII),a - call SILENT_BIN - jp c,MUL_END - - ld a,(OLD_VERBOSE_M) - ld (VERBOSE),a - - ;>>> MPUT salta aqui - -MULTIPLE2: ld a,(PROMPT) - cpl - ld (ALLFILES),a - - ;--- Obtiene un nombre de fichero y - ; pregunta si se ha de actuar sobre el, - ; solo si ALLFILES=#FF - -MUL_FILE_LOOP: ld a,(MUL_LISTA) - ld ix,0 - ld b,1 - ld h,3 - ld iy,DATA_BUF - nesman 25 - ret c - ld hl,DATA_BUF - add hl,bc - ld (hl),0 - inc bc - inc bc - ld a,c - ld (USER_COM_BUF+1),a - - ld a,(ALLFILES) - or a - jr nz,MUL_DO_FILE - - ld de,(MUL_STR) - ld c,_STROUT - call DO_DOS - printz DATA_BUF - call ASK_YNAC - cp 3 ;Cancel? - push af - ld c,_STROUT - ld de,OPCAN_S - call z,DO_DOS - pop af - ret z - cp 1 ;No? - jr z,MUL_FILE_LOOP - or a ;Yes? - jr z,MUL_DO_FILE - - ld a,#FF ;All - ld (ALLFILES),a - -MUL_DO_FILE: ld hl," X" - ld (USER_COM_BUF+2),hl - ld hl,DATA_BUF - ld de,USER_COM_BUF+4 - ld bc,252 - ldir - - ld hl,(MUL_COM) - call JP_HL - - jp MUL_FILE_LOOP - - ;--- Rutinas de terminacion - -MUL_E: ld a,(DATA_CON) ;Error del comando "PORT": - call TCP_ABORT ;cierra conexion y termina - scf - jp MUL_END - -MUL_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar - ld a,(DATA_CON) - call TCP_ABORT - call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) - scf - jp MUL_END - -MUL_EX: ld a,(DATA_CON) ;Respuesta inesperada al - call TCP_ABORT ;comando "PORT" - call R_UNEX - scf - jr MUL_END - -MUL_MEME: print OUTOFM_S - ld a,(DATA_CON) - call TCP_ABORT - call WAIT_REPLY - ;jr MUL_END - -MUL_END: push af - ld a,(MUST_ASCII) - or a - jr z,MUL_END2! - ld a,(CONTROL_CON) - cp #FF - call nz,SILENT_BIN ;Restaura TYPE antiguo -MUL_END2!: pop af - ret - - ;--- Variables - -MUL_LISTA: db 0 -MUL_NAME_SIZE: db 0 -MUL_NAME_PNT: dw 0 -OLD_VERBOSE_M: db 0 -MUL_STR: dw 0 -MUL_COM: dw 0 - -JP_HL: jp (hl) +MULTIPLE: call _MULTIPLE + push af + ld a,(MUL_LISTA) + ld ix,0 + nesman 22 + ld a,#FF + ld (MUL_LISTA),a + ld a,(OLD_VERBOSE_M) + ld (VERBOSE),a + pop af + ret + +_MULTIPLE: ;--- Crea una lista y si no hay memoria, termina con error + + ld a,4 + ld (ABORT_STAT),a + + ld a,(VERBOSE) + ld (OLD_VERBOSE_M),a + + or a ; Lista interna + nesman 20 + jr nc,MUL_OK1 + + print OUTOFM_S + ret + +MUL_OK1: ld (MUL_LISTA),a + + ;--- Abre conexion, envia TYPE A, + ; envia PORT, espera conexion OK, envia NLST + + xor a + ld (VERBOSE),a + + call SILENT_ASCII ;Pone modo ASCII si es necesario + jp c,MUL_END + ld a,#FF + ld (MUST_ASCII),a + + call OPEN_DCON ;Abre conexion, envia PORT + jp c,MUL_END + + ld hl,C_NLST ;Envia NLST con el 2o parametro + call SET_COMMAND + ld hl,USER_COM_BUF+1 + ld de,SEND_COM_BUF+5 + ld a,2 + call EXTPAR + call nc,SET_SPACE + call APPEND_LF + call SEND_COM + + ;debug "1" + call WAIT_REPLY ;Espera respuesta, que ha de + ;debug "2" + jp c,MUL_E ;ser 1yz + cp 1 + jr z,MUL_WAIT + cp 4 + jp z,MUL_E + cp 5 + jp z,MUL_E + jp MUL_EX + +MUL_WAIT: ;debug "3" + call HALT ;Espera a que la conexion este + ld a,(DATA_CON) ;o ESTABLISHED o cerrandose + call TCP_STATUS ;(ya se han recibido todos los datos) + or a + jp z,MUL_E2 + cp 4 + jr c,MUL_WAIT + + ;debug "4" + xor a + ld hl,DATA_BUF + + ;--- Va cogiendo Los nombres de fichero y los + ; inserta en la lista + +MUL_NLST_LOOP: push af,hl +MUL_NLST_LOOP2: call GET_DDATA + jr c,MUL_NODATA + cp 10 + jr z,MUL_NLST_LOOP2 + cp 13 + jr z,MUL_NEXT_NAME + pop hl + ld (hl),a + inc hl + pop af + inc a + jr MUL_NLST_LOOP + +MUL_NEXT_NAME: ;Nombre completo obtenido, HL apunta a su direccion + ;y A contiene su longitud (en la pila) + + pop hl,af ;Inserta nombre en la lista + ld l,a + ld h,0 + ld a,(MUL_LISTA) + ld ix,0 + ld b,3 + ld iy,DO_DOS + nesman 24 + jp c,MUL_MEME + + ld hl,DO_DOS + ld a,0 + jr MUL_NLST_LOOP + + ;--- No se pueden coger mas datos: esperamos o + ; pasamos a tratar los nombres de fichero recibidos + +MUL_NODATA: pop hl,bc + push af + ld (MUL_NAME_PNT),hl + ld a,b + ld (MUL_NAME_SIZE),a + pop af + + ;cp 5 ;Si no hay datos pero la conexion sigue ESTABLISHED + ;jp nz,MUL_E2 ;(puede recibir mas datos), sigue esperando + ld a,(DATA_CON) + call TCP_STATUS + cp 4 + jr nz,MUL_NODATA2 + + call HALT ;Esperamos una interrupcion y + ld a,(MUL_NAME_SIZE) ;volvemos a intentarlo + ld hl,(MUL_NAME_PNT) + jr MUL_NLST_LOOP + +MUL_NODATA2: ld a,(DATA_CON) + call TCP_CLOSE ;TCP_ABORT + ld a,#FF + ld (DATA_CON),a + call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, + jp c,MUL_END ;espera respuesta de la conexion de control, + cp 2 ;y termina + jp z,MUL_OK_LIST + cp 4 + jp z,MUL_END + cp 5 + jp z,MUL_END + print UNEXPEC_S + scf + jp MUL_END + + ;--- Ya tenemos la lista completa de ficheros, + ; ahora ejecutamos el comando adecuado + +MUL_OK_LIST: xor a + ld (MUST_ASCII),a + call SILENT_BIN + jp c,MUL_END + + ld a,(OLD_VERBOSE_M) + ld (VERBOSE),a + + ;>>> MPUT salta aqui + +MULTIPLE2: ld a,(PROMPT) + cpl + ld (ALLFILES),a + + ;--- Obtiene un nombre de fichero y + ; pregunta si se ha de actuar sobre el, + ; solo si ALLFILES=#FF + +MUL_FILE_LOOP: ld a,(MUL_LISTA) + ld ix,0 + ld b,1 + ld h,3 + ld iy,DATA_BUF + nesman 25 + ret c + ld hl,DATA_BUF + add hl,bc + ld (hl),0 + inc bc + inc bc + ld a,c + ld (USER_COM_BUF+1),a + + ld a,(ALLFILES) + or a + jr nz,MUL_DO_FILE + + ld de,(MUL_STR) + ld c,_STROUT + call DO_DOS + printz DATA_BUF + call ASK_YNAC + cp 3 ;Cancel? + push af + ld c,_STROUT + ld de,OPCAN_S + call z,DO_DOS + pop af + ret z + cp 1 ;No? + jr z,MUL_FILE_LOOP + or a ;Yes? + jr z,MUL_DO_FILE + + ld a,#FF ;All + ld (ALLFILES),a + +MUL_DO_FILE: ld hl," X" + ld (USER_COM_BUF+2),hl + ld hl,DATA_BUF + ld de,USER_COM_BUF+4 + ld bc,252 + ldir + + ld hl,(MUL_COM) + call JP_HL + + jp MUL_FILE_LOOP + + ;--- Rutinas de terminacion + +MUL_E: ld a,(DATA_CON) ;Error del comando "PORT": + call TCP_ABORT ;cierra conexion y termina + scf + jp MUL_END + +MUL_E2: print DCONREF_S ;Conexion de datos cerrada sin llegar + ld a,(DATA_CON) + call TCP_ABORT + call WAIT_REPLY ;a abrirse (probable perdida de con. a internet) + scf + jp MUL_END + +MUL_EX: ld a,(DATA_CON) ;Respuesta inesperada al + call TCP_ABORT ;comando "PORT" + call R_UNEX + scf + jr MUL_END + +MUL_MEME: print OUTOFM_S + ld a,(DATA_CON) + call TCP_ABORT + call WAIT_REPLY + ;jr MUL_END + +MUL_END: push af + ld a,(MUST_ASCII) + or a + jr z,MUL_END2! + ld a,(CONTROL_CON) + cp #FF + call nz,SILENT_BIN ;Restaura TYPE antiguo +MUL_END2!: pop af + ret + + ;--- Variables + +MUL_LISTA: db 0 +MUL_NAME_SIZE: db 0 +MUL_NAME_PNT: dw 0 +OLD_VERBOSE_M: db 0 +MUL_STR: dw 0 +MUL_COM: dw 0 + +JP_HL: jp (hl) ;--- R_ABORT: Rutina de tratamiento de CTRL-C o CTRL-STOP, @@ -4586,330 +4586,330 @@ JP_HL: jp (hl) ; 4: Se esta ejecutando un comando FTP, con o sin conexion de datos ; 5: Se esta ejecutando CLOSE o QUIT -R_ABORT: pop hl ;Para ajustar la pila +R_ABORT: pop hl ;Para ajustar la pila - push af - xor a - ld (LDIR_EXE),a - ld (PUT_EXE),a - ld a,(MUL_LISTA) - ld ix,0 - nesman 22 - ld a,#FF - ld (MUL_LISTA),a + push af + xor a + ld (LDIR_EXE),a + ld (PUT_EXE),a + ld a,(MUL_LISTA) + ld ix,0 + nesman 22 + ld a,#FF + ld (MUL_LISTA),a - ld a,(HOOKING) ;Restauramos gancho CHPUT - or a ;si es necesario - jr z,AB_NOHOOK - xor a - ld (HOOKING),a - ld hl,HOOK_OLD - ld de,H_CHPH - ld bc,5 - ldir + ld a,(HOOKING) ;Restauramos gancho CHPUT + or a ;si es necesario + jr z,AB_NOHOOK + xor a + ld (HOOKING),a + ld hl,HOOK_OLD + ld de,H_CHPH + ld bc,5 + ldir -AB_NOHOOK: pop af +AB_NOHOOK: pop af - ;--- Primero comprobamos si es un error de disco, - ; en ese caso simplemente terminamos + ;--- Primero comprobamos si es un error de disco, + ; en ese caso simplemente terminamos - cp #9D ;Codigo de "disk operation aborted" - jr nz,R_AB_NODISK + cp #9D ;Codigo de "disk operation aborted" + jr nz,R_AB_NODISK - ld a,b - or a - ret + ld a,b + or a + ret - ;--- Imprimimos "CTRL-C pressed" o "CTRL-STOP pressed" + ;--- Imprimimos "CTRL-C pressed" o "CTRL-STOP pressed" -R_AB_NODISK: ld de,CTRLC_S - cp #9E ;Codigo de "CTRL-C pressed" - jr z,R_AB_PRINT - ld de,CTRLS_S - cp #9F ;Codigo de "CTRL-STOP pressed" - jr z,R_AB_PRINT - ld de,UNKE_S ;Error desconocido -R_AB_PRINT: ld c,_STROUT - call DO_DOS +R_AB_NODISK: ld de,CTRLC_S + cp #9E ;Codigo de "CTRL-C pressed" + jr z,R_AB_PRINT + ld de,CTRLS_S + cp #9F ;Codigo de "CTRL-STOP pressed" + jr z,R_AB_PRINT + ld de,UNKE_S ;Error desconocido +R_AB_PRINT: ld c,_STROUT + call DO_DOS - ld a,(ABORT_STAT) + ld a,(ABORT_STAT) - ;--- 0: No hacemos nada (ignoramos CTRL-C/STOP) + ;--- 0: No hacemos nada (ignoramos CTRL-C/STOP) -R_ABORT_0: or a - jr nz,R_ABORT_1 +R_ABORT_0: or a + jr nz,R_ABORT_1 - ret - - ;--- 1: Salimos del programa + ret + + ;--- 1: Salimos del programa -R_ABORT_1: cp 1 - jr nz,R_ABORT_2 +R_ABORT_1: cp 1 + jr nz,R_ABORT_2 - print EXITING_S - jp TERM + print EXITING_S + jp TERM - ;--- 2: Ejecutamos CLOSE + ;--- 2: Ejecutamos CLOSE -R_ABORT_2: cp 2 - jr nz,R_ABORT_3 +R_ABORT_2: cp 2 + jr nz,R_ABORT_3 - print DISCONN_S - jp R_CLOSE + print DISCONN_S + jp R_CLOSE - ;--- 3: Saltamos al bucle principal + ;--- 3: Saltamos al bucle principal -R_ABORT_3: cp 3 - jr nz,R_ABORT_4 +R_ABORT_3: cp 3 + jr nz,R_ABORT_4 - print ABCOMM_S - call CLOSE_FILE - jp MAIN_LOOP + print ABCOMM_S + call CLOSE_FILE + jp MAIN_LOOP - ;--- 4: Enviamos ABORT si no hay datos pendientes - ; en la conexion de control + ;--- 4: Enviamos ABORT si no hay datos pendientes + ; en la conexion de control -R_ABORT_4: cp 4 - jr nz,R_ABORT_5 +R_ABORT_4: cp 4 + jr nz,R_ABORT_5 - ld a,5 - ld (ABORT_STAT),a + ld a,5 + ld (ABORT_STAT),a - call CLOSE_FILE + call CLOSE_FILE - print ABCOMM_S + print ABCOMM_S - ld a,(CONTROL_CON) ;Hay datos en conexion de control? - call TCP_STATUS ;Entonces recogerlos y no - or a - jp z,MAIN_LOOP ;enviar ABORT - ld a,h - or l - jr z,R_AB4_1 + ld a,(CONTROL_CON) ;Hay datos en conexion de control? + call TCP_STATUS ;Entonces recogerlos y no + or a + jp z,MAIN_LOOP ;enviar ABORT + ld a,h + or l + jr z,R_AB4_1 - call WAIT_REPLY - jr R_AB4_2 + call WAIT_REPLY + jr R_AB4_2 -R_AB4_1: ;ld hl,#F4FF ;Envia comando telnet IP - ;ld (SEND_COM_BUF),hl - ;ld hl,SEND_COM_BUF - ;ld bc,2 - ;scf - ;ld a,(CONTROL_CON) - ;call TCP_SEND +R_AB4_1: ;ld hl,#F4FF ;Envia comando telnet IP + ;ld (SEND_COM_BUF),hl + ;ld hl,SEND_COM_BUF + ;ld bc,2 + ;scf + ;ld a,(CONTROL_CON) + ;call TCP_SEND - ;ld hl,#F2FF ;Envia secuencia telnet SYNCH - ;ld (SEND_COM_BUF),hl - ;ld hl,SEND_COM_BUF - ;ld bc,2 - ;ld d,2 ;??? (si es datos urgentes, vas dao...) - ;ld a,(CONTROL_CON) - ;call TCP_SEND + ;ld hl,#F2FF ;Envia secuencia telnet SYNCH + ;ld (SEND_COM_BUF),hl + ;ld hl,SEND_COM_BUF + ;ld bc,2 + ;ld d,2 ;??? (si es datos urgentes, vas dao...) + ;ld a,(CONTROL_CON) + ;call TCP_SEND - ld hl,C_ABOR - call SET_COMMAND - call APPEND_LF - call AUTOMATA_NO1 + ld hl,C_ABOR + call SET_COMMAND + call APPEND_LF + call AUTOMATA_NO1 -R_AB4_2: ld a,(DATA_CON) - cp #FF - jp z,MAIN_LOOP - call TCP_ABORT - ld a,#FF - ld (DATA_CON),a - jp MAIN_LOOP +R_AB4_2: ld a,(DATA_CON) + cp #FF + jp z,MAIN_LOOP + call TCP_ABORT + ld a,#FF + ld (DATA_CON),a + jp MAIN_LOOP - ;--- 5: Abortamos conexion de control + ;--- 5: Abortamos conexion de control -R_ABORT_5: ld a,(DATA_CON) - cp #FF - jr z,R_ABORT_52 +R_ABORT_5: ld a,(DATA_CON) + cp #FF + jr z,R_ABORT_52 - print ABDCON_S - ld a,(DATA_CON) - call TCP_ABORT - ld a,#FF - ld (DATA_CON),a - ret + print ABDCON_S + ld a,(DATA_CON) + call TCP_ABORT + ld a,#FF + ld (DATA_CON),a + ret -R_ABORT_52: print ABCCON_S +R_ABORT_52: print ABCCON_S - call CLOSE_FILE - ld a,(DATA_CON) - cp #FF - jr z,R_ABORT_53 - call TCP_ABORT -R_ABORT_53: ld a,(CONTROL_CON) - call TCP_ABORT + call CLOSE_FILE + ld a,(DATA_CON) + cp #FF + jr z,R_ABORT_53 + call TCP_ABORT +R_ABORT_53: ld a,(CONTROL_CON) + call TCP_ABORT - jp MAIN_LOOP + jp MAIN_LOOP ;--- Automata del protocolo de identificacion ; Espera datos de la conexion IDENT_CON, ; y los devuelve seguidos de IDENT_S -IDENT_AUTOM: push af,bc,de,hl - call _IDENT_AUTOM - pop hl,de,bc,af - ret - -_IDENT_AUTOM: ld a,(IDENT_CON) - cp #FF - ret z - - call TCP_STATUS - or a - jr nz,IDENT_AUT1 - ld a,#FF - ld (IDENT_CON),a - ret - -IDENT_AUT1: cp 4 - ret c - - ld a,(IDENT_CON) ;Recoge datos - ld de,DATA_BUF - ld bc,256 - call TCP_RCV - ret z - - push bc - ld hl,DATA_BUF ;Compone cadena de respuesta - add hl,bc - ex de,hl - ld hl,IDENT_S - ld bc,IDENT_LEN - ldir - - pop bc ;Envia respuesta - ld hl,IDENT_LEN - add hl,bc - push hl - pop bc - ld hl,DATA_BUF - ld a,(IDENT_CON) - scf - call TCP_SEND - - ret +IDENT_AUTOM: push af,bc,de,hl + call _IDENT_AUTOM + pop hl,de,bc,af + ret + +_IDENT_AUTOM: ld a,(IDENT_CON) + cp #FF + ret z + + call TCP_STATUS + or a + jr nz,IDENT_AUT1 + ld a,#FF + ld (IDENT_CON),a + ret + +IDENT_AUT1: cp 4 + ret c + + ld a,(IDENT_CON) ;Recoge datos + ld de,DATA_BUF + ld bc,256 + call TCP_RCV + ret z + + push bc + ld hl,DATA_BUF ;Compone cadena de respuesta + add hl,bc + ex de,hl + ld hl,IDENT_S + ld bc,IDENT_LEN + ldir + + pop bc ;Envia respuesta + ld hl,IDENT_LEN + add hl,bc + push hl + pop bc + ld hl,DATA_BUF + ld a,(IDENT_CON) + scf + call TCP_SEND + + ret ;--- Codigo del gancho para CHPUT para enmascaramiento de password ; Imprime todos los caracteres como "*", ; excepto espacios, caracteres de control (<32 y 127) ; y secuencias de escape -HOOK_CODE0: pop hl,bc ;B=Caracter a imprimir - ld a,(ESC_CHAR) - or a - jr z,HOOK_C0_NORMAL - ld c,a ;C=Caracter en ESC_CHAR - - ;Tratamiento de una secuencia de escape - - cp 27 ;El caracter anterior era ESC: - ld a,b ;Ponemos en ESC_CHAR el caracter - jr z,HOOK_C0_SETESC ;actual e imprimimos el ESC - ld a,c - - cp 1 ;"1": secuencia "ESC Y n m" - ld a,0 ;y el caracter actual es "m": - jr z,HOOK_C0_SETESC ;lo imprimimos - ld a,c - - cp "Y" ;Secuencia "ESC Y n m" y el - ld a,1 ;caracter actual es "n": - jr z,HOOK_C0_SETESC ;lo imprimimos - ld a,c - - and %11111110 ;Secuencia "ESC x n" o "ESC y n" - cp "x" ;y el caracter actual es "n": - ld a,0 ;lo imprimimos - jr z,HOOK_C0_SETESC - - ld a,b ;Otra secuencia "ESC m" ya completa - jr HOOK_C0_NORMAL - -HOOK_C0_SETESC: ld (ESC_CHAR),a ;ESC_CHAR=0 si no estamos - ld a,b ;en una secuencia de escape - jr HOOK_C0_OK - - ;Tratamiento normal (no estamos en secuencia ESC) - -HOOK_C0_NORMAL: ld a,b - cp 27 - jr nz,HOOK_C0_NORM2 - ld (ESC_CHAR),a - jr HOOK_C0_OK -HOOK_C0_NORM2: cp 33 - jr c,HOOK_C0_OK - cp 127 - jr z,HOOK_C0_OK - ld a,"*" -HOOK_C0_OK: push af,hl -HOOK_CODE0_END: ; +HOOK_CODE0: pop hl,bc ;B=Caracter a imprimir + ld a,(ESC_CHAR) + or a + jr z,HOOK_C0_NORMAL + ld c,a ;C=Caracter en ESC_CHAR + + ;Tratamiento de una secuencia de escape + + cp 27 ;El caracter anterior era ESC: + ld a,b ;Ponemos en ESC_CHAR el caracter + jr z,HOOK_C0_SETESC ;actual e imprimimos el ESC + ld a,c + + cp 1 ;"1": secuencia "ESC Y n m" + ld a,0 ;y el caracter actual es "m": + jr z,HOOK_C0_SETESC ;lo imprimimos + ld a,c + + cp "Y" ;Secuencia "ESC Y n m" y el + ld a,1 ;caracter actual es "n": + jr z,HOOK_C0_SETESC ;lo imprimimos + ld a,c + + and %11111110 ;Secuencia "ESC x n" o "ESC y n" + cp "x" ;y el caracter actual es "n": + ld a,0 ;lo imprimimos + jr z,HOOK_C0_SETESC + + ld a,b ;Otra secuencia "ESC m" ya completa + jr HOOK_C0_NORMAL + +HOOK_C0_SETESC: ld (ESC_CHAR),a ;ESC_CHAR=0 si no estamos + ld a,b ;en una secuencia de escape + jr HOOK_C0_OK + + ;Tratamiento normal (no estamos en secuencia ESC) + +HOOK_C0_NORMAL: ld a,b + cp 27 + jr nz,HOOK_C0_NORM2 + ld (ESC_CHAR),a + jr HOOK_C0_OK +HOOK_C0_NORM2: cp 33 + jr c,HOOK_C0_OK + cp 127 + jr z,HOOK_C0_OK + ld a,"*" +HOOK_C0_OK: push af,hl +HOOK_CODE0_END: ; ;--- Rutinas para establecer y resetear el gancho -SET_HOOK: push af,bc,de,hl - di - ld a,#C3 - ld (H_CHPH),a - ld hl,HOOK_CODE - ld (H_CHPH+1),hl - ld a,#FF - ld (HOOKING),a - ei - pop hl,de,bc,af - ret - -RESET_HOOK: push af,bc,de,hl - di - ld hl,HOOK_OLD - ld de,H_CHPH - ld bc,5 - ldir - ei - pop hl,de,bc,af - ret +SET_HOOK: push af,bc,de,hl + di + ld a,#C3 + ld (H_CHPH),a + ld hl,HOOK_CODE + ld (H_CHPH+1),hl + ld a,#FF + ld (HOOKING),a + ei + pop hl,de,bc,af + ret + +RESET_HOOK: push af,bc,de,hl + di + ld hl,HOOK_OLD + ld de,H_CHPH + ld bc,5 + ldir + ei + pop hl,de,bc,af + ret ;--- Code to switch TCP/IP implementation on page 1, if necessary SET_UNAPI: - ld a,(UNAPI_IS_SET) - or a - ret nz - dec a - ld (UNAPI_IS_SET),a -UNAPI_SLOT: ld a,0 - ld h,#40 - call ENASLT -UNAPI_SEG: ld a,0 - jp PUT_P1 - -CALL_UNAPI: ex af,af' - exx - call SET_UNAPI - ei - ex af,af' - exx - -DO_UNAPI: jp 0 + ld a,(UNAPI_IS_SET) + or a + ret nz + dec a + ld (UNAPI_IS_SET),a +UNAPI_SLOT: ld a,0 + ld h,#40 + call ENASLT +UNAPI_SEG: ld a,0 + jp PUT_P1 + +CALL_UNAPI: ex af,af' + exx + call SET_UNAPI + ei + ex af,af' + exx + +DO_UNAPI: jp 0 ;--- Code to call a DOS function DO_DOS: - ex af,af' - xor a - ld (UNAPI_IS_SET),a - ex af,af' - jp 5 + ex af,af' + xor a + ld (UNAPI_IS_SET),a + ex af,af' + jp 5 - ;>>> These rouines invoke the TCP related TCP/IP UNAPI <<< - ;>>> routines accepting the old INL input parameters <<< + ;>>> These rouines invoke the TCP related TCP/IP UNAPI <<< + ;>>> routines accepting the old INL input parameters <<< ;--- TCP_OPEN: Open a new TCP connection. ;Input: A = 0 for active, 1 for passive @@ -4923,25 +4923,25 @@ DO_DOS: ; If error: A = UNAPI Error code TCP_OPEN: - ld (TCP_INFO_BLOCK),hl - ld (TCP_INFO_BLOCK+2),de - ld (TCP_INFO_BLOCK+4),ix - ld (TCP_INFO_BLOCK+6),iy - ld (TCP_INFO_BLOCK+8),bc - and 1 - ld (TCP_INFO_BLOCK+10),a - - ld a,TCPIP_TCP_OPEN - ld hl,TCP_INFO_BLOCK - call CALL_UNAPI - or a - scf - ret nz - ld a,b - or a - ret - -TCP_INFO_BLOCK: ds 11 + ld (TCP_INFO_BLOCK),hl + ld (TCP_INFO_BLOCK+2),de + ld (TCP_INFO_BLOCK+4),ix + ld (TCP_INFO_BLOCK+6),iy + ld (TCP_INFO_BLOCK+8),bc + and 1 + ld (TCP_INFO_BLOCK+10),a + + ld a,TCPIP_TCP_OPEN + ld hl,TCP_INFO_BLOCK + call CALL_UNAPI + or a + scf + ret nz + ld a,b + or a + ret + +TCP_INFO_BLOCK: ds 11 ;--- TCP_CLOSE: Close a TCP connection @@ -4949,14 +4949,14 @@ TCP_INFO_BLOCK: ds 11 ;Output: Cy=1 if error, then A=UNAPI error code TCP_CLOSE: - ld b,a - ld a,TCPIP_TCP_CLOSE - call CALL_UNAPI - or a - scf - ret nz - or a - ret + ld b,a + ld a,TCPIP_TCP_CLOSE + call CALL_UNAPI + or a + scf + ret nz + or a + ret ;--- TCP_ABORT: Abort a TCP connection @@ -4964,14 +4964,14 @@ TCP_CLOSE: ;Output: Cy=1 if error, then A=UNAPI error code TCP_ABORT: - ld b,a - ld a,TCPIP_TCP_ABORT - call CALL_UNAPI - or a - scf - ret nz - or a - ret + ld b,a + ld a,TCPIP_TCP_ABORT + call CALL_UNAPI + or a + scf + ret nz + or a + ret ;--- TCP_STATUS: Obtain the state of a TCP connection @@ -4986,24 +4986,24 @@ TCP_ABORT: ; (If A=0, B=LAST_CLOSE) TCP_STATUS: - ld b,a - ld a,TCPIP_TCP_STATE - ld hl,0 - call CALL_UNAPI - or a - jr z,TCP_STATUS_2 - ld b,c - xor a ;Convert errors to "connection closed" - ret + ld b,a + ld a,TCPIP_TCP_STATE + ld hl,0 + call CALL_UNAPI + or a + jr z,TCP_STATUS_2 + ld b,c + xor a ;Convert errors to "connection closed" + ret TCP_STATUS_2: - ld a,b - push ix - pop de - ld ix,0 - ld bc,0 - or a - ret + ld a,b + push ix + pop de + ld ix,0 + ld bc,0 + or a + ret ;--- TCP_SEND: Send data to a TCP connection @@ -5014,21 +5014,21 @@ TCP_STATUS_2: ;Output: Cy=1 if error, then A=UNAPI error code TCP_SEND: - push hl,bc + push hl,bc - ld b,a - rla - and 1 - ld c,a + ld b,a + rla + and 1 + ld c,a - pop hl,de - ld a,TCPIP_TCP_SEND - call CALL_UNAPI - or a - scf - ret nz - or a - ret + pop hl,de + ld a,TCPIP_TCP_SEND + call CALL_UNAPI + or a + scf + ret nz + or a + ret ;--- TCP_RCV: Obtain data from a TCP connection @@ -5042,19 +5042,19 @@ TCP_SEND: ; Z = 1 if BC=0 TCP_RCV: - push af,bc - pop hl,bc + push af,bc + pop hl,bc - ld a,TCPIP_TCP_RCV - call CALL_UNAPI - or a - scf - ret nz + ld a,TCPIP_TCP_RCV + call CALL_UNAPI + or a + scf + ret nz - ld a,b - or c - ld a,0 - ret + ld a,b + or c + ld a,0 + ret ;************************************* @@ -5064,540 +5064,539 @@ TCP_RCV: ;************************************* DATA: - org #8000 + org #8000 DATA_START: ;--- Variables -IP_LOCAL: ds 4 -IP_REMOTE: ds 4 -PORT_REMOTE_C: dw 21 -PORT_REMOTE_I: dw 0 ;Ident: el puerto local sera el 113 -PORT_REMOTE_D: dw 0 -HAY_NMAN: db 0 -DATA_CON: db #FF -CONTROL_CON: db #FF -IDENT_CON: db #FF -VERBOSE: db #FF -XCOM: db 0 -ES_XCOM: db 0 -SAVESP: dw 0 -TYPE: db 0 ;0 para ASCII, 1 para binario -DEBUG: db 0 -BELL: db 0 -HASH: db 0 -PROMPT: db #FF -PAUSE: db 0 -PASSIVE: db 0 -OLD_TYPE: db 0 -OLD_VERBOSE: db 0 -PORT_C_PNT: dw C_PORT+5 ;Puntero a la parte "puerto" de PORT_C -FILE_FH: db #FF -FILES_QUEUE: db #FF ;Cola para guardar los nombres de fichero -QUITTING: db 0 ;#FF cuando se esta cerrando/saliendo -ALLFILES: db 0 -ALSO_RONLY: db 0 -LINE_COUNT: db 0 -BYTE_COUNT: db 0 -INS_IX: dw 0 -ABORT_STAT: db 0 -LAST_REPLY: db 0 -MSS: dw 448 ;Valor fijo -HOOKING: db 0 ;#FF cuando el gancho CHPUT esta parcheado -UNAPI_IS_SET: db 0 ;#FF when UNAPI slot/seg is switched on page 1 +IP_LOCAL: ds 4 +IP_REMOTE: ds 4 +PORT_REMOTE_C: dw 21 +PORT_REMOTE_I: dw 0 ;Ident: el puerto local sera el 113 +PORT_REMOTE_D: dw 0 +HAY_NMAN: db 0 +DATA_CON: db #FF +CONTROL_CON: db #FF +IDENT_CON: db #FF +VERBOSE: db #FF +XCOM: db 0 +ES_XCOM: db 0 +SAVESP: dw 0 +TYPE: db 0 ;0 para ASCII, 1 para binario +DEBUG: db 0 +BELL: db 0 +HASH: db 0 +PROMPT: db #FF +PAUSE: db 0 +PASSIVE: db 0 +OLD_TYPE: db 0 +OLD_VERBOSE: db 0 +PORT_C_PNT: dw C_PORT+5 ;Puntero a la parte "puerto" de PORT_C +FILE_FH: db #FF +FILES_QUEUE: db #FF ;Cola para guardar los nombres de fichero +QUITTING: db 0 ;#FF cuando se esta cerrando/saliendo +ALLFILES: db 0 +ALSO_RONLY: db 0 +LINE_COUNT: db 0 +BYTE_COUNT: db 0 +INS_IX: dw 0 +ABORT_STAT: db 0 +LAST_REPLY: db 0 +MSS: dw 448 ;Valor fijo +HOOKING: db 0 ;#FF cuando el gancho CHPUT esta parcheado +UNAPI_IS_SET: db 0 ;#FF when UNAPI slot/seg is switched on page 1 ;--- Pseudo-TCBs ;Control connection -IP_REMOTE_C: db 0,0,0,0 +IP_REMOTE_C: db 0,0,0,0 ;PORT_REMOTE_C: dw 21 ;Data connection -IP_REMOTE_D: db 0,0,0,0 -;PORT_REMOTE_D: dw 0 - ;db #FF ;Control connection is passive +IP_REMOTE_D: db 0,0,0,0 +;PORT_REMOTE_D: dw 0 + ;db #FF ;Control connection is passive ;Ident protocol connection ;PORT_REMOTE_I: dw 0 - ;dw 113 - ;db #FF ;Is passive + ;dw 113 + ;db #FF ;Is passive ;--- Cadenas de texto (informacion y errores) -PRESEN_S: db 13,10,"FTP client for the TCP/IP UNAPI 1.0",13,10 - db "By Konamiman, 4/2010",13,10,10 -TYPEHELP_S: db "Type ",34,"HELP",34," or ",34,"?",34," at any time to obtain help.",13,10,10,"$" -NONMAN_S: db 13,10,"*** This command needs NestorMan 1.21 or higher to be installed",13,10,13,10,"$" - -ERROR_S: db 13,10,"*** ERROR $" -UNKERR_S: db "Unknown error",13,10,"$" -UNKCOM_S: db "Unknown command",13,10,"$" -INVPAR_S: db "Invalid or missing parameter(s) for command",13,10,"$" -NOHELP_S: db " is not a command implemented in this application",13,10,"$" -WHENDNS_S: db "when resolving server name:",13,10," $" -WHENOPEN_S: db "when creating or accessing local file:",13,10," $" -WHENCONN_S: db "when connecting to the server:",13,10," $" -WHENOPEND_S: db "when opening data connection:",13,10," $" -NOIMP_S: db "Command not implemented in this version of the application",13,10,"$" -CONNECTING_S: db "Connecting (press ESC to cancel)... $" -CONLOST_S: db 13,10,"*** ERROR: Connection to FTP server lost",13,10,10,"$" -NOMEM_S: db 13,10,"*** ERROR: Not enough memory to enqueue data",13,10,10,"$" -UNEXPEC_S: db 13,10,"*** ERROR: Unexpected reply from FTP server",13,10,10,"$" -CONREF_S: db 13,10,"*** ERROR: Connection refused",13,10,10,"$" -DCONREF_S: db 13,10,"*** ERROR: Unexpected data connection loss",13,10,10,"$" -OUTOFM_S: db 13,10,"*** ERROR: Out of memory",13,10,"$" -DISKERR_S: db 13,10,"*** Disk error:",13,10," $" -CTRLC_S: db 13,10,"*** CTRL-C pressed: $" -CTRLS_S: db 13,10,"*** CTRL-STOP pressed: $" -UNKE_S: db 13,10,"*** Unknown error!: $" -CANCELLED_S: db 13,10,"*** Connection cancelled",13,10,"$" -EXITING_S: db "Exiting FTP application",13,10,"$" -DISCONN_S: db "Disconnecting from FTP server",13,10,"$" -ABCOMM_S: db "Aborting command execution",13,10,"$" -ABCCON_S: db "Aborting FTP server connection",13,10,"$" -ABDCON_S: db "Aborting data connection",13,10,"$" -FLUSHED_S: db "Flushing: $" -ANONYMOUS_S: db "anonymous",0 -NONE_S: db "none",0 -ENV_USER: db "FTP_USER",0 -ENV_PASSWORD: db "FTP_PASSWORD",0 -ENV_ACCOUNT: db "FTP_ACCOUNT",0 - -FTP_S: db 13,"ftp>$" -FLECHA_S: db 13,"--->$" -ON_S: db "ON$" -OFF_S: db "OFF$" -OK_S: db "OK",13,10,"$" -TURNED_S: db " mode turned $" -TYPESET_S: db "Type set to $" - -HASH_M_S: db "Hash$" -DEBUG_M_S: db "Debug$" -VERBOSE_M_S: db "Verbose$" -PROMPT_M_S: db "Prompt$" -BELL_M_S: db "Bell$" -PAUSE_M_S: db "Pause$" -PASSIVE_M_S: db "Passive$" -XCOM_M_S: db "X Commands$" -HASH_S: db "Hash: $" -DEBUG_S: db "Debug: $" -VERBOSE_S: db "Verbose: $" -PROMPT_S: db "Prompt: $" -PASSIVE_S: db "Passive: $" -PAUSE_S: db "Pause: $" -BELL_S: db "Bell: $" -TYPE_S: db "Type: $" -XCOM_S: db "X Commands: $" -ASCII_S: db "ASCII",13,10,"$" -BINARY_S: db "Binary",13,10,"$" - -DISCON_S: db 13,"Disconnected",13,10,"$" -CONNTO_S: db 13,10,"Connected to: $" -USER._S: db "User ($" -PASSWORD._S: db "Password ($" -CIERRAPAR_S: db "): $" -ACCOUNT._S: db "Account ($" -CURPATH_S: db "Current local path: $" -PATHCHAN_S: db "Local path changed to: $" -DIROF_S: db 13,10,"Directory of $" -ESDIR_S: db " $" -FFOUND_S: db " file(s) found",13,10,"$" -DFOUND_S: db " directory(es) found",13,10,"$" -KFREE_S: db "K free on drive $" -DELETE_S: db "Delete local file $" -RECEIVE_S: db "Receive file $" -DELETER_S: db "Delete file $" -SENDFILE_S: db "Send file $" -OPCOMP_S: db "Operation completed",13,10,"$" -OPCAN_S: db "Operation cancelled, remaining files skipped",13,10,"$" -YNAC_S: db " (y,n,a,c)? $" -ALCON_S: db "Already connected, CLOSE first",13,10,"$" -PRESS_S: db "--- Press any key to continue (",34,"P",34," to turn off pause mode) --- $" - -IDENT_S: db ":USERID:OTHER:MSX-DOS 2 running FTP for the TCP/IP UNAPI" -IDENT_S_END: ; -IDENT_LEN: equ IDENT_S_END-IDENT_S +PRESEN_S: db 13,10,"FTP client for the TCP/IP UNAPI 1.0",13,10 + db "By Konamiman, 4/2010",13,10,10 +TYPEHELP_S: db "Type ",34,"HELP",34," or ",34,"?",34," at any time to obtain help.",13,10,10,"$" +NONMAN_S: db 13,10,"*** This command needs NestorMan 1.21 or higher to be installed",13,10,13,10,"$" + +ERROR_S: db 13,10,"*** ERROR $" +UNKERR_S: db "Unknown error",13,10,"$" +UNKCOM_S: db "Unknown command",13,10,"$" +INVPAR_S: db "Invalid or missing parameter(s) for command",13,10,"$" +NOHELP_S: db " is not a command implemented in this application",13,10,"$" +WHENDNS_S: db "when resolving server name:",13,10," $" +WHENOPEN_S: db "when creating or accessing local file:",13,10," $" +WHENCONN_S: db "when connecting to the server:",13,10," $" +WHENOPEND_S: db "when opening data connection:",13,10," $" +NOIMP_S: db "Command not implemented in this version of the application",13,10,"$" +CONNECTING_S: db "Connecting (press ESC to cancel)... $" +CONLOST_S: db 13,10,"*** ERROR: Connection to FTP server lost",13,10,10,"$" +NOMEM_S: db 13,10,"*** ERROR: Not enough memory to enqueue data",13,10,10,"$" +UNEXPEC_S: db 13,10,"*** ERROR: Unexpected reply from FTP server",13,10,10,"$" +CONREF_S: db 13,10,"*** ERROR: Connection refused",13,10,10,"$" +DCONREF_S: db 13,10,"*** ERROR: Unexpected data connection loss",13,10,10,"$" +OUTOFM_S: db 13,10,"*** ERROR: Out of memory",13,10,"$" +DISKERR_S: db 13,10,"*** Disk error:",13,10," $" +CTRLC_S: db 13,10,"*** CTRL-C pressed: $" +CTRLS_S: db 13,10,"*** CTRL-STOP pressed: $" +UNKE_S: db 13,10,"*** Unknown error!: $" +CANCELLED_S: db 13,10,"*** Connection cancelled",13,10,"$" +EXITING_S: db "Exiting FTP application",13,10,"$" +DISCONN_S: db "Disconnecting from FTP server",13,10,"$" +ABCOMM_S: db "Aborting command execution",13,10,"$" +ABCCON_S: db "Aborting FTP server connection",13,10,"$" +ABDCON_S: db "Aborting data connection",13,10,"$" +FLUSHED_S: db "Flushing: $" +ANONYMOUS_S: db "anonymous",0 +NONE_S: db "none",0 +ENV_USER: db "FTP_USER",0 +ENV_PASSWORD: db "FTP_PASSWORD",0 +ENV_ACCOUNT: db "FTP_ACCOUNT",0 + +FTP_S: db 13,"ftp>$" +FLECHA_S: db 13,"--->$" +ON_S: db "ON$" +OFF_S: db "OFF$" +OK_S: db "OK",13,10,"$" +TURNED_S: db " mode turned $" +TYPESET_S: db "Type set to $" + +HASH_M_S: db "Hash$" +DEBUG_M_S: db "Debug$" +VERBOSE_M_S: db "Verbose$" +PROMPT_M_S: db "Prompt$" +BELL_M_S: db "Bell$" +PAUSE_M_S: db "Pause$" +PASSIVE_M_S: db "Passive$" +XCOM_M_S: db "X Commands$" +HASH_S: db "Hash: $" +DEBUG_S: db "Debug: $" +VERBOSE_S: db "Verbose: $" +PROMPT_S: db "Prompt: $" +PASSIVE_S: db "Passive: $" +PAUSE_S: db "Pause: $" +BELL_S: db "Bell: $" +TYPE_S: db "Type: $" +XCOM_S: db "X Commands: $" +ASCII_S: db "ASCII",13,10,"$" +BINARY_S: db "Binary",13,10,"$" + +DISCON_S: db 13,"Disconnected",13,10,"$" +CONNTO_S: db 13,10,"Connected to: $" +USER._S: db "User ($" +PASSWORD._S: db "Password ($" +CIERRAPAR_S: db "): $" +ACCOUNT._S: db "Account ($" +CURPATH_S: db "Current local path: $" +PATHCHAN_S: db "Local path changed to: $" +DIROF_S: db 13,10,"Directory of $" +ESDIR_S: db " $" +FFOUND_S: db " file(s) found",13,10,"$" +DFOUND_S: db " directory(es) found",13,10,"$" +KFREE_S: db "K free on drive $" +DELETE_S: db "Delete local file $" +RECEIVE_S: db "Receive file $" +DELETER_S: db "Delete file $" +SENDFILE_S: db "Send file $" +OPCOMP_S: db "Operation completed",13,10,"$" +OPCAN_S: db "Operation cancelled, remaining files skipped",13,10,"$" +YNAC_S: db " (y,n,a,c)? $" +ALCON_S: db "Already connected, CLOSE first",13,10,"$" +PRESS_S: db "--- Press any key to continue (",34,"P",34," to turn off pause mode) --- $" + +IDENT_S: db ":USERID:OTHER:MSX-DOS 2 running FTP for the TCP/IP UNAPI" +IDENT_S_END: ; +IDENT_LEN: equ IDENT_S_END-IDENT_S ;--- Cadenas de ayuda -BIGHELP_H: db 13,10,"Available commands:",13,10,10 - db "? dir ls recv",13,10 - db "! disconnect lshow remotehelp",13,10 - db "append get mdelete rename",13,10 - db "ascii hash mget rmdir",13,10 - db "bell help mkdir send",13,10 - db "binary lcd mput show",13,10 - db "bye ldelete open status",13,10 - db "cd ldir passive type",13,10 - db "cdup literal pause user",13,10 - db "close lmkdir prompt verbose",13,10 - db "debug lrename put xcommands",13,10 - db "delete lrmdir quote",13,10 - db 10,"Program execution: FTP [| []]",13,10 - db "On ",34,"multiple",34," commands, ",34,"(y,n,a,c)?",34," means ",34,"(Yes, No, yes to All, Cancel)?",34,13,10,10 - db "Default values for the login sequence can be set up in the environment",13,10 - db "variables FTP_USER, FTP_PASSWORD and FTP_ACCOUNT",13,10 - db 10,"$" - -H_APPEND: db "APPEND ",13,10 - db "Appends the content of the local file",13,10 - db "at the end of the remote file.",13,10,"$" - -H_ASCII: db "ASCII",13,10 - db "Sets the transfer mode to ASCII (same as TYPE A).",13,10,"$" - -H_BELL: db "BELL",13,10 - db "Turns on/off the bell mode. In this mode, a BEEP will sound",13,10 - db "when a command execution is complete.",13,10,"$" - -H_BINARY: db "BINARY",13,10 - db "Sets the transfer mode to binary (same as TYPE I).",13,10,"$" - -H_CD: db "CD []",13,10 - db "Changes to the specified remote directory.",13,10 - db "If no directory is specified, shows the current one (same as ",34,"PWD",34,").",13,10,"$" - -H_CDUP: db "CDUP",13,10 - db "Changes to the parent directory (usually same as CD ..)",13,10,"$" - -H_CLOSE: db "CLOSE|DISCONNECT",13,10 - db "Closes connection to FTP server.",13,10,"$" - -H_DEBUG: db "DEBUG",13,10 - db "Turns on/off the debug mode. In this mode, all commands sent",13,10 - db "to the FTP server will be printed on the screen.",13,10,"$" - -H_DELETE: db "DELETE ",13,10 - db "Deletes the specified remote file.",13,10,"$" - -H_DIR: db "DIR [ []]",13,10 - db "Shows the detailed contents of the remote directory",13,10 - db "according to the specified mask (all files if omitted).",13,10 - db "If is specified, information will be stored on",13,10 - db "the specified file instead of being shown on the screen.",13,10 - db "Mask specification is mandatory when specifying ,",13,10 - db "use ",34,".",34," to specify ",34,"all files",34,".",13,10,"$" - -H_FLUSH: ;db "FLUSH",13,10 - ;db "Flushes any data received from the FTP server but not yet",13,10 - ;db "consummed by the application. This type of data appears tipically",13,10 - ;db "when aborting commands with CTRL-C. Use FLUSH when the application",13,10 - ;db "starts to act incorrectly or gives strange errors.",13,10,"$" - -H_GET: db "GET|RETR []",13,10 - db "Obtains the specified remote filename.",13,10,"$" - -H_HASH db "HASH",13,10 - db "Turns on/off the hash mode. In this mode, every time that",13,10 - db "new data arrives from the data connection, a ",34,"#",34," symbol",13,10 - db "is printed on the screen.",13,10,"$" - -H_HELP: db "HELP|? []",13,10 - db "Shows help on available commands.",13,10,"$" - -H_LCD: db "LCD [:][]",13,10 - db "Changes to the specified local drive and/or directory.",13,10 - db "If no parameter is specified, shows the current drive and directory.",13,10,"$" - -H_LDELETE: db "LDELETE [R]",13,10 - db "Deletes the specified local file(s).",13,10 - db "With ",34,"R",34," deletes also read-only file(s).",13,10,"$" - -H_LDIR: db "LDIR [\][]",13,10 - db "Shows the contents of the specified local directory (current one if omitted)",13,10 - db "according to the specified mask (all files if omitted).",13,10,"$" - -H_LITERAL: db "LITERAL|QUOTE ",13,10 - db "!",13,10 - db "Sends a raw command to the FTP server.",13,10 - db "When using ",34,"!",34,", do not put an space between it and the command",13,10 - db "(for example: !NOOP)",13,10,"$" - -H_LMKDIR: db "LMKDIR ",13,10 - db "Creates the specified local directory.",13,10,"$" - -H_LRENAME: db "LRENAME ",13,10 - db "Renames the specified local file(s).",13,10,"$" - -H_LRMDIR: db "LRMDIR ",13,10 - db "Removes the specified local directory.",13,10,"$" - -H_LS: db "LS [ []]",13,10 - db "Shows the contents of the remote directory (filenames only)",13,10 - db "according to the specified mask (all files if omitted).",13,10 - db "If is specified, information will be stored on",13,10 - db "the specified file instead of being shown on the screen.",13,10 - db "Mask specification is mandatory when specifying ,",13,10 - db "use ",34,".",34," to specify ",34,"all files",34,".",13,10,"$" - -H_LSHOW: db "LSHOW ",13,10 - db "Shows the contents of the specified local file",13,10 - db "(which is assumed to be a text file).",13,10,"$" +BIGHELP_H: db 13,10,"Available commands:",13,10,10 + db "? dir ls recv",13,10 + db "! disconnect lshow remotehelp",13,10 + db "append get mdelete rename",13,10 + db "ascii hash mget rmdir",13,10 + db "bell help mkdir send",13,10 + db "binary lcd mput show",13,10 + db "bye ldelete open status",13,10 + db "cd ldir passive type",13,10 + db "cdup literal pause user",13,10 + db "close lmkdir prompt verbose",13,10 + db "debug lrename put xcommands",13,10 + db "delete lrmdir quote",13,10 + db 10,"Program execution: FTP [| []]",13,10 + db "On ",34,"multiple",34," commands, ",34,"(y,n,a,c)?",34," means ",34,"(Yes, No, yes to All, Cancel)?",34,13,10,10 + db "Default values for the login sequence can be set up in the environment",13,10 + db "variables FTP_USER, FTP_PASSWORD and FTP_ACCOUNT",13,10 + db 10,"$" + +H_APPEND: db "APPEND ",13,10 + db "Appends the content of the local file",13,10 + db "at the end of the remote file.",13,10,"$" + +H_ASCII: db "ASCII",13,10 + db "Sets the transfer mode to ASCII (same as TYPE A).",13,10,"$" + +H_BELL: db "BELL",13,10 + db "Turns on/off the bell mode. In this mode, a BEEP will sound",13,10 + db "when a command execution is complete.",13,10,"$" + +H_BINARY: db "BINARY",13,10 + db "Sets the transfer mode to binary (same as TYPE I).",13,10,"$" + +H_CD: db "CD []",13,10 + db "Changes to the specified remote directory.",13,10 + db "If no directory is specified, shows the current one (same as ",34,"PWD",34,").",13,10,"$" + +H_CDUP: db "CDUP",13,10 + db "Changes to the parent directory (usually same as CD ..)",13,10,"$" + +H_CLOSE: db "CLOSE|DISCONNECT",13,10 + db "Closes connection to FTP server.",13,10,"$" + +H_DEBUG: db "DEBUG",13,10 + db "Turns on/off the debug mode. In this mode, all commands sent",13,10 + db "to the FTP server will be printed on the screen.",13,10,"$" + +H_DELETE: db "DELETE ",13,10 + db "Deletes the specified remote file.",13,10,"$" + +H_DIR: db "DIR [ []]",13,10 + db "Shows the detailed contents of the remote directory",13,10 + db "according to the specified mask (all files if omitted).",13,10 + db "If is specified, information will be stored on",13,10 + db "the specified file instead of being shown on the screen.",13,10 + db "Mask specification is mandatory when specifying ,",13,10 + db "use ",34,".",34," to specify ",34,"all files",34,".",13,10,"$" + +H_FLUSH: ;db "FLUSH",13,10 + ;db "Flushes any data received from the FTP server but not yet",13,10 + ;db "consummed by the application. This type of data appears tipically",13,10 + ;db "when aborting commands with CTRL-C. Use FLUSH when the application",13,10 + ;db "starts to act incorrectly or gives strange errors.",13,10,"$" + +H_GET: db "GET|RETR []",13,10 + db "Obtains the specified remote filename.",13,10,"$" + +H_HASH db "HASH",13,10 + db "Turns on/off the hash mode. In this mode, every time that",13,10 + db "new data arrives from the data connection, a ",34,"#",34," symbol",13,10 + db "is printed on the screen.",13,10,"$" + +H_HELP: db "HELP|? []",13,10 + db "Shows help on available commands.",13,10,"$" + +H_LCD: db "LCD [:][]",13,10 + db "Changes to the specified local drive and/or directory.",13,10 + db "If no parameter is specified, shows the current drive and directory.",13,10,"$" + +H_LDELETE: db "LDELETE [R]",13,10 + db "Deletes the specified local file(s).",13,10 + db "With ",34,"R",34," deletes also read-only file(s).",13,10,"$" + +H_LDIR: db "LDIR [\][]",13,10 + db "Shows the contents of the specified local directory (current one if omitted)",13,10 + db "according to the specified mask (all files if omitted).",13,10,"$" + +H_LITERAL: db "LITERAL|QUOTE ",13,10 + db "!",13,10 + db "Sends a raw command to the FTP server.",13,10 + db "When using ",34,"!",34,", do not put an space between it and the command",13,10 + db "(for example: !NOOP)",13,10,"$" + +H_LMKDIR: db "LMKDIR ",13,10 + db "Creates the specified local directory.",13,10,"$" + +H_LRENAME: db "LRENAME ",13,10 + db "Renames the specified local file(s).",13,10,"$" + +H_LRMDIR: db "LRMDIR ",13,10 + db "Removes the specified local directory.",13,10,"$" + +H_LS: db "LS [ []]",13,10 + db "Shows the contents of the remote directory (filenames only)",13,10 + db "according to the specified mask (all files if omitted).",13,10 + db "If is specified, information will be stored on",13,10 + db "the specified file instead of being shown on the screen.",13,10 + db "Mask specification is mandatory when specifying ,",13,10 + db "use ",34,".",34," to specify ",34,"all files",34,".",13,10,"$" + +H_LSHOW: db "LSHOW ",13,10 + db "Shows the contents of the specified local file",13,10 + db "(which is assumed to be a text file).",13,10,"$" -H_MDELETE: db "MDELETE ",13,10 - db "Deletes multiple remote files, according to the mask.",13,10 - db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" +H_MDELETE: db "MDELETE ",13,10 + db "Deletes multiple remote files, according to the mask.",13,10 + db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" -H_MGET: db "MGET ",13,10 - db "Obtains multiple remote files.",13,10 - db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" +H_MGET: db "MGET ",13,10 + db "Obtains multiple remote files.",13,10 + db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" -H_MKDIR: db "MKDIR ",13,10 - db "Creates the specified remote directory.",13,10,"$" +H_MKDIR: db "MKDIR ",13,10 + db "Creates the specified remote directory.",13,10,"$" -H_MPUT: db "MPUT ",13,10 - db "Sends multiple files to the FTP server.",13,10 - db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" +H_MPUT: db "MPUT ",13,10 + db "Sends multiple files to the FTP server.",13,10 + db "This command needs NestorMan 1.21 or higher to be installed.",13,10,"$" -H_OPEN: db "OPEN | []",13,10 - db "Opens a connection to the specified FTP server.",13,10 - db "Default port number is 21.",13,10,"$" +H_OPEN: db "OPEN | []",13,10 + db "Opens a connection to the specified FTP server.",13,10 + db "Default port number is 21.",13,10,"$" -H_PASSIVE: db "PASSIVE",13,10 - db "Turns on/off the passive mode. In this mode, the application opens",13,10 - db "actively the data connections, instead of waiting for the server to do it.",13,10,"$" +H_PASSIVE: db "PASSIVE",13,10 + db "Turns on/off the passive mode. In this mode, the application opens",13,10 + db "actively the data connections, instead of waiting for the server to do it.",13,10,"$" -H_PAUSE: db "PAUSE",13,10 - db "Turns on/off the pause mode. In this mode, all commands involving",13,10 - db "data output to the screen (LIST, LS, SHOW and LSHOW) make a pause",13,10 - db "and ask for key pressing after a complete screen has been displayed.",13,10,"$" +H_PAUSE: db "PAUSE",13,10 + db "Turns on/off the pause mode. In this mode, all commands involving",13,10 + db "data output to the screen (LIST, LS, SHOW and LSHOW) make a pause",13,10 + db "and ask for key pressing after a complete screen has been displayed.",13,10,"$" -H_PROMPT: db "PROMPT",13,10 - db "Turns on/off the prompt mode. In this mode, all commands involving",13,10 - db "multiple files processing (MGET, MPUT, MDELETE, LDELETE) ask the user",13,10 - db "for confirmation on each file.",13,10,"$" +H_PROMPT: db "PROMPT",13,10 + db "Turns on/off the prompt mode. In this mode, all commands involving",13,10 + db "multiple files processing (MGET, MPUT, MDELETE, LDELETE) ask the user",13,10 + db "for confirmation on each file.",13,10,"$" -H_PWD: db "PWD",13,10 - db "Shows current remote directory",13,10 - db "(same as ",34,"CD",34," without parameters).",13,10,"$" - -H_REMOTEHELP: db "REMOTEHELP []",13,10 - db "Requests and shows help from the FTP server.",13,10,"$" +H_PWD: db "PWD",13,10 + db "Shows current remote directory",13,10 + db "(same as ",34,"CD",34," without parameters).",13,10,"$" + +H_REMOTEHELP: db "REMOTEHELP []",13,10 + db "Requests and shows help from the FTP server.",13,10,"$" -H_RENAME: db "RENAME ",13,10 - db "Renames the specified remote file.",13,10,"$" +H_RENAME: db "RENAME ",13,10 + db "Renames the specified remote file.",13,10,"$" -H_RMDIR: db "RMDIR ",13,10 - db "Removes the specified remote directory.",13,10,"$" +H_RMDIR: db "RMDIR ",13,10 + db "Removes the specified remote directory.",13,10,"$" -H_SEND: db "PUT|SEND ",13,10 - db "Sends the specified local file to the FTP server.",13,10,"$" +H_SEND: db "PUT|SEND ",13,10 + db "Sends the specified local file to the FTP server.",13,10,"$" -H_SHOW: db "SHOW ",13,10 - db "Shows the contents of the specified remote file",13,10 - db "(which is assumed to be a text file).",13,10,"$" +H_SHOW: db "SHOW ",13,10 + db "Shows the contents of the specified remote file",13,10 + db "(which is assumed to be a text file).",13,10,"$" -H_STATUS: db "STATUS",13,10 - db "Shows the current status of the application.",13,10,"$" +H_STATUS: db "STATUS",13,10 + db "Shows the current status of the application.",13,10,"$" -H_TYPE: db "TYPE A|I" - db "Sets the file transfer type to ASCII (A) or binary (I).",13,10 - db "Commands ASCII and BINARY can be used for the same purpose.",13,10,"$" +H_TYPE: db "TYPE A|I" + db "Sets the file transfer type to ASCII (A) or binary (I).",13,10 + db "Commands ASCII and BINARY can be used for the same purpose.",13,10,"$" -H_QUIT: db "BYE|QUIT",13,10 - db "Closes connection to FTP server and exits application.",13,10,"$" +H_QUIT: db "BYE|QUIT",13,10 + db "Closes connection to FTP server and exits application.",13,10,"$" -H_USER: db "USER ",13,10 - db "(Re)starts the login procedure on the FTP server.",13,10 - db "Default values por user, password and account information",13,10 - db "can be set up in the environment variables FTP_USER,",13,10 - db "FTP_PASSWORD and FTP_ACCOUNT respectively.",13,10,"$" +H_USER: db "USER ",13,10 + db "(Re)starts the login procedure on the FTP server.",13,10 + db "Default values por user, password and account information",13,10 + db "can be set up in the environment variables FTP_USER,",13,10 + db "FTP_PASSWORD and FTP_ACCOUNT respectively.",13,10,"$" -H_VERBOSE: db "VERBOSE",13,10 - db "Turns on/off the verbose mode. In this mode, all replies received",13,10 - db "from the server are printed on the screen (error messages are always printed).",13,10,"$" +H_VERBOSE: db "VERBOSE",13,10 + db "Turns on/off the verbose mode. In this mode, all replies received",13,10 + db "from the server are printed on the screen (error messages are always printed).",13,10,"$" -H_XCOMMANDS: db "XCOMMANDS",13,10 - db "Turns on/off the ",34,"X",34," commands mode. In this mode, FTP commands",13,10 - db "XMKD, XRMD, XPWD, XCUP and XCWD are sent to the FTP server",13,10 - db "instead of MKD, RMD, PWD, CDUP and CWD, respectively.",13,10,"$" +H_XCOMMANDS: db "XCOMMANDS",13,10 + db "Turns on/off the ",34,"X",34," commands mode. In this mode, FTP commands",13,10 + db "XMKD, XRMD, XPWD, XCUP and XCWD are sent to the FTP server",13,10 + db "instead of MKD, RMD, PWD, CDUP and CWD, respectively.",13,10,"$" ;--- Comandos para enviar al servidor FTP -C_ABOR: db "ABOR",0 -C_ACCT: db "ACCT",0 -C_APPE: db "APPE",0 -C_CDUP: db "CDUP",0 -C_DELE: db "DELE",0 -C_CWD: db "CWD",0,0 -C_RETR: db "RETR",0 -C_HELP: db "HELP",0 -C_LIST: db "LIST",0 -C_MKD: db "MKD",0,0 -C_NLST: db "NLST",0 -C_PASS: db "PASS",0 -C_PASV: db "PASV",0 -C_PORT: db "PORT 000,000,000,000,000,000",13,10 -C_PWD: db "PWD",0,0 -C_QUIT: db "QUIT",0 -C_RMD: db "RMD",0,0 -C_RNFR: db "RNFR",0 -C_RNTO: db "RNTO",0 -C_STOR: db "STOR",0 -C_TYPE: db "TYPE",0 -C_USER: db "USER",0 -C_XCUP: db "XCUP",0 +C_ABOR: db "ABOR",0 +C_ACCT: db "ACCT",0 +C_APPE: db "APPE",0 +C_CDUP: db "CDUP",0 +C_DELE: db "DELE",0 +C_CWD: db "CWD",0,0 +C_RETR: db "RETR",0 +C_HELP: db "HELP",0 +C_LIST: db "LIST",0 +C_MKD: db "MKD",0,0 +C_NLST: db "NLST",0 +C_PASS: db "PASS",0 +C_PASV: db "PASV",0 +C_PORT: db "PORT 000,000,000,000,000,000",13,10 +C_PWD: db "PWD",0,0 +C_QUIT: db "QUIT",0 +C_RMD: db "RMD",0,0 +C_RNFR: db "RNFR",0 +C_RNTO: db "RNTO",0 +C_STOR: db "STOR",0 +C_TYPE: db "TYPE",0 +C_USER: db "USER",0 +C_XCUP: db "XCUP",0 ;--- Tabla de comandos de usuario y direccion de su rutina y texto de ayuda -COM_ENTRY: macro @c ;Entrada para comando normal - db "@c",0 - dw R_@c - dw H_@c - endm - -COM_ENTRY2: macro @c,@x ;Entrada para alias - db "@c",0 - dw R_@x - dw H_@x - endm - -COMMAND_TABLE: ; - - COM_ENTRY2 ?,HELP - COM_ENTRY2 !,LITERAL - COM_ENTRY APPEND - COM_ENTRY ASCII - COM_ENTRY BELL - COM_ENTRY2 BYE,QUIT - COM_ENTRY BINARY - COM_ENTRY CD - COM_ENTRY CDUP - COM_ENTRY CLOSE - COM_ENTRY DEBUG - COM_ENTRY DELETE - COM_ENTRY DIR - COM_ENTRY2 DISCONNECT,CLOSE - ;COM_ENTRY FLUSH - COM_ENTRY GET - COM_ENTRY HASH - COM_ENTRY HELP - COM_ENTRY LCD - COM_ENTRY LDELETE - COM_ENTRY LDIR - COM_ENTRY LITERAL - COM_ENTRY LMKDIR - COM_ENTRY LRENAME - COM_ENTRY LRMDIR - COM_ENTRY LS - COM_ENTRY LSHOW - COM_ENTRY MDELETE - COM_ENTRY MGET - COM_ENTRY MKDIR - COM_ENTRY MPUT - COM_ENTRY OPEN - COM_ENTRY PASSIVE - COM_ENTRY PROMPT - COM_ENTRY PAUSE - COM_ENTRY2 PUT,SEND - COM_ENTRY PWD - COM_ENTRY QUIT - COM_ENTRY2 QUOTE,LITERAL - COM_ENTRY2 RECV,GET - COM_ENTRY REMOTEHELP - COM_ENTRY RENAME - COM_ENTRY RMDIR - COM_ENTRY SEND - COM_ENTRY SHOW - COM_ENTRY STATUS - COM_ENTRY TYPE - COM_ENTRY USER - COM_ENTRY VERBOSE - COM_ENTRY XCOMMANDS - db 0 +COM_ENTRY: macro @c ;Entrada para comando normal + db "@c",0 + dw R_@c + dw H_@c + endm + +COM_ENTRY2: macro @c,@x ;Entrada para alias + db "@c",0 + dw R_@x + dw H_@x + endm + +COMMAND_TABLE: ; + + COM_ENTRY2 ?,HELP + COM_ENTRY2 !,LITERAL + COM_ENTRY APPEND + COM_ENTRY ASCII + COM_ENTRY BELL + COM_ENTRY2 BYE,QUIT + COM_ENTRY BINARY + COM_ENTRY CD + COM_ENTRY CDUP + COM_ENTRY CLOSE + COM_ENTRY DEBUG + COM_ENTRY DELETE + COM_ENTRY DIR + COM_ENTRY2 DISCONNECT,CLOSE + ;COM_ENTRY FLUSH + COM_ENTRY GET + COM_ENTRY HASH + COM_ENTRY HELP + COM_ENTRY LCD + COM_ENTRY LDELETE + COM_ENTRY LDIR + COM_ENTRY LITERAL + COM_ENTRY LMKDIR + COM_ENTRY LRENAME + COM_ENTRY LRMDIR + COM_ENTRY LS + COM_ENTRY LSHOW + COM_ENTRY MDELETE + COM_ENTRY MGET + COM_ENTRY MKDIR + COM_ENTRY MPUT + COM_ENTRY OPEN + COM_ENTRY PASSIVE + COM_ENTRY PROMPT + COM_ENTRY PAUSE + COM_ENTRY2 PUT,SEND + COM_ENTRY PWD + COM_ENTRY QUIT + COM_ENTRY2 QUOTE,LITERAL + COM_ENTRY2 RECV,GET + COM_ENTRY REMOTEHELP + COM_ENTRY RENAME + COM_ENTRY RMDIR + COM_ENTRY SEND + COM_ENTRY SHOW + COM_ENTRY STATUS + COM_ENTRY TYPE + COM_ENTRY USER + COM_ENTRY VERBOSE + COM_ENTRY XCOMMANDS + db 0 ;--- Tabla de errores DNS -DNSERRS_T: db 1,"Query format error$" - db 2,"Server failure$" - db 3,"Name error (unknwon host)$" - db 4,"Query type not implemented$" - db 5,"Query refused$" - db 6,"DNS error 6$" - db 7,"DNS error 7$" - db 8,"DNS error 8$" - db 9,"DNS error 9$" - db 10,"DNS error 10$" - db 11,"DNS error 11$" - db 12,"DNS error 12$" - db 13,"DNS error 13$" - db 14,"DNS error 14$" - db 15,"DNS error 15$" - db 16,"Can't get a reply from DNS$" - db 17,"Operation timeout expired$" - db 18,"Query aborted$" - db 19,"Connection lost$" - db 20,"DNS did not give neither a reply nor a pointer to another DNS$" - db 21,"Answer is truncated$" - db 0 - -DNSQERRS_T: db ERR_NO_NETWORK,"No network connection$" - db ERR_NO_DNS,"No DNS servers available$" - db ERR_NOT_IMP,"This TCP/IP UNAPI implementation does not support name resolution.",13,10 - db "An IP address must be specified instead.$" - db 0 +DNSERRS_T: db 1,"Query format error$" + db 2,"Server failure$" + db 3,"Name error (unknwon host)$" + db 4,"Query type not implemented$" + db 5,"Query refused$" + db 6,"DNS error 6$" + db 7,"DNS error 7$" + db 8,"DNS error 8$" + db 9,"DNS error 9$" + db 10,"DNS error 10$" + db 11,"DNS error 11$" + db 12,"DNS error 12$" + db 13,"DNS error 13$" + db 14,"DNS error 14$" + db 15,"DNS error 15$" + db 16,"Can't get a reply from DNS$" + db 17,"Operation timeout expired$" + db 18,"Query aborted$" + db 19,"Connection lost$" + db 20,"DNS did not give neither a reply nor a pointer to another DNS$" + db 21,"Answer is truncated$" + db 0 + +DNSQERRS_T: db ERR_NO_NETWORK,"No network connection$" + db ERR_NO_DNS,"No DNS servers available$" + db ERR_NOT_IMP,"This TCP/IP UNAPI implementation does not support name resolution.",13,10 + db "An IP address must be specified instead.$" + db 0 ;--- Tabla de errores al abrir una conexion -OPENERR_T: db ERR_NO_FREE_CONN,"Too many TCP connections opened$" - db ERR_NO_NETWORK,"No network connection found$" - db ERR_CONN_EXISTS,"Connection already exists, try another local port number$" - db ERR_INV_PARAM,"Invalid parameter when opening connection$" - db 0 +OPENERR_T: db ERR_NO_FREE_CONN,"Too many TCP connections opened$" + db ERR_NO_NETWORK,"No network connection found$" + db ERR_CONN_EXISTS,"Connection already exists, try another local port number$" + db ERR_INV_PARAM,"Invalid parameter when opening connection$" + db 0 - db 0 + db 0 DATA_END: ;--- Bufer para el comando tecleado por el usuario -USER_COM_BUF: equ DATA_END +USER_COM_BUF: equ DATA_END ;--- Bufer para el primer comando a enviar -SEND_COM_BUF: equ USER_COM_BUF+270 +SEND_COM_BUF: equ USER_COM_BUF+270 ;--- Bufer para el nombre del servidor -SERVER_NAME: equ SEND_COM_BUF+270 +SERVER_NAME: equ SEND_COM_BUF+270 ;--- Bufer para la respuesta del servidor -RESPONSE_BUF: equ SERVER_NAME+257 +RESPONSE_BUF: equ SERVER_NAME+257 ;--- Bufer para examinar el comando del usuario -PARSE_BUF: equ RESPONSE_BUF+257 +PARSE_BUF: equ RESPONSE_BUF+257 ;--- Bufer para GET_DATA -GDATA_CBUF: equ PARSE_BUF+257 -GDATA_DBUF: equ GDATA_CBUF+257 +GDATA_CBUF: equ PARSE_BUF+257 +GDATA_DBUF: equ GDATA_CBUF+257 ;--- Bufer para coger datos de la conexion de idem -DATA_BUF: equ GDATA_DBUF+257 +DATA_BUF: equ GDATA_DBUF+257 ;--- Buferes para el nombre de usuario y password por defecto -DEF_USER: equ DATA_BUF+1510 -DEF_PASSWORD: equ DEF_USER+257 -DEF_ACCOUNT: equ DEF_PASSWORD+257 +DEF_USER: equ DATA_BUF+1510 +DEF_PASSWORD: equ DEF_USER+257 +DEF_ACCOUNT: equ DEF_PASSWORD+257 ;--- Espacio para la rutina HOOK -HOOK_CODE: equ DEF_ACCOUNT+257 +HOOK_CODE: equ DEF_ACCOUNT+257 - ;Donde colocaremos el gancho antiguo - ;(justo despues del codigo nuevo) + ;Donde colocaremos el gancho antiguo + ;(justo despues del codigo nuevo) -HOOK_OLD: equ HOOK_CODE0_END-HOOK_CODE0+HOOK_CODE -ESC_CHAR: equ HOOK_OLD+5 - \ No newline at end of file +HOOK_OLD: equ HOOK_CODE0_END-HOOK_CODE0+HOOK_CODE +ESC_CHAR: equ HOOK_OLD+5 From 8509c2f947813384aa87313ff7f6c2f401325928 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 15:51:06 +0900 Subject: [PATCH 2/9] Use "h" suffix instead of "#" prefix for hex numbers, and "b" suffix instead of "%" prefix for bin numbers --- SRC/NETWORK/ftp.asm | 428 ++++++++++++++++++++++---------------------- 1 file changed, 214 insertions(+), 214 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 99c022771..117456d7c 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -11,8 +11,8 @@ nesman: macro @f ;Llamada indirecta a las funciones de NestorMan ld c,@f - ld de,#2202 - call #FFCA + ld de,2202h + call 0FFCAh endm print: macro @d ;Imprime una cadena acabada en "$" @@ -31,44 +31,44 @@ printz: macro @d ;Imprime una cadena acabada en cero call PRINT_Z endm -_TERM0: equ #00 -_CONOUT: equ #02 ;Some DOS function calls -_DIRIO: equ #06 -_INNOE: equ #08 -_STROUT: equ #09 -_BUFIN: equ #0A -_CONST: equ #0B -_SELDSK: equ #0E -_CURDRV: equ #19 -_ALLOC: equ #1B -_FFIRST: equ #40 -_FNEXT: equ #41 -_OPEN: equ #43 -_CREATE: equ #44 -_CLOSE: equ #45 -_READ: equ #48 -_WRITE: equ #49 -_DELETE: equ #4D -_RENAME: equ #4E -_ATTR: equ #50 -_GETCD: equ #59 -_CHDIR: equ #5A -_PARSE: equ #5B -_TERM: equ #62 -_DEFAB: equ #63 -_ERROR: equ #65 -_EXPLAIN: equ #66 -_GENV: equ #6B -_DOSVER: equ #6F - -ENASLT: equ #0024 ;Slot swithcing BIOS routine -BEEP: equ #00C0 ;Generates a BEEP -CALSLT: equ #001C ;Calls a routine on another slot - -TPASLOT1: equ #F342 -ARG: equ #F847 -H_CHPH: equ #FDA4 ;Gancho CHPUT -EXTBIO: equ #FFCA +_TERM0: equ 00h +_CONOUT: equ 02h ;Some DOS function calls +_DIRIO: equ 06h +_INNOE: equ 08h +_STROUT: equ 09h +_BUFIN: equ 0Ah +_CONST: equ 0Bh +_SELDSK: equ 0Eh +_CURDRV: equ 19h +_ALLOC: equ 1Bh +_FFIRST: equ 40h +_FNEXT: equ 41h +_OPEN: equ 43h +_CREATE: equ 44h +_CLOSE: equ 45h +_READ: equ 48h +_WRITE: equ 49h +_DELETE: equ 4Dh +_RENAME: equ 4Eh +_ATTR: equ 50h +_GETCD: equ 59h +_CHDIR: equ 5Ah +_PARSE: equ 5Bh +_TERM: equ 62h +_DEFAB: equ 63h +_ERROR: equ 65h +_EXPLAIN: equ 66h +_GENV: equ 6Bh +_DOSVER: equ 6Fh + +ENASLT: equ 0024h ;Slot swithcing BIOS routine +BEEP: equ 00C0h ;Generates a BEEP +CALSLT: equ 001Ch ;Calls a routine on another slot + +TPASLOT1: equ 0F342h +ARG: equ 0F847h +H_CHPH: equ 0FDA4h ;Gancho CHPUT +EXTBIO: equ 0FFCAh ;--- TCP/IP UNAPI routines @@ -176,14 +176,14 @@ jpmyi: macro @a ;A >=x ;*** *** ;************************** - org #100 + org 100h ld hl,DATA - ld de,#8000 + ld de,8000h ld bc,DATA_END-DATA_START ldir - ld a,#FF + ld a,0FFh ld (USER_COM_BUF),a ;--- Muestra la cadena inicial @@ -217,7 +217,7 @@ OKDOS2: xor a ld b,0 - ld de,#2222 + ld de,2222h call EXTBIO ld a,b or a @@ -234,27 +234,27 @@ OKINS: ; ;--- Setup the UNAPI calling code ld a,1 - ld de,#2222 + ld de,2222h call EXTBIO ld (DO_UNAPI+1),hl ld c,a ld a,h - cp #C0 + cp 0C0h ld a,c jr c,NO_UNAPI_P3 - ld a,#C9 + ld a,0C9h ld (SET_UNAPI),a jr OK_SET_UNAPI NO_UNAPI_P3: ld (UNAPI_SLOT+1),a ld a,b - cp #FF + cp 0FFh jr nz,NO_UNAPI_ROM - ld a,#C9 + ld a,0C9h ld (UNAPI_SEG),a jr OK_SET_UNAPI NO_UNAPI_ROM: @@ -264,7 +264,7 @@ OK_SET_UNAPI: ;--- Get mapper support routines (we need GET_P1 and PUT_P1) - ld de,#0402 + ld de,0402h xor a call EXTBIO or a @@ -348,12 +348,12 @@ OKFRCON: or a jr z,OKNMAN -OKNMAN1: ld hl,#0201 ;Installed: now check version +OKNMAN1: ld hl,0201h ;Installed: now check version ex de,hl call COMP jr nc,OKNMAN - ld a,#FF + ld a,0FFh ld (HAY_NMAN),a OKNMAN: @@ -446,17 +446,17 @@ OK_DEFUSER: ; ;--- Si hay parametros, salta a OPEN - ld hl,#80 + ld hl,80h ld de,USER_COM_BUF+1 ld a,1 call EXTPAR jr c,NOPARS - ld hl,#81 ;Copia el comando ficticio "X" + ld hl,81h ;Copia el comando ficticio "X" ld de,USER_COM_BUF+3 ld bc,255 ;y los parametros a USER_COM_BUF, ldir - ld a,(#80) ;entonces salta a OPEN + ld a,(80h) ;entonces salta a OPEN inc a inc a ld (USER_COM_BUF+1),a @@ -478,7 +478,7 @@ MAIN_LOOP: ld sp,(SAVESP) ;--- Pone ABORT_STAT a 1 o a 2 ld a,(CONTROL_CON) - cp #FF + cp 0FFh ld a,1 jr z,MAINLOP_2 inc a @@ -527,7 +527,7 @@ NOADMIRA: ld hl,PARSE_BUF jr MAIN_LOOP COM_OK: ld a,(CONTROL_CON) ;Flushea datos si hay conexion - cp #FF + cp 0FFh jr z,COM_OK2 ;call TCP_STATUS ;jr c,COM_OK2 @@ -542,7 +542,7 @@ COM_OK2: call JP_HL ;Ejecuta comando or a jr z,MAIN_LOOP - ld iy,(#FCC1-1) ;Ejecuta BEEP si BELL=#FF + ld iy,(0FCC1h-1) ;Ejecuta BEEP si BELL=0FFh ld ix,BEEP call CALSLT jp MAIN_LOOP @@ -618,7 +618,7 @@ R_ASCII: ld a,4 ld a,"A" R_ASCBIN: ld (SEND_COM_BUF+5),a - ld hl,#0A0D ;Vuelve con Cy=1 en caso de error + ld hl,0A0Dh ;Vuelve con Cy=1 en caso de error ld (SEND_COM_BUF+6),hl ;(usado por R_DIR) ld hl,C_TYPE call SET_COMMAND @@ -651,7 +651,7 @@ R_BELL: ld a,3 R_BINARY: ;ld a,4 ;ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh push af ld a,"I" @@ -674,7 +674,7 @@ R_CD: call CHK_CON call EXTPAR jp c,R_PWD - ld a,#FF + ld a,0FFh ld (ES_XCOM),a ld hl,C_CWD jp PARAM_XCOM @@ -708,7 +708,7 @@ R_CLOSE: call CHK_CON ld a,5 ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh ld (QUITTING),a ld hl,C_QUIT call SET_COMMAND @@ -718,7 +718,7 @@ R_CLOSE: call CHK_CON ld b,a ld a,TCPIP_TCP_CLOSE call CALL_UNAPI - ld a,#FF + ld a,0FFh ld (CONTROL_CON),a xor a ld (QUITTING),a @@ -786,7 +786,7 @@ R_DIR_LS: ld (RETR_COM),hl R_DIR_LS2: ld a,2 ;Ejecuta comando ld (RETR_PAR),a - ld a,#FF + ld a,0FFh ld (MUST_ASCII),a jp RETRIEVE @@ -949,7 +949,7 @@ LCD_NOPATH: ld a,"\" ;Si se especifica unidad pero no dir, ;--- LDELETE --- ;----------------- -R_LDELETE: ;ld a,#FF +R_LDELETE: ;ld a,0FFh ;ld (LDIR_EXE),a call _R_LDELETE xor a @@ -980,10 +980,10 @@ _R_LDELETE: ld a,4 or a jp nz,R_INVPAR ld a,(RESPONSE_BUF) - or %00100000 + or 00100000b cp "r" jp nz,R_INVPAR - ld a,#FF + ld a,0FFh ld (ALSO_RONLY),a RLDEL2: ; @@ -991,11 +991,11 @@ RLDEL2: ; ld c,_FFIRST ld de,PARSE_BUF - ld b,%00111 ;Incluye ficheros ocultos y de sistema + ld b,00111b ;Incluye ficheros ocultos y de sistema R_LDELLOOP: ld ix,USER_COM_BUF+1 call DOS ;Realiza la busqueda jr c,R_LDELEND - ld a,#FF ;Solo imprimira "file not found" + ld a,0FFh ;Solo imprimira "file not found" ld (LDIR_EXE),a ;si no encuentra el primero ;--- Comprueba si es de solo lectura, @@ -1010,7 +1010,7 @@ R_LDELLOOP: ld ix,USER_COM_BUF+1 jr z,LDEL_NODEL LDEL_NORO: ; - ;--- Si ALLFILES=#FF, pregunta + ;--- Si ALLFILES=0FFh, pregunta ; si se quiere borrar; si no, lo borra directamente ld a,(ALLFILES) @@ -1026,7 +1026,7 @@ LDEL_NORO: ; jr z,LDEL_NODEL cp 3 jr z,LDEL_CANCEL - ld a,#FF + ld a,0FFh ld (ALLFILES),a ;--- Borrar fichero: primero le quita @@ -1047,7 +1047,7 @@ LDEL_DEL2: ld de,USER_COM_BUF+1 ;Borra el fichero ld c,_DELETE call DOS ret c - ld a,#FF + ld a,0FFh ld (BORRALGUNO),a ;--- Pasa al siguiente fichero @@ -1078,7 +1078,7 @@ BORRALGUNO: db 0 ;Al final sera 0 si no se ha borrado nada ;--- LDIR --- ;-------------- -R_LDIR: ld a,#FF +R_LDIR: ld a,0FFh ld (LDIR_EXE),a call _R_LDIR xor a @@ -1111,7 +1111,7 @@ _R_LDIR: ld a,3 ld c,_FFIRST ld de,RESPONSE_BUF - ld b,%10111 ;Incluye directorios, ocultos y de sistema + ld b,10111b ;Incluye directorios, ocultos y de sistema R_LDIRLOOP: ld ix,USER_COM_BUF+1 call DOS ;Realiza la busqueda jp c,LDIR_END @@ -1177,7 +1177,7 @@ LDIR_ESFILE: ld hl,(LDIR_FILES) ;Es fichero? Imprime tamanyo ld d,(ix+1) jr z,LDIR_PEQUEN ;"Grande" si es mayor de 64K ;ld a,(ix+1) - ;and %11000000 + ;and 11000000b ;ld e,(ix) ;ld d,(ix+1) ;jr z,LDIR_PEQUEN @@ -1199,7 +1199,7 @@ LDIR_PEQUEN: ;Aqui, DE es el tamanyo a imprimir, y Cy=1 si es "K" ld b,7 ld c," " push af - ld a,%1000 + ld a,1000b call NUMTOASC print RESPONSE_BUF pop af @@ -1223,7 +1223,7 @@ LDIR_END: ld (LDIR_ERRNUM),a ld hl,RESPONSE_BUF ;Fin: muestra num de dirs y files encontrados ld de,(LDIR_FILES) ld b,1 - ld a,%1000 + ld a,1000b call NUMTOASC print RESPONSE_BUF print FFOUND_S @@ -1231,13 +1231,13 @@ LDIR_END: ld (LDIR_ERRNUM),a ld hl,RESPONSE_BUF ld de,(LDIR_DIRS) ld b,1 - ld a,%1000 + ld a,1000b call NUMTOASC print RESPONSE_BUF print DFOUND_S ld a,(LDIR_ERRNUM) ;Si el error no era "file not found", - cp #D7 ;no calcula espacio libre + cp 0D7h ;no calcula espacio libre jr nz,LDIR_ENDL3 ld a,(LDIR_DRV) ;Consulta espacio libre en la unidad @@ -1256,7 +1256,7 @@ LDIR_ENDL2: srl h ;Convierte sectores a K ex de,hl ;Muestra "XXX K free on drive X:" ld hl,RESPONSE_BUF ld b,1 - ld a,%1000 + ld a,1000b call NUMTOASC print RESPONSE_BUF print KFREE_S @@ -1348,7 +1348,7 @@ R_LMKDIR: ld a,3 ld c,_CREATE ld de,PARSE_BUF xor a - ld b,%10000 + ld b,10000b call DOS ret c @@ -1360,7 +1360,7 @@ R_LMKDIR: ld a,3 ;--- LRENAME --- ;----------------- -R_LRENAME: ;ld a,#FF +R_LRENAME: ;ld a,0FFh ;ld (LDIR_EXE),a call _R_LRENAME xor a @@ -1383,11 +1383,11 @@ _R_LRENAME: ld a,3 ld c,_FFIRST ld de,PARSE_BUF - ld b,%00111 ;Incluye ficheros ocultos y de sistema + ld b,00111b ;Incluye ficheros ocultos y de sistema R_LRENLOOP: ld ix,USER_COM_BUF+1 call DOS ;Realiza la busqueda jr c,R_LRENEND - ld a,#FF ;Solo imprimira "file not found" + ld a,0FFh ;Solo imprimira "file not found" ld (LDIR_EXE),a ;si no encuentra el primero ld de,USER_COM_BUF+1 ;Renombra cada fichero encontrado @@ -1424,18 +1424,18 @@ R_LRMDIR: ld a,3 ld c,_PARSE call DO_DOS bit 5,b - ld a,#DA ;"Invalid filename" + ld a,0DAh ;"Invalid filename" jp nz,DOS2 ld c,_FFIRST ;Error si no encuentra el fichero/directorio ld de,RESPONSE_BUF ;con ese nombre, o si lo encuentra pero - ld b,%10111 ;es un fichero + ld b,10111b ;es un fichero ld ix,USER_COM_BUF+1 call DOS ret c ld a,(USER_COM_BUF+15) bit 4,a - ld a,#D6 ;"Directory not found" + ld a,0D6h ;"Directory not found" jp z,DOS2 ld de,USER_COM_BUF+1 ;Intenta borrar el directorio @@ -1474,11 +1474,11 @@ R_LSHOW: ld a,3 ld c,_PARSE call DO_DOS bit 5,b - ld a,#DA ;"Invalid filename" + ld a,0DAh ;"Invalid filename" jp nz,DOS2 ld a,(FILE_FH) ;Si ya hay un fichero abierto, - cp #FF ;lo cierra primero (no deberia pasar nunca) + cp 0FFh ;lo cierra primero (no deberia pasar nunca) jr z,R_LSHOW_OK1 ld c,_CLOSE ld b,a @@ -1506,7 +1506,7 @@ GET_LSHOW_END: ld a,(FILE_FH) ;No quedan datos: cierra el fichero ld b,a ld c,_CLOSE call DO_DOS - ld a,#FF + ld a,0FFh ld (FILE_FH),a ret @@ -1557,7 +1557,7 @@ R_MKDIR: call CHK_CON ld a,4 ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh ld (ES_XCOM),a ld hl,USER_COM_BUF+1 ld de,SEND_COM_BUF+4 @@ -1582,7 +1582,7 @@ R_MPUT: ld a,(HAY_NMAN) R_MPUT2: ld a,4 ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh ld (LDIR_EXE),a ld a,(VERBOSE) ld (OLD_VERBOSE_M),a @@ -1592,7 +1592,7 @@ R_MPUT2: ld a,4 ld a,(MUL_LISTA) ld ix,0 nesman 22 - ld a,#FF + ld a,0FFh ld (MUL_LISTA),a ld a,(OLD_VERBOSE_M) ld (VERBOSE),a @@ -1653,7 +1653,7 @@ R_MPUT_OOME: print OUTOFM_S ;--- OPEN --- ;-------------- -R_OPEN: ld a,#FF ;Primero actualiza informacion +R_OPEN: ld a,0FFh ;Primero actualiza informacion ld (QUITTING),a ;sobre la conexion call CHK_CON ld a,0 @@ -1741,7 +1741,7 @@ R_OPEN3: ld (IP_REMOTE_C),hl ;Establece las IPs en los TCBs ld de,0 ld iy,113 ;Conx pasiva a nuestro puerto 113 ld bc,0 - ld a,#FF + ld a,0FFh ;debug "3" call TCP_OPEN ;debug "4" @@ -1752,7 +1752,7 @@ OK_IDENT: ; ld hl,(IP_REMOTE_C) ld de,(IP_REMOTE_C+2) ld ix,(PORT_REMOTE_C) - ld iy,#FFFF + ld iy,0FFFFh ld bc,0 xor a ;debug "5" @@ -1783,7 +1783,7 @@ R_OPEN_L2: call IDENT_AUTOM ld a,(IDENT_CON) call TCP_ABORT - ld a,#FF + ld a,0FFh ld (IDENT_CON),a ld de,CONREF_S ld c,_STROUT @@ -1791,14 +1791,14 @@ R_OPEN_L2: call IDENT_AUTOM jp DO_DOS OPENNOREF: ld d,a - ld a,(#FBEC) ;El bit 2 de #FBEC es 0 + ld a,(0FBECh) ;El bit 2 de 0FBECh es 0 bit 2,a ;cuando se esta pulsando ESC ld a,d jr nz,NOOPCANCEL ld a,b call TCP_ABORT - ld a,#FF + ld a,0FFh ld (CONTROL_CON),a print CANCELLED_S ret @@ -2017,11 +2017,11 @@ R_PWD: call CHK_CON ld a,4 ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh ld (ES_XCOM),a ld a,(VERBOSE) push af ;Siempre muestra el resultado, - ld a,#FF ;aunque "verbose" sea 0 + ld a,0FFh ;aunque "verbose" sea 0 ld (VERBOSE),a ld hl,C_PWD call SINGLE_XCOM @@ -2034,7 +2034,7 @@ R_PWD: call CHK_CON ;--- QUIT --- ;-------------- -R_QUIT: ld a,#FF +R_QUIT: ld a,0FFh ld (QUITTING),a call CHK_CON jp c,TERM @@ -2075,7 +2075,7 @@ R_REMOTEHELP: call CHK_CON ld de,SEND_COM_BUF+5 ld a,(VERBOSE) push af - ld a,#FF ;Siempre muestra respuesta + ld a,0FFh ;Siempre muestra respuesta ld (VERBOSE),a ld a,2 call LITELOOP @@ -2144,7 +2144,7 @@ R_RMDIR: call CHK_CON ld a,4 ld (ABORT_STAT),a - ld a,#FF + ld a,0FFh ld (ES_XCOM),a ld hl,USER_COM_BUF+1 ld de,SEND_COM_BUF+4 @@ -2187,7 +2187,7 @@ R_SEND_APP: ld (PUTR_PAR),a ;Comprueba si existe el parametro ld a,b ld (FILE_FH),a - ld a,#FF + ld a,0FFh ld (PUT_EXE),a call PUTRIEVE xor a @@ -2211,14 +2211,14 @@ R_SHOW: ld hl,C_RETR R_STATUS: ld a,3 ld (ABORT_STAT),a - ld a,#FF ;Primero actualiza informacion + ld a,0FFh ;Primero actualiza informacion ld (QUITTING),a ;sobre la conexion call CHK_CON xor a ld (QUITTING),a ld a,(CONTROL_CON) - cp #FF + cp 0FFh jr nz,STATR_2 call CRLF @@ -2296,7 +2296,7 @@ R_TYPE: call CHK_CON jp nz,R_INVPAR ld a,(PARSE_BUF) ;Error si no es "A" o "I", - or %00100000 ;si no hay error, salta a ASCII o BINARY + or 00100000b ;si no hay error, salta a ASCII o BINARY cp "a" jp z,R_ASCII cp "i" @@ -2386,7 +2386,7 @@ PARAM_COM: call SET_COMMAND SINGLE_XCOM: call SET_COMMAND call APPEND_LF - ld a,#FF + ld a,0FFh ld (ES_XCOM),a jp AUTOMATA_NO1 @@ -2395,7 +2395,7 @@ SINGLE_XCOM: call SET_COMMAND PARAM_XCOM: call SET_COMMAND call SET_SPACE call APPEND_LF - ld a,#FF + ld a,0FFh ld (ES_XCOM),a jp AUTOMATA_NO1 @@ -2496,7 +2496,7 @@ ENDPNUM: ld a,ixh ;Error if the parameter to extract push iy pop hl - ;ld hl,#81 + ;ld hl,81h ld b,1 ;B = current parameter PASAP2: ld a,(hl) ;Skips spaces until the next cp " " ;parameter is found @@ -2553,30 +2553,30 @@ TERM: xor a ;Desde ahora, CTRL-C no tiene efecto ;ld b,a ;ld a,(CONTROL_CON) ;and b - ;cp #FF + ;cp 0FFh ;jr z,TERM_CON_OK ld a,(DATA_CON) - cp #FF + cp 0FFh call nz,TCP_CLOSE ;TCP_ABORT ld a,(CONTROL_CON) - cp #FF + cp 0FFh call nz,TCP_CLOSE ;TCP_ABORT ld a,(IDENT_CON) - cp #FF + cp 0FFh call nz,TCP_CLOSE TERM_CON_OK: ; TERM2: ld a,(TPASLOT1) - ld h,#40 + ld h,40h call ENASLT ld a,(TPASEG1) ;Restaura TPA call PUT_P1 ld a,(FILES_QUEUE) ;Borra cola de nombres de fichero - cp #FF + cp 0FFh jr z,TERM_Q_OK ld ix,0 nesman 22 @@ -2603,9 +2603,9 @@ LF: ld e,10 ; these are overwritten with calls to ; mapper support routines on DOS 2 -PUT_P1: out (#FD),a +PUT_P1: out (0FDh),a ret -GET_P1: in a,(#FD) +GET_P1: in a,(0FDh) ret TPASEG1: db 2 ;TPA segment on page 1 @@ -2664,16 +2664,16 @@ TPASEG1: db 2 ;TPA segment on page 1 NUMTOASC: push af,ix,de,hl ld ix,WorkNTOA push af,af - and %00000111 + and 00000111b ld (ix+0),a ;Type pop af - and %00011000 + and 00011000b rrca rrca rrca ld (ix+1),a ;Finishing pop af - and %11100000 + and 11100000b rlca rlca rlca @@ -2891,7 +2891,7 @@ ToBufUs: ld l,(ix+10) ex de,hl ChkFin1: ld a,(ix+1) ;Checks if "$" or 00 finishing is desired - and %00000111 + and 00000111b or a jr z,Fin cp 1 @@ -2901,7 +2901,7 @@ ChkFin1: ld a,(ix+1) ;Checks if "$" or 00 finishing is desire PonBit7: dec hl ld a,(hl) - or %10000000 + or 10000000b ld (hl),a jr Fin @@ -3084,7 +3084,7 @@ SRCH_C_LOOP: inc hl ld a,(de) cp "A" jrmn SRCH_C_LP2 - and %11011111 ;Lo transforma a mayusculas + and 11011111b ;Lo transforma a mayusculas SRCH_C_LP2: cp (hl) jr nz,NEXT_COM or a @@ -3203,18 +3203,18 @@ DOS: call DO_DOS ret z DOS2: push hl,de,bc - ld b,a ;Si se esta haciendo un DIR, el error #D7 + ld b,a ;Si se esta haciendo un DIR, el error 0D7h ld a,(LDIR_EXE) ;(file not found) no se imprime or a jr z,DOS3 ld a,b - cp #D7 + cp 0D7h jr z,DOS5 DOS3: ld a,(PUT_EXE) ;Si se esta haciendo un PUT, - or a ;el error #C7 (end of file) + or a ;el error 0C7h (end of file) jr z,DOS4 ;no se imprime ld a,b - cp #C7 + cp 0C7h jr z,DOS5 DOS4: ld de,RESPONSE_BUF ld c,_EXPLAIN @@ -3259,7 +3259,7 @@ ASK_YNAC: print YNAC_S ASK_YNAC2: ld c,_INNOE call DO_DOS ld c,a - or %00100000 + or 00100000b ld b,0 cp "y" jr z,ASK_YNAC3 @@ -3282,12 +3282,12 @@ ASK_YNAC3: push bc ret -;--- PRINT_PAUSE: Imprime el caracter A, y si PAUSE=#FF, +;--- PRINT_PAUSE: Imprime el caracter A, y si PAUSE=0FFh, ; realiza una pausa "Press any key to continue" ; cuando se muestra una pantalla llena. ; Se ha de inicializar con BYTE_COUNT y LINE_COUNT a 0. -PRINT_PAUSE: cp #C ;Si es "borrar panrtalla", +PRINT_PAUSE: cp 0Ch ;Si es "borrar panrtalla", jr z,PPAUSE_CLS ;actua como pantalla llena push af ld e,a @@ -3309,7 +3309,7 @@ PRINT_PAUSE: cp #C ;Si es "borrar panrtalla", PPAUSE_NEWL: xor a ld (BYTE_COUNT),a - ld a,(LINE_COUNT) ;Si era LF, PAUSE=#FF, y era la linea 23, + ld a,(LINE_COUNT) ;Si era LF, PAUSE=0FFh, y era la linea 23, inc a ;imprime "Press any key" y hace una pausa ld (LINE_COUNT),a cp 23 @@ -3324,7 +3324,7 @@ PPAUSE_NEWS: xor a ;Pantalla llena push af call CRLF pop af - or %00100000 + or 00100000b cp "p" ret nz xor a @@ -3332,7 +3332,7 @@ PPAUSE_NEWS: xor a ;Pantalla llena ret PPAUSE_CLS: call PPAUSE_NEWS - ld e,#C + ld e,0Ch ld c,_CONOUT jp DO_DOS @@ -3340,13 +3340,13 @@ PPAUSE_CLS: call PPAUSE_NEWS ;--- CLOSE_FILE: Cierra fichero abierto si lo hay CLOSE_FILE: ld a,(FILE_FH) - cp #FF + cp 0FFh ret z ld b,a ld c,_CLOSE call DO_DOS - ld a,#FF + ld a,0FFh ld (FILE_FH),a ret @@ -3357,9 +3357,9 @@ CLOSE_FILE: ld a,(FILE_FH) ;--- CHK_CON: Comprueba la conexion con el servidor FTP. ; Si hay conexion, devuelve Cy=0. -; Si no hay conexion y CONTROL_CON=#FF, imprime "Disconnected" y devuelve Cy=1. -; Si no hay conexion y CONTROL_CON<>#FF, imprimer "ERROR" y devuelve Cy=1. -; Si QUITTING=#FF, no imprime nada. +; Si no hay conexion y CONTROL_CON=0FFh, imprime "Disconnected" y devuelve Cy=1. +; Si no hay conexion y CONTROL_CON<>0FFh, imprimer "ERROR" y devuelve Cy=1. +; Si QUITTING=0FFh, no imprime nada. CHK_CON: call _CHK_CON ret nc @@ -3368,10 +3368,10 @@ CHK_CON: call _CHK_CON ret _CHK_CON: ld a,(CONTROL_CON) - cp #FF + cp 0FFh jr nz,CHK_CON2 - ;CONTROL_CON es #FF: + ;CONTROL_CON es 0FFh: ;Imprime "Disconnected" y devuelve Cy=1 ld a,(QUITTING) @@ -3382,7 +3382,7 @@ _CHK_CON: ld a,(CONTROL_CON) scf ret - ;CONTROL_CON no es #FF: + ;CONTROL_CON no es 0FFh: ;En teoria hay alguna conexion abierta CHK_CON2: call TCP_STATUS @@ -3394,7 +3394,7 @@ CHK_CON2: call TCP_STATUS call TCP_CLOSE ;1.1 ld a,(QUITTING) ;aunque no este ESTABLISHED, or a ;ya que pueden quedar datos por recoger - ld a,#FF + ld a,0FFh ld (CONTROL_CON),a scf ret nz @@ -3409,7 +3409,7 @@ CHK_CON22: ;call CRLF ld a,(CONTROL_CON) call TCP_CLOSE ;TCP_ABORT ;No hay conexion abierta: imprime "ERROR" -CHK_CON3: ld a,#FF +CHK_CON3: ld a,0FFh ld (CONTROL_CON),a xor a ld (GCDATA_COUNT),a @@ -3423,8 +3423,8 @@ CHK_CON3: ld a,#FF ;--- SEND_COM: Envia el comando que hay en SEND_COM_BUF (acabado en CRLF). -; Si ES_XCOM=#FF y XCOMMANDS=#FF, envia la version "X" -; Si DEBUG=#FF, tambien lo imprime por pantalla. +; Si ES_XCOM=0FFh y XCOMMANDS=0FFh, envia la version "X" +; Si DEBUG=0FFh, tambien lo imprime por pantalla. ; Devuelve Cy=1 si no hay conexion. SEND_COM: ld hl,SEND_COM_BUF @@ -3447,7 +3447,7 @@ SEND_COM2: inc bc or e jr nz,SEND_COM3 ;Decrementa el puntero al comando, ld a,"X" ;incrementa la longitud y pone "X" al principio - ld (SEND_COM_BUF-1),a ;si XCOM y ES_XCOM son #FF + ld (SEND_COM_BUF-1),a ;si XCOM y ES_XCOM son 0FFh xor a ld (ES_XCOM),a dec hl @@ -3479,9 +3479,9 @@ SEND_COM_E: print NOMEM_S ; (una linea cada vez). ; Devuelve Cy=1 si no hay conexion. ; Devuelve Cy=0 y A=primer digito de la respuesta en caso contrario. -; Imprime la respuesta si VERBOSE=#FF (cada vez que hay una linea disponible). +; Imprime la respuesta si VERBOSE=0FFh (cada vez que hay una linea disponible). -WAIT_REPLY: ld a,#FF +WAIT_REPLY: ld a,0FFh ld (LAST_REPLY),a call _WAIT_REPLY ret c ;Si tras llamar a la rutina quedan datos, @@ -3508,7 +3508,7 @@ _WAIT_REPLY: ; WREPLY_LOOP1: ld hl,RESPONSE_BUF WREPLY_LOOP2: call HALT ld a,(IDENT_CON) - cp #FF + cp 0FFh call nz,IDENT_AUTOM ;!!! Mejorar esto push hl call CHK_CON @@ -3548,7 +3548,7 @@ WREPLY_LOOP3: push hl ld bc,4 ldir - ;Lo imprime si es un error, o si VERBOSE=#FF + ;Lo imprime si es un error, o si VERBOSE=0FFh call WREPLY_PRINT @@ -3563,7 +3563,7 @@ WREPLY_OK1: ld a,(RESPONSE_BUF+3) or a ret -WREPLY_HAYMAS: ld a,#FF +WREPLY_HAYMAS: ld a,0FFh ld (WREPLY_LINE),a jr WREPLY_LOOP1 @@ -3571,7 +3571,7 @@ WREPLY_HAYMAS: ld a,#FF WREPLY_NO1: ; - ;Lo imprime si es un error, o si VERBOSE=#FF + ;Lo imprime si es un error, o si VERBOSE=0FFh call WREPLY_PRINT @@ -3597,7 +3597,7 @@ WREPLY_LOOP4: ld a,(de) ret ;--- Esta subrutina imprime la linea de RESPONSE_BUF - ; si es un error o si VERBOSE=#FF + ; si es un error o si VERBOSE=0FFh WREPLY_PRINT: ld a,(VERBOSE) or a @@ -3615,7 +3615,7 @@ WREPLY_PRE: printl RESPONSE_BUF+4 WREPLY_PRINT2: printl RESPONSE_BUF ret -WREPLY_LINE: db 0 ;Linea: 0=1a, #FF=otras +WREPLY_LINE: db 0 ;Linea: 0=1a, 0FFh=otras WREPLY_CODE: db "000 " ;Codigo de la 1a linea @@ -3708,7 +3708,7 @@ GET_LDATA: ld a,(GLDATA_COUNT) ret GLDATA_NEW: ld a,(FILE_FH) - cp #FF + cp 0FFh scf ret z ld b,a @@ -3762,7 +3762,7 @@ AUTOMATA_NO1: call SEND_COM HALT: push af,bc,de,hl ld a,TCPIP_WAIT call CALL_UNAPI - ;ld c,#B + ;ld c,0Bh ;call DO_DOS pop hl,de,bc,af ret @@ -3783,7 +3783,7 @@ OPEN_DCON: ld a,(PASSIVE) ; imprime el error y vuelve con Cy=1 OPEN_DCON_P: ld a,(DATA_CON) - cp #FF + cp 0FFh jr z,OPEN_DCONP2 call TCP_ABORT OPEN_DCONP2: call HALT @@ -3836,7 +3836,7 @@ OPEN_DCP_L2: push bc,de ld ixh,a ld a,(DATA_BUF+5) ld ixl,a - ld iy,#FFFF + ld iy,0FFFFh xor a ld bc,0 call TCP_OPEN @@ -3856,16 +3856,16 @@ OPEN_DCP_L2: push bc,de ; imprime el error y vuelve con Cy=1 OPEN_DCON_A: ld a,(DATA_CON) - cp #FF + cp 0FFh jr z,OPEN_DCON2 call TCP_ABORT OPEN_DCON2: call HALT ld hl,0 ld de,0 - ld iy,#FFFF + ld iy,0FFFFh ld bc,0 - ld a,#FF + ld a,0FFh call TCP_OPEN ;Abre conexion pasiva ld de,WHENOPEND_S ld hl,OPENERR_T @@ -3910,7 +3910,7 @@ OPEN_DCON2: call HALT OPEN_DCON_E: ld a,(DATA_CON) call TCP_ABORT - ld a,#FF + ld a,0FFh ld (DATA_CON),a scf ret @@ -4009,7 +4009,7 @@ PUTR_LOP2: push bc ld a,(HASH) or a call nz,CRLF - ld a,#FF + ld a,0FFh ld (DATA_CON),a print DCONREF_S ;call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, @@ -4055,13 +4055,13 @@ PUTR_EX: ld a,(DATA_CON) ;Respuesta inesperada al PUTR_END: push af ld a,(FILE_FH) - cp #FF + cp 0FFh jr z,PUTR_END2 ld a,(FILE_FH) ld b,a ld c,_CLOSE call DO_DOS - ld a,#FF + ld a,0FFh ld (FILE_FH),a PUTR_END2: pop af @@ -4073,9 +4073,9 @@ PUTR_COM: dw 0 ;--- RETRIEVE: Rutina generica para obtener datos ; desde una conexion de datos: -; - Usa SILENT_ASCII y SILENT_BIN si MUST_ASCII=#FF +; - Usa SILENT_ASCII y SILENT_BIN si MUST_ASCII=0FFh ; - Envia el comando PORT y abre una conexion de datos -; - Lee los datos recibidos. Si FILE_FH=#FF, los +; - Lee los datos recibidos. Si FILE_FH=0FFh, los ; imprime por pantalla. Si no, los escribe en el fichero. ; - El comando a enviar ha de estar en RETR_COM; ; se envia junto a la palabra que haya @@ -4162,7 +4162,7 @@ RETR_LOOP: call HALT ld a,(HASH) or a call nz,CRLF - ld a,#FF + ld a,0FFh ld (DATA_CON),a call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, jp c,RETR_END ;espera respuesta de la conexion de control, @@ -4178,10 +4178,10 @@ RETR_LOOP: call HALT RETR_OKDATA: ; ld a,(FILE_FH) - cp #FF + cp 0FFh jr nz,RETR_FILE - ;--- FILE_FH=#FF: Imprime los datos en pantalla + ;--- FILE_FH=0FFh: Imprime los datos en pantalla ld hl,DATA_BUF ;Imprime todos los datos recibidos RETR_LOOP2: push bc,hl @@ -4196,7 +4196,7 @@ RETR_LOOP2: push bc,hl jr nz,RETR_LOOP2 jp RETR_LOOP - ;--- FILE_FH<>#FF: Guarda los datos en el fichero + ;--- FILE_FH<>0FFh: Guarda los datos en el fichero RETR_FILE: ld a,(HASH) or a @@ -4237,13 +4237,13 @@ RETR_EX: ld a,(DATA_CON) ;Respuesta inesperada al RETR_END: push af ld a,(FILE_FH) - cp #FF + cp 0FFh jr z,RETR_END2 ld a,(FILE_FH) ld b,a ld c,_CLOSE call DO_DOS - ld a,#FF + ld a,0FFh ld (FILE_FH),a RETR_END2: ; @@ -4251,7 +4251,7 @@ RETR_END2: ; or a jr z,RETR_END2! ld a,(CONTROL_CON) - cp #FF + cp 0FFh call nz,SILENT_BIN ;Restaura TYPE antiguo RETR_END2!: pop af ret @@ -4311,7 +4311,7 @@ MULTIPLE: call _MULTIPLE ld a,(MUL_LISTA) ld ix,0 nesman 22 - ld a,#FF + ld a,0FFh ld (MUL_LISTA),a ld a,(OLD_VERBOSE_M) ld (VERBOSE),a @@ -4343,7 +4343,7 @@ MUL_OK1: ld (MUL_LISTA),a call SILENT_ASCII ;Pone modo ASCII si es necesario jp c,MUL_END - ld a,#FF + ld a,0FFh ld (MUST_ASCII),a call OPEN_DCON ;Abre conexion, envia PORT @@ -4442,7 +4442,7 @@ MUL_NODATA: pop hl,bc MUL_NODATA2: ld a,(DATA_CON) call TCP_CLOSE ;TCP_ABORT - ld a,#FF + ld a,0FFh ld (DATA_CON),a call WAIT_REPLY ;Conexion cerrada legalmente: la cerramos nosotros, jp c,MUL_END ;espera respuesta de la conexion de control, @@ -4475,7 +4475,7 @@ MULTIPLE2: ld a,(PROMPT) ;--- Obtiene un nombre de fichero y ; pregunta si se ha de actuar sobre el, - ; solo si ALLFILES=#FF + ; solo si ALLFILES=0FFh MUL_FILE_LOOP: ld a,(MUL_LISTA) ld ix,0 @@ -4513,7 +4513,7 @@ MUL_FILE_LOOP: ld a,(MUL_LISTA) or a ;Yes? jr z,MUL_DO_FILE - ld a,#FF ;All + ld a,0FFh ;All ld (ALLFILES),a MUL_DO_FILE: ld hl," X" @@ -4559,7 +4559,7 @@ MUL_END: push af or a jr z,MUL_END2! ld a,(CONTROL_CON) - cp #FF + cp 0FFh call nz,SILENT_BIN ;Restaura TYPE antiguo MUL_END2!: pop af ret @@ -4595,7 +4595,7 @@ R_ABORT: pop hl ;Para ajustar la pila ld a,(MUL_LISTA) ld ix,0 nesman 22 - ld a,#FF + ld a,0FFh ld (MUL_LISTA),a ld a,(HOOKING) ;Restauramos gancho CHPUT @@ -4613,7 +4613,7 @@ AB_NOHOOK: pop af ;--- Primero comprobamos si es un error de disco, ; en ese caso simplemente terminamos - cp #9D ;Codigo de "disk operation aborted" + cp 9Dh ;Codigo de "disk operation aborted" jr nz,R_AB_NODISK ld a,b @@ -4623,10 +4623,10 @@ AB_NOHOOK: pop af ;--- Imprimimos "CTRL-C pressed" o "CTRL-STOP pressed" R_AB_NODISK: ld de,CTRLC_S - cp #9E ;Codigo de "CTRL-C pressed" + cp 9Eh ;Codigo de "CTRL-C pressed" jr z,R_AB_PRINT ld de,CTRLS_S - cp #9F ;Codigo de "CTRL-STOP pressed" + cp 9Fh ;Codigo de "CTRL-STOP pressed" jr z,R_AB_PRINT ld de,UNKE_S ;Error desconocido R_AB_PRINT: ld c,_STROUT @@ -4690,7 +4690,7 @@ R_ABORT_4: cp 4 call WAIT_REPLY jr R_AB4_2 -R_AB4_1: ;ld hl,#F4FF ;Envia comando telnet IP +R_AB4_1: ;ld hl,0F4FFh ;Envia comando telnet IP ;ld (SEND_COM_BUF),hl ;ld hl,SEND_COM_BUF ;ld bc,2 @@ -4698,7 +4698,7 @@ R_AB4_1: ;ld hl,#F4FF ;Envia comando telnet IP ;ld a,(CONTROL_CON) ;call TCP_SEND - ;ld hl,#F2FF ;Envia secuencia telnet SYNCH + ;ld hl,0F2FFh ;Envia secuencia telnet SYNCH ;ld (SEND_COM_BUF),hl ;ld hl,SEND_COM_BUF ;ld bc,2 @@ -4712,23 +4712,23 @@ R_AB4_1: ;ld hl,#F4FF ;Envia comando telnet IP call AUTOMATA_NO1 R_AB4_2: ld a,(DATA_CON) - cp #FF + cp 0FFh jp z,MAIN_LOOP call TCP_ABORT - ld a,#FF + ld a,0FFh ld (DATA_CON),a jp MAIN_LOOP ;--- 5: Abortamos conexion de control R_ABORT_5: ld a,(DATA_CON) - cp #FF + cp 0FFh jr z,R_ABORT_52 print ABDCON_S ld a,(DATA_CON) call TCP_ABORT - ld a,#FF + ld a,0FFh ld (DATA_CON),a ret @@ -4736,7 +4736,7 @@ R_ABORT_52: print ABCCON_S call CLOSE_FILE ld a,(DATA_CON) - cp #FF + cp 0FFh jr z,R_ABORT_53 call TCP_ABORT R_ABORT_53: ld a,(CONTROL_CON) @@ -4755,13 +4755,13 @@ IDENT_AUTOM: push af,bc,de,hl ret _IDENT_AUTOM: ld a,(IDENT_CON) - cp #FF + cp 0FFh ret z call TCP_STATUS or a jr nz,IDENT_AUT1 - ld a,#FF + ld a,0FFh ld (IDENT_CON),a ret @@ -4822,7 +4822,7 @@ HOOK_CODE0: pop hl,bc ;B=Caracter a imprimir jr z,HOOK_C0_SETESC ;lo imprimimos ld a,c - and %11111110 ;Secuencia "ESC x n" o "ESC y n" + and 11111110b ;Secuencia "ESC x n" o "ESC y n" cp "x" ;y el caracter actual es "n": ld a,0 ;lo imprimimos jr z,HOOK_C0_SETESC @@ -4853,11 +4853,11 @@ HOOK_CODE0_END: ; SET_HOOK: push af,bc,de,hl di - ld a,#C3 + ld a,0C3h ld (H_CHPH),a ld hl,HOOK_CODE ld (H_CHPH+1),hl - ld a,#FF + ld a,0FFh ld (HOOKING),a ei pop hl,de,bc,af @@ -4883,7 +4883,7 @@ SET_UNAPI: dec a ld (UNAPI_IS_SET),a UNAPI_SLOT: ld a,0 - ld h,#40 + ld h,40h call ENASLT UNAPI_SEG: ld a,0 jp PUT_P1 @@ -4915,9 +4915,9 @@ DO_DOS: ;Input: A = 0 for active, 1 for passive ; L.H.E.D = remote IP (0.0.0.0 for passive with unespecified remote socket) ; IX = Remote port (ignored if IP=0.0.0.0) -; IY = Local port (#FFFF for random between 16384 and 32767) +; IY = Local port (0FFFFh for random between 16384 and 32767) ; BC = Usuer timeout in seconds -; (1-1080, 0 for 3 minutes, #FFFF for infinite) +; (1-1080, 0 for 3 minutes, 0FFFFh for infinite) ;Output: Cy=0 if OK, 1 if error ; If OK: A = Connection number ; If error: A = UNAPI Error code @@ -5064,7 +5064,7 @@ TCP_RCV: ;************************************* DATA: - org #8000 + org 8000h DATA_START: @@ -5076,10 +5076,10 @@ PORT_REMOTE_C: dw 21 PORT_REMOTE_I: dw 0 ;Ident: el puerto local sera el 113 PORT_REMOTE_D: dw 0 HAY_NMAN: db 0 -DATA_CON: db #FF -CONTROL_CON: db #FF -IDENT_CON: db #FF -VERBOSE: db #FF +DATA_CON: db 0FFh +CONTROL_CON: db 0FFh +IDENT_CON: db 0FFh +VERBOSE: db 0FFh XCOM: db 0 ES_XCOM: db 0 SAVESP: dw 0 @@ -5087,15 +5087,15 @@ TYPE: db 0 ;0 para ASCII, 1 para binario DEBUG: db 0 BELL: db 0 HASH: db 0 -PROMPT: db #FF +PROMPT: db 0FFh PAUSE: db 0 PASSIVE: db 0 OLD_TYPE: db 0 OLD_VERBOSE: db 0 PORT_C_PNT: dw C_PORT+5 ;Puntero a la parte "puerto" de PORT_C -FILE_FH: db #FF -FILES_QUEUE: db #FF ;Cola para guardar los nombres de fichero -QUITTING: db 0 ;#FF cuando se esta cerrando/saliendo +FILE_FH: db 0FFh +FILES_QUEUE: db 0FFh ;Cola para guardar los nombres de fichero +QUITTING: db 0 ;0FFh cuando se esta cerrando/saliendo ALLFILES: db 0 ALSO_RONLY: db 0 LINE_COUNT: db 0 @@ -5104,8 +5104,8 @@ INS_IX: dw 0 ABORT_STAT: db 0 LAST_REPLY: db 0 MSS: dw 448 ;Valor fijo -HOOKING: db 0 ;#FF cuando el gancho CHPUT esta parcheado -UNAPI_IS_SET: db 0 ;#FF when UNAPI slot/seg is switched on page 1 +HOOKING: db 0 ;0FFh cuando el gancho CHPUT esta parcheado +UNAPI_IS_SET: db 0 ;0FFh when UNAPI slot/seg is switched on page 1 ;--- Pseudo-TCBs @@ -5118,13 +5118,13 @@ IP_REMOTE_C: db 0,0,0,0 IP_REMOTE_D: db 0,0,0,0 ;PORT_REMOTE_D: dw 0 - ;db #FF ;Control connection is passive + ;db 0FFh ;Control connection is passive ;Ident protocol connection ;PORT_REMOTE_I: dw 0 ;dw 113 - ;db #FF ;Is passive + ;db 0FFh ;Is passive ;--- Cadenas de texto (informacion y errores) From 6476c4eb7e03e88586cc75f9ff349fccfca5dceb Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 15:54:24 +0900 Subject: [PATCH 3/9] Use regular code instead of macros for the commands table (those macros only worked on Compass) --- SRC/NETWORK/ftp.asm | 314 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 251 insertions(+), 63 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 117456d7c..e138ad449 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -5446,70 +5446,258 @@ C_XCUP: db "XCUP",0 ;--- Tabla de comandos de usuario y direccion de su rutina y texto de ayuda -COM_ENTRY: macro @c ;Entrada para comando normal - db "@c",0 - dw R_@c - dw H_@c - endm - -COM_ENTRY2: macro @c,@x ;Entrada para alias - db "@c",0 - dw R_@x - dw H_@x - endm +COMMAND_TABLE: + + ;?,HELP + db "?",0 + dw R_HELP + dw H_HELP + + ;!,LITERAL + db "!",0 + dw R_LITERAL + dw H_LITERAL + + ;APPEND + db "APPEND",0 + dw R_APPEND + dw H_APPEND + + ;ASCII + db "ASCII",0 + dw R_ASCII + dw H_ASCII + + ;BELL + db "BELL",0 + dw R_BELL + dw H_BELL + + ;BYE,QUIT + db "BYE",0 + dw R_QUIT + dw H_QUIT + + ;BINARY + db "BINARY",0 + dw R_BINARY + dw H_BINARY + + ;CD + db "CD",0 + dw R_CD + dw H_CD + + ;CDUP + db "CDUP",0 + dw R_CDUP + dw H_CDUP + + ;CLOSE + db "CLOSE",0 + dw R_CLOSE + dw H_CLOSE + + ;DEBUG + db "DEBUG",0 + dw R_DEBUG + dw H_DEBUG + + ;DELETE + db "DELETE",0 + dw R_DELETE + dw H_DELETE + + ;DIR + db "DIR",0 + dw R_DIR + dw H_DIR + + ;DISCONNECT,CLOSE + db "DISCONNECT",0 + dw R_CLOSE + dw H_CLOSE + + ;FLUSH + ;db "FLUSH",0 + ;dw R_FLUSH + ;dw H_FLUSH + + ;GET + db "GET",0 + dw R_GET + dw H_GET + + ;HASH + db "HASH",0 + dw R_HASH + dw H_HASH + + ;HELP + db "HELP",0 + dw R_HELP + dw H_HELP + + ;LCD + db "LCD",0 + dw R_LCD + dw H_LCD + + ;LDELETE + db "LDELETE",0 + dw R_LDELETE + dw H_LDELETE + + ;LDIR + db "LDIR",0 + dw R_LDIR + dw H_LDIR + + ;LITERAL + db "LITERAL",0 + dw R_LITERAL + dw H_LITERAL + + ;LMKDIR + db "LMKDIR",0 + dw R_LMKDIR + dw H_LMKDIR + + ;LRENAME + db "LRENAME",0 + dw R_LRENAME + dw H_LRENAME + + ;LRMDIR + db "LRMDIR",0 + dw R_LRMDIR + dw H_LRMDIR + + ;LS + db "LS",0 + dw R_LS + dw H_LS + + ;LSHOW + db "LSHOW",0 + dw R_LSHOW + dw H_LSHOW + + ;MDELETE + db "MDELETE",0 + dw R_MDELETE + dw H_MDELETE + + ;MGET + db "MGET",0 + dw R_MGET + dw H_MGET + + ;MKDIR + db "MKDIR",0 + dw R_MKDIR + dw H_MKDIR + + ;MPUT + db "MPUT",0 + dw R_MPUT + dw H_MPUT + + ;OPEN + db "OPEN",0 + dw R_OPEN + dw H_OPEN + + ;PASSIVE + db "PASSIVE",0 + dw R_PASSIVE + dw H_PASSIVE + + ;PROMPT + db "PROMPT",0 + dw R_PROMPT + dw H_PROMPT + + ;PAUSE + db "PAUSE",0 + dw R_PAUSE + dw H_PAUSE + + ;PUT,SEND + db "PUT",0 + dw R_SEND + dw H_SEND + + ;PWD + db "PWD",0 + dw R_PWD + dw H_PWD + + ;QUIT + db "QUIT",0 + dw R_QUIT + dw H_QUIT + + ;QUOTE,LITERAL + db "QUOTE",0 + dw R_LITERAL + dw H_LITERAL + + ;RECV,GET + db "RECV",0 + dw R_GET + dw H_GET + + ;REMOTEHELP + db "REMOTEHELP",0 + dw R_REMOTEHELP + dw H_REMOTEHELP + + ;RENAME + db "RENAME",0 + dw R_RENAME + dw H_RENAME + + ;RMDIR + db "RMDIR",0 + dw R_RMDIR + dw H_RMDIR + + ;SEND + db "SEND",0 + dw R_SEND + dw H_SEND + + ;SHOW + db "SHOW",0 + dw R_SHOW + dw H_SHOW + + ;STATUS + db "STATUS",0 + dw R_STATUS + dw H_STATUS + + ;TYPE + db "TYPE",0 + dw R_TYPE + dw H_TYPE + + ;USER + db "USER",0 + dw R_USER + dw H_USER + + ;VERBOSE + db "VERBOSE",0 + dw R_VERBOSE + dw H_VERBOSE + + ;XCOMMANDS + db "XCOMMANDS",0 + dw R_XCOMMANDS + dw H_XCOMMANDS -COMMAND_TABLE: ; - - COM_ENTRY2 ?,HELP - COM_ENTRY2 !,LITERAL - COM_ENTRY APPEND - COM_ENTRY ASCII - COM_ENTRY BELL - COM_ENTRY2 BYE,QUIT - COM_ENTRY BINARY - COM_ENTRY CD - COM_ENTRY CDUP - COM_ENTRY CLOSE - COM_ENTRY DEBUG - COM_ENTRY DELETE - COM_ENTRY DIR - COM_ENTRY2 DISCONNECT,CLOSE - ;COM_ENTRY FLUSH - COM_ENTRY GET - COM_ENTRY HASH - COM_ENTRY HELP - COM_ENTRY LCD - COM_ENTRY LDELETE - COM_ENTRY LDIR - COM_ENTRY LITERAL - COM_ENTRY LMKDIR - COM_ENTRY LRENAME - COM_ENTRY LRMDIR - COM_ENTRY LS - COM_ENTRY LSHOW - COM_ENTRY MDELETE - COM_ENTRY MGET - COM_ENTRY MKDIR - COM_ENTRY MPUT - COM_ENTRY OPEN - COM_ENTRY PASSIVE - COM_ENTRY PROMPT - COM_ENTRY PAUSE - COM_ENTRY2 PUT,SEND - COM_ENTRY PWD - COM_ENTRY QUIT - COM_ENTRY2 QUOTE,LITERAL - COM_ENTRY2 RECV,GET - COM_ENTRY REMOTEHELP - COM_ENTRY RENAME - COM_ENTRY RMDIR - COM_ENTRY SEND - COM_ENTRY SHOW - COM_ENTRY STATUS - COM_ENTRY TYPE - COM_ENTRY USER - COM_ENTRY VERBOSE - COM_ENTRY XCOMMANDS db 0 ;--- Tabla de errores DNS From dfc98069c02b8117b060a8f0276c17ff9b583dd8 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 15:57:12 +0900 Subject: [PATCH 4/9] Use ASCII code instead of literal "" inside of strings (the lastest isn't supported by Sjasm), remove "label" directive --- SRC/NETWORK/ftp.asm | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index e138ad449..48a696fee 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -1,8 +1,6 @@ ;--- FTP 1.0 - FTP client for the TCP/IP UNAPI ; By Konami Man, 4/2010 - .label 20 - ;****************************** ;*** *** ;*** MACROS, CONSTANTES *** @@ -935,7 +933,7 @@ LCD_NODRIVE: ; LCD_END: print PATHCHAN_S jp PRINT_PATH -LCD_NOPATH: ld a,"\" ;Si se especifica unidad pero no dir, +LCD_NOPATH: ld a,92 ;"\" ;Si se especifica unidad pero no dir, ld (RESPONSE_BUF+2),a ;se muestra el dir actual ld c,_GETCD ld de,RESPONSE_BUF+3 @@ -3237,7 +3235,7 @@ PRINT_PATH: ld c,_CURDRV ;Muestra unidad ld e,":" ld c,_CONOUT call DO_DOS - ld e,"\" + ld e,92 ;"\" ld c,_CONOUT call DO_DOS @@ -5308,7 +5306,7 @@ H_LDELETE: db "LDELETE [R]",13,10 db "Deletes the specified local file(s).",13,10 db "With ",34,"R",34," deletes also read-only file(s).",13,10,"$" -H_LDIR: db "LDIR [\][]",13,10 +H_LDIR: db "LDIR [",92,"][]",13,10 db "Shows the contents of the specified local directory (current one if omitted)",13,10 db "according to the specified mask (all files if omitted).",13,10,"$" From fe4bfe20a6d7ba34b9cc9407543879eaa5142d85 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 16:36:20 +0900 Subject: [PATCH 5/9] Get rid of the silly jump macros --- SRC/NETWORK/ftp.asm | 75 ++++++--------------------------------------- 1 file changed, 10 insertions(+), 65 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 48a696fee..b10197bbe 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -110,63 +110,6 @@ debug: macro @c pop hl,de,bc,af endm -; Conditional relative jumps - -jri: macro @a ;A = x - jr z,@a - endm - -jrni: macro @a ;A <> x - jr nz,@a - endm - -jrmn: macro @a ;A < x - jr c,@a - endm - -jrmy: macro @a ;A > x - jr z,$+4 - jr nc,@a - endm - -jrmni: macro @a ;A <= x - jr c,@a - jr z,@a - endm - -jrmyi: macro @a ;A >= x - jr nc,@a - endm - -; Conditional absolute jumps - -jpi: macro @a ;A = x - jp z,@a - endm - -jpni: macro @a ;A <> x - jp nz,@a - endm - -jpmn: macro @a ;A < x - jp c,@a - endm - -jpmy: macro @a ;A > x - jr z,$+5 - jp nc,@a - endm - -jpmni: macro @a ;A <= x - jp c,@a - jp z,@a - endm - -jpmyi: macro @a ;A >=x - jp nc,@a - endm - - ;************************** ;*** *** @@ -2475,7 +2418,7 @@ PASASPC: ld a,(hl) ;Skips spaces until a parameter jr z,ENDPNUM cp " " inc hl - jri PASASPC + jr z,PASASPC inc ix ;Increases number of parameters PASAPAR: ld a,(hl) ;Walks through the parameter @@ -2483,14 +2426,16 @@ PASAPAR: ld a,(hl) ;Walks through the parameter jr z,ENDPNUM cp " " inc hl - jri PASASPC + jr z,PASASPC jr PASAPAR ;* Here we know already how many parameters are available ENDPNUM: ld a,ixh ;Error if the parameter to extract cp ixl ;is greater than the total number of - jrmy EXTPERR ;parameters available + jr z,PAROK ;parameters available + jr nc,EXTPERR +PAROK: push iy pop hl @@ -2499,17 +2444,17 @@ ENDPNUM: ld a,ixh ;Error if the parameter to extract PASAP2: ld a,(hl) ;Skips spaces until the next cp " " ;parameter is found inc hl - jri PASAP2 + jr z,PASAP2 ld a,ixh ;If it is the parameter we are cp b ;searching for, we extract it, - jri PUTINDE0 ;else... + jr z,PUTINDE0 ;else... inc b PASAP3: ld a,(hl) ;...we skip it and return to PASAP2 cp " " inc hl - jrni PASAP3 + jr nz,PASAP3 jr PASAP2 ;* Parameter is located, now copy it to the user buffer @@ -2519,7 +2464,7 @@ PUTINDE0: ld b,0 PUTINDE: inc b ld a,(hl) cp " " - jri ENDPUT + jr z,ENDPUT or a jr z,ENDPUT cp 13 @@ -3081,7 +3026,7 @@ SRCH_C_LOOP: inc hl inc de ld a,(de) cp "A" - jrmn SRCH_C_LP2 + jr c,SRCH_C_LP2 and 11011111b ;Lo transforma a mayusculas SRCH_C_LP2: cp (hl) jr nz,NEXT_COM From f07fcd1d071d498bd9b803d19ceafd47a2257a48 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 16:40:00 +0900 Subject: [PATCH 6/9] Convert macros to sjasm syntax --- SRC/NETWORK/ftp.asm | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index b10197bbe..e33564ae1 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -7,25 +7,25 @@ ;*** *** ;****************************** -nesman: macro @f ;Llamada indirecta a las funciones de NestorMan - ld c,@f + macro nesman func ;Indirect call to NestorMan functions + ld c,func ld de,2202h call 0FFCAh endm -print: macro @d ;Imprime una cadena acabada en "$" - ld de,@d + macro print str ;Print a "$" terminated string + ld de,str ld c,_STROUT call DO_DOS endm -printl: macro @d ;Imprime una cadena acabada en CRLF - ld de,@d + macro printl str ;Print a CRLF terminated string + ld de,str call PRINT_L endm -printz: macro @d ;Imprime una cadena acabada en cero - ld de,@d + macro printz str ;Print a zero terminated string + ld de,str call PRINT_Z endm @@ -102,7 +102,7 @@ ERR_BUFFER: equ 13 ERR_LARGE_DGRAM: equ 14 ERR_INV_OPER: equ 15 -debug: macro @c + macro debug char push af,bc,de,hl ld e,@c ld c,2 @@ -2295,18 +2295,6 @@ R_XCOMMANDS: ld a,3 jp TURN_ON_OFF -;--- Pruebas: comandos no implementados aun - -NOIMP: macro @c -R_@c: ;jp R_NOIMP - endm - - ;NOIMP APPEND - -R_NOIMP: print NOIMP_S - ret - - ;*** Rutinas auxiliares para la ejecucion de comandos ;--- SINGLE_COM: Ejecuta el comando HL sin parametros @@ -5086,7 +5074,6 @@ WHENDNS_S: db "when resolving server name:",13,10," $" WHENOPEN_S: db "when creating or accessing local file:",13,10," $" WHENCONN_S: db "when connecting to the server:",13,10," $" WHENOPEND_S: db "when opening data connection:",13,10," $" -NOIMP_S: db "Command not implemented in this version of the application",13,10,"$" CONNECTING_S: db "Connecting (press ESC to cancel)... $" CONLOST_S: db 13,10,"*** ERROR: Connection to FTP server lost",13,10,10,"$" NOMEM_S: db 13,10,"*** ERROR: Not enough memory to enqueue data",13,10,10,"$" From af96f1361c39ad510b2015d55e1215f4afa10cdf Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 16:52:29 +0900 Subject: [PATCH 7/9] Convert multi-register PUSH and POP to single-register. The code now compiles with sjasm without the -C argument. --- SRC/NETWORK/ftp.asm | 154 ++++++++++++++++++++++++++++++++------------ 1 file changed, 113 insertions(+), 41 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index e33564ae1..2062286fe 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -103,11 +103,17 @@ ERR_LARGE_DGRAM: equ 14 ERR_INV_OPER: equ 15 macro debug char - push af,bc,de,hl + push af + push bc + push de + push hl ld e,@c ld c,2 call DO_DOS - pop hl,de,bc,af + pop hl + pop de + pop bc + pop af endm @@ -318,7 +324,8 @@ OKNMAN: call SET_IP jr OK_SET_PORT -SET_IP: push hl,de +SET_IP: push hl + push de ld e,a ld d,0 ld b,1 @@ -331,7 +338,8 @@ SET_IP: push hl,de ld (hl),"," inc hl ld (PORT_C_PNT),hl - pop de,hl + pop de + pop hl ret OK_SET_PORT: ; @@ -1234,7 +1242,8 @@ R_LITERAL: call CHK_CON ld a,2 ;Va cogiendo los elementos de la cadena ;ld hl,USER_COM_BUF+1 ;pasada por el usuario, y los ld de,SEND_COM_BUF ;copia a SEND_COM_BUF -LITELOOP: push af,de ;separados con un espacio +LITELOOP: push af ;separados con un espacio + push de ld hl,USER_COM_BUF+1 call EXTPAR pop hl @@ -2390,7 +2399,10 @@ EXTPAR: or a ;Terminates with error if A = 0 ret z ld a,b - push hl,de,ix,iy + push hl + push de + push ix + push iy ld ix,0 ;IXl: Number of parameter ld ixh,a ;IXh: Parameter to be extracted inc hl @@ -2470,7 +2482,10 @@ ENDPUT: xor a or a jr FINEXTP EXTPERR: scf -FINEXTP: pop iy,ix,de,hl +FINEXTP: pop iy + pop ix + pop de + pop hl ret ;--- Rutina de terminacion @@ -2592,9 +2607,13 @@ TPASEG1: db 2 ;TPA segment on page 1 ; Tailing "$" or 00 are not counted for the length ; All other registers are preserved -NUMTOASC: push af,ix,de,hl +NUMTOASC: push af + push ix + push de + push hl ld ix,WorkNTOA - push af,af + push af + push af and 00000111b ld (ix+0),a ;Type pop af @@ -2681,7 +2700,8 @@ EsBin2: ld b,8 EsDec: ld b,5 EsHexa2: push de -Divide: push bc,hl ;DE/(IX+7)=DE, remaining A +Divide: push bc ;DE/(IX+7)=DE, remaining A + push hl ld a,d ld c,e ld d,0 @@ -2701,7 +2721,8 @@ BucDiv: rl c ld d,a ld e,c ld a,l - pop hl,bc + pop hl + pop bc ChkRest9: cp 10 ;Converts the remaining jp nc,EsMay9 ;to a character @@ -2844,7 +2865,10 @@ PonDo0: ld (hl),a Fin: ld b,(ix+5) ld c,(ix+4) - pop hl,de,ix,af + pop hl + pop de + pop ix + pop af ret WorkNTOA: defs 16 @@ -2867,7 +2891,8 @@ BufNTOA: ds 10 ; only the first five digits. ; All other registers are preserved. -EXTNUM: push hl,ix +EXTNUM: push hl + push ix ld ix,ACA res 0,(ix) set 1,(ix) @@ -2911,14 +2936,16 @@ FINEXT: ld a,e cp "9"+1 call nc,NODESB ld a,(ix) - pop ix,hl + pop ix + pop hl srl a ret NODESB: res 1,(ix) ret -POR10: push de,hl ;BC = BC * 10 +POR10: push de + push hl ;BC = BC * 10 push bc push bc pop hl @@ -2934,18 +2961,21 @@ ROTA: sla l call c,BIT17 push hl pop bc - pop hl,de + pop hl + pop de ret ;--- PRINT_L: Imprime la cadena DE, acabada en CRLF PRINT_L: ld a,(de) - push af,de + push af + push de ld e,a ld c,_CONOUT call DO_DOS - pop de,af + pop de + pop af cp 10 ret z inc de @@ -2967,12 +2997,15 @@ PRINT_Z: ld a,(de) ;--- SHOW_ERR: Muestra la cadena DE, y a continuacion ; busca un error con codigo A en la tabla HL, y lo muestra. -SHOW_ERR push af,hl,de +SHOW_ERR push af + push hl + push de print ERROR_S pop de ld c,_STROUT call DO_DOS - pop de,af + pop de + pop af ld b,a SEARCH_ERROR: ld a,(de) inc de @@ -3133,7 +3166,9 @@ DOS: call DO_DOS or a ret z -DOS2: push hl,de,bc +DOS2: push hl + push de + push bc ld b,a ;Si se esta haciendo un DIR, el error 0D7h ld a,(LDIR_EXE) ;(file not found) no se imprime or a @@ -3154,7 +3189,9 @@ DOS4: ld de,RESPONSE_BUF printz RESPONSE_BUF call CRLF DOS5: scf - pop bc,de,hl + pop bc + pop de + pop hl ret ;--- PRINT_PATH: Muestra la unidad+directorio actual y un fin de linea @@ -3690,12 +3727,18 @@ AUTOMATA_NO1: call SEND_COM ;--- HALT: Espera a la siguiente interrupcion -HALT: push af,bc,de,hl +HALT: push af + push bc + push de + push hl ld a,TCPIP_WAIT call CALL_UNAPI ;ld c,0Bh ;call DO_DOS - pop hl,de,bc,af + pop hl + pop de + pop bc + pop af ret @@ -3744,7 +3787,8 @@ OPEN_DCP_L1: inc hl ld de,DATA_BUF ld b,6 ;4 bytes para IP y 2 para puerto -OPEN_DCP_L2: push bc,de +OPEN_DCP_L2: push bc + push de call EXTNUM ld e,d ;Hace que HL apunte al siguiente numero @@ -4115,7 +4159,8 @@ RETR_OKDATA: ; ;--- FILE_FH=0FFh: Imprime los datos en pantalla ld hl,DATA_BUF ;Imprime todos los datos recibidos -RETR_LOOP2: push bc,hl +RETR_LOOP2: push bc + push hl ld a,(hl) call PRINT_PAUSE pop hl @@ -4318,7 +4363,8 @@ MUL_WAIT: ;debug "3" ;--- Va cogiendo Los nombres de fichero y los ; inserta en la lista -MUL_NLST_LOOP: push af,hl +MUL_NLST_LOOP: push af + push hl MUL_NLST_LOOP2: call GET_DDATA jr c,MUL_NODATA cp 10 @@ -4335,7 +4381,8 @@ MUL_NLST_LOOP2: call GET_DDATA MUL_NEXT_NAME: ;Nombre completo obtenido, HL apunta a su direccion ;y A contiene su longitud (en la pila) - pop hl,af ;Inserta nombre en la lista + pop hl ;Inserta nombre en la lista + pop af ld l,a ld h,0 ld a,(MUL_LISTA) @@ -4352,7 +4399,8 @@ MUL_NEXT_NAME: ;Nombre completo obtenido, HL apunta a su direccion ;--- No se pueden coger mas datos: esperamos o ; pasamos a tratar los nombres de fichero recibidos -MUL_NODATA: pop hl,bc +MUL_NODATA: pop hl + pop bc push af ld (MUL_NAME_PNT),hl ld a,b @@ -4680,9 +4728,15 @@ R_ABORT_53: ld a,(CONTROL_CON) ; Espera datos de la conexion IDENT_CON, ; y los devuelve seguidos de IDENT_S -IDENT_AUTOM: push af,bc,de,hl +IDENT_AUTOM: push af + push bc + push de + push hl call _IDENT_AUTOM - pop hl,de,bc,af + pop hl + pop de + pop bc + pop af ret _IDENT_AUTOM: ld a,(IDENT_CON) @@ -4730,7 +4784,8 @@ IDENT_AUT1: cp 4 ; excepto espacios, caracteres de control (<32 y 127) ; y secuencias de escape -HOOK_CODE0: pop hl,bc ;B=Caracter a imprimir +HOOK_CODE0: pop hl + pop bc ;B=Caracter a imprimir ld a,(ESC_CHAR) or a jr z,HOOK_C0_NORMAL @@ -4777,12 +4832,16 @@ HOOK_C0_NORM2: cp 33 cp 127 jr z,HOOK_C0_OK ld a,"*" -HOOK_C0_OK: push af,hl +HOOK_C0_OK: push af + push hl HOOK_CODE0_END: ; ;--- Rutinas para establecer y resetear el gancho -SET_HOOK: push af,bc,de,hl +SET_HOOK: push af + push bc + push de + push hl di ld a,0C3h ld (H_CHPH),a @@ -4791,17 +4850,26 @@ SET_HOOK: push af,bc,de,hl ld a,0FFh ld (HOOKING),a ei - pop hl,de,bc,af + pop hl + pop de + pop bc + pop af ret -RESET_HOOK: push af,bc,de,hl +RESET_HOOK: push af + push bc + push de + push hl di ld hl,HOOK_OLD ld de,H_CHPH ld bc,5 ldir ei - pop hl,de,bc,af + pop hl + pop de + pop bc + pop af ret @@ -4945,14 +5013,16 @@ TCP_STATUS_2: ;Output: Cy=1 if error, then A=UNAPI error code TCP_SEND: - push hl,bc + push hl + push bc ld b,a rla and 1 ld c,a - pop hl,de + pop hl + pop de ld a,TCPIP_TCP_SEND call CALL_UNAPI or a @@ -4973,8 +5043,10 @@ TCP_SEND: ; Z = 1 if BC=0 TCP_RCV: - push af,bc - pop hl,bc + push af + push bc + pop hl + pop bc ld a,TCPIP_TCP_RCV call CALL_UNAPI From 43535ac5e8c5a1e63e362091bae4747a0a2976aa Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 16:56:45 +0900 Subject: [PATCH 8/9] Translate section headers, add notice about compiling with sjasm --- SRC/NETWORK/ftp.asm | 56 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 2062286fe..616972a83 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -1,11 +1,14 @@ ;--- FTP 1.0 - FTP client for the TCP/IP UNAPI - ; By Konami Man, 4/2010 + ; By Konamiman, 4/2010 + ; + ; Can be complied with sjasm 0.39 (https://github.com/Konamiman/Sjasm/releases): + ; sjasm ftp.asm ftp.com -;****************************** -;*** *** -;*** MACROS, CONSTANTES *** -;*** *** -;****************************** +;***************************** +;*** *** +;*** MACROS, CONSTANTS *** +;*** *** +;***************************** macro nesman func ;Indirect call to NestorMan functions ld c,func @@ -119,7 +122,7 @@ ERR_INV_OPER: equ 15 ;************************** ;*** *** -;*** INICIALIZACION *** +;*** INITIALIZATION *** ;*** *** ;************************** @@ -416,11 +419,11 @@ NOPARS: ; -;*************************** -;*** *** -;*** BUCLE PRINCIPAL *** -;*** *** -;*************************** +;***************************** +;*** *** +;*** MAIN PROGRAM LOOP *** +;*** *** +;***************************** MAIN_LOOP: ld sp,(SAVESP) @@ -498,11 +501,11 @@ COM_OK2: call JP_HL ;Ejecuta comando -;****************************** -;*** *** -;*** COMANDOS DE USUARIO *** -;*** *** -;****************************** +;************************ +;*** *** +;*** USER COMMANDS *** +;*** *** +;************************ ;----------------- ;--- ?, HELP --- @@ -2346,15 +2349,14 @@ R_INVPAR: print INVPAR_S ;****************************** ;*** *** -;*** RUTINAS AUXILIARES *** +;*** AUXILIARY ROUTINES *** ;*** *** ;****************************** -;-------------------------------------------- -;--- Rutinas de manipulacion de cadenas --- -;--- e impresion por pantalla --- -;-------------------------------------------- +;---------------------------------------------------------- +;--- String manipulation and screen printing routines --- +;---------------------------------------------------------- ;--- NAME: COMP @@ -5060,11 +5062,11 @@ TCP_RCV: ret -;************************************* -;*** *** -;*** DATOS, VARIABLES, CADENAS *** -;*** *** -;************************************* +;************************************ +;*** *** +;*** DATA, VARIABLES, STRINGS *** +;*** *** +;************************************ DATA: org 8000h From d837c6a1dc7bb946debbab5d45ad59c184d8363b Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Tue, 16 Jul 2019 20:35:49 +0900 Subject: [PATCH 9/9] Translated some more comments --- SRC/NETWORK/ftp.asm | 243 ++++++++++++++++++++++---------------------- 1 file changed, 121 insertions(+), 122 deletions(-) diff --git a/SRC/NETWORK/ftp.asm b/SRC/NETWORK/ftp.asm index 616972a83..9df1a175f 100644 --- a/SRC/NETWORK/ftp.asm +++ b/SRC/NETWORK/ftp.asm @@ -110,7 +110,7 @@ ERR_INV_OPER: equ 15 push bc push de push hl - ld e,@c + ld e,char ld c,2 call DO_DOS pop hl @@ -136,12 +136,12 @@ ERR_INV_OPER: equ 15 ld a,0FFh ld (USER_COM_BUF),a - ;--- Muestra la cadena inicial + ;--- Show welcome string - print PRESEN_S ;Presentation string + print PRESEN_S ld (SAVESP),sp - ;--- Comprueba la version del DOS + ;--- Check DOS version ld c,_DOSVER call DO_DOS @@ -230,10 +230,9 @@ OK_SET_UNAPI: ld (TPASEG1),a NOMAPPER: - ;--- Comprueba que realmente estemos conectados, - ; en caso contrario muestra error y termina + ;--- Check if we have network connectivity - ld a,TCPIP_NET_STATE ;La red esta disponible? + ld a,TCPIP_NET_STATE call CALL_UNAPI or a jr z,CONNECT_OK ;Assume ok if "unknown" @@ -276,7 +275,7 @@ CAN_PASSIVE: ld b,0 call CALL_UNAPI - ;--- Comprueba que haya al menos dos conexiones TCP libres + ;--- Check if we have at least two TCP connections available ld b,2 ld a,TCPIP_GET_CAPAB @@ -290,8 +289,7 @@ CAN_PASSIVE: NOFRCON_S: db "*** Not enough free TCP connections available (I need two)$" OKFRCON: - ;--- Comprueba que NestorMan 1.21 o superior este instalado, - ; y establece HAY_NMAN en ese caso + ;--- Check if NestorMan 1.21 or newer is installed xor a ;Installed? nesman 1 @@ -307,9 +305,8 @@ OKNMAN1: ld hl,0201h ;Installed: now check version ld (HAY_NMAN),a OKNMAN: - ;--- Obtiene la IP local. - ; Con esta informacion compone la primera parte - ; de la cadena que forma el comando "PORT". + ;--- Get local IP address. + ; With this we compose the first part of the "PORT" command. ld a,TCPIP_GET_IPINFO ld b,1 @@ -346,7 +343,7 @@ SET_IP: push hl ret OK_SET_PORT: ; - ;--- Compone DEF_USER y DEF_PASSWORD + ;--- Compose DEF_USER y DEF_PASSWORD ld hl,ENV_USER ld de,DEF_USER @@ -370,12 +367,12 @@ OK_SET_PORT: ; or a jr nz,OK_DEFUSER ld hl,ANONYMOUS_S - ld de,DEF_USER ;Por si no hay variable FTP_USER + ld de,DEF_USER ;In case FTP_USER is not set ld bc,10 ldir OK_DEFUSER: ; - ;--- Copia el codigo del gancho CHPUT + ;--- Copy the code for the CHPUT hook ld hl,HOOK_CODE0 ld de,HOOK_CODE @@ -390,13 +387,13 @@ OK_DEFUSER: ; xor a ld (ESC_CHAR),a - ;--- Define la rutina de terminacion + ;--- Define termination routine ld de,R_ABORT ld c,_DEFAB call DO_DOS - ;--- Si hay parametros, salta a OPEN + ;--- If there are command line arguments, jump to OPEN ld hl,80h ld de,USER_COM_BUF+1 @@ -404,11 +401,11 @@ OK_DEFUSER: ; call EXTPAR jr c,NOPARS - ld hl,81h ;Copia el comando ficticio "X" + ld hl,81h ;Copy the pseudo-command "X" ld de,USER_COM_BUF+3 - ld bc,255 ;y los parametros a USER_COM_BUF, + ld bc,255 ;and parameterts to USER_COM_BUF, ldir - ld a,(80h) ;entonces salta a OPEN + ld a,(80h) ;then jump to OPEN inc a inc a ld (USER_COM_BUF+1),a @@ -427,7 +424,7 @@ NOPARS: ; MAIN_LOOP: ld sp,(SAVESP) - ;--- Pone ABORT_STAT a 1 o a 2 + ;--- Set ABORT_STAT to 1 or 2 ld a,(CONTROL_CON) cp 0FFh @@ -436,7 +433,7 @@ MAIN_LOOP: ld sp,(SAVESP) inc a MAINLOP_2: ld (ABORT_STAT),a - ;--- Imprime prompt y queda a la espera de un comando + ;--- Print prompt and wait for a command xor a ld (ES_XCOM),a @@ -447,16 +444,15 @@ MAINLOP_2: ld (ABORT_STAT),a call DO_DOS call LF - ld a,(USER_COM_BUF+1) ;Anyade 0 al final + ld a,(USER_COM_BUF+1) ;Add 0 at the end ld c,a ld b,0 ld hl,USER_COM_BUF+2 add hl,bc ld (hl),0 - ;--- Busca en la tabla el comando adecuado, - ; y salta a su rutina. - ; Si no existe, muestra "Unknown command". + ;--- Find the command in the table and jump to its routine. + ; If command doesn't exist, show "Unknown command". ld hl,USER_COM_BUF+1 ld de,PARSE_BUF @@ -478,7 +474,7 @@ NOADMIRA: ld hl,PARSE_BUF print UNKCOM_S jr MAIN_LOOP -COM_OK: ld a,(CONTROL_CON) ;Flushea datos si hay conexion +COM_OK: ld a,(CONTROL_CON) ;Flush data if there's a connection cp 0FFh jr z,COM_OK2 ;call TCP_STATUS @@ -488,13 +484,13 @@ COM_OK: ld a,(CONTROL_CON) ;Flushea datos si hay conexion push hl call R_FLUSH pop hl -COM_OK2: call JP_HL ;Ejecuta comando +COM_OK2: call JP_HL ;Execute command ld a,(BELL) or a jr z,MAIN_LOOP - ld iy,(0FCC1h-1) ;Ejecuta BEEP si BELL=0FFh + ld iy,(0FCC1h-1) ;Execute BEEP if BELL=0FFh ld ix,BEEP call CALSLT jp MAIN_LOOP @@ -887,7 +883,7 @@ LCD_NODRIVE: ; LCD_END: print PATHCHAN_S jp PRINT_PATH -LCD_NOPATH: ld a,92 ;"\" ;Si se especifica unidad pero no dir, +LCD_NOPATH: ld a,92 ;"\" ;Si se especifica unidad pero no dir, ld (RESPONSE_BUF+2),a ;se muestra el dir actual ld c,_GETCD ld de,RESPONSE_BUF+3 @@ -1245,7 +1241,8 @@ R_LITERAL: call CHK_CON ld a,2 ;Va cogiendo los elementos de la cadena ;ld hl,USER_COM_BUF+1 ;pasada por el usuario, y los ld de,SEND_COM_BUF ;copia a SEND_COM_BUF -LITELOOP: push af ;separados con un espacio +LITELOOP: + push af ;separados con un espacio push de ld hl,USER_COM_BUF+1 call EXTPAR @@ -2307,23 +2304,23 @@ R_XCOMMANDS: ld a,3 jp TURN_ON_OFF -;*** Rutinas auxiliares para la ejecucion de comandos +;*** Auxiliary routines for command execution -;--- SINGLE_COM: Ejecuta el comando HL sin parametros +;--- SINGLE_COM: Execute command pointed by HL without parameters SINGLE_COM: call SET_COMMAND call APPEND_LF jp AUTOMATA_NO1 -;--- PARAM_COM: Ejecuta el comando HL con parametros ya establecidos -; (SEND_COM_BUF contiene "xxxxx") +;--- PARAM_COM: Execute command pointed by HL with parameters already set +; (SEND_COM_BUF contains "xxxxx") PARAM_COM: call SET_COMMAND call SET_SPACE call APPEND_LF jp AUTOMATA_NO1 -;--- SINGLE_XCOM: Como SINGLE_COM, para comandos "X" +;--- SINGLE_XCOM: Like SINGLE_COM, for "X" commands SINGLE_XCOM: call SET_COMMAND call APPEND_LF @@ -2331,7 +2328,7 @@ SINGLE_XCOM: call SET_COMMAND ld (ES_XCOM),a jp AUTOMATA_NO1 -;--- PARAM_XCOM: Como SINGLE_COM, para comandos "X" +;--- PARAM_XCOM: Like SINGLE_COM, for "X" commands PARAM_XCOM: call SET_COMMAND call SET_SPACE @@ -2340,7 +2337,7 @@ PARAM_XCOM: call SET_COMMAND ld (ES_XCOM),a jp AUTOMATA_NO1 -;--- R_INVPAR: Faltan parametros o son incorrectos +;--- R_INVPAR: Missing or invalid paramenters R_INVPAR: print INVPAR_S ret @@ -2490,11 +2487,11 @@ FINEXTP: pop iy pop hl ret -;--- Rutina de terminacion -; Aborta las conexiones abiertas, si las hay -; y borra la cola de nombres de fichero -TERM: xor a ;Desde ahora, CTRL-C no tiene efecto +;--- Termination routine +; Aborts all open connections and deletes the filenames queue + +TERM: xor a ;From now on, CTRL-C has no effect ld (ABORT_STAT),a ;ld a,(DATA_CON) @@ -2520,21 +2517,21 @@ TERM2: ld h,40h call ENASLT - ld a,(TPASEG1) ;Restaura TPA + ld a,(TPASEG1) ;Restore TPA call PUT_P1 - ld a,(FILES_QUEUE) ;Borra cola de nombres de fichero + ld a,(FILES_QUEUE) ;Delete filenames queue cp 0FFh jr z,TERM_Q_OK ld ix,0 nesman 22 TERM_Q_OK: ; - ld de,0 ;Desdefine rutina de CTRL-C + ld de,0 ;Undefines CTRL-C handling routine ld c,_DEFAB call DO_DOS - ld bc,_TERM+0*256 ;Termina + ld bc,_TERM+0*256 ;Terminates jp DO_DOS ;--- Prints LF @@ -2968,7 +2965,7 @@ ROTA: sla l ret -;--- PRINT_L: Imprime la cadena DE, acabada en CRLF +;--- PRINT_L: Prints CRLF terminated string pointed by DE PRINT_L: ld a,(de) push af @@ -2983,7 +2980,8 @@ PRINT_L: ld a,(de) inc de jr PRINT_L -;--- PRINT_Z: Imprime la cadena DE, acabada en cero + +;--- PRINT_Z: Prints zero terminated string pointed by DE PRINT_Z: ld a,(de) or a @@ -2996,8 +2994,9 @@ PRINT_Z: ld a,(de) inc de jr PRINT_Z -;--- SHOW_ERR: Muestra la cadena DE, y a continuacion -; busca un error con codigo A en la tabla HL, y lo muestra. + +;--- SHOW_ERR: Show string pointed by DE, then search an error +; with code A in table pointed by HL and print it SHOW_ERR push af push hl @@ -3028,11 +3027,12 @@ ERROR_FOUND: ld c,_STROUT ;Print error string scf ret -;--- SEARCH_COM: Busca un comando en la tabla de idems -; Entrada: HL = Dir. del comando, acabado en 0 -; Salida: HL = Dir de la rutina del comando -; DE = Dir de la ayuda del comando -; Cy = 1 si no existe + +;--- SEARCH_COM: Search a command in the commands table +; Input: HL = Zero terminated command +; Output: HL = Command routine address +; DE = Command help text address +; Cy = 1: unknown command SEARCH_COM: ld (COMM_DIR),hl @@ -3050,14 +3050,14 @@ SRCH_C_LOOP: inc hl ld a,(de) cp "A" jr c,SRCH_C_LP2 - and 11011111b ;Lo transforma a mayusculas + and 11011111b ;Convert to upper case SRCH_C_LP2: cp (hl) jr nz,NEXT_COM or a jr nz,SRCH_C_LOOP inc hl - push hl ;Comando encontrado + push hl ;Command found pop ix ld l,(ix) ld h,(ix+1) @@ -3079,9 +3079,9 @@ NEXT_COM: ld a,(hl) COMM_DIR: dw 0 -;--- TURN_ON_OFF: Intercambia el valor de una variable -; Entrada: HL = Variable -; DE = Cadena para imprimir "xxx turned ON/OFF" +;--- TURN_ON_OFF: Change the status of a boolean variable +; Entrada: HL = Variable address +; DE = String to print "xxx turned ON/OFF" TURN_ON_OFF: push de ld a,(hl) @@ -3102,8 +3102,8 @@ TONOFF2: pop de jp CRLF -;--- SHOW_ON_OFF: Muestra la cadena DE, y luego "ON" o "OFF" -; segun el valor de la variable HL. +;--- SHOW_ON_OFF: Prints string pointed by DE, then "ON" or"OFF" +; according to the variable value pointed by HL. SHOW_ON_OFF: push hl ld c,_STROUT @@ -3119,7 +3119,7 @@ SHOWONOFF2: ld c,_STROUT jp CRLF -;--- APPEND_LF: Aqade CRLF al final de la cadena en SEND_COM_BUF (acabada en 0) +;--- APPEND_LF: Adds CRLF at the end of the zero-terminated string at SEND_COM_BUF APPEND_LF: ld hl,SEND_COM_BUF-1 APLF_L: inc hl @@ -3132,7 +3132,7 @@ APLF_L: inc hl ret -;--- SET_COMMAND: Copia el comando HL a SEND_COM_BUF, acabado en 0 +;--- SET_COMMAND: Copies command HL to SEND_COM_BUF, zero terminated SET_COMMAND: ld de,SEND_COM_BUF ld bc,5 @@ -3149,8 +3149,8 @@ SETCOM2: ldir ret -;--- SET_SPACE: Pone un espacio tras el comando en SEND_COM_BUF -; (donde esta el 0) +;--- SET_SPACE: Set a space after the command at SEND_COM_BUF +; (in lieu of the terminating 0) SET_SPACE: ld hl,SEND_COM_BUF-1 SETSPACE2: inc hl @@ -3161,8 +3161,8 @@ SETSPACE2: inc hl ret -;--- DOS: Llama a una funcion del DOS, y en caso de error, -; imprime su codigo y vuelve con Cy=1 +;--- DOS: Execute a DOS function call, and in case of error, +; print its code and return Cy=1 DOS: call DO_DOS or a @@ -3171,16 +3171,16 @@ DOS: call DO_DOS DOS2: push hl push de push bc - ld b,a ;Si se esta haciendo un DIR, el error 0D7h - ld a,(LDIR_EXE) ;(file not found) no se imprime + ld b,a ;If DIR is in progress, 0D7h + ld a,(LDIR_EXE) ;(file not found) is not printed or a jr z,DOS3 ld a,b cp 0D7h jr z,DOS5 -DOS3: ld a,(PUT_EXE) ;Si se esta haciendo un PUT, - or a ;el error 0C7h (end of file) - jr z,DOS4 ;no se imprime +DOS3: ld a,(PUT_EXE) ;If PUT is in progress, + or a ;error 0C7h (end of file) + jr z,DOS4 ;is not printed ld a,b cp 0C7h jr z,DOS5 @@ -3196,9 +3196,9 @@ DOS5: scf pop hl ret -;--- PRINT_PATH: Muestra la unidad+directorio actual y un fin de linea +;--- PRINT_PATH: Prints currend drive+directory plus CRLF -PRINT_PATH: ld c,_CURDRV ;Muestra unidad +PRINT_PATH: ld c,_CURDRV ;Drive call DO_DOS add "A" ld e,a @@ -3211,7 +3211,7 @@ PRINT_PATH: ld c,_CURDRV ;Muestra unidad ld c,_CONOUT call DO_DOS - ld b,0 ;Muestra dir y CRLF + ld b,0 ;Directory+CRLF ld de,RESPONSE_BUF ld c,_GETCD call DO_DOS @@ -3220,9 +3220,9 @@ PRINT_PATH: ld c,_CURDRV ;Muestra unidad ;--- ASK_YNAC -; - Imprime "(y,n,a,c)?" -; - Obtiene un caracter del teclado -; - Devuelve 0,1,2,3 para y,n,a,c respectivamente. +; - Prints "(y,n,a,c)?" +; - Reads a character from keyboard +; - Returns 0,1,2,3 for y,n,a,c respectively ASK_YNAC: print YNAC_S @@ -3252,13 +3252,13 @@ ASK_YNAC3: push bc ret -;--- PRINT_PAUSE: Imprime el caracter A, y si PAUSE=0FFh, -; realiza una pausa "Press any key to continue" -; cuando se muestra una pantalla llena. -; Se ha de inicializar con BYTE_COUNT y LINE_COUNT a 0. +;--- PRINT_PAUSE: Print character passed in A, and if PAUSE=0FFh, +; does a "Press any key to continue" pause +; if the screen is full of text. +; Must be initialized with BYTE_COUNT and LINE_COUNT to 0. -PRINT_PAUSE: cp 0Ch ;Si es "borrar panrtalla", - jr z,PPAUSE_CLS ;actua como pantalla llena +PRINT_PAUSE: cp 0Ch ;If character is "clear screen", + jr z,PPAUSE_CLS ;act as if the screen was full push af ld e,a ld c,_CONOUT @@ -3269,8 +3269,8 @@ PRINT_PAUSE: cp 0Ch ;Si es "borrar panrtalla", ret z ld a,(BYTE_COUNT) - inc a ;Si se encuentra LF, o se han cogido 80 caracteres, - ld (BYTE_COUNT),a ;se cambia de linea + inc a ;If LF found, or if 80 characters printed, + ld (BYTE_COUNT),a ;change line cp 80 jr z,PPAUSE_NEWL ld a,b @@ -3279,13 +3279,13 @@ PRINT_PAUSE: cp 0Ch ;Si es "borrar panrtalla", PPAUSE_NEWL: xor a ld (BYTE_COUNT),a - ld a,(LINE_COUNT) ;Si era LF, PAUSE=0FFh, y era la linea 23, - inc a ;imprime "Press any key" y hace una pausa + ld a,(LINE_COUNT) ;If it was LF, PAUSE=0FFh, and line was 23, + inc a ;print "Press any key" and pause ld (LINE_COUNT),a cp 23 ret nz -PPAUSE_NEWS: xor a ;Pantalla llena +PPAUSE_NEWS: xor a ;Screen is full ld (LINE_COUNT),a ld (BYTE_COUNT),a print PRESS_S @@ -3307,7 +3307,7 @@ PPAUSE_CLS: call PPAUSE_NEWS jp DO_DOS -;--- CLOSE_FILE: Cierra fichero abierto si lo hay +;--- CLOSE_FILE: Close the open file if any CLOSE_FILE: ld a,(FILE_FH) cp 0FFh @@ -4838,7 +4838,7 @@ HOOK_C0_OK: push af push hl HOOK_CODE0_END: ; -;--- Rutinas para establecer y resetear el gancho +;--- Routines to set and reset the hook SET_HOOK: push af push bc @@ -5078,7 +5078,7 @@ DATA_START: IP_LOCAL: ds 4 IP_REMOTE: ds 4 PORT_REMOTE_C: dw 21 -PORT_REMOTE_I: dw 0 ;Ident: el puerto local sera el 113 +PORT_REMOTE_I: dw 0 ;Ident: local port will be 113 PORT_REMOTE_D: dw 0 HAY_NMAN: db 0 DATA_CON: db 0FFh @@ -5088,7 +5088,7 @@ VERBOSE: db 0FFh XCOM: db 0 ES_XCOM: db 0 SAVESP: dw 0 -TYPE: db 0 ;0 para ASCII, 1 para binario +TYPE: db 0 ;0 for ASCII, 1 for binary DEBUG: db 0 BELL: db 0 HASH: db 0 @@ -5097,10 +5097,10 @@ PAUSE: db 0 PASSIVE: db 0 OLD_TYPE: db 0 OLD_VERBOSE: db 0 -PORT_C_PNT: dw C_PORT+5 ;Puntero a la parte "puerto" de PORT_C +PORT_C_PNT: dw C_PORT+5 ;Pointer to the "port" part of PORT_C FILE_FH: db 0FFh -FILES_QUEUE: db 0FFh ;Cola para guardar los nombres de fichero -QUITTING: db 0 ;0FFh cuando se esta cerrando/saliendo +FILES_QUEUE: db 0FFh +QUITTING: db 0 ;0FFh when we are closing/exiting ALLFILES: db 0 ALSO_RONLY: db 0 LINE_COUNT: db 0 @@ -5108,8 +5108,8 @@ BYTE_COUNT: db 0 INS_IX: dw 0 ABORT_STAT: db 0 LAST_REPLY: db 0 -MSS: dw 448 ;Valor fijo -HOOKING: db 0 ;0FFh cuando el gancho CHPUT esta parcheado +MSS: dw 448 ;Fixed value +HOOKING: db 0 ;0FFh when CHPUT hook is patched UNAPI_IS_SET: db 0 ;0FFh when UNAPI slot/seg is switched on page 1 ;--- Pseudo-TCBs @@ -5132,7 +5132,7 @@ IP_REMOTE_D: db 0,0,0,0 ;db 0FFh ;Is passive -;--- Cadenas de texto (informacion y errores) +;--- Information and error strings PRESEN_S: db 13,10,"FTP client for the TCP/IP UNAPI 1.0",13,10 db "By Konamiman, 4/2010",13,10,10 @@ -5227,7 +5227,7 @@ IDENT_S: db ":USERID:OTHER:MSX-DOS 2 running FTP for the TCP/IP UNAP IDENT_S_END: ; IDENT_LEN: equ IDENT_S_END-IDENT_S -;--- Cadenas de ayuda +;--- Help strings BIGHELP_H: db 13,10,"Available commands:",13,10,10 db "? dir ls recv",13,10 @@ -5399,7 +5399,7 @@ H_SHOW: db "SHOW ",13,10 H_STATUS: db "STATUS",13,10 db "Shows the current status of the application.",13,10,"$" -H_TYPE: db "TYPE A|I" +H_TYPE: db "TYPE A|I",13,10 db "Sets the file transfer type to ASCII (A) or binary (I).",13,10 db "Commands ASCII and BINARY can be used for the same purpose.",13,10,"$" @@ -5421,7 +5421,7 @@ H_XCOMMANDS: db "XCOMMANDS",13,10 db "XMKD, XRMD, XPWD, XCUP and XCWD are sent to the FTP server",13,10 db "instead of MKD, RMD, PWD, CDUP and CWD, respectively.",13,10,"$" -;--- Comandos para enviar al servidor FTP +;--- Commands for the FTP server C_ABOR: db "ABOR",0 C_ACCT: db "ACCT",0 @@ -5448,7 +5448,7 @@ C_USER: db "USER",0 C_XCUP: db "XCUP",0 -;--- Tabla de comandos de usuario y direccion de su rutina y texto de ayuda +;--- User commands table, R_ is the routine address and H_ is the help text COMMAND_TABLE: @@ -5704,7 +5704,7 @@ COMMAND_TABLE: db 0 -;--- Tabla de errores DNS +;--- DNS errors table DNSERRS_T: db 1,"Query format error$" db 2,"Server failure$" @@ -5736,59 +5736,58 @@ DNSQERRS_T: db ERR_NO_NETWORK,"No network connection$" db 0 -;--- Tabla de errores al abrir una conexion +;--- Connection opening errors table OPENERR_T: db ERR_NO_FREE_CONN,"Too many TCP connections opened$" - db ERR_NO_NETWORK,"No network connection found$" - db ERR_CONN_EXISTS,"Connection already exists, try another local port number$" - db ERR_INV_PARAM,"Invalid parameter when opening connection$" - db 0 + db ERR_NO_NETWORK,"No network connection found$" + db ERR_CONN_EXISTS,"Connection already exists, try another local port number$" + db ERR_INV_PARAM,"Invalid parameter when opening connection$" + db 0 db 0 DATA_END: -;--- Bufer para el comando tecleado por el usuario +;--- Buffer for user-typed command USER_COM_BUF: equ DATA_END -;--- Bufer para el primer comando a enviar +;--- Buffer for the first command to be sent SEND_COM_BUF: equ USER_COM_BUF+270 -;--- Bufer para el nombre del servidor +;--- Buffer for the server name SERVER_NAME: equ SEND_COM_BUF+270 -;--- Bufer para la respuesta del servidor +;--- Buffer for the server reply RESPONSE_BUF: equ SERVER_NAME+257 -;--- Bufer para examinar el comando del usuario +;--- Buffer to parse the user command PARSE_BUF: equ RESPONSE_BUF+257 -;--- Bufer para GET_DATA +;--- Buffer for GET_DATA GDATA_CBUF: equ PARSE_BUF+257 GDATA_DBUF: equ GDATA_CBUF+257 -;--- Bufer para coger datos de la conexion de idem +;--- Buffer for retrieving data from the data connection DATA_BUF: equ GDATA_DBUF+257 -;--- Buferes para el nombre de usuario y password por defecto +;--- Buffers for the default username and password DEF_USER: equ DATA_BUF+1510 DEF_PASSWORD: equ DEF_USER+257 DEF_ACCOUNT: equ DEF_PASSWORD+257 -;--- Espacio para la rutina HOOK +;--- Buffer for the HOOK routine HOOK_CODE: equ DEF_ACCOUNT+257 - ;Donde colocaremos el gancho antiguo - ;(justo despues del codigo nuevo) + ;Where goes the old hook (right afther the new code) HOOK_OLD: equ HOOK_CODE0_END-HOOK_CODE0+HOOK_CODE ESC_CHAR: equ HOOK_OLD+5