Close

Further enhancement

A project log for Joy232

Print using RS232 on the joystick port of MSX computers

danjovicdanjovic 12/12/2016 at 20:370 Comments

After optimization the size of the loadable binary file shrinked to only 65 bytes being 7 for the file header, 14 for hook code installer and 44 for the hook code itself which is small enough to fit whithin the unused 64 bytes reserved for the rs232 queue in 'system variables' area.

;
; Install bitbang routine on printer HOOK
; Borrowed from the book "+50 dicas para o MSX"
;
HLPT:  EQU 0FFB6H ; Printer hook entry
RS2IQ: EQU 0FAF5H ; RS232 queue, 64 bytes

;
INSTALL:
LD HL, HOOK_PRNTJ232           ; beginning of hook code
LD DE, RS2IQ                   ; destiny, unused rs232 queue
LD BC, HOOK_END-HOOK_PRNTJ232  ; block size
LDIR                           ; transfer hook code to its new location


LD HL,RS2IQ     ; Write the execution entry point for printer hook
LD [HLPT+1],HL
LD A,0C3H       ; then write the CALL instruction (0xC3)
LD [HLPT],A
RET

The downside is that now we need 10 extra bytes of instructions to move the hook code from the load address to the rs232 queue area. Another necessary modification was on the bit delay loop which used an absolute address jump to simplify the timing (JP NZ,xxxx takes 11 cycles either jump or no jump) . It was replaced by a relative jump (JR NZ,xxxx) .

   ; delay 1 bit time
   LD C,T9600     ;   8     8      poke here to change the baud rate
   DELAY_C:
   DEC C          ; ( 5)
   JR NZ,DELAY_C  ; (12)(/7)
                  ;  (12+5)*(TDelay-1)+(7+5) = 17*TDelay - 17 + 12 = (17*Tdelay-5)

DJNZ SEND_BITS    ; 14(/9)         send next bit

The relative jump made the hook code relocatable (now it can be copied and executed from wherever address) and the new timing due to the relative jump ended by enhancing the error rate for 14400 and 19200 baud are now both under 2% of error (it was not intentional though).

Clock = 3.575611 MHz
                 
Baud   Tdelay  Cycles RealRate  Error %
1200    170    2971   1203,50    0,29
2400     83    1492   2396,52   -0,14
4800     39     744   4805,92    0,12
9600     17     370   9663,81    0,66
14400    10     251   14245,4   -1,07
19200     6     183   19538,8    1,76

I could have loaded the hook code directly in the rs232 queue along with the installation code (14+44 bytes) , but I am planning to use the remaining 20 bytes to allow extra stuff like parity.

Discussions