> S/Printer ( Provides emulated printer Spectrum  Used IN/OUT &FB ( 2' 16-Mar-2004 JGH : Initial version < F : : P mcode% &8000:ver$="0.10" Zsp=13:link=14:pc=15 d p=0 1 nP%=0:O%=mcode% x[OPT p*3+4 EQUD 0:\start EQUD Initialise EQUD Finalise EQUD Service EQUD TitleStr EQUD HelpStr EQUD CommandTable EQUD 0:\ SWI chunk number EQUD 0:\ SWI chunk handler EQUD 0:\ SWI decoding table EQUD 0:\ SWI decoding code : .TitleStr EQUS "SpecPrinter"  EQUB 0  ALIGN " .HelpStr ,|
" EQUB 0:ALIGN : : .Initialise stmfd (sp)!,{link} ldr r0,[r12] orrs r0,r0,#0 5bne Reinitialise ; We already have workspace ;mov r0,#6 -;mov r3,#10*4 ; We want 10 words ;swi "XOS_Module" 0;ldmvsfd (sp)!,{pc} ; Memory claim failed &1;str r2,[r12] ; Store in w/s pointer 0/;mov r0,#0 ; Clear ROM pointers :;mov r1,#0 D;.InitClear N;str r0,[r2,r1] X;add r1,r1,#4 bE;cmp r1,#10*4 ; 8 ROM pointers, module pointer, OUT copy l;bcc InitClear v.Reinitialise ldmfd (sp)!,{pc} : :  .Finalise stmfd (sp)!,{link} =ldr r3,[r12] ; Get pointer to module's workspace orrs r3,r3,#0 Mbeq Finalised ; No workspace (shouldn't ever get called this way) 2;mov r4,#0 ; Loop from workspace+0 ;.FinalLoop 5;ldr r2,[r3,r4] ; Get pointer to ROM space (;orrs r2,r2,#0 ; Is is zero? 2;add r4,r4,#4 ; Point to next pointer ;movne r0,#7  ;;swine "XOS_Module" ; Release ROM space if it exists ;cmp r4,#4*8  +;bcc FinalLoop ; 8 ROM pointers *:;ldr r2,[r12] ; Pointer to module's workspace 4;mov r0,#7 >';swi "XOS_Module" ; Release it H.Finalised Rldmfd (sp)!,{pc} \: f: p?.SpecPrintInit ; *SpecPrint |
zmov pc,link : :  .Service \ In r0=mem[0] !\ r1=Srv_Z80Reset - &80AC2 !\ r1=Srv_Z80OUT - &80AC1 \ r2=port \ r3=value \ r4=Module base \ Cstmfd (sp)!,{r1} ; Check for Srv_Z80IN, Z80OUT or Z80Reset and r1,r1,#&FF000 $cmp r1,#&80000 ; &80xxx ? ldmfd (sp)!,{r1} movne pc,link ; No stmfd (sp)!,{r1} $and r1,r1,#&FF0 .$cmp r1,#&AC0 ; &80ACx ? 8ldmfd (sp)!,{r1} Bmovne pc,link ; No L1ldr r12,[r12] ; Get workspace address Vstmfd (sp)!,{r1} `and r1,r1,#&F j$cmp r1,#&0 ; &80AC0 ? tbeq Service_Z80IN ~$cmp r1,#&1 ; &80AC1 ? beq Service_Z80OUT $cmp r1,#&2 ; &80AC2 ? beq Service_Z80Reset ldmfd (sp)!,{r1} mov pc,link ; No : : .Service_Z80Reset ;stmfd (sp)!,{link} ;ldmfd (sp)!,{link} /ldmfd (sp)!,{r1} ; Restore call number 'mov pc,link ; Don't claim :  : .Service_Z80IN /ldmfd (sp)!,{r1} ; Restore call number (,stmfd (sp)!,{r2} ; Save port number 2)and r2,r2,#&FF ; Lose top byte <(cmp r2,#&FB ; Port &xxFB ? F/ldmfd (sp)!,{r2} ; Restore port number P0movne pc,link ; No -> exit unclaimed Z$ ; IN &xxFB d; r0=z80mem[0] n; r1=corruptable x; r2=corruptable *; r3=returns IN value [Printer Status] ; r4=corruptable ; stack balanced : +mov r3,#&80 ; b7=1 - not busy : *mov r1,#0 ; Claim the call mov pc,link : : .Service_Z80OUT /ldmfd (sp)!,{r1} ; Restore call number ,stmfd (sp)!,{r2} ; Save port number )and r2,r2,#&FF ; Lose top byte (cmp r2,#&FB ; Port &xxFB ? /ldmfd (sp)!,{r2} ; Restore port number "0movne pc,link ; No -> exit unclaimed ,/ ; OUT &xxFB,character 6; r0=z80mem[0] @; r1=corruptable J; r2=corruptable T.; r3=OUT value [character] - must preserve ^; r4=corruptable h; stack balanced r: |-stmfd (sp)!,{r0,r3,link} ; Save registers mov r0,#&80 adr r1,PrinterName swi "XOS_Find" +mov r1,r0 ; r1=("Printer") (mov r0,r3 ; r0=byte sent %swi "XOS_BPut" ; #r1,byte mov r0,#0  swi "XOS_Find" ; #r1 0ldmfd (sp)!,{r0,r3,link} ; Restore registers : *mov r1,#0 ; Claim the call mov pc,link : .PrinterName EQUS "Printer:":EQUB 13 : &: 0 ALIGN :] D("SAVE SpecPrint "+~mcode%+" "+~O% N*SetType SpecPrint Module X*Stamp SpecPrint b