Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagenone
1000 DIM code 512                   \ space for program
1010 REM
1020 GN_Esp=&4C09                   \ return pointer to system error message
1040 GN_Nln=&2E09                   \ carriage return, linefeed to std. output
1050 GN_Sop=&3A09                   \ output string to std. output
1060 GN_Opf=&6009                   \ open file
1070 OS_Erh=&75                     \ install error handler
1080 OS_Esc=&6F                     \ examine special condition
1090 GN_Err=&4A09                   \ standard system error box
1100 GN_Sdo=&0E09                   \ date and time to standard output
1110 OS_Dor=&87                     \ DOR interface
1120 dr_rd=&09                      \ read DOR record
1130 dr_fre=&05                     \ free DOR handle
1140 op_dor=&06                     \ open file for DOR access
1150 rc_quit=&67                    \ KILL request error code
1160 rc_esc=&01                     \ escape detection error code
1170
1180 FOR pass=0 TO 2 STEP 2
1190 P%=code
1200 [ 
1210 OPT pass 
1220 LD HL,0 
1230 ADD  HL,SP                     \ get stack pointer
1240 LD   (bstk),HL                 \ save current BASIC stack pointer
1250 LD   SP,(&1FFE)                \ install safe stack pointer 
1260 
1270 XOR A 
1280 LD B,A 

1290 LD   HL,errhan                 \ address of error handler
1300 OPT  FNsys(OS_Erh)             \ install new error handler
1310 LD   (obou),A                  \ save old error handler call level
1320 LD   (oerr),HL                 \ save old error handler address
1330 CALL main                      \ call main routine
1340 .exit 

1350 LD   HL,(oerr)                 \ address of old error handler
1360 LD   A,(obou)                  \ old call level
1370 LD B,0 

1380 OPT  FNsys(OS_Erh)             \ restore old error handler
1390 LD   SP,(bstk)                 \ install BASIC stack pointer
1400 RET                            \ return to BBC BASIC interpreter
1410 
1420 .errhan 
1430 RET Z 

1440 CP   rc_esc                    \ ESC pressed?
1450 JR NZ,err1 

1460 OPT  FNsys(OS_Esc)             \ acknowledge ESC
1470 LD A,rc_esc 

1480 OR   A                         \ return rc_esc back to main program
1490 RET                            \ Fc = 0, Fz = 0
1500 .err1 

1510 CP   rc_quit                   \ KILL request?
1520 JR NZ,err2 

1530 LD   HL,(oerr)                 \ re-install old error handler
1540 LD   A,(obou)                  \ old call level
1550 OPT FNsys(OS_Erh) 

1560 LD   SP,(bstk)                 \ install BASIC stack pointer
1570 LD HL,(oerr) 

1580 LD   A, rc_quit                \ reload A with RC_QUIT
1590 OR   A                         \ Fz = 0
1400 SCF                            \ Fc = 1
1410 JP   (HL)                      \ jump to BASIC's error handler
1420 

1430 .err2                          \ write error message if possible
1440 OR   A                         \ Fc = 0
1450 RET 
1460 
1470 .bstk DEFW 0                   \ storage for BASIC stack pointer
1480 .obou DEFB 0                   \ storage for old call level
1490 .oerr DEFW 0                   \ storage for old error handler address
1500 
1510 \ main routine starts here 
1520 .main 
1530 LD   HL,scratch_1              \ holds address of file to open
1540 LD   DE,scratch_2              \ explicit name buffer
1550 LD   C,40                      \ size of explicit name buffer
1560 LD   B,0                       \ HL string pointer is local
1570 LD   a, op_dor                 \ get DOR handle
1580 OPT  FNsys(GN_Opf)             \ open...
1590 JR NC,opened_OK
1600 OPT  FNsys(GN_Err)             \ report error in standard window 
1610 RET 
1620 .opened_OK 
1630 LD   A,dr_rd                   \ read DOR record
1640 LD   B,ASC"U"                  \ read update information
1650 LD   C,6                       \ 3 byte internal date, 3 byte int. time
1660 LD   DE,scratch_1              \ store returned information at (DE)
1670 OPT  FNsys(OS_Dor)             \ fetch update date 
1680 LD A,dr_fre 
1690 OPT  FNsys(OS_Dor)             \ free DOR handle
1700 LD   HL,scratch_2              \ display explicit filename
1710 OPT  FNsys(GN_Sop)             \ to standard output 
1720 LD HL,tab_str 
1730 OPT  FNsys(GN_Sop)             \ tab to column 40 
1740 LD HL,scratch_1 
1750 OPT  FNsys(GN_Sdo)             \ output returned update date
1760 OPT  FNsys(GN_Nln)             \ display newline
1770 RET                            \ back to BASIC 
1780 
1790 .scratch_1 DEFM STRING$(40,"X") 
1800 .scratch_2 DEFM STRING$(40,"X") 
1810 .tab_str DEFM CHR$1+"2X"+CHR$(32+40)+CHR$0 
1820 ] 
1830 NEXT pass 
1840 
1850 CLS 
1860 PRINT "Read File Update Date and Time" 
1870 INPUT "Filename:"A$ 
1880 IF LEN(a$)>40 THEN PRINT "String too long": END 

1890 A$=A$+CHR$0                    \ null-terminate filename string
1900 $scratch_1=A$ 
1910 CALL code 
1920 END 
1930 DEF FNsys(arg) 
1940 IF arg>255 THEN [OPT pass: RST &20: DEFW arg] :=pass 
1950 [OPT pass: RST &20: DEFB arg] :=pass

...