; ************************************************* ; MODEM SAMPLE PROGRAM ; ************************************************* ; ; NOTE : ; This sample program is for using MODEM ; cartridge. ; ; <> assemble condition <> .Z80 ; <> loading address <> .PHASE 100H ; <> constant values <> ; IO registers 0018 ZSWR EQU 18H ; Switch register 0002 ZCSW1 EQU 02H ; Cartridge switch 1 0001 ZCSW0 EQU 01H ; Cartridge switch 2 0019 ZIOCTLR EQU 19H ; I0 control register 0003 BZCRS EQU 3 ; CRS signal bit ; ; System area F005 RZSWR EQU 0F005H ; SNR data setting area F006 RZIOCTLR EQU 0F006H ; IOCTLR data setting area F53F CRGDEV EQU 0F53FH ; Cartridge device coda ; ; BIOS entry (RBIOS2) EB03 WBOOT EQU 0EB03H ; Warm Hoot EB54 RSIOX EQU WBOOT+51H ; Serial Input/Output EB06 CONST EQU WBOOT+03H ; Console status EB09 CONIN EQU WBOOT+06H ; Console in EBOC CONOUT EQU WBOOT+09H ; Console out ; ; RSIOX parameter 0010 RSOPN EQU 10H ; Open code 0020 RSCLS EQU 20H ; Close code 0030 RSIST EQU 30H ; Input status code 0040 RSOST EQU 40H ; Output status code 0050 RSGET EQU 50H ; Get code 0060 RSPUT EQU 60H ; Put code ; 0001 RS232 EQU 01H ; RS—232C using 0002 SI0 EQU 02H ; SI0 using 0003 CSI0 EQU 03H ; Cartridge SIO using ; ; Cartridge mode. ; 0000 DBMODE EQU 00000000B ; DB node 0040 HSMODE EQU 01000000B ; HS mode 0080 IOMODE EQU 10000000B ; IO mode 00C0 OTMODE EQU 11000000B ; OT mode 000F DVMDM EQU 00001111B ; Device code for Modem 000D CR EQU 0DH ; Carriage return. 000A LF EQU 0AH ; Line feed. ; 0200 RCVSZ EQU 200H ; Receive buffer size. ; ; ************************************************* ; MAIN PROGRAM ; ************************************************* ; ; NOTE : ; ; CAUTION : ; If you use resident BIOS, change ; RBIOS1 to RBIOS2. ; If Your program is ROM execute program, ; you must use RBIOS2. 0100 START: 0100 C3 01AE JP PSTART ; ; Message ; 0103 53 74 61 72 MSG1: DB 'Start of Modem communication.',CR,LF,00H 0107 74 20 6F 66 01OB 20 4D 6F 64 010F 65 6D 20 63 0113 6F 6D 6D 75 0117 GE 69 63 61 011B 74 69 6F 6E 011F 2E 0D 0A 00 0123 4D 6F 64 65 MSG2: DB 'Modem cartridge check.',CR,LF,00H 0127 6D 20 63 61 012B 72 74 72 69 012F 64 67 65 20 0133 63 68 65 63 0137 6B 2E OD OA 013B 00 013C 53 65 6E 64 MSG3: DB 'Send initial data.',CR,LF,00H 0140 20 69 6E 69 0144 74 69 61 6C 0148 20 64 61 74 014C 61 2E OD UA 0150 00 0151 52 65 63 65 MSG4: DB 'Receive answer code.',CR,LF,00H 0155 69 76 65 20 0159 61 6E 73 77 015D 65 72 20 63 0161 GF 64 65 2E 0165 OD 0A 00 ; II-549 0168 21 21 21 20 MSG5: DB '!!! Start of Modem !!!',CR,LF,O0H 016C 53 74 61 72 0170 74 20 6F 66 0174 20 4D 6F 64 0178 65 6D 20 21 017C 21 21 OD OA 0180 O0 0181 21 21 21 20 MSG6: DB '!!! End of Modem '!!!,CR,LF,00H 0185 45 6E 64 20 0189 BF 66 20 4D 018D 6F 64 65 6D 0191 20 21 21 21 0195 OD OA 00 0198 43 6F 6D 6D MSG7: DB 'Communication error',CR,LF,00H 019C 75 SE 69 63 01AO 61 74 69 6F OIA4 6E 20 65 72 01A8 72 6F 72 OD 01AC OA 00 ; Main program 01AE PSTART: 01AE 31 4000 LD SP,4000H ; Set stack pointer. 0181 21 0103 LD HL,MSG1 ; ’Start of Nodes communication' 01B4 CD 02BC CALL MSGDSP ; Message display. ; 0187 21 0123 LD HL,MSG2 ; ’moden cartridge check' 01BA CD 02BC CALL MSGDSP ; Message display. 01BD 3A F53F LD A,(CRGDEV) ; Get cartridge device code. 01C0 47 LD B,A 01Cl E6 3F AND 03FH ; Get device code only. 0lC3 FE OF CP DVMDM ; Modem cartridge? 01C5 C2 EBO3 JP NZ,WBOOT ; No. then WBOOT. 01CB 75 LD A,B ; Restore CRGDE\. OIC9 FE BF CP IOMODE+DVMDM ; Already IO mode? 01CB C4 0289 CALL NZ,SETMODE ; N0. then set into I0 node. 01CE CRESET: 0lCE CD 029D CALL CRST02 ; CRS line on and wait 10 msec. 01D1 CD 0296 CALL CRST01 ; CRS line off and wait 10 nsec. OID4 MDMOPN: 0104 21 02F2 LD HL,OPNDAT ; Copy RSIOX open parameters. OID7 11 0305 LD DE,OPNPRM ; 01DA 01 0009 LD BC,9 ; 01DD ED B0 LDIR ; ; OIDF 21 0305 LD HL,OPNPRM ; RSIOX open. O1E2 06 I3 LD B,RSOPN+CSIO ; Using Cartridge S10. OIE4 CD EB54 CALL RSIOX ; 0157 B7 OR A ; Already opened? 01E8 C2 026F JR NZ,ERREND ; Yes. ; 01EB PUTINIT: OIEB 21 013C LD HL,MSG3 ; `Send initial data. 0lEE CD 02BC CALL MSGDSP ; Display message. ; 01Fl 21 0305 LD HL,OPNPRN ; Send initial data. OIF4 3A 02FB LD A,(INITDATA) ; Initial data --> A OIF7 4F LD C,A ; 01FB 06 60 LD B,RSPUT ; Using PUT function of RSIOX. OIFA CD EH54 CALL RSIOX ; 01FD 20 70 JR NZ, ERREND ; Error return, then retry. 01FF GETANS: 01FF 21 0151 LD HL,MSG4 ; 'Receive answer code. ' 0202 CD 02BC CALL MSGDSP ; Display message. 0205 GETANS1: 0205 21 0305 LD HL,OPNPRM ; Receive answer code- 0208 06 50 LD B,RSGET ; Using GET function of RSIOX. 020A CD EB54 CALL RSIOX ; 020D C2 026F JP NZ,ERREND ; Error return, then Warm Boot. ; 0210 CD 02CB CALL CHARDSP ; Display receiving character. 0213 _ FE 0D CP CR ; Recive char. is CR? 0215 20 EE JR NZ,GETANS1 ; No. (Loop until receivig CR code.) ; 0217 06 20 LD B,RSCLS ; Close RSIOX. 0219 CD EB54 CALL RSIOX ; 021C 21 0168 LD HL,MSG5 ; '!!! Start of modem !!!" 021F CD 02BC CALL MSGDSP ; Display message. ; 0222 21 02FC LD HL,MDMDAT ; Copy initial data paraneter for RSIOX. 0225 11 0305 LD DE,OPNPR 0228 01 0009 LD BC,9 ; 022B ED B0 LDIR ; ‘022D 21 0305 LD HL,OPNPRN ; Open RSIO1 0230 06 13 LD B,RSOPN+CSIO ; Using OPEN function of RSIOX. 0232 CD EB54 CALL RSIOX ; 0235 B7 OR A ; Error return 0236 C2 026F JP NZ,ERREND ; Yes. (then Warm Boot) ; 0239 KEYCHK: 0239 CD EBO6 CALL CONST ; Get console status. 023C 3C INC A ; Exist inputing key data? 023D 28 OE JR Z,PUT ; Yes. ; 023F 21 0305 LD HL,OPNPRM ; Get RSIOX receiving status. 0242 06 30 LD B,RSIST ; Using INSTS function of RSIOX. 0244 CD EB54 CALL RSIOX ; 0247 3C INC A ; Exist receiving data? 0248 28 18 JR Z,GET ; Yes. 024A 76 HALT ; 024B 18 EC JR KEYCHK ; Loop to Key Check. ; II-550 024D PUT: 024D CD EB09 CALL CONIN ; Get inputed key code. 0250 FE 03 CP 03H ; 1 STOP key? 0252 28 21 JR Z,PEND ; Yes. 0254 CD 02C8 CALL CHARDSP ; Display inputed key data. ; 0257 21 0305 LD HL,OPNPRM ; Send inputed key data. 025A 4F LD C,A ; 0258 06 60 LD B,RSPUT ; Using PUT function of RSIOX. 025D CD EB54 CALL RSIOX ; 0260 18 D7 JR KEYCHK ; Loop to Key Check. ; 0262 GET: 0262 21 0305 LD HL,OPNPRM ; Get reciving data. 0265 06 50 LD B,RSGET ; Using GET function of RSIOX. 0267 CD EB54 CALL RSIOX ; 026A CD 02C8 CALL CHARDSP ; Display receiving data. 0260 18 CA JR KEYCHK ; Loop to Key Check. ; 026F ERREND: 026F 21 0198 LD HL,MSG7 ; 'Communication error.‘ 0272 CD 02BC CALL MSGDSP ; Display message. 0275 PEND: 0275 21 0181 LD HL,MSG6 ; '!!! End of moden !!!' 0278 CD 02BC CALL MSGDSP ; Display message. 027B 21 02FE LD HL,CLSCMD ; Modem close parameter ·—> HL 027E CD OZAB CALL PUTDATA ; Send modem close parameter. ; 0281 06 20 LD B,RSCLS ; Close RSIOX. 0253 CD EB54 CALL RSIOX 0286 C3 EBU3 JP WBOOT ; Jump to harm Boot. ; ; ************************************************* ; SELECT I0 MODE ; ************************************************* ; NOTE : ; Select IO node (Cartridge node) ; ; <> entry parameter <> ; NON ; <> return paraneter <> ; NON ; <> preserved registers <> ; NON ; 0289 SETMODE: 0289 3A F005 LD A,(RZSWR) ; Get switch register data. 028C E6 FC AND 0FFH—ZCSW1-ZCSW0 ; Clear CSN1,0 bit. 028E F6 01 OR ZCSW0 ; Set IO node. 0290 32 F005 LD (RZSWR),A ; Store to nenory. 0293 D3 18 OUT (ZSWR),A ; Output to IO port. 0295 C9 RET ; ; ************************************************* ; CRS LINE CONTROL SUBROUTINE ; ************************************************* ; NOTE : ; There are two routine, one is setting ; CRS high. and one is setting CRS low. ; <> entry parameter <> ; NON ; <> return parameter <> ; NON ; <> preserved registers <> ; NON ; 0296 CRST01: 0296 3A F006 LD A,(RZIOCTLR) ; Get IO control register data. 0299 CB DF SET BZCRS,A ; Set CRS high.? 0298 18 05 JR CRST ; ; 029D CRST02: 029D 3A F006 LD A,(RZIOCTLR) ; Get IO control register data. 02AO CB 9F RES BZCRS,A ; Reset CRS low. 02A2 CRST: 02A2 32 F006 LD (RZIOCTLR),A ; Store data to nenory. 02A5 D3 19 OUT (ZIOCTLR),A ; Out put to I0 port. 02A7 CD 02DE CALL WAIT10 ; Wait about 10 msec. 02AA C9 RET ; ; ************************************************* ; SEND DATA TO RSIOX ; ************************************************* ; NOTE : ; Send data to RSIOX until finding ; 00h code. ; <> entry paraneter <> ; HL 1 Data top address. ; <> return paraneter <> ; NON ; <> preserved registers <> ; NON : CAUTION : ; If error happend, then stop this ; this program. ; 02AB PUTDATA: 02AB 4E LD C,(HL) ; Get sending data. (1 byte) 02AC OC INC C ; 02AD OD DEC C ; Data is 00h? 02AE C8 RET Z ; Yes. (then return) ; II—551 02AF E5 PUSH HL ; Save parameter. 02B0 21 0305 LD HL,OPNPRM ; Send data to RSIOX. 02B3 06 S0 LD B,RSPUT ; Use PUT function of RSIOX, 02B5 CD EB54 CALL RSIOX ; 0288 E1 POP HL ; Restore parameter. 0289 23 INC HL ; Pointer update. 02BA 18 EF JR PUTDATA ; Loop. ; ; ************************************************* ; DISPLAY MESSAGE UNTIL FIND OOH ; ************************************************* ; ; NOTE : ; ; <> entry parameter <> ; HL : Message data top address ; <> return parameter <> ; NON ; <> preserved registers <> ; NON ; ; CAUTION : 02Bc MSGDSP: 02BC 4E LD C,(HL) ; Get displaying data, 02BD OC INC C ; 02BE 0D DEC C ; Gettlng data is 00h? 02BF C8 RET Z ; Yes. (then return) ; 02C0 E5 PUSH HL ; Save parameter. 02C1 CD EBOC CALL CONOUT ; Console out data. 02C4 El POP HL ; Restore parameter. 02C5 23 INC HL ; Update parameter. 02C6 18 F4 JR MSGDSP ; Loop. ; ************************************************* ; DISPLAY A CHARACTER ; ************************************************* ; ; NOTE : ; ; <> entry parameter <> ; A : Character code. ; <> return parameter <> ; NON ; <> preserved registers <> ; All registers. ; ; CAUTION : ; If character code is CR, then console ; out CR with LF. 02CB CHARDSP: 02C8 F5 PUSH AF ; Save all registers. 02C9 C5 PUSH BC ; 02CA D5 PUSH DE ; 02CB E5 PUSH HL ; 02CC F5 PUSH AF ; 02CD 4F LD C,A ; Console out data. 02CE CD EBOC CALL CONOUT ; 02Dl Fl POP AF ; Get inputed parameter, 02D2 FE OD CP CR ; Is It CR? 0204 0E OA LD C,LF ; If so, then console out LF. O2D6 CC EBOC CALL Z,CONOUT ; 02D9 E1 POP HL ; Restore all registers. 02DA D1 POP DE ; OZDB Cl POP BC ; 02DC F1 POP AF ; 02DD C9 RET ; ; ; ************************************************* ; WAIT ABOUT 100 MILLI SECOND ; ************************************************* ; ; NOTE : ; ; <> entry parameter <> ; NON ; <> return parameter <> ; NON ; <> preserved registers <> ; NON ; CAUTION : 02DE WAIT10: 02DE O1 0002 LD BC,2 ; 02El F5 PUSH AF ; 02E2 WTIO: 02E2 3E E6 LD A,230 ; 02EA WT20: OZE4 3D DEC A ; O2E5 20 FD JR NZ,WT20 ; ; 02E7 OB I DEC BC ; 02E8 78 LD A,B ; O2E9 B1 OR C ; 02EA 20 F6 JR NZ,WT10 ; 02EC F1 POP AF ; 02ED C9 RET ; ; ; Constant data & Work area ; 02EE CLSCMD: 02EE 25 5A OD O0 DB '%Z',CR,00H ; Modem close command data. ; ; RSIOX first open parameter. ; ; II-552 02F2 OPNDAT: 02F2 030E DW RCVBUF ; Receive buffer top address. 02F4 0200 DW RCVSZ ; Receive buffer size. 02F6 06 DB 006H ; Baud rate. (300 bps) 02F7 03 DB 003H ; Bit length. (8 bits/character) 02F8 00 DB 000H ; Parity. (non parity) O2F9 01 DB 001H ; Stop bit. (1 stop bit) 02FA FF DB OFFH ; Special parameter. ; ; Modem initial data. ; (8 bits, non parity, 1 stop bit) 02FB INITDATA: 02FB 58 DB 01011000B ; ; RSIOX second open parameter. ; (This parameters are matched with initial data.) 02FC MDMDAT: 02FC 030E DW RCVBUF ; Receive buffer top address. 02FE 0200 DN RCVSZ ; Receive buffer size. 0300 06 DB 006H ; Baud rate. 0301 03 DB 003H ; Bit length. 0302 00 DB 000H ; Parity. 0303 01 DH 001H ; Stop bit. 0304 FF DB 0FFH ; Special parameter. ; ; RSIOX parameter area (for calling & return) ; 0005 OPNPRM: 0305 DS 9 ; Receiving buffer area 030E RCVBUF: 030E DS RCVSZ ; END ; II-553