1000 rem Program READER.BAS 1010 rem Micheal H. McCabe 1020 rem October 19, 2022 -- Revised October 31, 2022 1030 rem Part of the Retrochallenge 2022/10 1040 rem 1050 rem This program, running on the BCC-52 Microcontroller, handles the 1060 rem low-level interface between the M200 card reader and a serial 1070 rem connection to the host computer. 1080 rem 1090 rem initialize global variables 1100 rem 1110 clear 1120 dim buffer(254) : rem card input buffer 1130 let column = 0 : rem counts card columns and indexes buffer 1140 let mode = 57347 : rem control register for 82C55 1150 let porta = 57344 : rem Port A I/O register 1160 let portb = 57345 : rem Port B I/O register 1170 let portc = 57346 : rem Port C I/O register 1180 let card = 4097 : rem signals a new card 1190 let deck = 4098 : rem signals end of a deck 1210 let modev = 146 : rem port a and b are input, c is for control (tbd) 1230 xby(mode)=modev 1240 rem 1250 rem 1260 let ready = 16 : rem bit 5 will be set in Port B when reader ready 1270 let err = 32 : rem bit 6 will be set in Port B when reader gives check 1310 let status = 0 : rem means that no error has been encountered yet 1330 rem main program loop begins 1340 rem 1350 gosub 10000 : rem check reader status 1360 if status <> 0 then 1350 : rem reader may be offline. Wait. 1370 gosub 9000 : rem wait for ready and load card buffer 1380 gosub 8000 : rem send card buffer down serial line 1390 if status = 0 then 1370 1400 print deck 1410 rem main program ends here, but this is a microcontroller so we like infinite loops 1420 goto 1330 : rem would nominally be a stop or end statement 8000 rem send card buffer down the serial line 8005 print card : rem signals a new punch card in the stream 8010 for i = 1 to column 8020 print buffer(i) 8025 let buffer(i) = 0:rem clears the buffer 8030 next i 8035 let column=0 : rem resets the column pointer to zero 8040 return 9000 rem wait for ready signal and grab data 9010 v=xby(portb) AND ready 9020 if v <> 16 then 9000 : rem this could be a long wait 9030 let column = column+1 9040 let z9 = xby(porta) 9050 let z8 = xby(portB) AND 15 9060 let z1 = z9 + (z8*256) : rem a shift 8L would work also 9070 let buffer(column) = z1 9075 gosub 10000 : rem check the reader status again 9075 if status=1 then 9090 : rem abort! reader failed with < 80 columns 9080 if column < 80 then 9000 9090 return 10000 rem check reader status 10010 v = xby(portb) AND err 10020 if v = 32 then status = 1 10030 return