10  MODE 0
   20  PROC_screen
   30  PROC_setup
   40  PROC_update
   50  PROC_clock
   60  PROC_window2
   70  CALL revector
   80  CALL clock
   90  ON ERROR PROC_error
  100  REPEAT
  110    IF FN_keyready  THEN PROC_keyboard
  120    IF FN_charready THEN PROC_character
  130  UNTIL FALSE
  140  
  150  DEF PROC_screen
  160  PRINT TAB(25,1);"RTTY Program (Interupt Driven)"
  170  PRINT TAB(7,3);"Baud Rate    USOS    Supress LF's    Printer    Disc    Time (GMT)"
  180  PROC_box(0,12,1278,1016)
  190  PROC_box(8,948,1270,1008)
  200  PROC_box(8,852,1270,940)
  210  PROC_box(8,692,1270,844)
  220  PROC_box(8,20,1270,684)
  230  ENDPROC
  240  
  250  DEF PROC_box(x0,y0,x1,y1)
  260  MOVE x0,y0
  270  DRAW x0,y1
  280  DRAW x1,y1
  290  DRAW x1,y0
  300  DRAW x0,y0
  310  ENDPROC
  320  
  330  DEF PROC_update
  340  PROC_store
  350  VDU 26
  360  PROC_centre(STR$(baud),7,15)
  370  PROC_centre(FN_onoff(usos),20,23)
  380  PROC_centre(FN_onoff(lfs),28,39)
  390  PROC_centre(FN_onoff(printer),44,50)
  400  PROC_centre(FN_onoff(disc),55,58)
  410  PROC_restore
  420  ENDPROC
  430  
  440  DEF PROC_setup
  450  *FX 225,128
  460  VDU 23,224,&01,&03,&06,&8C,&D8,&70,&20,&00
  470  VDU 23,225,&00,&C3,&66,&3C,&3C,&6C,&C3,&00
  480  revector   = A%
  490  clock      = B%
  500  resetirq   = C%
  510  resetclock = D%
  520  shift      = &73
  530  delayl     = &74
  540  delayh     = &75
  550  ptr1       = &76
  560  ptr2       = &77
  570  status     = &78
  580  hours      = &80
  590  minutes    = &81
  600  seconds    = &82
  610  buffer     = &900
  620  baud       = 50
  630  usos       = FALSE
  640  lfs        = TRUE
  650  printer    = FALSE
  660  disc       = FALSE
  670  outline    = FALSE
  680  fsp$       = ""
  690  comment$   = ""
  700  PROC_pokevalues
  710  ENDPROC
  720  
  730  DEF PROC_clock
  740  PROC_store
  750  PROC_window1
  760  PRINT "Enter Time (GMT)"
  770  INPUT "Hours   : "h
  780  INPUT "Minutes : "m
  790  INPUT "Seconds : "s
  800  ?hours=h
  810  ?minutes=m
  820  ?seconds=s
  830  CLS
  840  PROC_restore
  850  ENDPROC
  860  
  870  DEF PROC_window1
  880  VDU 28,2,9,77,6
  890  ENDPROC
  900  
  910  DEF PROC_window2
  920  VDU 28,2,30,77,11
  930  ENDPROC
  940  
  950  DEF PROC_store
  960  oldx    = POS
  970  oldy    = VPOS
  980  leftx   = ?&308
  990  bottomy = ?&309
 1000  rightx  = ?&30A
 1010  topy    = ?&30B
 1020  ENDPROC
 1030  
 1040  DEF PROC_restore
 1050  VDU 28,leftx,bottomy,rightx,topy,31,oldx,oldy
 1060  ENDPROC
 1070  
 1080  DEF FN_onoff(t)
 1090  IF t THEN =CHR$(224) ELSE ="x"
 1100  
 1110  DEF PROC_centre(s$,x0,x1)
 1120  PRINT TAB(x0,4);SPC(x1-x0+1)
 1130  VDU 5
 1140  MOVE (x0+(x1+1-x0-LEN(s$))/2)*16,888
 1150  PRINT s$
 1160  VDU 4
 1170  ENDPROC
 1180  
 1190  DEF PROC_keyboard
 1200  key=GET
 1210  IF key=9   THEN ?shift=0
 1220  IF key=13  THEN PROC_output(32):PROC_output(13)
 1230  IF key=128 THEN baud=FN_changebaud
 1240  IF key=129 THEN PROC_enterbaud
 1250  IF key=130 THEN usos=NOT(usos)
 1260  IF key=131 THEN lfs=NOT(lfs)
 1270  IF key=132 THEN printer=NOT(printer)
 1280  IF key=133 THEN PROC_disc
 1290  IF key=134 THEN PROC_comment
 1300  IF key=135 THEN outline=TRUE
 1310  IF key=136 THEN PROC_clock
 1320  IF key=137  THEN PROC_standby
 1330  PROC_pokevalues
 1340  PROC_update
 1350  ENDPROC
 1360  
 1370  DEF FN_changebaud
 1380  IF baud=45.45 THEN =50
 1390  IF baud=50    THEN =75
 1400  IF baud=75    THEN =100
 1410  =45.45
 1420  
 1430  DEF PROC_enterbaud
 1440  PROC_store
 1450  PROC_window1
 1460  CLS
 1470  REPEAT
 1480    INPUT "Enter Baud Rate : "baud
 1490  UNTIL baud>0
 1500  CLS
 1510  PROC_restore
 1520  ENDPROC
 1530  
 1540  DEF PROC_disc
 1550  disc=NOT(disc)
 1560  IF disc THEN PROC_discon ELSE PROC_discoff
 1570  ENDPROC
 1580  
 1590  DEF PROC_discon
 1600  PROC_store
 1610  PROC_window1
 1620  CLS
 1630  REPEAT
 1640    INPUT "Enter Filename : "f$
 1650  UNTIL (f$="" AND fsp$<>""OR f$<>""
 1660  IF f$="" THEN PROC_oldfile ELSE PROC_newfile
 1670  CLS
 1680  PROC_restore
 1690  ENDPROC
 1700  
 1710  DEF PROC_oldfile
 1720  file=OPENUP(fsp$)
 1730  PTR #file=EXT #file
 1740  ENDPROC
 1750  
 1760  DEF PROC_newfile
 1770  fsp$=f$
 1780  file=OPENOUT(fsp$)
 1790  ENDPROC
 1800  
 1810  DEF PROC_discoff
 1820  CLOSE #file
 1830  ENDPROC
 1840  
 1850  DEF PROC_comment
 1860  PROC_store
 1870  PROC_window1
 1880  CLS
 1890  PRINT "Enter Comment"
 1900  INPUT ": "comment$
 1910  CLS
 1920  PROC_restore
 1930  ENDPROC
 1940  
 1950  DEF PROC_standby
 1960  CLS
 1970  PROC_window1
 1980  REPEAT
 1990    CLS
 2000    PRINT
 2010    PRINT TAB(31);"Stand By Mode"
 2020    PRINT TAB(25);"Press <Space> To Continue"
 2030    PROC_keyboard
 2040  UNTIL key=32
 2050  ?ptr1=0
 2060  ?ptr2=0
 2070  CLS
 2080  PROC_window2
 2090  ENDPROC
 2100  
 2110  DEF PROC_character
 2120  ch=buffer??ptr2
 2130  ?ptr2=?ptr2+1
 2140  PROC_output(ch)
 2150  IF ch<>13 OR NOT(outline) THEN ENDPROC
 2160  outline=FALSE
 2170  out$="Time "+FN_time+" --- Speed "+STR$(baud)+" Baud --- Comment "+comment$+CHR$(13)
 2180  FOR a=1 TO LEN(out$)
 2190    PROC_output(ASC(MID$(out$,a,1)))
 2200  NEXT
 2210  ENDPROC
 2220  
 2230  DEF PROC_output(c)
 2240  IF c=13 AND lfs AND POS=0 THEN ENDPROC
 2250  IF printer THEN VDU 2
 2260  IF disc THEN BPUT #file,c
 2270  IF c=13 THEN PRINT ELSE PRINT CHR$(c);
 2280  IF printer THEN VDU 3
 2290  ENDPROC
 2300  
 2310  DEF FN_time
 2320  =FN_conv(?hours)+":"+FN_conv(?minutes)+":"+FN_conv(?seconds)
 2330  
 2340  DEF FN_conv(c)
 2350  =CHR$(48+c DIV 10)+CHR$(48+c MOD 10)
 2360  DEF PROC_pokevalues
 2370  ?delayl=(1000000/baud) MOD 256
 2380  ?delayh=(1000000/baud) DIV 256
 2390  ?status=-128*usos
 2400  ENDPROC
 2410  
 2420  DEF FN_keyready
 2430  =ADVAL(-1)>0
 2440  
 2450  DEF FN_charready
 2460  =?ptr1<>?ptr2
 2470  
 2480  DEF PROC_error
 2490  CALL resetirq
 2500  CALL resetclock
 2510  CLOSE #0
 2520  VDU 26,12
 2530  REPORT
 2540  PRINT " at line ";ERL
 2550  END