My final Superboard II post. 300 baud terminal fun.

Post Reply
royedmund
Posts: 23
Joined: Wed May 18, 2022 7:08 am
Location: Blue Mountains, Australia

My final Superboard II post. 300 baud terminal fun.

Post by royedmund »

I'm using the program C1P-Modem.65D Simple Serial I/O Modem Program written in BASIC which I found on Mark's Ohio Scientific page. http://osi.marks-lab.com/software/misc.html

I extracted the MODEM BASIC code from the disk image and then I load the BASIC program to my Superboard II via the RS232 port. The terminal is very limited as there is no escape sequence ANSI support but BASIC is under 3K in size.
My Video demo
https://youtu.be/hUMJbJfMKZI
Superboard II Rev B
BillO
Posts: 216
Joined: Tue Jul 08, 2014 4:03 pm
Location: Canada
Contact:

Re: My final Superboard II post. 300 baud terminal fun.

Post by BillO »

This is interesting stuff. Please keep posting!

How did you get the BASIC program off the disk?
Box stock Superboard II Rev. B
KLyball replica 600D, replica 610 & KLyball Data Separator
OMS SBME and SBME+ memory cards
OMS Digi-Mule expansion bus
KLyball memory card
royedmund
Posts: 23
Joined: Wed May 18, 2022 7:08 am
Location: Blue Mountains, Australia

Re: My final Superboard II post. 300 baud terminal fun.

Post by royedmund »

I opened the disk image file in WINOSI emulator and copied/pasted the MODEM BASIC to a text file.
modem01.jpg
modem01.jpg (126.61 KiB) Viewed 2087 times
Superboard II Rev B
BillO
Posts: 216
Joined: Tue Jul 08, 2014 4:03 pm
Location: Canada
Contact:

Re: My final Superboard II post. 300 baud terminal fun.

Post by BillO »

Makes sense. I'll have to make the time to give that a try.
Box stock Superboard II Rev. B
KLyball replica 600D, replica 610 & KLyball Data Separator
OMS SBME and SBME+ memory cards
OMS Digi-Mule expansion bus
KLyball memory card
BillO
Posts: 216
Joined: Tue Jul 08, 2014 4:03 pm
Location: Canada
Contact:

Re: My final Superboard II post. 300 baud terminal fun.

Post by BillO »

Just had a gander. The BASIC program poke a machine language program into memory and executes it. I'll have to disassemble that someday.
Box stock Superboard II Rev. B
KLyball replica 600D, replica 610 & KLyball Data Separator
OMS SBME and SBME+ memory cards
OMS Digi-Mule expansion bus
KLyball memory card
Mark
Posts: 297
Joined: Tue Sep 16, 2008 6:04 am
Location: Madison, WI
Contact:

Re: My final Superboard II post. 300 baud terminal fun.

Post by Mark »

So you piqued my interest. I had a closer look at the C1P modem program and found a few interesting things!

It is a program designed for the C1/C1E as well as C2/C4 with or without floppy.
It auto-configures for BASIC-IN-ROM or floppy based systems.

While running, <CTRL>B will exit the program, and <CTRL>D toggles local echo ON/OFF.

Under most cases it does not change the default serial word size/parity/stop bits/clock divisor thus 8N2/16
However on disk based C2/C4 The ACIA control byte is set to "2" aka 7E2/64 on line 4080 (a bug?), I believe it should be "21" 8N1/16
[EDIT: According to C4P Operations manual pg 64, C4PMF defaults to 1200 baud. Setting ACIA ctrl byte to "2" will set the ACIA to 300 baud for the modem connection J9, setting it to "1" restores 1200 baud operation i.e. 7E2/16]
It also sets ($F703=$34 which I think controls the CTS/DCD select line CB2 on PIA of 505CPU) which selects the alternate port [J9] on the back of C4P. Modem vs Printer?

When RUN, the BASIC program determines machine type and OS type. It relocates the modem USR routine depending on OS type, patching absolute addresses of the machine code as it goes. Then it patches for machine type, changing ACIA addresses if C2/C4, as well as changing screen output & other routines as appropriate for OS65D.

On a BASIC in ROM machine, the modem code is located from $0222 to $02FF and is called by a USR routine from BASIC. The code itself interfaces with the ROM kernel routines for scanning the keyboard, but doesn't call the normal getkey entry as it does not wait until a key is pressed to return. The code runs in a loop, sending any received characters to the BASIC screen print routine, polling the keyboard and either echoing key presses to the screen or just to the serial port.

When running under OS65D, the modem program is located at $4222 to $42FA, the C1E screen is toggled to run in 48x16 mode. The output routine is patched to use the OS65D screen printer, but keypolling still relies on the hijacked ROM kernal routines.
(The disk the program is located on is for the C1PMF, but the MODEM program itself will run under OS65D for C2/C4PMF etc.)

Since it relies on calling ROM based key poller subroutines in the OSI system ROMS, it requires an OSI SYNMON or SYN600 ROM. It does not work with a CEGMON or alternate ROM.

All in all, a deceptively simple and surprisingly versatile piece of coding!

Attached is the extracted BASIC program with the C4P OS65D port fix, below is the BASIC program listing with my notes in red.

10 REM MODEM PROGRAM
15 FORI=1TO30:PRINT:NEXT
20 PRINT"MODEM ROUTINE LOADING"
30 Y=PEEK(2):Z=PEEK(64774) :REM Y=4 on disk based, Z=32 on C1P
40 IFZ=32THENGOSUB3000:GOTO60
50 GOSUB4000
60 FORI=1TO32:PRINT:NEXT:PRINT"MODEM READY"
70 X=USR(X)
80 RESTORE:GOSUB500:IFY=4THENRUN"BEXEC*"
90 END
500 PS=1:IFPEEK(9800)=32THENPS=2 :REM C1PMF(9800)=32
510 IFY<>4ORZ<>32THENFORI=1TO48:READP:NEXT:RETURN
520 READP,C(1),C(2):IFPTHENPOKEP,C(PS):GOTO520
530 RETURN
540 DATA 9730,8,16
550 DATA 9743,7,15
560 DATA 9723,31,63
570 DATA 9736,31,63
580 DATA 9725,4,10
590 DATA 9738,29,59
610 DATA 9800,32,64
620 DATA 9636,101,75
630 DATA 9766,101,75
640 DATA 9770,101,75
650 DATA 9815,101,75
670 DATA 9670,125,123
680 DATA 9783,125,123
690 DATA 9682,95,164
990 DATA55296,0,1,0,0,0
1500 FORI=0+FTO216+F:READX
1510 IFX=-1THENX=INT(I/256)
1520 POKEI,X:NEXT
1530 RETURN
2000 DATA 32,13,37,173,0,240,74,144,6,173,1,240,32,67,35
2010 DATA 32,93,-1,240,239,201,2,240,22,201,4,240,21,72,32
2020 DATA 67,35,173,0,240,74,74,144,249,104,141,1,240,76,37
2030 DATA -1,76,13,37,173,63,-1,73,12,141,63,-1,208,225,138
2035 DATA 72,152,72
2040 DATA 169,1,32,190,252,32,198,252,208,5,10,208,245,240,83
2050 DATA 74,144,9,42,224,33,208,243,169,27,208,33,32,200,253
2060 DATA 152,141,19,2,10,10,10,56,237,19,2,141,19,2,168,138
2070 DATA 74,240,49,136,200,74,144,252,208,42,234,185,207,253,205
2080 DATA 21,2,208,38,206,20,2,240,43,160,5,162,200,202,208,253
2090 DATA 136,208,248,240,67,201,1,240,53,160,0,201,2,240,54,160
2100 DATA 192,201,32,240,48,169,0,141,22,2,141,21,2,169,2,141
2110 DATA 20,2,208,36,162,150,205,22,2,208,2,162,14,142,20,2
2120 DATA 141,22,2,169,1,32,190,252,32,207,252,74,144,3,76
2130 DATA 143,253,208,194,160,32,76,167,253,169,0,76,183,253
3000 GOSUB500
3005 IFY=4THENPOKE574,34:POKE575,66:F=16930:GOTO1500
3008 F=546:GOSUB1500
3010 POKE546,44:POKE592,96
3020 POKE559,251:POKE560,2:POKE576,251:POKE577,2
3030 POKE763,41:POKE764,127:POKE765,76:POKE766,45:POKE767,191
3040 POKE11,34:POKE12,2:RETURN
4000 GOSUB3000 :REM patch for C2/C4
4010 POKEF+65,141:POKEF+66,0:POKEF+67,223
4020 POKEF+68,174:POKEF+69,0:POKEF+70,223
4030 POKEF+193,141:POKEF+194,0:POKEF+195,223
4040 POKEF+196,173:POKEF+197,0:POKEF+198,223
4050 POKEF+1,68:POKEF+2,38
4060 POKEF+47,68:POKEF+48,38
4070 POKEF+5,252:POKEF+11,252:POKEF+34,252:POKEF+42,252
4080 IFY=4THENPOKE63235,52:POKE64512,21 :REM C4PMF 21 was 2 for 300bps
4090 RETURN

Assembler program listings after being patched & installed in various configurations:

Code: Select all

;C1P BASIC-IN-ROM version
;-----------------------------------------------------------
0222 2C 0D 25 BIT $250D ;inactive code from disk version
0225 AD 00 F0 LDA $F000	;check if character received
0228 4A       LSR A
0229 90 06    BCC $0231
022B AD 01 F0 LDA $F001 ;load character from serial
022E 20 FB 02 JSR $02FB ;send to screen
0231 20 5D 02 JSR $025D ;get keypress
0234 F0 EF    BEQ $0225 ;no keypress? loop to start
0236 C9 02    CMP #$02
0238 F0 16    BEQ $0250 ;^B ?
023A C9 04    CMP #$04  ;^D ?
023C F0 15    BEQ $0253
023E 48       PHA
023F 20 FB 02 JSR $02FB ;echo to screen when JSR 
0242 AD 00 F0 LDA $F000 ;wait for serial out to finish
0245 4A       LSR A
0246 4A       LSR A
0247 90 F9    BCC $0242
0249 68       PLA
024A 8D 01 F0 STA $F001 ;send to serial out
024D 4C 25 02 JMP $0225 ;loop to start
0250 60       RTS	;exit to BASIC
0251 0D 25    .BYT $0D,$25 ;(2 leftover bytes from disk version)
0253 AD 3F 02 LDA $023F  ;toggle between BIT and JSR instruction for local echo
0256 49 0C    EOR #$0C
0258 8D 3F 02 STA $023F
025B D0 E1    BNE $023E
025D 8A       TXA	;read keyboard without wait entry point
025E 48       PHA
025F 98       TYA
0260 48       PHA
0261 A9 01    LDA #$01
0263 20 BE FC JSR $FCBE
0266 20 C6 FC JSR $FCC6
0269 D0 05    BNE $0270
026B 0A       ASL A
026C D0 F5    BNE $0263
026E F0 53    BEQ $02C3
0270 4A       LSR A
0271 90 09    BCC $027C
0273 2A       ROL A
0274 E0 21    CPX #$21
0276 D0 F3    BNE $026B
0278 A9 1B    LDA #$1B
027A D0 21    BNE $029D
027C 20 C8 FD JSR $FDC8
027F 98       TYA
0280 8D 13 02 STA $0213
0283 0A       ASL A
0284 0A       ASL A
0285 0A       ASL A
0286 38       SEC
0287 ED 13 02 SBC $0213
028A 8D 13 02 STA $0213
028D A8       TAY
028E 8A       TXA
028F 4A       LSR A
0290 F0 31    BEQ $02C3
0292 88       DEY
0293 C8       INY
0294 4A       LSR A
0295 90 FC    BCC $0293
0297 D0 2A    BNE $02C3
0299 EA       NOP
029A B9 CF FD LDA $FDCF,Y
029D CD 15 02 CMP $0215
02A0 D0 26    BNE $02C8
02A2 CE 14 02 DEC $0214
02A5 F0 2B    BEQ $02D2
02A7 A0 05    LDY #$05
02A9 A2 C8    LDX #$C8
02AB CA       DEX
02AC D0 FD    BNE $02AB
02AE 88       DEY
02AF D0 F8    BNE $02A9
02B1 F0 43    BEQ $02F6
02B3 C9 01    CMP #$01
02B5 F0 35    BEQ $02EC
02B7 A0 00    LDY #$00
02B9 C9 02    CMP #$02
02BB F0 36    BEQ $02F3
02BD A0 C0    LDY #$C0
02BF C9 20    CMP #$20
02C1 F0 30    BEQ $02F3
02C3 A9 00    LDA #$00
02C5 8D 16 02 STA $0216
02C8 8D 15 02 STA $0215
02CB A9 02    LDA #$02
02CD 8D 14 02 STA $0214
02D0 D0 24    BNE $02F6
02D2 A2 96    LDX #$96
02D4 CD 16 02 CMP $0216
02D7 D0 02    BNE $02DB
02D9 A2 0E    LDX #$0E
02DB 8E 14 02 STX $0214
02DE 8D 16 02 STA $0216
02E1 A9 01    LDA #$01  ;check for shift-lock keypress
02E3 20 BE FC JSR $FCBE	;(select inverted keyboard row)
02E6 20 CF FC JSR $FCCF ;(load inverted keyboard col)
02E9 4A       LSR A
02EA 90 03    BCC $02EF
02EC 4C 8F FD JMP $FD8F ;part of keypoll routine
02EF D0 C2    BNE $02B3; <entry if no capslock pressed>
02F1 A0 20    LDY #$20
02F3 4C A7 FD JMP $FDA7
02F6 A9 00    LDA #$00
02F8 4C B7 FD JMP $FDB7
02FB 29 7F    AND #$7F
02FD 4C 2D BF JMP $BF2D ;send to screen

; C1P DISK VERSION
;----------------------------------------------------
4222 20 0D 25 JSR $250D  ;save contents of $0213-0217
4225 AD 00 F0 LDA $F000  ;check if character received
4228 4A       LSR A
4229 90 06    BCC $4231
422B AD 01 F0 LDA $F001 ;load character from serial
422E 20 43 23 JSR $2343 ;out screen OS65D
4231 20 5D 42 JSR $425D
4234 F0 EF    BEQ $4225
4236 C9 02    CMP #$02  ;^B
4238 F0 16    BEQ $4250
423A C9 04    CMP #$04  ;^D
423C F0 15    BEQ $4253
423E 48       PHA
423F 20 43 23 JSR $2343 ;out screen OS65D
4242 AD 00 F0 LDA $F000
4245 4A       LSR A
4246 4A       LSR A
4247 90 F9    BCC $4242  ;wait for serial out to clear
4249 68       PLA
424A 8D 01 F0 STA $F001  ;write to serial out
424D 4C 25 42 JMP $4225  ;loop to start
4250 4C 0D 25 JMP $250D  ;restore contents of $0213-0217 & exit to BASIC via RTS
4253 AD 3F 42 LDA $423F
4256 49 0C    EOR #$0C   ;toggle local echo
4258 8D 3F 42 STA $423F
425B D0 E1    BNE $423E
425D 8A       TXA        ;read keyboard without wait entry point
425E 48       PHA
425F 98       TYA
4260 48       PHA
4261 A9 01    LDA #$01
4263 20 BE FC JSR $FCBE
4266 20 C6 FC JSR $FCC6
4269 D0 05    BNE $4270
426B 0A       ASL A
426C D0 F5    BNE $4263
426E F0 53    BEQ $42C3
4270 4A       LSR A
4271 90 09    BCC $427C
4273 2A       ROL A
4274 E0 21    CPX #$21
4276 D0 F3    BNE $426B
4278 A9 1B    LDA #$1B
427A D0 21    BNE $429D
427C 20 C8 FD JSR $FDC8
427F 98       TYA
4280 8D 13 02 STA $0213
4283 0A       ASL A
4284 0A       ASL A
4285 0A       ASL A
4286 38       SEC
4287 ED 13 02 SBC $0213
428A 8D 13 02 STA $0213
428D A8       TAY
428E 8A       TXA
428F 4A       LSR A
4290 F0 31    BEQ $42C3
4292 88       DEY
4293 C8       INY
4294 4A       LSR A
4295 90 FC    BCC $4293
4297 D0 2A    BNE $42C3
4299 EA       NOP
429A B9 CF FD LDA $FDCF,Y
429D CD 15 02 CMP $0215
42A0 D0 26    BNE $42C8
42A2 CE 14 02 DEC $0214
42A5 F0 2B    BEQ $42D2
42A7 A0 05    LDY #$05
42A9 A2 C8    LDX #$C8
42AB CA       DEX
42AC D0 FD    BNE $42AB
42AE 88       DEY
42AF D0 F8    BNE $42A9
42B1 F0 43    BEQ $42F6
42B3 C9 01    CMP #$01
42B5 F0 35    BEQ $42EC
42B7 A0 00    LDY #$00
42B9 C9 02    CMP #$02
42BB F0 36    BEQ $42F3
42BD A0 C0    LDY #$C0
42BF C9 20    CMP #$20
42C1 F0 30    BEQ $42F3
42C3 A9 00    LDA #$00
42C5 8D 16 02 STA $0216
42C8 8D 15 02 STA $0215
42CB A9 02    LDA #$02
42CD 8D 14 02 STA $0214
42D0 D0 24    BNE $42F6
42D2 A2 96    LDX #$96
42D4 CD 16 02 CMP $0216
42D7 D0 02    BNE $42DB
42D9 A2 0E    LDX #$0E
42DB 8E 14 02 STX $0214
42DE 8D 16 02 STA $0216
42E1 A9 01    LDA #$01
42E3 20 BE FC JSR $FCBE
42E6 20 CF FC JSR $FCCF
42E9 4A       LSR A
42EA 90 03    BCC $42EF
42EC 4C 8F FD JMP $FD8F
42EF D0 C2    BNE $42B3
42F1 A0 20    LDY #$20
42F3 4C A7 FD JMP $FDA7
42F6 A9 00    LDA #$00
42F8 4C B7 FD JMP $FDB7


;C4PMF DISK VERSION
;----------------------------------------------------
4222 20 44 26 JSR $2644  ;save keypoller values $0213-0217
4225 AD 00 FC LDA $FC00
4228 4A       LSR A
4229 90 06    BCC $4231
422B AD 01 FC LDA $FC01
422E 20 43 23 JSR $2343
4231 20 5D 42 JSR $425D
4234 F0 EF    BEQ $4225
4236 C9 02    CMP #$02
4238 F0 16    BEQ $4250
423A C9 04    CMP #$04
423C F0 15    BEQ $4253
423E 48       PHA
423F 20 43 23 JSR $2343
4242 AD 00 FC LDA $FC00
4245 4A       LSR A
4246 4A       LSR A
4247 90 F9    BCC $4242
4249 68       PLA
424A 8D 01 FC STA $FC01
424D 4C 25 42 JMP $4225
4250 4C 44 26 JMP $2644 ;restore keypoller values $0213-0217 & exit to BASIC via RTS
4253 AD 3F 42 LDA $423F
4256 49 0C    EOR #$0C
4258 8D 3F 42 STA $423F
425B D0 E1    BNE $423E
425D 8A       TXA
425E 48       PHA
425F 98       TYA
4260 48       PHA
4261 A9 01    LDA #$01
4263 8D 00 DF STA $DF00
4266 AE 00 DF LDX $DF00
4269 D0 05    BNE $4270
426B 0A       ASL A
426C D0 F5    BNE $4263
426E F0 53    BEQ $42C3
4270 4A       LSR A
4271 90 09    BCC $427C
4273 2A       ROL A
4274 E0 21    CPX #$21
4276 D0 F3    BNE $426B
4278 A9 1B    LDA #$1B
427A D0 21    BNE $429D
427C 20 C8 FD JSR $FDC8
427F 98       TYA
4280 8D 13 02 STA $0213
4283 0A       ASL A
4284 0A       ASL A
4285 0A       ASL A
4286 38       SEC
4287 ED 13 02 SBC $0213
428A 8D 13 02 STA $0213
428D A8       TAY
428E 8A       TXA
428F 4A       LSR A
4290 F0 31    BEQ $42C3
4292 88       DEY
4293 C8       INY
4294 4A       LSR A
4295 90 FC    BCC $4293
4297 D0 2A    BNE $42C3
4299 EA       NOP
429A B9 CF FD LDA $FDCF,Y
429D CD 15 02 CMP $0215
42A0 D0 26    BNE $42C8
42A2 CE 14 02 DEC $0214
42A5 F0 2B    BEQ $42D2
42A7 A0 05    LDY #$05
42A9 A2 C8    LDX #$C8
42AB CA       DEX
42AC D0 FD    BNE $42AB
42AE 88       DEY
42AF D0 F8    BNE $42A9
42B1 F0 43    BEQ $42F6
42B3 C9 01    CMP #$01
42B5 F0 35    BEQ $42EC
42B7 A0 00    LDY #$00
42B9 C9 02    CMP #$02
42BB F0 36    BEQ $42F3
42BD A0 C0    LDY #$C0
42BF C9 20    CMP #$20
42C1 F0 30    BEQ $42F3
42C3 A9 00    LDA #$00
42C5 8D 16 02 STA $0216
42C8 8D 15 02 STA $0215
42CB A9 02    LDA #$02
42CD 8D 14 02 STA $0214
42D0 D0 24    BNE $42F6
42D2 A2 96    LDX #$96
42D4 CD 16 02 CMP $0216
42D7 D0 02    BNE $42DB
42D9 A2 0E    LDX #$0E
42DB 8E 14 02 STX $0214
42DE 8D 16 02 STA $0216
42E1 A9 01    LDA #$01
42E3 8D 00 DF STA $DF00
42E6 AD 00 DF LDA $DF00
42E9 4A       LSR A
42EA 90 03    BCC $42EF
42EC 4C 8F FD JMP $FD8F
42EF D0 C2    BNE $42B3
42F1 A0 20    LDY #$20
42F3 4C A7 FD JMP $FDA7
42F6 A9 00    LDA #$00
42F8 4C B7 FD JMP $FDB7
42FB 00       BRK
42FC 00       BRK
42FD 00       BRK
42FE 00       BRK
42FF 00       BRK
Attachments
modem.txt
BASIC "Modem" program text only without embedded NULLs
(2.41 KiB) Downloaded 149 times
modem.bas
BASIC "Modem" program for OS65D or ROM based video systems C1P/C1E/C2/C4P/C8 in OSI SAVE file format
(3 KiB) Downloaded 146 times
Last edited by Mark on Tue Jul 05, 2022 6:16 am, edited 1 time in total.
royedmund
Posts: 23
Joined: Wed May 18, 2022 7:08 am
Location: Blue Mountains, Australia

Re: My final Superboard II post. 300 baud terminal fun.

Post by royedmund »

Thanks, Mark this is good stuff.
Superboard II Rev B
Post Reply